@4399ywkf/core 5.0.21 → 5.0.22
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/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/build.ts","../src/config/loader.ts","../src/config/schema.ts","../src/plugin/manager.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/bootstrap.ts","../src/generator/templates/entry.ts","../src/generator/templates/env-types.ts","../src/generator/templates/route-types.ts","../src/rspack/prod.ts","../src/cli/env.ts","../src/cli/printer.ts","../src/cli/dev.ts","../src/cli/port.ts","../src/plugin/define.ts","../src/plugin/builtin/analytics.ts","../src/plugin/builtin/biome.ts","../src/plugin/builtin/garfish.ts","../src/plugin/builtin/i18n.ts","../src/plugin/builtin/mock.ts","../src/plugin/builtin/react-query.ts","../src/plugin/builtin/tailwind.ts","../src/plugin/builtin/theme.ts","../src/plugin/builtin/zustand.ts","../src/router/plugin.ts","../src/runtime/bootstrap.tsx","../src/runtime/providers.tsx","../src/runtime/context.tsx","../src/runtime/error-boundary.tsx"],"sourcesContent":["import { rspack, type Stats } from \"@rspack/core\";\nimport chalk from \"chalk\";\nimport { resolveConfig } from \"../config/loader.js\";\nimport { PluginManager } from \"../plugin/manager.js\";\nimport { createRspackConfig } from \"../rspack/index.js\";\nimport { loadEnv, preloadEnv } from \"./env.js\";\nimport { createProgressHandler, DevPrinter } from \"./printer.js\";\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\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 Compile errors:\"));\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 Warnings:\"));\n for (const warning of info.warnings) {\n console.log(chalk.yellow(` ${warning.message}`));\n }\n }\n\n console.log(chalk.bold(\"\\n Build output:\"));\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(` ${chalk.dim(asset.name.padEnd(50))} ${sizeColor(formatSize(asset.size))}`);\n }\n\n if (sortedAssets.length > 15) {\n console.log(chalk.dim(` ... and ${sortedAssets.length - 15} more files`));\n }\n\n console.log();\n}\n\n/**\n * 执行生产构建\n *\n * @param options.mode - env 文件模式,决定加载 .env.{mode},默认 \"production\"\n * 例如 --mode staging 会加载 .env.staging,但 NODE_ENV 仍为 \"production\"\n */\nexport async function build(options: { cwd?: string; mode?: string } = {}): Promise<void> {\n const cwd = options.cwd || process.cwd();\n const mode = options.mode || \"production\";\n\n try {\n // 1. 预加载环境变量(在配置解析之前)\n preloadEnv(cwd, mode, \"production\");\n\n // 2. 加载配置\n const { config } = await resolveConfig(cwd);\n\n // 3. 完整加载环境变量\n loadEnv(config, cwd, mode, \"production\");\n\n // 4. 加载插件\n const pluginManager = new PluginManager(config, cwd, false);\n if (config.plugins && config.plugins.length > 0) {\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 const pluginNames = pluginManager.getPluginNames();\n\n // 8. 终端 UI\n const printer = new DevPrinter(\"localhost\", 0, pluginNames, true);\n printer.printBanner();\n printer.printBuildStart();\n printer.updateProgress(0, \"preparing\");\n\n // 9. 注入 ProgressPlugin\n rspackConfig.plugins = rspackConfig.plugins || [];\n rspackConfig.plugins.push(new rspack.ProgressPlugin(createProgressHandler(printer)));\n\n rspackConfig.stats = \"none\";\n rspackConfig.infrastructureLogging = { level: \"none\" };\n\n // 10. 执行构建\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(\"Build failed: no stats available\"));\n return;\n }\n resolve(stats);\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n compiler.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n\n const hasErrors = stats.hasErrors();\n\n // 11. 执行 afterBuild 钩子\n const statsInfo = stats.toJson({ errors: true });\n await pluginManager.runAfterBuild({\n success: !hasErrors,\n errors: statsInfo.errors?.map((e) => e.message),\n });\n\n printer.printBuildDone(hasErrors);\n\n if (hasErrors) {\n printBuildResult(stats);\n process.exit(1);\n }\n\n printBuildResult(stats);\n } catch (error) {\n console.error();\n console.error(chalk.red(\" ✖ Build failed\"));\n console.error(error);\n process.exit(1);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { extname, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport deepmerge from \"deepmerge\";\nimport { defaultConfig, type YwkfConfig } from \"./schema.js\";\n\n/** 支持的配置文件名 */\nconst CONFIG_FILES = [\"ywkf.config.ts\", \"ywkf.config.mts\", \"ywkf.config.js\", \"ywkf.config.mjs\"];\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(\"⚠️ 未找到配置文件 (ywkf.config.ts),使用默认配置\");\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 | undefined;\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 as RspackConfig } from \"@rspack/core\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport type { RouteItem } from \"../router/types.js\";\nimport type { AppConfig, ProviderConfig } from \"../runtime/types.js\";\nimport type {\n PluginConfig,\n PluginContext,\n PluginHooks,\n PluginLogger,\n YwkfPlugin,\n} from \"./types.js\";\n\n/**\n * 创建插件日志工具\n */\nfunction createLogger(pluginName: string): PluginLogger {\n const prefix = `[${pluginName}]`;\n const verbose = !!process.env.DEBUG;\n\n return {\n info: (msg) => {\n if (verbose) console.log(`${prefix} ${msg}`);\n },\n warn: (msg) => console.warn(`${prefix} ${msg}`),\n error: (msg) => console.error(`${prefix} ${msg}`),\n debug: (msg) => {\n if (verbose) console.debug(`${prefix} ${msg}`);\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 }> = new Map();\n private context: PluginContext;\n\n constructor(config: Required<YwkfConfig>, cwd: string, isDev: boolean) {\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(`加载插件失败: ${String(pluginConfig)} - ${error}`);\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(`插件 ${name} modifyRspackConfig 执行失败: ${error}`);\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(`插件 ${name} modifyRoutes 执行失败: ${error}`);\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(`插件 ${name} modifyAppConfig 执行失败: ${error}`);\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(`插件 ${name} addProvider 执行失败: ${error}`);\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(`插件 ${name} beforeBuild 执行失败: ${error}`);\n }\n }\n }\n }\n\n /**\n * 执行 afterBuild 钩子\n */\n async runAfterBuild(stats: { success: boolean; errors?: string[] }): 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(`插件 ${name} afterBuild 执行失败: ${error}`);\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(`插件 ${name} beforeDevServer 执行失败: ${error}`);\n }\n }\n }\n }\n\n /**\n * 执行 afterDevServer 钩子\n */\n async runAfterDevServer(server: { port: number; host: string }): 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(`插件 ${name} afterDevServer 执行失败: ${error}`);\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 { RsdoctorRspackPlugin } from \"@rsdoctor/rspack-plugin\";\nimport type { Configuration } from \"@rspack/core\";\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 ? createDevConfig(config, cwd) : createProdConfig(config, cwd);\n\n // Rsdoctor 性能分析\n if (config.performance.rsdoctor) {\n rspackConfig.plugins = [...(rspackConfig.plugins || []), new RsdoctorRspackPlugin({})];\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 { createRequire } from \"node:module\";\nimport type { Configuration } from \"@rspack/core\";\nimport ReactRefreshPlugin from \"@rspack/plugin-react-refresh\";\nimport { merge } from \"webpack-merge\";\nimport { createPathResolver } from \"../config/loader.js\";\nimport type { YwkfConfig } from \"../config/schema.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(config: Required<YwkfConfig>, cwd: string): Configuration {\n const baseConfig = createBaseConfig(config, cwd, { isDev: true });\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: [/[\\\\/]node_modules[\\\\/].*antd/, /[\\\\/]node_modules[\\\\/]@4399ywkf[\\\\/]design/],\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: \"[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: \"[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 plugins: [new ReactRefreshPlugin()],\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 { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { type Configuration, rspack } from \"@rspack/core\";\nimport { createPathResolver } from \"../config/loader.js\";\nimport type { YwkfConfig } from \"../config/schema.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 options: { isDev?: boolean } = {},\n): Configuration {\n const isDev = options.isDev ?? process.env.NODE_ENV !== \"production\";\n const { resolveApp } = createPathResolver(cwd);\n\n const { appName, appCName, output, html, alias: userAlias, microFrontend, router } = 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: true,\n alias: {\n ...alias,\n \"process/browser.js\": require.resolve(\"process/browser.js\"),\n \"process/browser\": require.resolve(\"process/browser.js\"),\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 development: isDev,\n refresh: isDev,\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 ? `chunk_global_${appName}` : 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 { existsSync, watch } from \"fs\";\nimport { join } from \"path\";\nimport { findConfigFile, loadConfigFile, mergeConfig } from \"../config/loader.js\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport type { PluginConfig, PluginContext, PluginHooks, YwkfPlugin } 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(pluginConfig: PluginConfig): 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) => {\n if (process.env.DEBUG) console.log(`[ywkf] ${msg}`);\n },\n warn: (msg) => console.warn(`[ywkf] ${msg}`),\n error: (msg) => console.error(`[ywkf] ${msg}`),\n debug: (msg) => {\n if (process.env.DEBUG) console.log(`[ywkf:debug] ${msg}`);\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 if (process.env.DEBUG) 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 private resetState(): void {\n this.initialized = false;\n this.pluginHooks = [];\n this.generator = null;\n }\n\n private async regenerate(): Promise<void> {\n if (this.generator) {\n await this.generator.generate();\n }\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 this.watchConfig();\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(pagesDir, { recursive: true }, (_eventType, filename) => {\n if (!filename?.match(/\\.(tsx?|jsx?)$/)) {\n return;\n }\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n if (process.env.DEBUG) console.log(`[ywkf] 检测到页面变化: ${filename}`);\n if (this.generator) {\n await this.generator.generate();\n }\n }, 500);\n });\n\n process.on(\"exit\", () => {\n watcher.close();\n });\n }\n\n /**\n * 监听配置文件变化,重新加载配置并重新生成 .ywkf 文件\n */\n private watchConfig(): void {\n const { cwd } = this.options;\n const configPath = findConfigFile(cwd);\n\n if (!configPath) {\n return;\n }\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const watcher = watch(configPath, async () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n try {\n console.log(`\\n [ywkf] 检测到配置文件变化,重新生成 .ywkf 目录...\\n`);\n\n const userConfig = await loadConfigFile(configPath);\n const newConfig = mergeConfig(userConfig);\n\n this.options.config = newConfig;\n this.options.pluginConfigs = newConfig.plugins;\n\n // 重置状态,让 initialize() 重新创建 generator\n this.resetState();\n await this.initialize();\n await this.regenerate();\n\n console.log(\n ` [ywkf] .ywkf 目录已重新生成。部分配置变更(如端口、代理)需重启 dev server 生效。\\n`,\n );\n } catch (error) {\n console.error(` [ywkf] 配置重载失败:`, error);\n }\n }, 500);\n });\n\n process.on(\"exit\", () => {\n watcher.close();\n });\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { CodeInjection, GeneratorContext, PluginHooks } from \"../plugin/types.js\";\nimport { ConventionalRouteGenerator } from \"../router/generator.js\";\nimport { generateBootstrap } from \"./templates/bootstrap.js\";\nimport { generateEntry } from \"./templates/entry.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 if (process.env.DEBUG) 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(configPath, JSON.stringify(serializableConfig, null, 2));\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(type: \"entry\" | \"bootstrap\"): 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(join(outputDir, \"types\", \"env.d.ts\"), envTypesContent);\n\n // 生成路由类型\n if (config.router.conventional) {\n const routeTypesContent = generateRouteTypes();\n this.writeFileIfChanged(join(outputDir, \"types\", \"routes.d.ts\"), routeTypesContent);\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, mkdirSync, readdirSync, statSync, writeFileSync } from \"fs\";\nimport { join, relative } from \"path\";\n\n/** 将 Windows 路径统一为 POSIX 正斜杠(import 路径必须用 /) */\nfunction winPath(path: string): string {\n const isExtendedLengthPath = /^\\\\\\\\\\?\\\\/.test(path);\n if (isExtendedLengthPath) {\n return path;\n }\n return path.replace(/\\\\/g, \"/\");\n}\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) => CONVENTION_FILES.layout.test(e));\n if (pathlessLayout) {\n const pathlessChildren = this.scanDirectory(subDirPath, routePath);\n const pathlessLayoutRel = winPath(\n relative(this.options.pagesDir, join(subDirPath, pathlessLayout)),\n );\n childRoutes.push({\n path: routePath,\n name: this.generateRouteName(subDir.slice(2)),\n layoutFile: pathlessLayoutRel,\n isLayout: true,\n pathless: true,\n children: pathlessChildren.filter((r) => r.layoutFile !== pathlessLayoutRel),\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) => winPath(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 === \"/\" ? `/${segment}` : `${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) => s.replace(/^:/, \"Param\").replace(/\\?$/, \"Optional\").replace(/^\\*$/, \"CatchAll\"))\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(\n route.loadingFile,\n )}\"));`,\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 if (process.env.DEBUG) 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/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 effectiveBasename = userConfig.basename || BASENAME;\n const router = createRouter(effectiveBasename);\n\n const defaultConfig: AppConfig = {\n appName: APP_NAME,\n router,\n basename: effectiveBasename,\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 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 const hasPluginExports = exports.length > 0;\n const hasAsyncTopLevel = topLevel.some((line) => line.includes(\"await \"));\n\n let startupBody: string;\n\n if (hasPluginExports) {\n // 子应用模式:条件启动\n startupBody = [\n ...topLevel,\n ...exports,\n ``,\n `if (shouldRunIndependently !== false) {`,\n ` runApp();`,\n `}`,\n ].join(\"\\n\");\n } else if (hasAsyncTopLevel) {\n // 主应用异步初始化模式:用 async IIFE 包装\n startupBody = [\n `(async () => {`,\n ...topLevel.map((l) => ` ${l}`),\n ` await runApp();`,\n `})();`,\n ].join(\"\\n\");\n } else {\n startupBody = topLevel.length > 0 ? [...topLevel, `runApp();`].join(\"\\n\") : `runApp();`;\n }\n\n return `// 此文件由 @4399ywkf/core 自动生成,请勿手动修改\n// Generated at: ${new Date().toISOString()}\n\n${imports.join(\"\\n\")}\n\n${startupBody}\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(cwd: string, config: Required<YwkfConfig>): string {\n const envVars = collectEnvVars(cwd, config);\n\n const envInterface = envVars.map((key) => ` readonly ${key}: string;`).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 { type Configuration, rspack } from \"@rspack/core\";\nimport { merge } from \"webpack-merge\";\nimport { createPathResolver } from \"../config/loader.js\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport { createBaseConfig } from \"./base.js\";\n\n/**\n * 创建生产环境 Rspack 配置\n */\nexport function createProdConfig(config: Required<YwkfConfig>, cwd: string): Configuration {\n const baseConfig = createBaseConfig(config, cwd, { isDev: false });\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: [/[\\\\/]node_modules[\\\\/].*antd/, /[\\\\/]node_modules[\\\\/]@4399ywkf[\\\\/]design/],\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: \"[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: \"[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 *\n * @param cwd 工作目录\n * @param mode env 文件模式,决定加载 .env.{mode}(如 \"staging\"、\"devProduction\")\n * @param nodeEnv JS 运行时环境,始终为 \"development\" 或 \"production\"\n */\nexport function preloadEnv(cwd: string, mode: string, nodeEnv: \"development\" | \"production\"): void {\n process.env.NODE_ENV = nodeEnv;\n process.env.APP_MODE = 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 // 尝试加载模式特定的变量:.env.{mode}\n const modeEnvPaths = [resolve(cwd, `config/env/.env.${mode}`), resolve(cwd, `.env.${mode}`)];\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 // NODE_ENV / APP_MODE 由框架控制,env 文件不可覆盖\n process.env.NODE_ENV = nodeEnv;\n process.env.APP_MODE = mode;\n}\n\n/**\n * 加载环境变量(完整版,依赖配置)\n *\n * @param config 用户配置\n * @param cwd 工作目录\n * @param mode env 文件模式,决定加载 .env.{mode}\n * @param nodeEnv JS 运行时环境,始终为 \"development\" 或 \"production\"\n */\nexport function loadEnv(\n config: Required<YwkfConfig>,\n cwd: string,\n mode: string,\n nodeEnv: \"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 // 加载模式特定的变量:.env.{mode}\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 // 设置默认值(NODE_ENV 始终由框架控制,不受 mode 影响)\n process.env.NODE_ENV = nodeEnv;\n process.env.APP_MODE = 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 { createRequire } from \"node:module\";\nimport os from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport chalk from \"chalk\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst require = createRequire(import.meta.url);\n\nlet _version: string | null = null;\n\nfunction getFrameworkVersion(): string {\n if (_version) return _version;\n try {\n const pkgPath = join(__dirname, \"../../package.json\");\n const pkg = require(pkgPath);\n _version = pkg.version || \"0.0.0\";\n } catch {\n _version = \"0.0.0\";\n }\n return _version!;\n}\n\nfunction getNetworkAddress(port: number): string | null {\n const interfaces = os.networkInterfaces();\n for (const entries of Object.values(interfaces)) {\n if (!entries) continue;\n for (const entry of entries) {\n if (entry.family === \"IPv4\" && !entry.internal) {\n return `http://${entry.address}:${port}/`;\n }\n }\n }\n return null;\n}\n\nconst BAR_WIDTH = 30;\n\nfunction renderBar(percent: number): string {\n const filled = Math.round(BAR_WIDTH * percent);\n const empty = BAR_WIDTH - filled;\n const bar = chalk.green(\"━\".repeat(filled)) + chalk.gray(\"━\".repeat(empty));\n return bar;\n}\n\n/**\n * 框架终端 UI\n *\n * 负责在 dev / build 阶段输出 Modern.js 风格的终端信息:\n * - 框架 banner\n * - 编译进度条\n * - 就绪信息(Local / Network / Plugins)\n * - 交互式快捷键\n */\nexport class DevPrinter {\n private startTime = 0;\n private lastProgressLine = \"\";\n private firstCompileDone = false;\n\n constructor(\n readonly _host: string,\n private readonly port: number,\n private readonly pluginNames: string[],\n private readonly isBuild = false,\n ) {}\n\n /**\n * 打印框架 banner\n */\n printBanner(): void {\n const version = getFrameworkVersion();\n console.log();\n console.log(` ${chalk.bold.cyan(\"@4399ywkf/core\")} ${chalk.green(`Framework v${version}`)}`);\n console.log();\n }\n\n /**\n * 打印 \"start build started...\"\n */\n printBuildStart(): void {\n this.startTime = Date.now();\n this.compileDone = false;\n const label = chalk.gray(\"start\");\n console.log(` ${label} build started...`);\n }\n\n /**\n * 更新编译进度条(原地覆写同一行)\n */\n updateProgress(percent: number, message: string): void {\n const pct = Math.min(Math.round(percent * 100), 100);\n const bar = renderBar(percent);\n const status = message || \"compiling\";\n const line = ` ${chalk.yellow(\"●\")} client ${bar} ${chalk.bold(`(${pct}%)`)} ${chalk.gray(status)}`;\n\n if (process.stdout.isTTY) {\n if (this.lastProgressLine) {\n process.stdout.write(\"\\x1b[1A\\x1b[2K\");\n }\n process.stdout.write(`${line}\\n`);\n } else if (!this.firstCompileDone && pct === 100) {\n console.log(line);\n }\n this.lastProgressLine = line;\n }\n\n /**\n * 编译完成\n */\n printBuildDone(hasErrors = false): void {\n if (this.firstCompileDone) {\n if (!hasErrors) {\n const elapsed = ((Date.now() - this.startTime) / 1000).toFixed(2);\n console.log(` ${chalk.green(\"hmr\")} update in ${chalk.bold(`${elapsed} s`)}`);\n }\n return;\n }\n\n this.firstCompileDone = true;\n this.lastProgressLine = \"\";\n\n if (hasErrors) return;\n\n const elapsed = ((Date.now() - this.startTime) / 1000).toFixed(2);\n const label = chalk.green(\"ready\");\n console.log(` ${label} built in ${chalk.bold(`${elapsed} s`)}`);\n console.log();\n\n if (this.isBuild) {\n this.printPluginList();\n } else {\n this.printServerInfo();\n }\n }\n\n /**\n * 标记新一轮编译开始(HMR)\n */\n markRebuildStart(): void {\n this.startTime = Date.now();\n this.lastProgressLine = \"\";\n }\n\n /**\n * 仅打印插件列表(build 模式使用)\n */\n private printPluginList(): void {\n if (this.pluginNames.length > 0) {\n console.log(` ${chalk.bold(\">\")} Plugins:`);\n for (const name of this.pluginNames) {\n const shortName = name.replace(\"@4399ywkf/plugin-\", \"\").replace(\"@4399ywkf/\", \"\");\n console.log(` ${chalk.green(\"✓\")} ${shortName}`);\n }\n console.log();\n }\n }\n\n /**\n * 打印服务器信息面板(dev 模式使用)\n */\n private printServerInfo(): void {\n const localUrl = `http://localhost:${this.port}/`;\n const networkUrl = getNetworkAddress(this.port);\n\n console.log(` ${chalk.bold(\">\")} Local: ${chalk.cyan(localUrl)}`);\n if (networkUrl) {\n console.log(` ${chalk.bold(\">\")} Network: ${chalk.cyan(networkUrl)}`);\n }\n console.log();\n\n this.printPluginList();\n\n console.log(` ${chalk.bold(\">\")} press ${chalk.bold(\"h + enter\")} to show shortcuts`);\n console.log();\n }\n\n /**\n * 打印快捷键帮助\n */\n printShortcuts(): void {\n console.log();\n console.log(` ${chalk.bold(\"Shortcuts:\")}`);\n console.log(` ${chalk.bold(\"o + enter\")} open in browser`);\n console.log(` ${chalk.bold(\"c + enter\")} clear console`);\n console.log(` ${chalk.bold(\"q + enter\")} quit`);\n console.log();\n }\n}\n\n/**\n * 创建 Rspack ProgressPlugin handler\n *\n * 返回一个 (percent, message, ...details) 回调供 ProgressPlugin 使用。\n */\nexport function createProgressHandler(printer: DevPrinter) {\n return (percent: number, message: string, ..._details: string[]) => {\n printer.updateProgress(percent, message);\n };\n}\n\n/**\n * 注册交互式快捷键\n */\nexport function registerShortcuts(\n printer: DevPrinter,\n opts: { port: number; onQuit: () => void },\n): void {\n if (!process.stdin.isTTY) return;\n\n process.stdin.setEncoding(\"utf-8\");\n process.stdin.setRawMode?.(false);\n\n let buffer = \"\";\n\n const handler = (data: string) => {\n buffer += data;\n\n if (!buffer.includes(\"\\n\")) return;\n\n const cmd = buffer.trim().toLowerCase();\n buffer = \"\";\n\n switch (cmd) {\n case \"h\":\n printer.printShortcuts();\n break;\n case \"o\": {\n const url = `http://localhost:${opts.port}/`;\n import(\"child_process\").then((cp) => {\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"start\"\n : \"xdg-open\";\n cp.exec(`${command} ${url}`);\n });\n console.log(` ${chalk.green(\"➜\")} Opening ${chalk.cyan(url)}...`);\n break;\n }\n case \"c\":\n console.clear();\n break;\n case \"q\":\n opts.onQuit();\n break;\n }\n };\n\n process.stdin.on(\"data\", handler);\n process.stdin.resume();\n}\n","import { rspack } from \"@rspack/core\";\nimport { RspackDevServer } from \"@rspack/dev-server\";\nimport chalk from \"chalk\";\nimport { resolveConfig } from \"../config/loader.js\";\nimport { PluginManager } from \"../plugin/manager.js\";\nimport { createRspackConfig } from \"../rspack/index.js\";\nimport { loadEnv, preloadEnv } from \"./env.js\";\nimport { getAvailablePort } from \"./port.js\";\nimport { createProgressHandler, DevPrinter, registerShortcuts } from \"./printer.js\";\n\n/**\n * 启动开发服务器\n *\n * @param options.mode - env 文件模式,决定加载 .env.{mode},默认 \"development\"\n * 例如 --mode staging 会加载 .env.staging,但 NODE_ENV 仍为 \"development\"\n */\nexport async function dev(options: { cwd?: string; mode?: string } = {}): Promise<void> {\n const cwd = options.cwd || process.cwd();\n const mode = options.mode || \"development\";\n\n try {\n // 1. 预加载环境变量(在配置解析之前)\n preloadEnv(cwd, mode, \"development\");\n\n // 2. 加载配置\n const { config } = await resolveConfig(cwd);\n\n // 3. 完整加载环境变量\n loadEnv(config, cwd, mode, \"development\");\n\n // 4. 加载插件(静默模式,不输出到终端)\n const pluginManager = new PluginManager(config, cwd, true);\n if (config.plugins && config.plugins.length > 0) {\n await pluginManager.loadPlugins(config.plugins);\n }\n\n // 5. 执行 beforeDevServer 钩子\n await pluginManager.runBeforeDevServer();\n\n // 6. 创建 Rspack 配置\n let rspackConfig = createRspackConfig(config, cwd, { isDev: true });\n\n // 7. 应用插件的 rspack 配置修改\n rspackConfig = await pluginManager.applyRspackConfigHooks(rspackConfig);\n\n const host = config.dev.host || \"localhost\";\n const preferredPort = config.dev.port || 3000;\n const port = await getAvailablePort(preferredPort, host);\n const pluginNames = pluginManager.getPluginNames();\n\n if (port !== preferredPort) {\n console.log(chalk.yellow(` Port ${preferredPort} is in use, using ${port} instead.\\n`));\n }\n\n // 8. 初始化终端 UI\n const printer = new DevPrinter(host, port, pluginNames);\n printer.printBanner();\n printer.printBuildStart();\n printer.updateProgress(0, \"preparing\");\n\n // 9. 注入 ProgressPlugin\n rspackConfig.plugins = rspackConfig.plugins || [];\n rspackConfig.plugins.push(new rspack.ProgressPlugin(createProgressHandler(printer)));\n\n // 10. 静默 rspack 自带终端输出(不影响 HMR WebSocket 连接)\n rspackConfig.stats = \"none\";\n rspackConfig.infrastructureLogging = { level: \"none\" };\n if (rspackConfig.devServer) {\n const ds = rspackConfig.devServer as Record<string, unknown>;\n const existingClient = (ds.client ?? {}) as Record<string, unknown>;\n ds.client = {\n ...existingClient,\n logging: \"warn\",\n overlay: false,\n progress: false,\n };\n }\n\n // 11. 创建编译器 & 监听编译事件\n const compiler = rspack(rspackConfig);\n\n compiler.hooks.done.tap(\"ywkf-dev-printer\", (stats) => {\n const hasErrors = stats.hasErrors();\n if (hasErrors) {\n const info = stats.toJson({ errors: true });\n console.log();\n console.log(chalk.red(\" Compile error:\"));\n for (const err of info.errors || []) {\n console.log(chalk.red(` ${err.message}`));\n }\n console.log();\n }\n printer.printBuildDone(hasErrors);\n });\n\n compiler.hooks.invalid.tap(\"ywkf-dev-printer\", () => {\n printer.markRebuildStart();\n printer.updateProgress(0, \"rebuilding\");\n });\n\n // 12. 创建并启动开发服务器(使用检测后的实际端口)\n const devServerOptions = {\n ...(rspackConfig.devServer || {}),\n host,\n port,\n };\n const server = new RspackDevServer(devServerOptions, compiler);\n\n await server.start();\n\n // 13. 执行 afterDevServer 钩子\n await pluginManager.runAfterDevServer({ host, port });\n\n // 14. 注册交互式快捷键\n registerShortcuts(printer, {\n port,\n onQuit: async () => {\n console.log(chalk.gray(\"\\n Shutting down...\\n\"));\n await server.stop();\n process.exit(0);\n },\n });\n\n // 15. 监听退出信号\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 console.error();\n console.error(chalk.red(\" ✖ Dev server failed to start\"));\n console.error(error);\n process.exit(1);\n }\n}\n","import net from \"node:net\";\n\n/**\n * 检测端口是否可用\n */\nfunction isPortAvailable(port: number, host: string): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n\n server.once(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n resolve(false);\n } else {\n resolve(false);\n }\n });\n\n server.once(\"listening\", () => {\n server.close(() => resolve(true));\n });\n\n server.listen(port, host);\n });\n}\n\n/**\n * 获取可用端口\n *\n * 从 preferredPort 开始,依次尝试 +1,最多尝试 20 个端口。\n * 返回实际可用的端口号。\n */\nexport async function getAvailablePort(preferredPort: number, host: string): Promise<number> {\n const MAX_ATTEMPTS = 20;\n\n for (let i = 0; i < MAX_ATTEMPTS; i++) {\n const port = preferredPort + i;\n const available = await isPortAvailable(port, host);\n if (available) return port;\n }\n\n throw new Error(\n `No available port found in range ${preferredPort}-${preferredPort + MAX_ATTEMPTS - 1}`,\n );\n}\n","import type { PluginHooks, YwkfPlugin } from \"./types.js\";\n\n/**\n * 定义插件的辅助函数\n *\n * @example\n * ```ts\n * export default definePlugin({\n * name: \"my-plugin\",\n * setup(context) {\n * return {\n * modifyRspackConfig(config) {\n * // 修改配置\n * return config;\n * },\n * };\n * },\n * });\n * ```\n */\nexport function definePlugin(plugin: YwkfPlugin): YwkfPlugin {\n return plugin;\n}\n\n/**\n * 创建带配置的插件工厂\n *\n * @example\n * ```ts\n * export default createPlugin<{ apiUrl: string }>((options) => ({\n * name: \"api-plugin\",\n * setup(context) {\n * console.log(\"API URL:\", options?.apiUrl);\n * return {};\n * },\n * }));\n * ```\n */\nexport function createPlugin<T = Record<string, unknown>>(\n factory: (options?: T) => YwkfPlugin,\n): (options?: T) => YwkfPlugin {\n return factory;\n}\n\n/**\n * 组合多个插件钩子\n */\nexport function composeHooks(...hooksList: PluginHooks[]): PluginHooks {\n const composed: Record<string, Function> = {};\n\n for (const hooks of hooksList) {\n for (const [key, value] of Object.entries(hooks)) {\n if (value) {\n const existing = composed[key];\n if (existing) {\n composed[key] = async (...args: unknown[]) => {\n await existing(...args);\n return (value as Function)(...args);\n };\n } else {\n composed[key] = value as Function;\n }\n }\n }\n }\n\n return composed as PluginHooks;\n}\n","import { createPlugin } from \"../define.js\";\nimport type { PluginHooks } from \"../types.js\";\n\nexport interface AnalyticsPluginOptions {\n /** 是否启用构建分析 */\n buildAnalysis?: boolean;\n /** 是否输出构建时间 */\n timing?: boolean;\n /** 是否分析 bundle 大小 */\n bundleSize?: boolean;\n /** 大文件警告阈值(KB) */\n sizeWarningThreshold?: number;\n}\n\n/**\n * 构建分析插件\n *\n * @example\n * ```ts\n * import { analyticsPlugin } from \"@4399ywkf/core/plugin\";\n *\n * export default defineConfig({\n * plugins: [\n * analyticsPlugin({\n * timing: true,\n * bundleSize: true,\n * sizeWarningThreshold: 500, // 500KB\n * }),\n * ],\n * });\n * ```\n */\nexport const analyticsPlugin = createPlugin<AnalyticsPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-analytics\",\n version: \"1.0.0\",\n description: \"构建分析插件\",\n\n setup(context) {\n const {\n buildAnalysis = true,\n timing = true,\n bundleSize = true,\n sizeWarningThreshold = 500,\n } = options;\n const { logger, isProd } = context;\n\n let buildStartTime: number;\n\n const hooks: PluginHooks = {\n beforeBuild() {\n if (timing) {\n buildStartTime = Date.now();\n logger.info(\"开始构建...\");\n }\n },\n\n afterBuild(_context, stats) {\n if (timing) {\n const duration = Date.now() - buildStartTime;\n logger.info(`构建完成,耗时: ${(duration / 1000).toFixed(2)}s`);\n }\n\n if (!stats.success && stats.errors) {\n logger.error(`构建失败,错误数: ${stats.errors.length}`);\n }\n },\n\n modifyRspackConfig(config) {\n if (buildAnalysis && isProd) {\n // 可以在这里添加 bundle analyzer 插件\n logger.info(\"构建分析已启用\");\n }\n\n return config;\n },\n };\n\n return hooks;\n },\n}));\n\nexport default analyticsPlugin;\n","import { existsSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createPlugin } from \"../define.js\";\nimport type { PluginHooks } from \"../types.js\";\n\nexport interface BiomePluginOptions {\n /**\n * 是否在项目根目录生成 biome.json(仅在文件不存在时)\n * @default true\n */\n scaffold?: boolean;\n\n /**\n * biome.json 的 formatter 缩进风格\n * @default \"space\"\n */\n indentStyle?: \"space\" | \"tab\";\n\n /**\n * JS/TS formatter 引号风格\n * @default \"double\"\n */\n quoteStyle?: \"double\" | \"single\";\n\n /**\n * 箭头函数参数括号\n * @default \"always\"\n */\n arrowParentheses?: \"always\" | \"asNeeded\";\n\n /**\n * JS/TS 行宽\n * @default 100\n */\n lineWidth?: number;\n\n /**\n * 是否启用 organizeImports\n * @default true\n */\n organizeImports?: boolean;\n\n /**\n * 额外忽略的文件 glob\n */\n ignore?: string[];\n\n /**\n * 自定义 linter 规则覆盖(浅合并到默认规则上)\n */\n rules?: Record<string, Record<string, string>>;\n}\n\nconst DEFAULT_IGNORE = [\".vscode/**/*\", \"node_modules/**/*\", \"dist/**/*\", \".ywkf/**/*\"];\n\n/**\n * Biome 代码规范插件\n *\n * 在 setup 阶段自动生成 biome.json,为项目提供统一的\n * Lint / Format / Import Sorting 规范。\n *\n * 默认配置参考 modern.js 的 biome 方案,并适配 React + Ant Design 项目。\n *\n * @example\n * ```ts\n * import { defineConfig, biomePlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * biomePlugin(),\n * ],\n * });\n * ```\n */\nexport const biomePlugin = createPlugin<BiomePluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-biome\",\n version: \"1.0.0\",\n description: \"Biome 代码规范集成\",\n\n setup(context) {\n const {\n scaffold = true,\n indentStyle = \"space\",\n quoteStyle = \"double\",\n arrowParentheses = \"always\",\n lineWidth = 100,\n organizeImports = true,\n ignore = [],\n rules: customRules = {},\n } = options;\n\n const { cwd, logger } = context;\n\n if (scaffold) {\n const biomeConfigPath = join(cwd, \"biome.json\");\n if (!existsSync(biomeConfigPath)) {\n const config = buildBiomeConfig({\n indentStyle,\n quoteStyle,\n arrowParentheses,\n lineWidth,\n organizeImports,\n ignore: [...DEFAULT_IGNORE, ...ignore],\n customRules,\n });\n writeFileSync(biomeConfigPath, `${JSON.stringify(config, null, 2)}\\n`, \"utf-8\");\n logger.info(\"已生成 biome.json\");\n }\n }\n\n const hooks: PluginHooks = {\n modifyRspackConfig(rspackConfig) {\n logger.info(\"Biome 代码规范已启用\");\n return rspackConfig;\n },\n };\n\n return hooks;\n },\n}));\n\ninterface BuildConfigParams {\n indentStyle: string;\n quoteStyle: string;\n arrowParentheses: string;\n lineWidth: number;\n organizeImports: boolean;\n ignore: string[];\n customRules: Record<string, Record<string, string>>;\n}\n\nfunction buildBiomeConfig(params: BuildConfigParams) {\n const {\n indentStyle,\n quoteStyle,\n arrowParentheses,\n lineWidth,\n organizeImports: enableOrganizeImports,\n ignore,\n customRules,\n } = params;\n\n const defaultRules: Record<string, Record<string, string>> = {\n recommended: { \"\": \"true\" } as unknown as Record<string, string>,\n style: {\n useNodejsImportProtocol: \"off\",\n noNonNullAssertion: \"off\",\n noUnusedTemplateLiteral: \"off\",\n noUselessElse: \"off\",\n useNumberNamespace: \"off\",\n },\n suspicious: {\n noExplicitAny: \"off\",\n noConfusingVoidType: \"off\",\n noImplicitAnyLet: \"off\",\n noAssignInExpressions: \"off\",\n noPrototypeBuiltins: \"off\",\n },\n complexity: {\n noForEach: \"off\",\n noBannedTypes: \"off\",\n useArrowFunction: \"off\",\n },\n correctness: {\n useExhaustiveDependencies: \"off\",\n },\n a11y: {\n useAltText: \"off\",\n useKeyWithClickEvents: \"off\",\n useButtonType: \"off\",\n noSvgWithoutTitle: \"off\",\n },\n performance: {\n noDelete: \"off\",\n },\n security: {\n noDangerouslySetInnerHtml: \"off\",\n },\n };\n\n const mergedRules: Record<string, unknown> = { recommended: true };\n for (const [category, categoryRules] of Object.entries(defaultRules)) {\n if (category === \"recommended\") continue;\n const customCategoryRules = customRules[category] || {};\n mergedRules[category] = { ...categoryRules, ...customCategoryRules };\n }\n\n const includesPatterns = [\"**\", ...ignore.map((p) => `!${p}`)];\n\n return {\n $schema: \"https://biomejs.dev/schemas/2.3.2/schema.json\",\n vcs: {\n enabled: true,\n defaultBranch: \"main\",\n clientKind: \"git\",\n useIgnoreFile: true,\n },\n formatter: {\n enabled: true,\n indentStyle,\n },\n css: {\n formatter: {\n quoteStyle: \"single\",\n },\n },\n javascript: {\n formatter: {\n quoteStyle,\n arrowParentheses,\n jsxQuoteStyle: \"double\",\n lineWidth,\n },\n },\n linter: {\n enabled: true,\n rules: mergedRules,\n },\n assist: {\n actions: {\n source: {\n organizeImports: enableOrganizeImports ? \"on\" : \"off\",\n },\n },\n },\n files: {\n ignoreUnknown: true,\n includes: includesPatterns,\n },\n };\n}\n\n/**\n * 生成默认 biome.json 配置内容(纯数据,供 CLI 脚手架使用)\n */\nexport function getDefaultBiomeConfig(): Record<string, unknown> {\n return buildBiomeConfig({\n indentStyle: \"space\",\n quoteStyle: \"double\",\n arrowParentheses: \"always\",\n lineWidth: 100,\n organizeImports: true,\n ignore: DEFAULT_IGNORE,\n customRules: {},\n });\n}\n","import { createPlugin } from \"../define.js\";\nimport type { CodeInjection, GeneratorContext, PluginHooks } from \"../types.js\";\n\nexport interface GarfishPluginOptions {\n /** 应用名称(微前端标识) */\n appName?: string;\n /** 是否作为主应用 */\n master?: boolean;\n /** 子应用列表(主应用模式) */\n apps?: {\n name: string;\n entry: string;\n activeRule: string;\n basename?: string;\n }[];\n /** 沙箱配置 */\n sandbox?: {\n /** 是否开启 JS 沙箱 */\n open?: boolean;\n /** 是否开启快照沙箱 */\n snapshot?: boolean;\n /** 样式隔离 */\n strictStyleIsolation?: boolean;\n };\n}\n\n/**\n * Garfish 微前端插件\n *\n * 通过插件方式启用微前端功能,支持子应用和主应用两种模式。\n *\n * @example\n * ```ts\n * // ywkf.config.ts - 子应用模式\n * import { defineConfig, garfishPlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * garfishPlugin({\n * appName: \"sub-app\",\n * }),\n * ],\n * });\n * ```\n *\n * @example\n * ```ts\n * // ywkf.config.ts - 主应用模式\n * import { defineConfig, garfishPlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * garfishPlugin({\n * master: true,\n * apps: [\n * { name: \"sub-app\", entry: \"http://localhost:3001\", activeRule: \"/sub\" },\n * ],\n * }),\n * ],\n * });\n * ```\n */\nexport const garfishPlugin = createPlugin<GarfishPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-garfish\",\n version: \"1.0.0\",\n description: \"Garfish 微前端插件\",\n\n setup(context) {\n const { appName, master = false, apps = [], sandbox = {} } = options;\n const { config, logger, isDev } = context;\n const finalAppName = appName || config.appName;\n\n const hooks: PluginHooks = {\n // ===== 构建阶段钩子 =====\n modifyRspackConfig(rspackConfig) {\n // 微前端子应用需要 UMD 输出 + CORS\n if (!master) {\n rspackConfig.output = {\n ...rspackConfig.output,\n library: finalAppName,\n libraryTarget: \"umd\",\n globalObject: \"window\",\n chunkLoadingGlobal: `garfish_${finalAppName}`,\n };\n\n // 子应用 dev server 必须允许跨域(主应用需要跨域加载子应用资源)\n rspackConfig.devServer = {\n ...rspackConfig.devServer,\n headers: {\n ...(((rspackConfig.devServer as Record<string, unknown>)?.headers as Record<\n string,\n string\n >) || {}),\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET, POST, PUT, DELETE, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"*\",\n },\n };\n\n logger.info(`配置 UMD 输出: ${finalAppName}`);\n }\n\n return rspackConfig;\n },\n\n beforeDevServer() {\n if (master) {\n logger.info(\"Garfish 主应用模式\");\n logger.info(`子应用列表: ${apps.map((a) => a.name).join(\", \")}`);\n } else {\n logger.info(`Garfish 子应用模式: ${finalAppName}`);\n }\n },\n\n // ===== 代码生成阶段钩子 =====\n injectEntry(_ctx: GeneratorContext): CodeInjection {\n if (master && apps.length > 0) {\n return {\n imports: [`import { initGarfishMaster } from \"./bootstrap\";`],\n topLevel: [`// Garfish 主应用:初始化微前端并注册子应用`, `await initGarfishMaster();`],\n };\n }\n\n if (!master) {\n return {\n imports: [`import { garfishProvider, isMicroAppEnv } from \"./bootstrap\";`],\n exports: [\n `// Garfish 子应用生命周期导出(provider 函数格式)`,\n `export const provider = garfishProvider;`,\n ],\n topLevel: [\n `// Garfish 微前端:独立运行判断`,\n `const shouldRunIndependently = !isMicroAppEnv();`,\n ],\n };\n }\n\n return {};\n },\n\n injectBootstrap(_ctx: GeneratorContext): CodeInjection {\n const imports: string[] = [];\n const exports: string[] = [];\n const topLevel: string[] = [];\n\n if (master) {\n // 主应用模式\n if (apps.length > 0) {\n imports.push(`import Garfish from \"garfish\";`);\n topLevel.push(generateMasterInitCode(apps, config.router.basename));\n }\n } else {\n // 子应用模式:使用 Garfish 专用 provider 格式\n imports.push(\n `import { createGarfishProvider, isMicroAppEnv } from \"@4399ywkf/core/runtime\";`,\n );\n exports.push(\n `/**`,\n ` * Garfish 子应用 provider(render/destroy 格式)`,\n ` */`,\n `export const garfishProvider = createGarfishProvider(createAppConfig);`,\n ``,\n `/**`,\n ` * 判断是否在微前端环境`,\n ` */`,\n `export { isMicroAppEnv };`,\n );\n }\n\n return { imports, exports, topLevel };\n },\n\n modifyBootstrapCode(code: string, _ctx: GeneratorContext): string {\n // 微前端子应用禁用 antd 配置(由主应用管理)\n if (!master) {\n return code.replace(/antd:\\s*\\{\\s*enabled:\\s*true/, \"antd: { enabled: false\");\n }\n return code;\n },\n\n // ===== 运行时阶段钩子 =====\n modifyAppConfig(appConfig) {\n return {\n ...appConfig,\n // 微前端模式下禁用 antd 样式注入(由主应用管理)\n antd: {\n ...appConfig.antd,\n enabled: master,\n },\n };\n },\n };\n\n return hooks;\n },\n}));\n\n/**\n * 生成主应用初始化代码\n */\nfunction generateMasterInitCode(\n apps: NonNullable<GarfishPluginOptions[\"apps\"]>,\n basename?: string,\n): string {\n const appConfigs = apps\n .map(\n (app) => `{\n name: \"${app.name}\",\n entry: \"${app.entry}\",\n activeWhen: \"${app.activeRule}\",\n ${app.basename ? `basename: \"${app.basename}\",` : \"\"}\n }`,\n )\n .join(\",\\n \");\n\n return `\n/**\n * Garfish 主应用初始化\n * 在 runApp 之前调用\n */\nexport async function initGarfishMaster(): Promise<void> {\n await Garfish.run({\n basename: \"${basename || \"/\"}\",\n domGetter: \"#subapp-container\",\n apps: [\n ${appConfigs}\n ],\n });\n}\n`;\n}\n\nexport default garfishPlugin;\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createPlugin } from \"../define.js\";\nimport type { CodeInjection, GeneratedFile, GeneratorContext, PluginHooks } from \"../types.js\";\n\nexport interface I18nPluginOptions {\n /**\n * 默认语言\n * @default \"zh-CN\"\n */\n defaultLocale?: string;\n\n /**\n * 支持的语言列表\n * @default [\"zh-CN\", \"en-US\"]\n */\n locales?: string[];\n\n /**\n * 翻译 JSON 文件目录(相对于项目根目录)\n * 非默认语言的 JSON 翻译文件存放位置\n * @default \"locales\"\n */\n localesDir?: string;\n\n /**\n * 默认语言 TS 源文件目录(相对于项目根目录)\n * 开发者在此编写 TypeScript 翻译源文件,作为 i18n 的 single source of truth\n * @default \"src/locales/default\"\n */\n sourceDir?: string;\n\n /**\n * 默认命名空间\n * @default [\"common\"]\n */\n defaultNS?: string[];\n\n /**\n * 是否自动生成初始脚手架文件\n * @default true\n */\n autoScaffold?: boolean;\n}\n\n/**\n * 国际化插件(TS-first 工作流)\n *\n * 开发流程:\n * 1. 开发者在 src/locales/default/ 中编写 TypeScript 翻译源文件(有类型推导 + IDE 补全)\n * 2. 运行 `pnpm i18n:gen` 将 TS 源文件转换为 locales/{defaultLocale}/*.json\n * 3. 运行 `pnpm i18n` 使用 @lobehub/i18n-cli 将默认语言 JSON 翻译为其他语言\n * 4. 运行时:开发模式下默认语言直接 import TS,其他场景懒加载 JSON\n *\n * @example\n * ```ts\n * import { defineConfig, i18nPlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * i18nPlugin({\n * defaultLocale: \"zh-CN\",\n * locales: [\"zh-CN\", \"en-US\", \"ja-JP\"],\n * }),\n * ],\n * });\n * ```\n */\nexport const i18nPlugin = createPlugin<I18nPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-i18n\",\n version: \"1.0.0\",\n description: \"国际化 (i18next) 插件 — TS-first 工作流\",\n\n setup(context) {\n const {\n defaultLocale = \"zh-CN\",\n locales = [\"zh-CN\", \"en-US\"],\n localesDir = \"locales\",\n sourceDir = \"src/locales/default\",\n defaultNS = [\"common\"],\n autoScaffold = true,\n } = options;\n const { cwd, logger, isDev } = context;\n\n if (autoScaffold) {\n scaffoldSourceFiles(cwd, sourceDir, defaultNS, logger);\n scaffoldResourcesFile(cwd, sourceDir, defaultNS, locales, defaultLocale, logger);\n scaffoldConvertScript(cwd, sourceDir, localesDir, defaultLocale, logger);\n scaffoldI18nRc(cwd, localesDir, defaultLocale, locales, logger);\n scaffoldLocaleJsonDirs(cwd, localesDir, locales, defaultLocale, defaultNS, logger);\n }\n\n const hooks: PluginHooks = {\n modifyRspackConfig(rspackConfig) {\n const aliases = (rspackConfig.resolve?.alias || {}) as Record<string, string>;\n if (!aliases[\"@locales\"]) {\n aliases[\"@locales\"] = join(cwd, localesDir);\n }\n rspackConfig.resolve = { ...rspackConfig.resolve, alias: aliases };\n return rspackConfig;\n },\n\n generateFiles(_ctx: GeneratorContext): GeneratedFile[] {\n return [\n {\n path: \"i18n.ts\",\n content: generateI18nCode({\n defaultLocale,\n locales,\n localesDir,\n sourceDir,\n defaultNS,\n isDev,\n }),\n },\n ];\n },\n\n injectBootstrap(_ctx: GeneratorContext): CodeInjection {\n return {\n imports: [`import { initI18n } from \"./i18n\";`],\n topLevel: [`await initI18n();`],\n };\n },\n };\n\n return hooks;\n },\n}));\n\n// ============ 代码生成 ============\n\nfunction generateI18nCode(opts: {\n defaultLocale: string;\n locales: string[];\n localesDir: string;\n sourceDir: string;\n defaultNS: string[];\n isDev: boolean;\n}): string {\n const { defaultLocale, locales, defaultNS, sourceDir } = opts;\n\n // sourceDir = \"src/locales/default\"\n // → defaultDirAlias = \"locales/default\" (相对于 @/ 的路径)\n // → parentDirAlias = \"locales\" (resources.ts 所在目录)\n const defaultDirAlias = sourceDir.replace(/^src\\//, \"\");\n const parentDirAlias = defaultDirAlias.replace(/\\/[^/]+$/, \"\");\n\n return `// 此文件由 @4399ywkf/plugin-i18n 自动生成\nimport i18n from \"i18next\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\nimport resourcesToBackend from \"i18next-resources-to-backend\";\nimport { initReactI18next } from \"react-i18next\";\nimport { normalizeLocale, SUPPORTED_LOCALES, DEFAULT_LOCALE } from \"@/${parentDirAlias}/resources\";\n\nexport { DEFAULT_LOCALE, SUPPORTED_LOCALES, normalizeLocale };\nexport type { SupportedLocale, NS } from \"@/${parentDirAlias}/resources\";\n\nconst isDev = process.env.NODE_ENV === \"development\";\n\nconst instance = i18n\n .use(initReactI18next)\n .use(LanguageDetector)\n .use(\n resourcesToBackend(async (lng: string, ns: string) => {\n const normalizedLng = normalizeLocale(lng);\n\n // 开发模式下,默认语言直接 import TS(即时生效,无需先生成 JSON)\n if (isDev && normalizedLng === \"${defaultLocale}\") {\n return import(\"@/${defaultDirAlias}/\" + ns);\n }\n\n // 其他语言 / 生产模式:懒加载 JSON\n return import(\n /* webpackInclude: /\\\\.json$/ */\n /* webpackChunkName: \"locales-[request]\" */\n \\`@locales/\\${normalizedLng}/\\${ns}.json\\`\n );\n })\n );\n\nlet initialized = false;\n\nexport async function initI18n(lang?: string): Promise<typeof i18n> {\n if (initialized) return instance;\n\n await instance.init({\n defaultNS: ${JSON.stringify(defaultNS)},\n fallbackLng: DEFAULT_LOCALE,\n interpolation: { escapeValue: false },\n lng: lang,\n });\n\n initialized = true;\n return instance;\n}\n\nexport { instance as i18n };\nexport default instance;\n`;\n}\n\n// ============ 脚手架:TS 源文件 ============\n\nfunction scaffoldSourceFiles(\n cwd: string,\n sourceDir: string,\n namespaces: string[],\n logger: { info: (msg: string) => void },\n): void {\n const dir = join(cwd, sourceDir);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n for (const ns of namespaces) {\n const filePath = join(dir, `${ns}.ts`);\n if (!existsSync(filePath)) {\n writeFileSync(filePath, buildDefaultNsFile(ns), \"utf-8\");\n logger.info(`已生成翻译源文件: ${sourceDir}/${ns}.ts`);\n }\n }\n\n // 生成 index.ts barrel\n const indexPath = join(dir, \"index.ts\");\n if (!existsSync(indexPath)) {\n const imports = namespaces.map((ns) => `import ${ns} from \"./${ns}\";`).join(\"\\n\");\n const entries = namespaces.join(\",\\n \");\n const content = `${imports}\n\nconst resources = {\n ${entries},\n} as const;\n\nexport default resources;\n`;\n writeFileSync(indexPath, content, \"utf-8\");\n logger.info(`已生成翻译索引: ${sourceDir}/index.ts`);\n }\n}\n\nfunction buildDefaultNsFile(ns: string): string {\n if (ns === \"common\") {\n return `export default {\n welcome: \"欢迎使用\",\n loading: \"加载中...\",\n confirm: \"确定\",\n cancel: \"取消\",\n save: \"保存\",\n delete: \"删除\",\n edit: \"编辑\",\n back: \"返回\",\n} as const;\n`;\n }\n\n return `export default {\n title: \"${ns}\",\n} as const;\n`;\n}\n\n// ============ 脚手架:resources.ts 类型文件 ============\n\nfunction scaffoldResourcesFile(\n cwd: string,\n sourceDir: string,\n _namespaces: string[],\n locales: string[],\n defaultLocale: string,\n logger: { info: (msg: string) => void },\n): void {\n const parentDir = join(cwd, sourceDir, \"..\");\n const filePath = join(parentDir, \"resources.ts\");\n if (existsSync(filePath)) return;\n\n const content = `import resources from \"./default\";\n\nexport const DEFAULT_LOCALE = \"${defaultLocale}\";\n\nexport const SUPPORTED_LOCALES = ${JSON.stringify(locales)} as const;\n\nexport type SupportedLocale = (typeof SUPPORTED_LOCALES)[number];\n\nexport type DefaultResources = typeof resources;\n\nexport type NS = keyof DefaultResources;\n\nexport const normalizeLocale = (locale?: string): SupportedLocale => {\n if (!locale) return DEFAULT_LOCALE as SupportedLocale;\n\n for (const l of SUPPORTED_LOCALES) {\n if (l.startsWith(locale) || locale.startsWith(l.split(\"-\")[0])) {\n return l;\n }\n }\n\n return DEFAULT_LOCALE as SupportedLocale;\n};\n\nexport const localeOptions = ${JSON.stringify(\n locales.map((l) => ({ value: l, label: getLocaleLabel(l) })),\n null,\n 2,\n )} as const;\n`;\n\n writeFileSync(filePath, content, \"utf-8\");\n logger.info(`已生成类型文件: ${sourceDir}/../resources.ts`);\n}\n\nfunction getLocaleLabel(locale: string): string {\n const map: Record<string, string> = {\n \"zh-CN\": \"简体中文\",\n \"zh-TW\": \"繁體中文\",\n \"en-US\": \"English\",\n \"ja-JP\": \"日本語\",\n \"ko-KR\": \"한국어\",\n \"de-DE\": \"Deutsch\",\n \"fr-FR\": \"Français\",\n \"es-ES\": \"Español\",\n \"pt-BR\": \"Português\",\n \"ru-RU\": \"Русский\",\n \"it-IT\": \"Italiano\",\n \"vi-VN\": \"Tiếng Việt\",\n ar: \"العربية\",\n };\n return map[locale] || locale;\n}\n\n// ============ 脚手架:转换脚本 ============\n\nfunction scaffoldConvertScript(\n cwd: string,\n sourceDir: string,\n localesDir: string,\n defaultLocale: string,\n logger: { info: (msg: string) => void },\n): void {\n const scriptsDir = join(cwd, \"scripts\");\n const scriptPath = join(scriptsDir, \"i18n-gen.js\");\n if (existsSync(scriptPath)) return;\n\n if (!existsSync(scriptsDir)) {\n mkdirSync(scriptsDir, { recursive: true });\n }\n\n const content = `const fs = require(\"fs\");\nconst path = require(\"path\");\n\nconst sourceDir = path.join(__dirname, \"../${sourceDir}\");\nconst targetDir = path.join(__dirname, \"../${localesDir}/${defaultLocale}\");\n\nconst files = fs\n .readdirSync(sourceDir)\n .filter((file) => file.endsWith(\".ts\") && file !== \"index.ts\")\n .map((file) => path.basename(file, \".ts\"));\n\nrequire(\"ts-node/register\");\n\nif (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n}\n\nconsole.log(\"开始转换 TypeScript 文件到 JSON...\\\\n\");\n\nfiles.forEach((fileName) => {\n try {\n const modulePath = path.join(sourceDir, \\`\\${fileName}.ts\\`);\n delete require.cache[require.resolve(modulePath)];\n const moduleContent = require(modulePath).default;\n const jsonContent = JSON.stringify(moduleContent, null, 2);\n const targetPath = path.join(targetDir, \\`\\${fileName}.json\\`);\n fs.writeFileSync(targetPath, jsonContent, \"utf8\");\n console.log(\\` \\${fileName}.ts → \\${fileName}.json\\`);\n } catch (error) {\n console.error(\\` 转换 \\${fileName}.ts 失败:\\`, error.message);\n }\n});\n\nconsole.log(\"\\\\n转换完成!\");\n`;\n\n writeFileSync(scriptPath, content, \"utf-8\");\n logger.info(\"已生成转换脚本: scripts/i18n-gen.js\");\n}\n\n// ============ 脚手架:.i18nrc.js(@lobehub/i18n-cli 配置) ============\n\nfunction scaffoldI18nRc(\n cwd: string,\n localesDir: string,\n defaultLocale: string,\n locales: string[],\n logger: { info: (msg: string) => void },\n): void {\n const filePath = join(cwd, \".i18nrc.js\");\n if (existsSync(filePath)) return;\n\n const outputLocales = locales\n .filter((l) => l !== defaultLocale)\n .map((l) => `\"${l}\"`)\n .join(\", \");\n\n const content = `const { defineConfig } = require(\"@lobehub/i18n-cli\");\n\nmodule.exports = defineConfig({\n entry: \"${localesDir}/${defaultLocale}\",\n entryLocale: \"${defaultLocale}\",\n output: \"${localesDir}\",\n outputLocales: [${outputLocales}],\n});\n`;\n\n writeFileSync(filePath, content, \"utf-8\");\n logger.info(\"已生成翻译配置: .i18nrc.js(@lobehub/i18n-cli)\");\n}\n\n// ============ 脚手架:非默认语言的 JSON 目录 ============\n\nfunction scaffoldLocaleJsonDirs(\n cwd: string,\n localesDir: string,\n locales: string[],\n defaultLocale: string,\n namespaces: string[],\n logger: { info: (msg: string) => void },\n): void {\n const baseDir = join(cwd, localesDir);\n\n for (const locale of locales) {\n const localeDir = join(baseDir, locale);\n if (!existsSync(localeDir)) {\n mkdirSync(localeDir, { recursive: true });\n }\n\n // 只为非默认语言生成占位 JSON(默认语言由脚本从 TS 生成)\n if (locale === defaultLocale) continue;\n\n for (const ns of namespaces) {\n const filePath = join(localeDir, `${ns}.json`);\n if (!existsSync(filePath)) {\n const placeholder =\n ns === \"common\"\n ? JSON.stringify(\n {\n welcome: \"Welcome\",\n loading: \"Loading...\",\n confirm: \"OK\",\n cancel: \"Cancel\",\n save: \"Save\",\n delete: \"Delete\",\n edit: \"Edit\",\n back: \"Back\",\n },\n null,\n 2,\n )\n : JSON.stringify({ title: ns }, null, 2);\n writeFileSync(filePath, `${placeholder}\\n`, \"utf-8\");\n logger.info(`已生成翻译文件: ${localesDir}/${locale}/${ns}.json`);\n }\n }\n }\n}\n\nexport default i18nPlugin;\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { createPlugin } from \"../define.js\";\nimport type { PluginHooks } from \"../types.js\";\n\nexport interface MockPluginOptions {\n /** Mock 文件目录 */\n mockDir?: string;\n /** 是否在生产环境启用 */\n enableInProd?: boolean;\n /** 延迟时间(模拟网络延迟) */\n delay?: number;\n /** 前缀路径 */\n prefix?: string;\n}\n\n/**\n * Mock 数据插件\n *\n * @example\n * ```ts\n * // ywkf.config.ts\n * import { mockPlugin } from \"@4399ywkf/core/plugin\";\n *\n * export default defineConfig({\n * plugins: [\n * mockPlugin({\n * mockDir: \"mock\",\n * prefix: \"/api\",\n * }),\n * ],\n * });\n * ```\n *\n * Mock 文件示例 (mock/user.ts):\n * ```ts\n * export default {\n * \"GET /api/users\": [\n * { id: 1, name: \"张三\" },\n * ],\n * \"POST /api/users\": (req, res) => {\n * res.json({ success: true });\n * },\n * };\n * ```\n */\nexport const mockPlugin = createPlugin<MockPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-mock\",\n version: \"1.0.0\",\n description: \"Mock 数据插件\",\n\n setup(context) {\n const { mockDir = \"mock\", enableInProd = false, delay = 0, prefix = \"\" } = options;\n const { cwd, isDev, logger } = context;\n\n // 生产环境且未启用则跳过\n if (!isDev && !enableInProd) {\n logger.info(\"生产环境已禁用 Mock\");\n return {};\n }\n\n const mockPath = resolve(cwd, mockDir);\n\n // 检查 mock 目录是否存在\n if (!existsSync(mockPath)) {\n logger.warn(`Mock 目录不存在: ${mockPath}`);\n return {};\n }\n\n const hooks: PluginHooks = {\n modifyRspackConfig(rspackConfig) {\n // 配置 devServer proxy 以支持 mock\n if (isDev && rspackConfig.devServer) {\n const mockFiles = scanMockFiles(mockPath);\n logger.info(`找到 ${mockFiles.length} 个 Mock 文件`);\n\n // 添加 mock 中间件配置\n rspackConfig.devServer.setupMiddlewares = (middlewares, _devServer) => {\n // 在其他中间件之前添加 mock 处理\n middlewares.unshift({\n name: \"mock-middleware\",\n middleware: createMockMiddleware(mockPath, { delay, prefix, logger }),\n });\n return middlewares;\n };\n }\n\n return rspackConfig;\n },\n\n beforeDevServer() {\n logger.info(`Mock 已启用,目录: ${mockPath}`);\n if (delay > 0) {\n logger.info(`模拟延迟: ${delay}ms`);\n }\n },\n };\n\n return hooks;\n },\n}));\n\n/**\n * 扫描 mock 文件\n */\nfunction scanMockFiles(dir: string): string[] {\n const files: string[] = [];\n\n if (!existsSync(dir)) {\n return files;\n }\n\n const entries = readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n\n if (stat.isFile() && /\\.(ts|js|mjs)$/.test(entry)) {\n files.push(fullPath);\n } else if (stat.isDirectory()) {\n files.push(...scanMockFiles(fullPath));\n }\n }\n\n return files;\n}\n\n/**\n * 创建 mock 中间件\n */\nfunction createMockMiddleware(\n mockPath: string,\n options: { delay: number; prefix: string; logger: { info: (msg: string) => void } },\n): (req: unknown, res: unknown, next: () => void) => Promise<void> {\n const { delay } = options;\n\n // 加载所有 mock 文件\n scanMockFiles(mockPath);\n\n return async (_req: unknown, _res: unknown, next: () => void) => {\n // 简化实现:实际应该加载 mock 文件并匹配请求\n // 这里直接传递给下一个中间件\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n next();\n };\n}\n\nexport default mockPlugin;\n","import { createPlugin } from \"../define.js\";\nimport type { CodeInjection, GeneratedFile, GeneratorContext, PluginHooks } from \"../types.js\";\n\nexport interface ReactQueryPluginOptions {\n /**\n * 默认 staleTime(毫秒)\n * @default 5 * 60 * 1000 (5 分钟)\n */\n staleTime?: number;\n\n /**\n * 默认 gcTime(毫秒)\n * @default 10 * 60 * 1000 (10 分钟)\n */\n gcTime?: number;\n\n /**\n * 默认重试次数\n * @default 1\n */\n retry?: number | boolean;\n\n /**\n * 是否开启 React Query DevTools(仅开发模式生效)\n * @default true\n */\n devtools?: boolean;\n\n /**\n * axios baseURL\n * @default \"\"\n */\n baseURL?: string;\n\n /**\n * 请求超时时间(毫秒)\n * @default 15000\n */\n timeout?: number;\n}\n\n/**\n * React Query + Axios 请求层插件\n *\n * - 自动注入 QueryClientProvider\n * - 生成 .ywkf/query-client.ts(QueryClient 实例 + 默认配置)\n * - 生成 .ywkf/request.ts(axios 封装 + 拦截器骨架)\n * - 开发模式可选开启 React Query DevTools\n *\n * @example\n * ```ts\n * import { defineConfig, reactQueryPlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * reactQueryPlugin({ staleTime: 5 * 60 * 1000 }),\n * ],\n * });\n * ```\n */\nexport const reactQueryPlugin = createPlugin<ReactQueryPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-react-query\",\n version: \"1.0.0\",\n description: \"React Query + Axios 请求层集成\",\n\n setup(context) {\n const {\n staleTime = 5 * 60 * 1000,\n gcTime = 10 * 60 * 1000,\n retry = 1,\n devtools = true,\n baseURL = \"\",\n timeout = 15000,\n } = options;\n\n const { logger, isDev } = context;\n\n const hooks: PluginHooks = {\n generateFiles(_ctx: GeneratorContext): GeneratedFile[] {\n logger.info(\"React Query 已启用\");\n\n const files: GeneratedFile[] = [\n {\n path: \"query-client.ts\",\n content: buildQueryClientFile({ staleTime, gcTime, retry, devtools, isDev }),\n },\n {\n path: \"request.ts\",\n content: buildRequestFile({ baseURL, timeout }),\n },\n ];\n\n return files;\n },\n\n injectBootstrap(_ctx: GeneratorContext): CodeInjection {\n return {\n imports: [\n `import { QueryClientProvider } from \"@tanstack/react-query\";`,\n `import { queryClient } from \"./query-client\";`,\n ],\n topLevel: [`// React Query Provider(由 @4399ywkf/plugin-react-query 注入)`],\n };\n },\n\n modifyBootstrapCode(code: string): string {\n // 在 createAppConfig 的 providers 数组中注入 QueryClientProvider\n const providerEntry = ` {\n component: QueryClientProvider as React.ComponentType<{ children: React.ReactNode }>,\n props: { client: queryClient },\n order: 20,\n }`;\n\n // 查找 providers: [] 并注入\n if (code.includes(\"providers: []\")) {\n code = code.replace(\"providers: []\", `providers: [\\n${providerEntry},\\n ]`);\n } else if (code.includes(\"providers: [\")) {\n code = code.replace(\"providers: [\", `providers: [\\n${providerEntry},`);\n }\n\n // 补充 React import(用于类型断言)\n if (!code.includes(\"import React\")) {\n code = code.replace(\n `import { bootstrap`,\n `import React from \"react\";\\nimport { bootstrap`,\n );\n }\n\n return code;\n },\n };\n\n return hooks;\n },\n}));\n\nfunction buildQueryClientFile(opts: {\n staleTime: number;\n gcTime: number;\n retry: number | boolean;\n devtools: boolean;\n isDev: boolean;\n}): string {\n const { staleTime, gcTime, retry, devtools, isDev } = opts;\n\n return `// 此文件由 @4399ywkf/plugin-react-query 自动生成\nimport { QueryClient } from \"@tanstack/react-query\";\n\n/**\n * 全局 QueryClient 实例\n *\n * 默认配置可在 ywkf.config.ts 的 reactQueryPlugin 选项中修改。\n * 运行时自定义可通过 src/app.config.ts 覆盖。\n */\nexport const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: ${staleTime},\n gcTime: ${gcTime},\n retry: ${typeof retry === \"boolean\" ? retry : retry},\n refetchOnWindowFocus: false,\n },\n mutations: {\n retry: false,\n },\n },\n});\n\nexport default queryClient;\n`;\n}\n\nfunction buildRequestFile(opts: { baseURL: string; timeout: number }): string {\n const { baseURL, timeout } = opts;\n\n return `// 此文件由 @4399ywkf/plugin-react-query 自动生成,请勿手动修改\n// 如需定制拦截器,请编辑 src/request.ts\nimport axios from \"axios\";\nimport qs from \"qs\";\nimport type { AxiosInstance, AxiosRequestConfig, InternalAxiosRequestConfig, AxiosResponse, AxiosError } from \"axios\";\nimport type { RequestConfig, Result } from \"@4399ywkf/core/runtime\";\n\n// ============ 加载用户配置 ============\n\nlet userConfig: RequestConfig = {};\n\ntry {\n const mod = require(\"@/request\");\n userConfig = mod.default || mod;\n} catch {\n // src/request.ts 不存在,使用默认配置\n}\n\n// ============ 参数序列化(GET 请求专用)============\n\n/**\n * GET 请求参数序列化规则:\n * - 数组:repeat 模式(key=1&key=2)\n * - 对象:JSON.stringify 后作为字符串传递\n * - null / undefined:skipNulls 跳过\n * - 基本类型:原样传递\n */\nexport function paramsSerializer(params: Record<string, any>): string {\n const normalized: Record<string, any> = {};\n\n Object.keys(params).forEach((key) => {\n const value = params[key];\n\n if (value === null || value === undefined) {\n normalized[key] = value;\n } else if (Array.isArray(value)) {\n normalized[key] = value;\n } else if (typeof value === \"object\") {\n normalized[key] = JSON.stringify(value);\n } else {\n normalized[key] = value;\n }\n });\n\n return qs.stringify(normalized, { arrayFormat: \"repeat\", skipNulls: true });\n}\n\n// ============ 创建 Axios 实例 ============\n\nconst instance: AxiosInstance = axios.create({\n baseURL: userConfig.baseURL ?? (\"${baseURL}\" || \"\"),\n timeout: userConfig.timeout ?? ${timeout},\n withCredentials: userConfig.withCredentials ?? false,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(userConfig.headers || {}),\n },\n});\n\n// ============ 请求拦截器 ============\n\ninstance.interceptors.request.use(\n (config: InternalAxiosRequestConfig) => {\n // 1. Token 注入\n if (userConfig.getToken) {\n const token = userConfig.getToken();\n if (token && config.headers) {\n const prefix = userConfig.tokenPrefix ?? \"Bearer\";\n config.headers.Authorization = prefix ? \\`\\${prefix} \\${token}\\` : token;\n }\n } else {\n // 默认:从 localStorage 读取\n const token = typeof localStorage !== \"undefined\"\n ? localStorage.getItem(\"token\")\n : null;\n if (token && config.headers) {\n config.headers.Authorization = \\`Bearer \\${token}\\`;\n }\n }\n\n // 2. 用户自定义请求拦截\n if (userConfig.requestInterceptor) {\n return userConfig.requestInterceptor(config as any) as any;\n }\n\n return config;\n },\n (error: AxiosError) => Promise.reject(error)\n);\n\n// ============ 响应拦截器 ============\n\ninstance.interceptors.response.use(\n (response: AxiosResponse) => {\n // 用户自定义响应拦截\n if (userConfig.responseInterceptor) {\n return userConfig.responseInterceptor(response as any);\n }\n\n // 默认:直接返回 response.data\n return response.data;\n },\n (error: AxiosError) => {\n // 用户自定义错误处理\n if (userConfig.errorHandler) {\n return userConfig.errorHandler(error as any);\n }\n\n // 默认错误处理\n const status = error.response?.status;\n\n switch (status) {\n case 401:\n console.warn(\"[request] 未授权,请重新登录\");\n break;\n case 403:\n console.warn(\"[request] 无访问权限\");\n break;\n case 500:\n console.error(\"[request] 服务器内部错误\");\n break;\n default:\n if (!error.response) {\n console.error(\"[request] 网络异常,请检查网络连接\");\n }\n }\n\n return Promise.reject(error);\n }\n);\n\n// ============ 请求封装类 ============\n\ntype ExtraConfig = AxiosRequestConfig & { suppressErrorNotification?: boolean };\n\nclass Request {\n constructor(private readonly http: AxiosInstance) {}\n\n get<T = any>(url: string, params?: Record<string, any>, config?: ExtraConfig): Promise<Result<T>> {\n return this.http.get(url, {\n ...config,\n params,\n paramsSerializer,\n });\n }\n\n post<T = any>(url: string, data?: any, config?: ExtraConfig): Promise<Result<T>> {\n return this.http.post(url, data, config);\n }\n\n put<T = any>(url: string, data?: any, config?: ExtraConfig): Promise<Result<T>> {\n return this.http.put(url, data, config);\n }\n\n delete<T = any>(url: string, params?: Record<string, any>, config?: ExtraConfig): Promise<Result<T>> {\n return this.http.delete(url, {\n ...config,\n params,\n paramsSerializer,\n });\n }\n\n patch<T = any>(url: string, data?: any, config?: ExtraConfig): Promise<Result<T>> {\n return this.http.patch(url, data, config);\n }\n}\n\n// ============ 导出 ============\n\nexport const request = new Request(instance);\nexport type { Result };\nexport default request;\n`;\n}\n\nexport default reactQueryPlugin;\n","import { existsSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { rspack } from \"@rspack/core\";\nimport { createPlugin } from \"../define.js\";\nimport type { CodeInjection, GeneratedFile, GeneratorContext, PluginHooks } from \"../types.js\";\n\nexport interface TailwindPluginOptions {\n /**\n * 自定义暗色模式选择器\n * @default '&:where([data-theme=\"dark\"], [data-theme=\"dark\"] *)'\n */\n darkModeSelector?: string;\n\n /**\n * 是否生成 postcss.config.js(如果不存在)\n * @default true\n */\n autoConfig?: boolean;\n\n /**\n * 额外的 CSS 内容(追加到 index.css 之后)\n */\n extraCSS?: string;\n}\n\n/**\n * Tailwind CSS 插件\n *\n * 自动配置 Tailwind CSS:\n * - 注入 `@import \"tailwindcss\"` 到 index.css\n * - 确保 postcss.config.js 存在\n * - 修改 Rspack 配置添加 postcss-loader\n *\n * @example\n * ```ts\n * import { defineConfig, tailwindPlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * tailwindPlugin(),\n * ],\n * });\n * ```\n */\nexport const tailwindPlugin = createPlugin<TailwindPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-tailwind\",\n version: \"1.0.0\",\n description: \"Tailwind CSS 集成插件\",\n\n setup(context) {\n const {\n darkModeSelector = '&:where([data-theme=\"dark\"], [data-theme=\"dark\"] *)',\n autoConfig = true,\n extraCSS = \"\",\n } = options;\n const { cwd, logger } = context;\n\n // 确保 postcss.config.js 存在\n if (autoConfig) {\n ensurePostcssConfig(cwd, logger);\n }\n\n const hooks: PluginHooks = {\n modifyRspackConfig(rspackConfig) {\n logger.info(\"Tailwind CSS 已启用\");\n\n // 在 module.rules 中添加 .ywkf/tailwind.css 的 postcss-loader 规则\n const rules = rspackConfig.module?.rules || [];\n const postcssConfigPath = join(cwd, \"postcss.config.js\");\n\n // 根据 mode 选择 style-loader 或 CssExtractRspackPlugin.loader\n const isProd = rspackConfig.mode === \"production\";\n\n const tailwindRule = {\n test: /tailwind\\.css$/,\n use: [\n isProd ? rspack.CssExtractRspackPlugin.loader : \"style-loader\",\n \"css-loader\",\n {\n loader: \"postcss-loader\",\n options: {\n postcssOptions: {\n config: postcssConfigPath,\n },\n },\n },\n ],\n };\n\n rules.unshift(tailwindRule);\n rspackConfig.module = { ...rspackConfig.module, rules };\n\n return rspackConfig;\n },\n\n generateFiles(_ctx: GeneratorContext): GeneratedFile[] {\n const cssContent = buildTailwindCSS(darkModeSelector, extraCSS);\n return [\n {\n path: \"tailwind.css\",\n content: cssContent,\n },\n ];\n },\n\n injectEntry(_ctx: GeneratorContext): CodeInjection {\n return {\n imports: [`import \"./tailwind.css\";`],\n };\n },\n };\n\n return hooks;\n },\n}));\n\nfunction buildTailwindCSS(darkModeSelector: string, extraCSS: string): string {\n return `/* 此文件由 @4399ywkf/plugin-tailwind 自动生成 */\n@import \"tailwindcss\";\n@variant dark (${darkModeSelector});\n${extraCSS ? `\\n${extraCSS}` : \"\"}\n`;\n}\n\nfunction ensurePostcssConfig(cwd: string, logger: { info: (msg: string) => void }): void {\n const configPath = join(cwd, \"postcss.config.js\");\n if (!existsSync(configPath)) {\n writeFileSync(\n configPath,\n `module.exports = {\\n plugins: {\\n \"@tailwindcss/postcss\": {},\\n },\\n};\\n`,\n \"utf-8\",\n );\n logger.info(\"已自动生成 postcss.config.js\");\n }\n}\n\nexport default tailwindPlugin;\n","import { join } from \"node:path\";\nimport { createPlugin } from \"../define.js\";\nimport type {\n CodeInjection,\n GeneratedFile,\n GeneratorContext,\n PluginHooks,\n} from \"../types.js\";\n\nexport interface ThemePluginOptions {\n /**\n * 是否启用暗色模式切换能力\n * @default true\n */\n darkMode?: boolean;\n\n /**\n * 默认主题模式(运行时可通过 useThemeStore 动态切换)\n * @default \"light\"\n */\n defaultAppearance?: \"light\" | \"dark\" | \"auto\";\n\n /**\n * 主色调(Lobe-UI 命名预设,运行时可通过 useThemeStore 动态切换)\n *\n * 不设置时使用 Lobe-UI 默认 primary 色阶(黑色系),\n * 可选值:\"blue\" | \"cyan\" | \"geekblue\" | \"gold\" | \"green\" | \"lime\"\n * | \"magenta\" | \"orange\" | \"purple\" | \"red\" | \"volcano\" | \"yellow\"\n *\n * @default undefined\n */\n primaryColor?: string;\n\n /**\n * 中性色(Lobe-UI 命名预设)\n *\n * 可选值:\"mauve\" | \"olive\" | \"sage\" | \"sand\" | \"slate\"\n *\n * @default undefined\n */\n neutralColor?: string;\n\n /**\n * antd 组件前缀\n *\n * 支持三种配置方式(优先级从高到低):\n * 1. 运行时环境变量 process.env.YWKF_PREFIX_CLS\n * 2. 插件选项中直接指定\n * 3. 默认值 \"ant\"\n *\n * @default \"ant\"\n */\n prefixCls?: string;\n\n /**\n * 是否启用 CSS 变量\n * @default true\n */\n cssVar?: boolean;\n\n /**\n * 是否注入全局样式重置\n * @default true\n */\n globalReset?: boolean;\n\n /**\n * 是否启用外部主题注入(微前端场景)\n *\n * 启用后:\n * - 应用启动时读取 window.__YWKF_THEME__ 作为初始覆盖\n * - 监听 ywkf:theme-change 自定义事件,实现运行时主题同步\n *\n * @default false\n */\n externalTheme?: boolean;\n\n}\n\n/**\n * 响应式主题系统插件\n *\n * 基于 antd-style + @4399ywkf/theme-system + Zustand 提供运行时可变的主题管理:\n * - 使用 Lobe-UI 色彩体系(13 阶色阶 + 自定义算法)\n * - 支持 PrimaryColors / NeutralColors 命名预设\n * - 亮/暗色/跟随系统自动切换\n * - 支持微前端场景主应用注入主题\n *\n * @example\n * ```ts\n * import { defineConfig, themePlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * themePlugin({\n * defaultAppearance: \"light\",\n * primaryColor: \"geekblue\",\n * neutralColor: \"slate\",\n * prefixCls: \"my-app\",\n * }),\n * ],\n * });\n * ```\n */\nexport const themePlugin = createPlugin<ThemePluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-theme\",\n version: \"3.0.0\",\n description: \"Lobe-UI 风格响应式主题系统插件\",\n\n setup(context) {\n const {\n darkMode = true,\n defaultAppearance = \"light\",\n primaryColor,\n neutralColor,\n prefixCls = \"ant\",\n cssVar = true,\n globalReset = true,\n externalTheme = false,\n } = options;\n const { logger } = context;\n\n logger.info(\n `主题模式: ${defaultAppearance}, 主色: ${\n primaryColor ?? \"primary(默认黑)\"\n }, 响应式: ✓`,\n );\n\n const hooks: PluginHooks = {\n modifyRspackConfig(config, ctx) {\n const themePath = join(ctx.cwd, \".ywkf\", \"theme.tsx\");\n const currentAlias = (config.resolve?.alias ?? {}) as Record<\n string,\n string\n >;\n config.resolve = {\n ...config.resolve,\n alias: {\n ...currentAlias,\n \"@ywkf/theme\": themePath,\n },\n };\n return config;\n },\n\n generateFiles(_ctx: GeneratorContext): GeneratedFile[] {\n return [\n {\n path: \"theme.tsx\",\n content: generateThemeProvider({\n darkMode,\n defaultAppearance,\n primaryColor,\n neutralColor,\n prefixCls,\n cssVar,\n globalReset,\n externalTheme,\n }),\n },\n ];\n },\n\n injectBootstrap(_ctx: GeneratorContext): CodeInjection {\n return {\n imports: [`import { ThemeWrapper } from \"./theme\";`],\n };\n },\n\n modifyBootstrapCode(code: string): string {\n const providerEntry = ` {\n component: ThemeWrapper as React.ComponentType<{ children: React.ReactNode }>,\n props: {},\n order: 10,\n }`;\n\n if (code.includes(\"providers: []\")) {\n code = code.replace(\n \"providers: []\",\n `providers: [\\n${providerEntry},\\n ]`,\n );\n } else if (code.includes(\"providers: [\")) {\n code = code.replace(\n \"providers: [\",\n `providers: [\\n${providerEntry},`,\n );\n }\n\n if (!code.includes(\"import React\")) {\n code = code.replace(\n `import { bootstrap`,\n `import React from \"react\";\\nimport { bootstrap`,\n );\n }\n\n return code;\n },\n };\n\n return hooks;\n },\n}));\n\n// ═══════════════════════════════════════════════════════════\n// Code Generator\n// ═══════════════════════════════════════════════════════════\n\ninterface GenerateOptions {\n darkMode: boolean;\n defaultAppearance: string;\n primaryColor?: string;\n neutralColor?: string;\n prefixCls: string;\n cssVar: boolean;\n globalReset: boolean;\n externalTheme: boolean;\n}\n\nfunction generateThemeProvider(opts: GenerateOptions): string {\n const {\n darkMode,\n defaultAppearance,\n primaryColor,\n neutralColor,\n prefixCls,\n cssVar,\n globalReset,\n externalTheme,\n } = opts;\n\n const sections: string[] = [];\n\n sections.push(`// 此文件由 @4399ywkf/plugin-theme v3 自动生成,请勿手动修改`);\n sections.push(buildImports({ globalReset, cssVar }));\n sections.push(TYPES_CODE);\n sections.push(\n buildStoreCode({ defaultAppearance, primaryColor, neutralColor }),\n );\n sections.push(HOOKS_CODE);\n\n if (globalReset) sections.push(GLOBAL_RESET_CODE);\n if (cssVar) sections.push(buildCssVarSyncCode());\n if (darkMode) sections.push(APPEARANCE_SYNC_CODE);\n if (externalTheme) sections.push(EXTERNAL_THEME_CODE);\n\n sections.push(\n buildWrapperCode({\n darkMode,\n cssVar,\n globalReset,\n externalTheme,\n prefixCls,\n }),\n );\n\n return sections.join(\"\\n\");\n}\n\n// ── Import Builder ──\n\nfunction buildImports(opts: { globalReset: boolean; cssVar: boolean }): string {\n const reactImports = [\n \"useCallback\",\n \"useEffect\",\n \"useMemo\",\n \"useState\",\n ...(opts.cssVar ? [\"useLayoutEffect\", \"useRef\"] : []),\n \"type ReactNode\",\n ];\n\n const antdStyleImports = [\n \"ThemeProvider as AntdThemeProvider\",\n \"StyleProvider\",\n \"type GetAntdTheme\",\n ...(opts.globalReset ? [\"createGlobalStyle\", \"css\"] : []),\n ];\n\n return `\nimport React, { ${reactImports.join(\", \")} } from \"react\";\nimport { ${antdStyleImports.join(\", \")} } from \"antd-style\";\nimport { createWithEqualityFn } from \"zustand/traditional\";\nimport { shallow } from \"zustand/shallow\";\nimport { createThemeConfig, type PrimaryColors, type NeutralColors } from \"@4399ywkf/theme-system\";`;\n}\n\n// ── Types ──\n\nconst TYPES_CODE = `\n// ═══════════════ Types ═══════════════\n\nexport type ThemeAppearance = \"light\" | \"dark\" | \"auto\";\n\nexport interface ThemeState {\n appearance: ThemeAppearance;\n primaryColor?: PrimaryColors;\n neutralColor?: NeutralColors;\n}\n\nexport interface ThemeActions {\n setAppearance: (mode: ThemeAppearance) => void;\n setPrimaryColor: (color: PrimaryColors | undefined) => void;\n setNeutralColor: (color: NeutralColors | undefined) => void;\n setTheme: (partial: Partial<ThemeState>) => void;\n}\n\nexport type ThemeStore = ThemeState & ThemeActions;\n\nexport type { PrimaryColors, NeutralColors };`;\n\n// ── Store Builder ──\n\nfunction buildStoreCode(opts: {\n defaultAppearance: string;\n primaryColor?: string;\n neutralColor?: string;\n}): string {\n const primaryLine = opts.primaryColor\n ? ` primaryColor: \"${opts.primaryColor}\" as PrimaryColors,`\n : ` primaryColor: undefined,`;\n const neutralLine = opts.neutralColor\n ? ` neutralColor: \"${opts.neutralColor}\" as NeutralColors,`\n : ` neutralColor: undefined,`;\n\n return `\n// ═══════════════ Theme Store ═══════════════\n\nconst DEFAULT_THEME: ThemeState = {\n appearance: \"${opts.defaultAppearance}\",\n${primaryLine}\n${neutralLine}\n};\n\nexport const useThemeStore = createWithEqualityFn<ThemeStore>()(\n (set) => ({\n ...DEFAULT_THEME,\n setAppearance: (mode) => set({ appearance: mode }),\n setPrimaryColor: (color) => set({ primaryColor: color }),\n setNeutralColor: (color) => set({ neutralColor: color }),\n setTheme: (partial) => set(partial),\n }),\n shallow,\n);`;\n}\n\n// ── Convenience Hooks ──\n\nconst HOOKS_CODE = `\n// ═══════════════ Convenience Hooks ═══════════════\n\nexport const useTheme = () =>\n useThemeStore(\n (s) => ({\n appearance: s.appearance,\n primaryColor: s.primaryColor,\n neutralColor: s.neutralColor,\n }),\n shallow,\n );\n\nexport const useAppearance = () => useThemeStore((s) => s.appearance);\nexport const usePrimaryColor = () => useThemeStore((s) => s.primaryColor);`;\n\n// ── Global Reset Style ──\n\nconst GLOBAL_RESET_CODE = `\n// ═══════════════ Global Style ═══════════════\n\nconst GlobalReset = createGlobalStyle(({ theme }) => css\\`\n :root {\n --font-settings: \"cv01\", \"tnum\", \"kern\";\n --font-variations: \"opsz\" auto, tabular-nums;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n vertical-align: baseline;\n }\n\n * {\n scrollbar-color: \\${theme.colorFill} transparent;\n scrollbar-width: thin;\n }\n\n html {\n overscroll-behavior: none;\n color-scheme: \\${theme.isDarkMode ? \"dark\" : \"light\"};\n }\n\n html, body, #root, #app {\n height: 100%;\n margin: 0;\n padding: 0;\n }\n\n body {\n overflow: hidden auto;\n min-height: 100vh;\n font-family: \\${theme.fontFamily};\n font-size: \\${theme.fontSize}px;\n font-feature-settings: var(--font-settings);\n font-variation-settings: var(--font-variations);\n line-height: 1;\n color: \\${theme.colorTextBase};\n text-size-adjust: none;\n text-rendering: optimizelegibility;\n word-wrap: break-word;\n background-color: \\${theme.colorBgLayout};\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n -webkit-overflow-scrolling: touch;\n -webkit-tap-highlight-color: transparent;\n }\n\n code {\n font-family: \\${theme.fontFamilyCode} !important;\n }\n\n ::selection {\n color: #000;\n -webkit-text-fill-color: unset !important;\n }\n\\`);`;\n\n// ── CSS Variable Class Sync ──\n\nfunction buildCssVarSyncCode(): string {\n return `\n// ═══════════════ CSS Variable Sync ═══════════════\n\nconst CSS_VAR_CLASS_RE = /(^|-)css-var(-|$)/;\n\nfunction isCssVarClassName(className: string): boolean {\n return CSS_VAR_CLASS_RE.test(className);\n}\n\nfunction useCssVarSync(ref: React.RefObject<HTMLDivElement | null>) {\n useLayoutEffect(() => {\n const node = ref.current;\n if (!node) return;\n\n const htmlEl = document.documentElement;\n let currentClasses: string[] = [];\n\n const sync = () => {\n for (const cls of currentClasses) {\n htmlEl.classList.remove(cls);\n }\n\n const nextSet = new Set<string>();\n let el: HTMLElement | null = node;\n\n while (el && el !== htmlEl) {\n for (const cls of el.classList) {\n if (isCssVarClassName(cls)) {\n nextSet.add(cls);\n }\n }\n el = el.parentElement;\n }\n\n const next = Array.from(nextSet);\n\n for (const cls of next) {\n htmlEl.classList.add(cls);\n }\n\n currentClasses = next;\n };\n\n sync();\n\n const observer = new MutationObserver(sync);\n let el: HTMLElement | null = node;\n while (el && el !== htmlEl) {\n observer.observe(el, { attributeFilter: [\"class\"] });\n el = el.parentElement;\n }\n\n return () => {\n observer.disconnect();\n for (const cls of currentClasses) {\n htmlEl.classList.remove(cls);\n }\n };\n }, []);\n}`;\n}\n\n// ── Appearance Sync ──\n\nconst APPEARANCE_SYNC_CODE = `\n// ═══════════════ Appearance Sync ═══════════════\n\nfunction useAppearanceSync(appearance: ThemeAppearance) {\n useEffect(() => {\n if (appearance !== \"auto\") {\n document.documentElement.dataset.theme = appearance;\n return;\n }\n\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n document.documentElement.dataset.theme = mq.matches ? \"dark\" : \"light\";\n\n function handleChange(e: MediaQueryListEvent) {\n document.documentElement.dataset.theme = e.matches ? \"dark\" : \"light\";\n }\n\n mq.addEventListener(\"change\", handleChange);\n return () => mq.removeEventListener(\"change\", handleChange);\n }, [appearance]);\n}`;\n\n// ── External Theme Injection ──\n\nconst EXTERNAL_THEME_CODE = `\n// ═══════════════ External Theme Injection ═══════════════\n\nfunction useExternalTheme() {\n useEffect(() => {\n const hostTheme = (window as any).__YWKF_THEME__;\n if (hostTheme && typeof hostTheme === \"object\") {\n useThemeStore.getState().setTheme(hostTheme);\n }\n\n const handler = (e: Event) => {\n const detail = (e as CustomEvent<Partial<ThemeState>>).detail;\n if (detail) useThemeStore.getState().setTheme(detail);\n };\n\n window.addEventListener(\"ywkf:theme-change\", handler);\n return () => window.removeEventListener(\"ywkf:theme-change\", handler);\n }, []);\n}`;\n\n// ── Wrapper Builder ──\n\nfunction buildWrapperCode(opts: {\n darkMode: boolean;\n cssVar: boolean;\n globalReset: boolean;\n externalTheme: boolean;\n prefixCls: string;\n}): string {\n const { darkMode, cssVar, globalReset, externalTheme, prefixCls } = opts;\n\n const refLine = cssVar\n ? \"\\n const containerRef = useRef<HTMLDivElement>(null);\"\n : \"\";\n const cssVarSyncLine = cssVar ? \"\\n useCssVarSync(containerRef);\" : \"\";\n const appearanceSyncLine = darkMode\n ? \"\\n useAppearanceSync(appearance);\"\n : \"\";\n const externalThemeLine = externalTheme ? \"\\n useExternalTheme();\" : \"\";\n\n const childrenSlot = cssVar\n ? `<div ref={containerRef} style={{ display: \"contents\" }}>\n {children}\n </div>`\n : \"{children}\";\n\n const antdProvider = `<AntdThemeProvider\n prefixCls={RUNTIME_PREFIX_CLS}\n appearance={resolvedAppearance}\n themeMode={appearance}\n theme={theme}${cssVar ? \"\\n customToken={{ cssVar: true }}\" : \"\"}\n >\n ${globalReset ? \"<GlobalReset />\" : \"\"}\n ${childrenSlot}\n </AntdThemeProvider>`;\n\n return `\n// ═══════════════ ThemeWrapper ═══════════════\n\n// 运行时判断是否处于 Garfish 子应用环境,同一 bundle 支持独立部署与微前端两种模式。\nconst IS_MICRO_APP = typeof window !== \"undefined\" && !!(window as any).__GARFISH__;\n\nconst RUNTIME_PREFIX_CLS = typeof process !== \"undefined\"\n && process.env?.YWKF_PREFIX_CLS\n || \"${prefixCls}\";\n\ninterface ThemeWrapperProps {\n children: ReactNode;\n}\n\nexport function ThemeWrapper({ children }: ThemeWrapperProps) {${refLine}\n const { appearance, primaryColor, neutralColor } = useThemeStore(\n (s) => ({ appearance: s.appearance, primaryColor: s.primaryColor, neutralColor: s.neutralColor }),\n shallow,\n );${cssVarSyncLine}${appearanceSyncLine}${externalThemeLine}\n\n // 微前端模式下,将 CSS-in-JS 样式注入到 Garfish 子应用容器而非 document.head,\n // 避免与主应用共享的 @ant-design/cssinjs StyleContext 产生冲突。\n // useState lazy initializer 同步读取(Garfish 挂载时容器已提前创建),\n // useEffect 兜底处理极端竞态(如 SSR hydration)。\n const [styleContainer, setStyleContainer] = useState<HTMLElement | undefined>(() => {\n if (!IS_MICRO_APP || typeof document === \"undefined\") return undefined;\n return document.getElementById(RUNTIME_PREFIX_CLS)?.parentElement ?? undefined;\n });\n\n useEffect(() => {\n if (!IS_MICRO_APP) return;\n const el = document.getElementById(RUNTIME_PREFIX_CLS)?.parentElement;\n if (el) setStyleContainer(el);\n }, []);\n\n const resolvedAppearance = useMemo(() => {\n if (appearance !== \"auto\") return appearance;\n if (typeof window === \"undefined\") return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n }, [appearance]);\n\n const theme = useCallback<GetAntdTheme>(\n (ap) => createThemeConfig({\n appearance: ap as \"light\" | \"dark\",\n primaryColor,\n neutralColor,\n }),\n [primaryColor, neutralColor],\n );\n\n const provider = (\n ${antdProvider}\n );\n\n return IS_MICRO_APP && styleContainer ? (\n <StyleProvider container={styleContainer}>{provider}</StyleProvider>\n ) : provider;\n}\n\nexport default ThemeWrapper;\n`;\n}\n\nexport default themePlugin;\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createPlugin } from \"../define.js\";\nimport type { GeneratedFile, GeneratorContext, PluginHooks } from \"../types.js\";\n\nexport interface ZustandPluginOptions {\n /**\n * 是否自动生成 store 脚手架(仅在 store/ 目录不存在时)\n * @default true\n */\n scaffold?: boolean;\n\n /**\n * store 目录路径(相对于项目根目录)\n * @default \"store\"\n */\n storeDir?: string;\n}\n\n/**\n * Zustand 状态管理插件\n *\n * 采用扁平域/Slice 架构:\n * - store/{domain}/slices/ 按业务域拆分\n * - 每个 slice 拆为 initialState.ts + actions.ts\n * - 域级 store.ts 聚合所有 slice\n * - 使用 StateCreator<Store, [['zustand/devtools', never]], [], Action> 标准范式\n * - 内置 devtools + subscribeWithSelector 中间件\n *\n * @example\n * ```ts\n * import { defineConfig, zustandPlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * zustandPlugin(),\n * ],\n * });\n * ```\n */\nexport const zustandPlugin = createPlugin<ZustandPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-zustand\",\n version: \"1.0.0\",\n description: \"Zustand 状态管理集成\",\n\n setup(context) {\n const { scaffold = true, storeDir = \"store\" } = options;\n const { cwd, logger } = context;\n\n const storePath = join(cwd, storeDir);\n\n if (scaffold && !existsSync(storePath)) {\n scaffoldStore(storePath, logger);\n }\n\n const hooks: PluginHooks = {\n modifyRspackConfig(rspackConfig) {\n logger.info(\"Zustand 已启用\");\n\n const resolve = rspackConfig.resolve || {};\n const alias = (resolve.alias || {}) as Record<string, string>;\n alias[\"@store\"] = storePath;\n resolve.alias = alias;\n rspackConfig.resolve = resolve;\n\n return rspackConfig;\n },\n\n generateFiles(_ctx: GeneratorContext): GeneratedFile[] {\n return [\n {\n path: \"store.ts\",\n content: buildStoreHelperFile(),\n },\n ];\n },\n };\n\n return hooks;\n },\n}));\n\nfunction scaffoldStore(storePath: string, logger: { info: (msg: string) => void }): void {\n const dirs = [\n storePath,\n join(storePath, \"middleware\"),\n join(storePath, \"app\"),\n join(storePath, \"app\", \"slices\"),\n join(storePath, \"app\", \"slices\", \"counter\"),\n ];\n\n for (const dir of dirs) {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n // store/middleware/createDevtools.ts\n writeFileSync(join(storePath, \"middleware\", \"createDevtools.ts\"), TPL_CREATE_DEVTOOLS, \"utf-8\");\n\n // store/app/slices/counter/initialState.ts\n writeFileSync(\n join(storePath, \"app\", \"slices\", \"counter\", \"initialState.ts\"),\n TPL_COUNTER_INITIAL_STATE,\n \"utf-8\",\n );\n\n // store/app/slices/counter/actions.ts\n writeFileSync(\n join(storePath, \"app\", \"slices\", \"counter\", \"actions.ts\"),\n TPL_COUNTER_ACTIONS,\n \"utf-8\",\n );\n\n // store/app/initialState.ts\n writeFileSync(join(storePath, \"app\", \"initialState.ts\"), TPL_APP_INITIAL_STATE, \"utf-8\");\n\n // store/app/store.ts\n writeFileSync(join(storePath, \"app\", \"store.ts\"), TPL_APP_STORE, \"utf-8\");\n\n // store/app/index.tsx\n writeFileSync(join(storePath, \"app\", \"index.tsx\"), TPL_APP_INDEX, \"utf-8\");\n\n // store/index.ts\n writeFileSync(join(storePath, \"index.ts\"), TPL_STORE_INDEX, \"utf-8\");\n\n logger.info(\"已生成 store/ 脚手架(Agent/Slice 架构)\");\n}\n\n// ==================== 模板内容 ====================\n\nconst TPL_CREATE_DEVTOOLS = `import type { DevtoolsOptions } from \"zustand/middleware\";\nimport { devtools as devtoolsMiddleware } from \"zustand/middleware\";\nimport type { StateCreator, StoreMutatorIdentifier } from \"zustand/vanilla\";\n\n/**\n * 封装 zustand devtools 中间件\n * 生产环境自动禁用,开发环境启用 trace\n */\nexport const createDevtools =\n (name: string, options?: DevtoolsOptions) =>\n <\n T,\n Mps extends [StoreMutatorIdentifier, unknown][] = [],\n Mcs extends [StoreMutatorIdentifier, unknown][] = [],\n >(\n initializer: StateCreator<T, [...Mps, [\"zustand/devtools\", never]], Mcs>,\n ) =>\n devtoolsMiddleware(initializer, {\n name,\n enabled: process.env.NODE_ENV === \"development\",\n trace: process.env.NODE_ENV === \"development\",\n ...options,\n });\n`;\n\nconst TPL_COUNTER_INITIAL_STATE = `export interface CounterState {\n count: number;\n loading: boolean;\n error: string | null;\n}\n\nexport const initialCounterState: CounterState = {\n count: 0,\n loading: false,\n error: null,\n};\n`;\n\nconst TPL_COUNTER_ACTIONS = `import type { StateCreator } from \"zustand/vanilla\";\nimport type { AppStore } from \"../../store\";\n\nexport interface CounterAction {\n increment: () => void;\n decrement: () => void;\n reset: () => void;\n setLoading: (loading: boolean) => void;\n setError: (error: string | null) => void;\n fetchCount: () => Promise<void>;\n}\n\nexport const createCounterSlice: StateCreator<\n AppStore,\n [[\"zustand/devtools\", never]],\n [],\n CounterAction\n> = (set, get) => ({\n increment: () => set((s) => ({ count: s.count + 1 })),\n decrement: () => set((s) => ({ count: s.count - 1 })),\n reset: () => set({ count: 0, error: null }),\n setLoading: (loading) => set({ loading }),\n setError: (error) => set({ error }),\n\n fetchCount: async () => {\n set({ loading: true, error: null });\n try {\n // 替换为实际 API 调用\n // import request from \"@ywkf/request\";\n // const res = await request.get(\"/api/count\");\n // set({ count: res.data, loading: false });\n await new Promise((r) => setTimeout(r, 500));\n set({ count: 42, loading: false });\n } catch (err) {\n set({\n error: err instanceof Error ? err.message : \"未知错误\",\n loading: false,\n });\n }\n },\n});\n`;\n\nconst TPL_APP_INITIAL_STATE = `import {\n type CounterState,\n initialCounterState,\n} from \"./slices/counter/initialState\";\n\n// ============== 聚合所有 Slice 状态 ============== //\n\nexport type AppStoreState = CounterState;\n\nexport const initialState: AppStoreState = {\n ...initialCounterState,\n};\n`;\n\nconst TPL_APP_STORE = `import { subscribeWithSelector } from \"zustand/middleware\";\nimport { shallow } from \"zustand/shallow\";\nimport { createWithEqualityFn } from \"zustand/traditional\";\nimport type { StateCreator } from \"zustand/vanilla\";\n\nimport { createDevtools } from \"../middleware/createDevtools\";\nimport { type AppStoreState, initialState } from \"./initialState\";\n\nimport {\n type CounterAction,\n createCounterSlice,\n} from \"./slices/counter/actions\";\n\n// ============== 聚合 Store 类型 ============== //\n\nexport type AppStore = AppStoreState & CounterAction;\n\n// ============== 创建 Store ============== //\n\nconst createStore: StateCreator<AppStore, [[\"zustand/devtools\", never]]> = (\n ...parameters\n) => ({\n ...initialState,\n ...createCounterSlice(...parameters),\n});\n\n// ============== 实装 useStore ============== //\n\nconst devtools = createDevtools(\"app\");\n\nexport const useAppStore = createWithEqualityFn<AppStore>()(\n subscribeWithSelector(devtools(createStore)),\n shallow,\n);\n\nexport const getAppStoreState = () => useAppStore.getState();\n`;\n\nconst TPL_APP_INDEX = `export { useAppStore, getAppStoreState } from \"./store\";\nexport type { AppStore } from \"./store\";\nexport { initialState } from \"./initialState\";\nexport type { AppStoreState } from \"./initialState\";\n`;\n\nconst TPL_STORE_INDEX = `/**\n * Store 聚合入口\n *\n * 架构:\n * - store/middleware/ — 中间件(devtools 等)\n * - store/{domain}/ — 每个域代表一个业务子系统\n * - store/{domain}/slices — 每个 slice 拆为 initialState + actions\n *\n * 约束:\n * - initialState:纯数据定义,不含逻辑\n * - actions:同步状态变更 + 异步副作用\n * - slice 之间禁止直接修改彼此状态\n * - 域层负责跨 slice 协调\n */\nexport { useAppStore, getAppStoreState } from \"./app\";\nexport type { AppStore, AppStoreState } from \"./app\";\n`;\n\nfunction buildStoreHelperFile(): string {\n return `// 此文件由 @4399ywkf/plugin-zustand 自动生成\n// 提供 Zustand 工具函数的 re-export,方便业务代码引用\n\nexport { useShallow } from \"zustand/react/shallow\";\nexport type { StateCreator, StoreApi } from \"zustand\";\n`;\n}\n\nexport default zustandPlugin;\n","import type { Compiler } from \"@rspack/core\";\nimport { existsSync, watch } from \"fs\";\nimport { join } from \"path\";\nimport { ConventionalRouteGenerator } from \"./generator.js\";\n\nexport interface ConventionalRoutePluginOptions {\n /** 页面目录 */\n pagesDir: string;\n /** 输出目录 */\n outputDir: string;\n /** 路由 basename */\n basename?: string;\n /** 是否监听文件变化(开发模式) */\n watch?: boolean;\n}\n\n/**\n * 约定式路由 Rspack 插件\n *\n * 在编译开始前扫描 src/pages 目录,生成 .ywkf/routes.tsx\n */\nexport class ConventionalRoutePlugin {\n private options: ConventionalRoutePluginOptions;\n private isWatching = false;\n private hasGenerated = false;\n private lastGeneratedContent = \"\";\n\n constructor(options: ConventionalRoutePluginOptions) {\n this.options = options;\n }\n\n apply(compiler: Compiler): void {\n const pluginName = \"ConventionalRoutePlugin\";\n\n // 只在首次编译时生成路由\n compiler.hooks.beforeCompile.tapAsync(pluginName, (_params, callback) => {\n if (!this.hasGenerated) {\n this.generateRoutes();\n this.hasGenerated = true;\n }\n callback();\n });\n\n // 开发模式下监听文件变化\n if (this.options.watch && !this.isWatching) {\n this.watchPages();\n }\n }\n\n /**\n * 生成路由文件(带内容比对,避免不必要的重复生成)\n */\n private generateRoutes(): void {\n try {\n const generator = new ConventionalRouteGenerator({\n pagesDir: this.options.pagesDir,\n outputDir: this.options.outputDir,\n basename: this.options.basename,\n });\n\n const newContent = generator.generateCode();\n const _outputPath = join(this.options.outputDir, \"routes.tsx\");\n\n // 比对内容,如果相同则跳过(去掉时间戳后比较)\n const normalizedNew = this.normalizeContent(newContent);\n const normalizedOld = this.normalizeContent(this.lastGeneratedContent);\n\n if (normalizedNew === normalizedOld) {\n return; // 内容相同,跳过生成\n }\n\n generator.write();\n this.lastGeneratedContent = newContent;\n } catch (error) {\n console.error(\"[ywkf] 生成路由失败:\", error);\n }\n }\n\n /**\n * 标准化内容(去掉时间戳等动态部分)\n */\n private normalizeContent(content: string): string {\n return content.replace(/\\/\\/ Generated at: .+/g, \"\");\n }\n\n /**\n * 监听页面目录变化\n */\n private watchPages(): void {\n if (!existsSync(this.options.pagesDir)) {\n return;\n }\n\n this.isWatching = true;\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const watcher = watch(this.options.pagesDir, { recursive: true }, (_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(() => {\n if (process.env.DEBUG) console.log(`[ywkf] 检测到页面变化: ${filename}`);\n this.generateRoutes();\n }, 500);\n });\n\n // 进程退出时关闭监听\n process.on(\"exit\", () => {\n watcher.close();\n });\n }\n}\n","import { createRoot, type Root } from \"react-dom/client\";\nimport { RootProvider } from \"./providers.js\";\nimport type { AppConfig, MicroAppConfig } from \"./types.js\";\n\nlet root: Root | null = null;\n\n/**\n * 解析应用配置,处理约定式路由\n */\nasync function resolveAppConfig(config: AppConfig): Promise<AppConfig> {\n // 如果已有 router 或未启用约定式路由,直接返回\n if (config.router || !config.conventionalRoutes) {\n return config;\n }\n\n try {\n // 动态导入约定式路由\n // @ts-expect-error @ywkf/routes 是编译时生成的模块\n const routesModule = await import(\"@ywkf/routes\");\n const createRouter = routesModule.createRouter || routesModule.default?.createRouter;\n\n if (typeof createRouter === \"function\") {\n const router = createRouter(config.basename);\n console.log(\"[ywkf] 已自动注入约定式路由\");\n return { ...config, router };\n } else {\n console.warn(\"[ywkf] @ywkf/routes 未导出 createRouter 函数\");\n }\n } catch (error) {\n console.error(\"[ywkf] 加载约定式路由失败:\", error);\n console.warn(\"[ywkf] 请确保已启用约定式路由且 src/pages 目录存在\");\n }\n\n return config;\n}\n\n/**\n * 启动应用\n */\nexport async function bootstrap(config: AppConfig): Promise<void> {\n const { rootId = \"root\", lifecycle } = config;\n\n // 解析约定式路由\n const resolvedConfig = await resolveAppConfig(config);\n\n // 执行挂载前钩子\n if (lifecycle?.onBeforeMount) {\n await lifecycle.onBeforeMount();\n }\n\n // 获取根元素\n const rootElement = document.getElementById(rootId);\n\n if (!rootElement) {\n throw new Error(`找不到根元素 #${rootId}`);\n }\n\n // 创建 React Root\n root = createRoot(rootElement);\n\n // 渲染应用\n root.render(<RootProvider config={resolvedConfig} />);\n\n // 执行挂载后钩子\n if (lifecycle?.onMounted) {\n // 使用 setTimeout 确保 React 渲染完成\n setTimeout(() => {\n lifecycle.onMounted?.();\n }, 0);\n }\n\n // 注册卸载钩子\n if (lifecycle?.onUnmount) {\n window.addEventListener(\"beforeunload\", () => {\n lifecycle.onUnmount?.();\n });\n }\n}\n\n/**\n * 卸载应用\n */\nexport function unmount(): void {\n if (root) {\n root.unmount();\n root = null;\n }\n}\n\n/**\n * 创建微前端应用入口\n *\n * 用于 qiankun/garfish 等微前端框架\n */\nexport function createMicroApp(getConfig: (props?: MicroAppConfig) => AppConfig) {\n let microRoot: Root | null = null;\n\n return {\n /**\n * 微前端 bootstrap 生命周期\n */\n async bootstrap() {\n console.log(\"[MicroApp] bootstrap\");\n },\n\n /**\n * 微前端 mount 生命周期\n */\n async mount(props?: MicroAppConfig) {\n console.log(\"[MicroApp] mount\", props);\n\n const config = getConfig(props);\n // 解析约定式路由\n const resolvedConfig = await resolveAppConfig(config);\n\n const container = props?.masterProps?.container as Element | undefined;\n const rootId = resolvedConfig.rootId || \"root\";\n\n // 获取根元素(优先使用微前端容器)\n const rootElement = container\n ? container.querySelector(`#${rootId}`)\n : document.getElementById(rootId);\n\n if (!rootElement) {\n throw new Error(`[MicroApp] 找不到根元素 #${rootId}`);\n }\n\n // 执行挂载前钩子\n if (resolvedConfig.lifecycle?.onBeforeMount) {\n await resolvedConfig.lifecycle.onBeforeMount();\n }\n\n // 创建 React Root\n microRoot = createRoot(rootElement);\n microRoot.render(<RootProvider config={resolvedConfig} />);\n\n // 执行挂载后钩子\n if (resolvedConfig.lifecycle?.onMounted) {\n setTimeout(() => {\n resolvedConfig.lifecycle?.onMounted?.();\n }, 0);\n }\n },\n\n /**\n * 微前端 unmount 生命周期\n */\n async unmount(props?: MicroAppConfig) {\n console.log(\"[MicroApp] unmount\", props);\n\n const config = getConfig(props);\n\n // 执行卸载钩子\n if (config.lifecycle?.onUnmount) {\n config.lifecycle.onUnmount();\n }\n\n if (microRoot) {\n microRoot.unmount();\n microRoot = null;\n }\n },\n\n /**\n * 微前端 update 生命周期(可选)\n */\n async update(props?: MicroAppConfig) {\n console.log(\"[MicroApp] update\", props);\n },\n };\n}\n\n/**\n * Garfish 子应用 provider\n *\n * Garfish 要求子应用导出 provider 函数,接收 { dom, basename, props },\n * 返回 { render, destroy } 对象。\n */\nexport function createGarfishProvider(getConfig: (overrides?: Partial<AppConfig>) => AppConfig) {\n let garfishRoot: Root | null = null;\n\n return function provider(providerContext: {\n dom: Element;\n basename: string;\n props?: Record<string, unknown>;\n }) {\n const { dom, basename } = providerContext;\n\n return {\n render() {\n const config = getConfig({ basename });\n const resolvedConfig = { ...config, basename };\n const rootId = resolvedConfig.rootId || \"root\";\n\n let rootElement = dom.querySelector(`#${rootId}`);\n if (!rootElement) {\n rootElement = document.createElement(\"div\");\n rootElement.id = rootId;\n dom.appendChild(rootElement);\n }\n\n garfishRoot = createRoot(rootElement);\n garfishRoot.render(<RootProvider config={resolvedConfig} />);\n\n if (resolvedConfig.lifecycle?.onMounted) {\n setTimeout(() => resolvedConfig.lifecycle?.onMounted?.(), 0);\n }\n },\n\n destroy() {\n if (garfishRoot) {\n garfishRoot.unmount();\n garfishRoot = null;\n }\n },\n };\n };\n}\n\n/**\n * 判断是否在微前端环境中运行\n */\nexport function isMicroAppEnv(): boolean {\n // qiankun\n if ((window as unknown as Record<string, unknown>).__POWERED_BY_QIANKUN__) {\n return true;\n }\n\n // garfish\n if ((window as unknown as Record<string, unknown>).__GARFISH__) {\n return true;\n }\n\n return false;\n}\n\n/**\n * 获取微前端公共路径\n */\nexport function getMicroAppPublicPath(): string {\n // qiankun 注入的公共路径\n if ((window as unknown as Record<string, string>).__INJECTED_PUBLIC_PATH_BY_QIANKUN__) {\n return (window as unknown as Record<string, string>).__INJECTED_PUBLIC_PATH_BY_QIANKUN__;\n }\n\n return \"/\";\n}\n","import { ConfigProvider } from \"antd\";\nimport zhCN from \"antd/locale/zh_CN.js\";\nimport { type ComponentType, type ReactNode, StrictMode, Suspense } from \"react\";\nimport { RouterProvider } from \"react-router\";\nimport { AppContextProvider } from \"./context.js\";\nimport { ErrorBoundary } from \"./error-boundary.js\";\nimport type { AppConfig, AppContextValue, ProviderConfig } from \"./types.js\";\n\n/**\n * 默认加载中组件\n */\nfunction DefaultLoading() {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100vh\",\n fontSize: 16,\n color: \"#999\",\n }}\n >\n 加载中...\n </div>\n );\n}\n\n/**\n * 组合多个 Provider\n */\nfunction composeProviders(providers: ProviderConfig[]): ComponentType<{ children: ReactNode }> {\n const sortedProviders = [...providers].sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n\n return function ComposedProviders({ children }: { children: ReactNode }) {\n return sortedProviders.reduceRight((acc, { component: Provider, props }) => {\n return <Provider {...props}>{acc}</Provider>;\n }, children);\n };\n}\n\nexport interface RootProviderProps {\n config: AppConfig;\n children?: ReactNode;\n}\n\n/**\n * 根 Provider 组件\n * 自动组合所有必要的 Provider\n */\nexport function RootProvider({ config, children }: RootProviderProps) {\n const {\n appName = \"app\",\n router,\n basename = \"/\",\n strictMode = true,\n antd = { enabled: true },\n providers = [],\n lifecycle,\n } = config;\n\n // 构建应用上下文\n const appContextValue: Partial<AppContextValue> = {\n appName,\n basename,\n isDev: process.env.NODE_ENV === \"development\",\n env: typeof process !== \"undefined\" ? (process.env as Record<string, string>) : {},\n };\n\n // 构建 Provider 列表\n const allProviders: ProviderConfig[] = [\n // 应用上下文 Provider(最外层)\n {\n component: AppContextProvider as ComponentType<{ children: ReactNode }>,\n props: { value: appContextValue },\n order: 0,\n },\n // Ant Design ConfigProvider\n ...(antd.enabled !== false\n ? [\n {\n component: ConfigProvider as ComponentType<{ children: ReactNode }>,\n props: {\n locale: antd.locale || zhCN,\n theme: antd.theme,\n ...antd.configProvider,\n },\n order: 10,\n },\n ]\n : []),\n // 用户自定义 Providers\n ...providers.map((p) => ({ ...p, order: p.order ?? 50 })),\n ];\n\n const ComposedProviders = composeProviders(allProviders);\n\n // 内容:路由或自定义 children\n const content = router ? (\n <Suspense fallback={<DefaultLoading />}>\n <RouterProvider router={router} />\n </Suspense>\n ) : (\n children\n );\n\n // 组装最终结构\n const app = (\n <ErrorBoundary onError={lifecycle?.onError}>\n <ComposedProviders>{content}</ComposedProviders>\n </ErrorBoundary>\n );\n\n // 严格模式包装\n if (strictMode) {\n return <StrictMode>{app}</StrictMode>;\n }\n\n return app;\n}\n\n/**\n * 创建自定义 Provider 配置的辅助函数\n */\nexport function createProvider<P extends Record<string, unknown>>(\n component: ComponentType<P & { children: ReactNode }>,\n props?: Omit<P, \"children\">,\n order?: number,\n): ProviderConfig {\n return {\n component: component as ComponentType<{ children: ReactNode }>,\n props,\n order,\n };\n}\n","import { createContext, type ReactNode, useContext } from \"react\";\nimport type { AppContextValue } from \"./types.js\";\n\n/**\n * 默认上下文值\n */\nconst defaultContextValue: AppContextValue = {\n appName: \"app\",\n basename: \"/\",\n isDev: process.env.NODE_ENV === \"development\",\n env: {},\n};\n\n/**\n * 应用上下文\n */\nexport const AppContext = createContext<AppContextValue>(defaultContextValue);\n\n/**\n * 应用上下文 Provider\n */\nexport interface AppContextProviderProps {\n value: Partial<AppContextValue>;\n children: ReactNode;\n}\n\nexport function AppContextProvider({ value, children }: AppContextProviderProps) {\n const contextValue: AppContextValue = {\n ...defaultContextValue,\n ...value,\n env: {\n ...defaultContextValue.env,\n ...value.env,\n },\n };\n\n return <AppContext.Provider value={contextValue}>{children}</AppContext.Provider>;\n}\n\n/**\n * 获取应用上下文的 Hook\n */\nexport function useApp(): AppContextValue {\n const context = useContext(AppContext);\n\n if (!context) {\n throw new Error(\"useApp must be used within AppContextProvider\");\n }\n\n return context;\n}\n\n/**\n * 获取应用名称\n */\nexport function useAppName(): string {\n return useApp().appName;\n}\n\n/**\n * 获取路由 basename\n */\nexport function useBasename(): string {\n return useApp().basename;\n}\n\n/**\n * 获取环境变量\n */\nexport function useEnv(): Record<string, string | undefined> {\n return useApp().env;\n}\n\n/**\n * 判断是否开发环境\n */\nexport function useIsDev(): boolean {\n return useApp().isDev;\n}\n","import { Component, type ErrorInfo, type ReactNode } from \"react\";\n\nexport interface ErrorBoundaryProps {\n /** 子组件 */\n children: ReactNode;\n /** 错误回退 UI */\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n /** 错误回调 */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * 错误边界组件\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error(\"[ErrorBoundary] Caught error:\", error, errorInfo);\n this.props.onError?.(error, errorInfo);\n }\n\n reset = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n const { hasError, error } = this.state;\n const { children, fallback } = this.props;\n\n if (hasError && error) {\n if (typeof fallback === \"function\") {\n return fallback(error, this.reset);\n }\n\n if (fallback) {\n return fallback;\n }\n\n return <DefaultErrorFallback error={error} onReset={this.reset} />;\n }\n\n return children;\n }\n}\n\n/**\n * 默认错误回退 UI\n */\ninterface DefaultErrorFallbackProps {\n error: Error;\n onReset: () => void;\n}\n\nfunction DefaultErrorFallback({ error, onReset }: DefaultErrorFallbackProps) {\n const isDev = process.env.NODE_ENV === \"development\";\n\n return (\n <div\n style={{\n padding: 24,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n backgroundColor: \"#f5f5f5\",\n }}\n >\n <div\n style={{\n maxWidth: 600,\n padding: 32,\n backgroundColor: \"#fff\",\n borderRadius: 8,\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n }}\n >\n <h1 style={{ color: \"#ff4d4f\", marginBottom: 16 }}>页面出错了</h1>\n <p style={{ color: \"#666\", marginBottom: 16 }}>\n 抱歉,页面遇到了一些问题。请尝试刷新页面或联系管理员。\n </p>\n\n {isDev && (\n <details\n style={{\n marginBottom: 16,\n padding: 12,\n backgroundColor: \"#fff2f0\",\n borderRadius: 4,\n border: \"1px solid #ffccc7\",\n }}\n >\n <summary style={{ cursor: \"pointer\", fontWeight: \"bold\" }}>\n 错误详情(仅开发环境可见)\n </summary>\n <pre\n style={{\n marginTop: 8,\n padding: 8,\n backgroundColor: \"#fff\",\n borderRadius: 4,\n overflow: \"auto\",\n fontSize: 12,\n }}\n >\n {error.message}\n {\"\\n\\n\"}\n {error.stack}\n </pre>\n </details>\n )}\n\n <div style={{ display: \"flex\", gap: 8 }}>\n <button\n onClick={onReset}\n style={{\n padding: \"8px 16px\",\n backgroundColor: \"#1890ff\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: 4,\n cursor: \"pointer\",\n }}\n >\n 重试\n </button>\n <button\n onClick={() => window.location.reload()}\n style={{\n padding: \"8px 16px\",\n backgroundColor: \"#fff\",\n color: \"#666\",\n border: \"1px solid #d9d9d9\",\n borderRadius: 4,\n cursor: \"pointer\",\n }}\n >\n 刷新页面\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["rspack","chalk","createRequire","join","existsSync","join","existsSync","mkdirSync","readFileSync","writeFileSync","join","existsSync","existsSync","join","join","existsSync","mkdirSync","readFileSync","writeFileSync","join","existsSync","require","join","createRequire","dev","rspack","merge","rspack","merge","existsSync","readFileSync","resolve","createRequire","dirname","join","fileURLToPath","__dirname","require","elapsed","chalk","rspack","resolve","stats","rspack","chalk","resolve","chalk","rspack","existsSync","writeFileSync","join","join","existsSync","writeFileSync","existsSync","mkdirSync","writeFileSync","join","join","existsSync","mkdirSync","writeFileSync","existsSync","readdirSync","statSync","join","resolve","resolve","existsSync","readdirSync","join","statSync","existsSync","writeFileSync","join","rspack","join","rspack","existsSync","writeFileSync","join","join","existsSync","mkdirSync","writeFileSync","join","join","existsSync","resolve","mkdirSync","writeFileSync","existsSync","watch","join","join","existsSync","watch","jsx","jsx","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/build.ts","../src/config/loader.ts","../src/config/schema.ts","../src/plugin/manager.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/bootstrap.ts","../src/generator/templates/entry.ts","../src/generator/templates/env-types.ts","../src/generator/templates/route-types.ts","../src/rspack/prod.ts","../src/cli/env.ts","../src/cli/printer.ts","../src/cli/dev.ts","../src/cli/port.ts","../src/plugin/define.ts","../src/plugin/builtin/analytics.ts","../src/plugin/builtin/biome.ts","../src/plugin/builtin/garfish.ts","../src/plugin/builtin/i18n.ts","../src/plugin/builtin/mock.ts","../src/plugin/builtin/react-query.ts","../src/plugin/builtin/tailwind.ts","../src/plugin/builtin/theme.ts","../src/plugin/builtin/zustand.ts","../src/router/plugin.ts","../src/runtime/bootstrap.tsx","../src/runtime/providers.tsx","../src/runtime/context.tsx","../src/runtime/error-boundary.tsx"],"sourcesContent":["import { rspack, type Stats } from \"@rspack/core\";\nimport chalk from \"chalk\";\nimport { resolveConfig } from \"../config/loader.js\";\nimport { PluginManager } from \"../plugin/manager.js\";\nimport { createRspackConfig } from \"../rspack/index.js\";\nimport { loadEnv, preloadEnv } from \"./env.js\";\nimport { createProgressHandler, DevPrinter } from \"./printer.js\";\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\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 Compile errors:\"));\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 Warnings:\"));\n for (const warning of info.warnings) {\n console.log(chalk.yellow(` ${warning.message}`));\n }\n }\n\n console.log(chalk.bold(\"\\n Build output:\"));\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(` ${chalk.dim(asset.name.padEnd(50))} ${sizeColor(formatSize(asset.size))}`);\n }\n\n if (sortedAssets.length > 15) {\n console.log(chalk.dim(` ... and ${sortedAssets.length - 15} more files`));\n }\n\n console.log();\n}\n\n/**\n * 执行生产构建\n *\n * @param options.mode - env 文件模式,决定加载 .env.{mode},默认 \"production\"\n * 例如 --mode staging 会加载 .env.staging,但 NODE_ENV 仍为 \"production\"\n */\nexport async function build(options: { cwd?: string; mode?: string } = {}): Promise<void> {\n const cwd = options.cwd || process.cwd();\n const mode = options.mode || \"production\";\n\n try {\n // 1. 预加载环境变量(在配置解析之前)\n preloadEnv(cwd, mode, \"production\");\n\n // 2. 加载配置\n const { config } = await resolveConfig(cwd);\n\n // 3. 完整加载环境变量\n loadEnv(config, cwd, mode, \"production\");\n\n // 4. 加载插件\n const pluginManager = new PluginManager(config, cwd, false);\n if (config.plugins && config.plugins.length > 0) {\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 const pluginNames = pluginManager.getPluginNames();\n\n // 8. 终端 UI\n const printer = new DevPrinter(\"localhost\", 0, pluginNames, true);\n printer.printBanner();\n printer.printBuildStart();\n printer.updateProgress(0, \"preparing\");\n\n // 9. 注入 ProgressPlugin\n rspackConfig.plugins = rspackConfig.plugins || [];\n rspackConfig.plugins.push(new rspack.ProgressPlugin(createProgressHandler(printer)));\n\n rspackConfig.stats = \"none\";\n rspackConfig.infrastructureLogging = { level: \"none\" };\n\n // 10. 执行构建\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(\"Build failed: no stats available\"));\n return;\n }\n resolve(stats);\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n compiler.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n\n const hasErrors = stats.hasErrors();\n\n // 11. 执行 afterBuild 钩子\n const statsInfo = stats.toJson({ errors: true });\n await pluginManager.runAfterBuild({\n success: !hasErrors,\n errors: statsInfo.errors?.map((e) => e.message),\n });\n\n printer.printBuildDone(hasErrors);\n\n if (hasErrors) {\n printBuildResult(stats);\n process.exit(1);\n }\n\n printBuildResult(stats);\n } catch (error) {\n console.error();\n console.error(chalk.red(\" ✖ Build failed\"));\n console.error(error);\n process.exit(1);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { extname, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport deepmerge from \"deepmerge\";\nimport { defaultConfig, type YwkfConfig } from \"./schema.js\";\n\n/** 支持的配置文件名 */\nconst CONFIG_FILES = [\"ywkf.config.ts\", \"ywkf.config.mts\", \"ywkf.config.js\", \"ywkf.config.mjs\"];\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(\"⚠️ 未找到配置文件 (ywkf.config.ts),使用默认配置\");\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 | undefined;\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 as RspackConfig } from \"@rspack/core\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport type { RouteItem } from \"../router/types.js\";\nimport type { AppConfig, ProviderConfig } from \"../runtime/types.js\";\nimport type {\n PluginConfig,\n PluginContext,\n PluginHooks,\n PluginLogger,\n YwkfPlugin,\n} from \"./types.js\";\n\n/**\n * 创建插件日志工具\n */\nfunction createLogger(pluginName: string): PluginLogger {\n const prefix = `[${pluginName}]`;\n const verbose = !!process.env.DEBUG;\n\n return {\n info: (msg) => {\n if (verbose) console.log(`${prefix} ${msg}`);\n },\n warn: (msg) => console.warn(`${prefix} ${msg}`),\n error: (msg) => console.error(`${prefix} ${msg}`),\n debug: (msg) => {\n if (verbose) console.debug(`${prefix} ${msg}`);\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 }> = new Map();\n private context: PluginContext;\n\n constructor(config: Required<YwkfConfig>, cwd: string, isDev: boolean) {\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(`加载插件失败: ${String(pluginConfig)} - ${error}`);\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(`插件 ${name} modifyRspackConfig 执行失败: ${error}`);\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(`插件 ${name} modifyRoutes 执行失败: ${error}`);\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(`插件 ${name} modifyAppConfig 执行失败: ${error}`);\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(`插件 ${name} addProvider 执行失败: ${error}`);\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(`插件 ${name} beforeBuild 执行失败: ${error}`);\n }\n }\n }\n }\n\n /**\n * 执行 afterBuild 钩子\n */\n async runAfterBuild(stats: { success: boolean; errors?: string[] }): 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(`插件 ${name} afterBuild 执行失败: ${error}`);\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(`插件 ${name} beforeDevServer 执行失败: ${error}`);\n }\n }\n }\n }\n\n /**\n * 执行 afterDevServer 钩子\n */\n async runAfterDevServer(server: { port: number; host: string }): 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(`插件 ${name} afterDevServer 执行失败: ${error}`);\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 { RsdoctorRspackPlugin } from \"@rsdoctor/rspack-plugin\";\nimport type { Configuration } from \"@rspack/core\";\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 ? createDevConfig(config, cwd) : createProdConfig(config, cwd);\n\n // Rsdoctor 性能分析\n if (config.performance.rsdoctor) {\n rspackConfig.plugins = [...(rspackConfig.plugins || []), new RsdoctorRspackPlugin({})];\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 { createRequire } from \"node:module\";\nimport type { Configuration } from \"@rspack/core\";\nimport ReactRefreshPlugin from \"@rspack/plugin-react-refresh\";\nimport { merge } from \"webpack-merge\";\nimport { createPathResolver } from \"../config/loader.js\";\nimport type { YwkfConfig } from \"../config/schema.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(config: Required<YwkfConfig>, cwd: string): Configuration {\n const baseConfig = createBaseConfig(config, cwd, { isDev: true });\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: [/[\\\\/]node_modules[\\\\/].*antd/, /[\\\\/]node_modules[\\\\/]@4399ywkf[\\\\/]design/],\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: \"[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: \"[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 plugins: [new ReactRefreshPlugin()],\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 { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { type Configuration, rspack } from \"@rspack/core\";\nimport { createPathResolver } from \"../config/loader.js\";\nimport type { YwkfConfig } from \"../config/schema.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 options: { isDev?: boolean } = {},\n): Configuration {\n const isDev = options.isDev ?? process.env.NODE_ENV !== \"production\";\n const { resolveApp } = createPathResolver(cwd);\n\n const { appName, appCName, output, html, alias: userAlias, microFrontend, router } = 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: true,\n alias: {\n ...alias,\n \"process/browser.js\": require.resolve(\"process/browser.js\"),\n \"process/browser\": require.resolve(\"process/browser.js\"),\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 development: isDev,\n refresh: isDev,\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 ? `chunk_global_${appName}` : 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 { existsSync, watch } from \"fs\";\nimport { join } from \"path\";\nimport { findConfigFile, loadConfigFile, mergeConfig } from \"../config/loader.js\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport type { PluginConfig, PluginContext, PluginHooks, YwkfPlugin } 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(pluginConfig: PluginConfig): 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) => {\n if (process.env.DEBUG) console.log(`[ywkf] ${msg}`);\n },\n warn: (msg) => console.warn(`[ywkf] ${msg}`),\n error: (msg) => console.error(`[ywkf] ${msg}`),\n debug: (msg) => {\n if (process.env.DEBUG) console.log(`[ywkf:debug] ${msg}`);\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 if (process.env.DEBUG) 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 private resetState(): void {\n this.initialized = false;\n this.pluginHooks = [];\n this.generator = null;\n }\n\n private async regenerate(): Promise<void> {\n if (this.generator) {\n await this.generator.generate();\n }\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 this.watchConfig();\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(pagesDir, { recursive: true }, (_eventType, filename) => {\n if (!filename?.match(/\\.(tsx?|jsx?)$/)) {\n return;\n }\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n if (process.env.DEBUG) console.log(`[ywkf] 检测到页面变化: ${filename}`);\n if (this.generator) {\n await this.generator.generate();\n }\n }, 500);\n });\n\n process.on(\"exit\", () => {\n watcher.close();\n });\n }\n\n /**\n * 监听配置文件变化,重新加载配置并重新生成 .ywkf 文件\n */\n private watchConfig(): void {\n const { cwd } = this.options;\n const configPath = findConfigFile(cwd);\n\n if (!configPath) {\n return;\n }\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const watcher = watch(configPath, async () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n try {\n console.log(`\\n [ywkf] 检测到配置文件变化,重新生成 .ywkf 目录...\\n`);\n\n const userConfig = await loadConfigFile(configPath);\n const newConfig = mergeConfig(userConfig);\n\n this.options.config = newConfig;\n this.options.pluginConfigs = newConfig.plugins;\n\n // 重置状态,让 initialize() 重新创建 generator\n this.resetState();\n await this.initialize();\n await this.regenerate();\n\n console.log(\n ` [ywkf] .ywkf 目录已重新生成。部分配置变更(如端口、代理)需重启 dev server 生效。\\n`,\n );\n } catch (error) {\n console.error(` [ywkf] 配置重载失败:`, error);\n }\n }, 500);\n });\n\n process.on(\"exit\", () => {\n watcher.close();\n });\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { CodeInjection, GeneratorContext, PluginHooks } from \"../plugin/types.js\";\nimport { ConventionalRouteGenerator } from \"../router/generator.js\";\nimport { generateBootstrap } from \"./templates/bootstrap.js\";\nimport { generateEntry } from \"./templates/entry.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 if (process.env.DEBUG) 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(configPath, JSON.stringify(serializableConfig, null, 2));\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(type: \"entry\" | \"bootstrap\"): 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(join(outputDir, \"types\", \"env.d.ts\"), envTypesContent);\n\n // 生成路由类型\n if (config.router.conventional) {\n const routeTypesContent = generateRouteTypes();\n this.writeFileIfChanged(join(outputDir, \"types\", \"routes.d.ts\"), routeTypesContent);\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, mkdirSync, readdirSync, statSync, writeFileSync } from \"fs\";\nimport { join, relative } from \"path\";\n\n/** 将 Windows 路径统一为 POSIX 正斜杠(import 路径必须用 /) */\nfunction winPath(path: string): string {\n const isExtendedLengthPath = /^\\\\\\\\\\?\\\\/.test(path);\n if (isExtendedLengthPath) {\n return path;\n }\n return path.replace(/\\\\/g, \"/\");\n}\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) => CONVENTION_FILES.layout.test(e));\n if (pathlessLayout) {\n const pathlessChildren = this.scanDirectory(subDirPath, routePath);\n const pathlessLayoutRel = winPath(\n relative(this.options.pagesDir, join(subDirPath, pathlessLayout)),\n );\n childRoutes.push({\n path: routePath,\n name: this.generateRouteName(subDir.slice(2)),\n layoutFile: pathlessLayoutRel,\n isLayout: true,\n pathless: true,\n children: pathlessChildren.filter((r) => r.layoutFile !== pathlessLayoutRel),\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) => winPath(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 === \"/\" ? `/${segment}` : `${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) => s.replace(/^:/, \"Param\").replace(/\\?$/, \"Optional\").replace(/^\\*$/, \"CatchAll\"))\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(\n route.loadingFile,\n )}\"));`,\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 if (process.env.DEBUG) 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/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 effectiveBasename = userConfig.basename || BASENAME;\n const router = createRouter(effectiveBasename);\n\n const defaultConfig: AppConfig = {\n appName: APP_NAME,\n router,\n basename: effectiveBasename,\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 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 const hasPluginExports = exports.length > 0;\n const hasAsyncTopLevel = topLevel.some((line) => line.includes(\"await \"));\n\n let startupBody: string;\n\n if (hasPluginExports) {\n // 子应用模式:条件启动\n startupBody = [\n ...topLevel,\n ...exports,\n ``,\n `if (shouldRunIndependently !== false) {`,\n ` runApp();`,\n `}`,\n ].join(\"\\n\");\n } else if (hasAsyncTopLevel) {\n // 主应用异步初始化模式:用 async IIFE 包装\n startupBody = [\n `(async () => {`,\n ...topLevel.map((l) => ` ${l}`),\n ` await runApp();`,\n `})();`,\n ].join(\"\\n\");\n } else {\n startupBody = topLevel.length > 0 ? [...topLevel, `runApp();`].join(\"\\n\") : `runApp();`;\n }\n\n return `// 此文件由 @4399ywkf/core 自动生成,请勿手动修改\n// Generated at: ${new Date().toISOString()}\n\n${imports.join(\"\\n\")}\n\n${startupBody}\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(cwd: string, config: Required<YwkfConfig>): string {\n const envVars = collectEnvVars(cwd, config);\n\n const envInterface = envVars.map((key) => ` readonly ${key}: string;`).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 { type Configuration, rspack } from \"@rspack/core\";\nimport { merge } from \"webpack-merge\";\nimport { createPathResolver } from \"../config/loader.js\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport { createBaseConfig } from \"./base.js\";\n\n/**\n * 创建生产环境 Rspack 配置\n */\nexport function createProdConfig(config: Required<YwkfConfig>, cwd: string): Configuration {\n const baseConfig = createBaseConfig(config, cwd, { isDev: false });\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: [/[\\\\/]node_modules[\\\\/].*antd/, /[\\\\/]node_modules[\\\\/]@4399ywkf[\\\\/]design/],\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: \"[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: \"[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 *\n * @param cwd 工作目录\n * @param mode env 文件模式,决定加载 .env.{mode}(如 \"staging\"、\"devProduction\")\n * @param nodeEnv JS 运行时环境,始终为 \"development\" 或 \"production\"\n */\nexport function preloadEnv(cwd: string, mode: string, nodeEnv: \"development\" | \"production\"): void {\n process.env.NODE_ENV = nodeEnv;\n process.env.APP_MODE = 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 // 尝试加载模式特定的变量:.env.{mode}\n const modeEnvPaths = [resolve(cwd, `config/env/.env.${mode}`), resolve(cwd, `.env.${mode}`)];\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 // NODE_ENV / APP_MODE 由框架控制,env 文件不可覆盖\n process.env.NODE_ENV = nodeEnv;\n process.env.APP_MODE = mode;\n}\n\n/**\n * 加载环境变量(完整版,依赖配置)\n *\n * @param config 用户配置\n * @param cwd 工作目录\n * @param mode env 文件模式,决定加载 .env.{mode}\n * @param nodeEnv JS 运行时环境,始终为 \"development\" 或 \"production\"\n */\nexport function loadEnv(\n config: Required<YwkfConfig>,\n cwd: string,\n mode: string,\n nodeEnv: \"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 // 加载模式特定的变量:.env.{mode}\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 // 设置默认值(NODE_ENV 始终由框架控制,不受 mode 影响)\n process.env.NODE_ENV = nodeEnv;\n process.env.APP_MODE = 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 { createRequire } from \"node:module\";\nimport os from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport chalk from \"chalk\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst require = createRequire(import.meta.url);\n\nlet _version: string | null = null;\n\nfunction getFrameworkVersion(): string {\n if (_version) return _version;\n try {\n const pkgPath = join(__dirname, \"../../package.json\");\n const pkg = require(pkgPath);\n _version = pkg.version || \"0.0.0\";\n } catch {\n _version = \"0.0.0\";\n }\n return _version!;\n}\n\nfunction getNetworkAddress(port: number): string | null {\n const interfaces = os.networkInterfaces();\n for (const entries of Object.values(interfaces)) {\n if (!entries) continue;\n for (const entry of entries) {\n if (entry.family === \"IPv4\" && !entry.internal) {\n return `http://${entry.address}:${port}/`;\n }\n }\n }\n return null;\n}\n\nconst BAR_WIDTH = 30;\n\nfunction renderBar(percent: number): string {\n const filled = Math.round(BAR_WIDTH * percent);\n const empty = BAR_WIDTH - filled;\n const bar = chalk.green(\"━\".repeat(filled)) + chalk.gray(\"━\".repeat(empty));\n return bar;\n}\n\n/**\n * 框架终端 UI\n *\n * 负责在 dev / build 阶段输出 Modern.js 风格的终端信息:\n * - 框架 banner\n * - 编译进度条\n * - 就绪信息(Local / Network / Plugins)\n * - 交互式快捷键\n */\nexport class DevPrinter {\n private startTime = 0;\n private lastProgressLine = \"\";\n private firstCompileDone = false;\n\n constructor(\n readonly _host: string,\n private readonly port: number,\n private readonly pluginNames: string[],\n private readonly isBuild = false,\n ) {}\n\n /**\n * 打印框架 banner\n */\n printBanner(): void {\n const version = getFrameworkVersion();\n console.log();\n console.log(` ${chalk.bold.cyan(\"@4399ywkf/core\")} ${chalk.green(`Framework v${version}`)}`);\n console.log();\n }\n\n /**\n * 打印 \"start build started...\"\n */\n printBuildStart(): void {\n this.startTime = Date.now();\n this.compileDone = false;\n const label = chalk.gray(\"start\");\n console.log(` ${label} build started...`);\n }\n\n /**\n * 更新编译进度条(原地覆写同一行)\n */\n updateProgress(percent: number, message: string): void {\n const pct = Math.min(Math.round(percent * 100), 100);\n const bar = renderBar(percent);\n const status = message || \"compiling\";\n const line = ` ${chalk.yellow(\"●\")} client ${bar} ${chalk.bold(`(${pct}%)`)} ${chalk.gray(status)}`;\n\n if (process.stdout.isTTY) {\n if (this.lastProgressLine) {\n process.stdout.write(\"\\x1b[1A\\x1b[2K\");\n }\n process.stdout.write(`${line}\\n`);\n } else if (!this.firstCompileDone && pct === 100) {\n console.log(line);\n }\n this.lastProgressLine = line;\n }\n\n /**\n * 编译完成\n */\n printBuildDone(hasErrors = false): void {\n if (this.firstCompileDone) {\n if (!hasErrors) {\n const elapsed = ((Date.now() - this.startTime) / 1000).toFixed(2);\n console.log(` ${chalk.green(\"hmr\")} update in ${chalk.bold(`${elapsed} s`)}`);\n }\n return;\n }\n\n this.firstCompileDone = true;\n this.lastProgressLine = \"\";\n\n if (hasErrors) return;\n\n const elapsed = ((Date.now() - this.startTime) / 1000).toFixed(2);\n const label = chalk.green(\"ready\");\n console.log(` ${label} built in ${chalk.bold(`${elapsed} s`)}`);\n console.log();\n\n if (this.isBuild) {\n this.printPluginList();\n } else {\n this.printServerInfo();\n }\n }\n\n /**\n * 标记新一轮编译开始(HMR)\n */\n markRebuildStart(): void {\n this.startTime = Date.now();\n this.lastProgressLine = \"\";\n }\n\n /**\n * 仅打印插件列表(build 模式使用)\n */\n private printPluginList(): void {\n if (this.pluginNames.length > 0) {\n console.log(` ${chalk.bold(\">\")} Plugins:`);\n for (const name of this.pluginNames) {\n const shortName = name.replace(\"@4399ywkf/plugin-\", \"\").replace(\"@4399ywkf/\", \"\");\n console.log(` ${chalk.green(\"✓\")} ${shortName}`);\n }\n console.log();\n }\n }\n\n /**\n * 打印服务器信息面板(dev 模式使用)\n */\n private printServerInfo(): void {\n const localUrl = `http://localhost:${this.port}/`;\n const networkUrl = getNetworkAddress(this.port);\n\n console.log(` ${chalk.bold(\">\")} Local: ${chalk.cyan(localUrl)}`);\n if (networkUrl) {\n console.log(` ${chalk.bold(\">\")} Network: ${chalk.cyan(networkUrl)}`);\n }\n console.log();\n\n this.printPluginList();\n\n console.log(` ${chalk.bold(\">\")} press ${chalk.bold(\"h + enter\")} to show shortcuts`);\n console.log();\n }\n\n /**\n * 打印快捷键帮助\n */\n printShortcuts(): void {\n console.log();\n console.log(` ${chalk.bold(\"Shortcuts:\")}`);\n console.log(` ${chalk.bold(\"o + enter\")} open in browser`);\n console.log(` ${chalk.bold(\"c + enter\")} clear console`);\n console.log(` ${chalk.bold(\"q + enter\")} quit`);\n console.log();\n }\n}\n\n/**\n * 创建 Rspack ProgressPlugin handler\n *\n * 返回一个 (percent, message, ...details) 回调供 ProgressPlugin 使用。\n */\nexport function createProgressHandler(printer: DevPrinter) {\n return (percent: number, message: string, ..._details: string[]) => {\n printer.updateProgress(percent, message);\n };\n}\n\n/**\n * 注册交互式快捷键\n */\nexport function registerShortcuts(\n printer: DevPrinter,\n opts: { port: number; onQuit: () => void },\n): void {\n if (!process.stdin.isTTY) return;\n\n process.stdin.setEncoding(\"utf-8\");\n process.stdin.setRawMode?.(false);\n\n let buffer = \"\";\n\n const handler = (data: string) => {\n buffer += data;\n\n if (!buffer.includes(\"\\n\")) return;\n\n const cmd = buffer.trim().toLowerCase();\n buffer = \"\";\n\n switch (cmd) {\n case \"h\":\n printer.printShortcuts();\n break;\n case \"o\": {\n const url = `http://localhost:${opts.port}/`;\n import(\"child_process\").then((cp) => {\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"start\"\n : \"xdg-open\";\n cp.exec(`${command} ${url}`);\n });\n console.log(` ${chalk.green(\"➜\")} Opening ${chalk.cyan(url)}...`);\n break;\n }\n case \"c\":\n console.clear();\n break;\n case \"q\":\n opts.onQuit();\n break;\n }\n };\n\n process.stdin.on(\"data\", handler);\n process.stdin.resume();\n}\n","import { rspack } from \"@rspack/core\";\nimport { RspackDevServer } from \"@rspack/dev-server\";\nimport chalk from \"chalk\";\nimport { resolveConfig } from \"../config/loader.js\";\nimport { PluginManager } from \"../plugin/manager.js\";\nimport { createRspackConfig } from \"../rspack/index.js\";\nimport { loadEnv, preloadEnv } from \"./env.js\";\nimport { getAvailablePort } from \"./port.js\";\nimport { createProgressHandler, DevPrinter, registerShortcuts } from \"./printer.js\";\n\n/**\n * 启动开发服务器\n *\n * @param options.mode - env 文件模式,决定加载 .env.{mode},默认 \"development\"\n * 例如 --mode staging 会加载 .env.staging,但 NODE_ENV 仍为 \"development\"\n */\nexport async function dev(options: { cwd?: string; mode?: string } = {}): Promise<void> {\n const cwd = options.cwd || process.cwd();\n const mode = options.mode || \"development\";\n\n try {\n // 1. 预加载环境变量(在配置解析之前)\n preloadEnv(cwd, mode, \"development\");\n\n // 2. 加载配置\n const { config } = await resolveConfig(cwd);\n\n // 3. 完整加载环境变量\n loadEnv(config, cwd, mode, \"development\");\n\n // 4. 加载插件(静默模式,不输出到终端)\n const pluginManager = new PluginManager(config, cwd, true);\n if (config.plugins && config.plugins.length > 0) {\n await pluginManager.loadPlugins(config.plugins);\n }\n\n // 5. 执行 beforeDevServer 钩子\n await pluginManager.runBeforeDevServer();\n\n // 6. 创建 Rspack 配置\n let rspackConfig = createRspackConfig(config, cwd, { isDev: true });\n\n // 7. 应用插件的 rspack 配置修改\n rspackConfig = await pluginManager.applyRspackConfigHooks(rspackConfig);\n\n const host = config.dev.host || \"localhost\";\n const preferredPort = config.dev.port || 3000;\n const port = await getAvailablePort(preferredPort, host);\n const pluginNames = pluginManager.getPluginNames();\n\n if (port !== preferredPort) {\n console.log(chalk.yellow(` Port ${preferredPort} is in use, using ${port} instead.\\n`));\n }\n\n // 8. 初始化终端 UI\n const printer = new DevPrinter(host, port, pluginNames);\n printer.printBanner();\n printer.printBuildStart();\n printer.updateProgress(0, \"preparing\");\n\n // 9. 注入 ProgressPlugin\n rspackConfig.plugins = rspackConfig.plugins || [];\n rspackConfig.plugins.push(new rspack.ProgressPlugin(createProgressHandler(printer)));\n\n // 10. 静默 rspack 自带终端输出(不影响 HMR WebSocket 连接)\n rspackConfig.stats = \"none\";\n rspackConfig.infrastructureLogging = { level: \"none\" };\n if (rspackConfig.devServer) {\n const ds = rspackConfig.devServer as Record<string, unknown>;\n const existingClient = (ds.client ?? {}) as Record<string, unknown>;\n ds.client = {\n ...existingClient,\n logging: \"warn\",\n overlay: false,\n progress: false,\n };\n }\n\n // 11. 创建编译器 & 监听编译事件\n const compiler = rspack(rspackConfig);\n\n compiler.hooks.done.tap(\"ywkf-dev-printer\", (stats) => {\n const hasErrors = stats.hasErrors();\n if (hasErrors) {\n const info = stats.toJson({ errors: true });\n console.log();\n console.log(chalk.red(\" Compile error:\"));\n for (const err of info.errors || []) {\n console.log(chalk.red(` ${err.message}`));\n }\n console.log();\n }\n printer.printBuildDone(hasErrors);\n });\n\n compiler.hooks.invalid.tap(\"ywkf-dev-printer\", () => {\n printer.markRebuildStart();\n printer.updateProgress(0, \"rebuilding\");\n });\n\n // 12. 创建并启动开发服务器(使用检测后的实际端口)\n const devServerOptions = {\n ...(rspackConfig.devServer || {}),\n host,\n port,\n };\n const server = new RspackDevServer(devServerOptions, compiler);\n\n await server.start();\n\n // 13. 执行 afterDevServer 钩子\n await pluginManager.runAfterDevServer({ host, port });\n\n // 14. 注册交互式快捷键\n registerShortcuts(printer, {\n port,\n onQuit: async () => {\n console.log(chalk.gray(\"\\n Shutting down...\\n\"));\n await server.stop();\n process.exit(0);\n },\n });\n\n // 15. 监听退出信号\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 console.error();\n console.error(chalk.red(\" ✖ Dev server failed to start\"));\n console.error(error);\n process.exit(1);\n }\n}\n","import net from \"node:net\";\n\n/**\n * 检测端口是否可用\n */\nfunction isPortAvailable(port: number, host: string): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n\n server.once(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n resolve(false);\n } else {\n resolve(false);\n }\n });\n\n server.once(\"listening\", () => {\n server.close(() => resolve(true));\n });\n\n server.listen(port, host);\n });\n}\n\n/**\n * 获取可用端口\n *\n * 从 preferredPort 开始,依次尝试 +1,最多尝试 20 个端口。\n * 返回实际可用的端口号。\n */\nexport async function getAvailablePort(preferredPort: number, host: string): Promise<number> {\n const MAX_ATTEMPTS = 20;\n\n for (let i = 0; i < MAX_ATTEMPTS; i++) {\n const port = preferredPort + i;\n const available = await isPortAvailable(port, host);\n if (available) return port;\n }\n\n throw new Error(\n `No available port found in range ${preferredPort}-${preferredPort + MAX_ATTEMPTS - 1}`,\n );\n}\n","import type { PluginHooks, YwkfPlugin } from \"./types.js\";\n\n/**\n * 定义插件的辅助函数\n *\n * @example\n * ```ts\n * export default definePlugin({\n * name: \"my-plugin\",\n * setup(context) {\n * return {\n * modifyRspackConfig(config) {\n * // 修改配置\n * return config;\n * },\n * };\n * },\n * });\n * ```\n */\nexport function definePlugin(plugin: YwkfPlugin): YwkfPlugin {\n return plugin;\n}\n\n/**\n * 创建带配置的插件工厂\n *\n * @example\n * ```ts\n * export default createPlugin<{ apiUrl: string }>((options) => ({\n * name: \"api-plugin\",\n * setup(context) {\n * console.log(\"API URL:\", options?.apiUrl);\n * return {};\n * },\n * }));\n * ```\n */\nexport function createPlugin<T = Record<string, unknown>>(\n factory: (options?: T) => YwkfPlugin,\n): (options?: T) => YwkfPlugin {\n return factory;\n}\n\n/**\n * 组合多个插件钩子\n */\nexport function composeHooks(...hooksList: PluginHooks[]): PluginHooks {\n const composed: Record<string, Function> = {};\n\n for (const hooks of hooksList) {\n for (const [key, value] of Object.entries(hooks)) {\n if (value) {\n const existing = composed[key];\n if (existing) {\n composed[key] = async (...args: unknown[]) => {\n await existing(...args);\n return (value as Function)(...args);\n };\n } else {\n composed[key] = value as Function;\n }\n }\n }\n }\n\n return composed as PluginHooks;\n}\n","import { createPlugin } from \"../define.js\";\nimport type { PluginHooks } from \"../types.js\";\n\nexport interface AnalyticsPluginOptions {\n /** 是否启用构建分析 */\n buildAnalysis?: boolean;\n /** 是否输出构建时间 */\n timing?: boolean;\n /** 是否分析 bundle 大小 */\n bundleSize?: boolean;\n /** 大文件警告阈值(KB) */\n sizeWarningThreshold?: number;\n}\n\n/**\n * 构建分析插件\n *\n * @example\n * ```ts\n * import { analyticsPlugin } from \"@4399ywkf/core/plugin\";\n *\n * export default defineConfig({\n * plugins: [\n * analyticsPlugin({\n * timing: true,\n * bundleSize: true,\n * sizeWarningThreshold: 500, // 500KB\n * }),\n * ],\n * });\n * ```\n */\nexport const analyticsPlugin = createPlugin<AnalyticsPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-analytics\",\n version: \"1.0.0\",\n description: \"构建分析插件\",\n\n setup(context) {\n const {\n buildAnalysis = true,\n timing = true,\n bundleSize = true,\n sizeWarningThreshold = 500,\n } = options;\n const { logger, isProd } = context;\n\n let buildStartTime: number;\n\n const hooks: PluginHooks = {\n beforeBuild() {\n if (timing) {\n buildStartTime = Date.now();\n logger.info(\"开始构建...\");\n }\n },\n\n afterBuild(_context, stats) {\n if (timing) {\n const duration = Date.now() - buildStartTime;\n logger.info(`构建完成,耗时: ${(duration / 1000).toFixed(2)}s`);\n }\n\n if (!stats.success && stats.errors) {\n logger.error(`构建失败,错误数: ${stats.errors.length}`);\n }\n },\n\n modifyRspackConfig(config) {\n if (buildAnalysis && isProd) {\n // 可以在这里添加 bundle analyzer 插件\n logger.info(\"构建分析已启用\");\n }\n\n return config;\n },\n };\n\n return hooks;\n },\n}));\n\nexport default analyticsPlugin;\n","import { existsSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createPlugin } from \"../define.js\";\nimport type { PluginHooks } from \"../types.js\";\n\nexport interface BiomePluginOptions {\n /**\n * 是否在项目根目录生成 biome.json(仅在文件不存在时)\n * @default true\n */\n scaffold?: boolean;\n\n /**\n * biome.json 的 formatter 缩进风格\n * @default \"space\"\n */\n indentStyle?: \"space\" | \"tab\";\n\n /**\n * JS/TS formatter 引号风格\n * @default \"double\"\n */\n quoteStyle?: \"double\" | \"single\";\n\n /**\n * 箭头函数参数括号\n * @default \"always\"\n */\n arrowParentheses?: \"always\" | \"asNeeded\";\n\n /**\n * JS/TS 行宽\n * @default 100\n */\n lineWidth?: number;\n\n /**\n * 是否启用 organizeImports\n * @default true\n */\n organizeImports?: boolean;\n\n /**\n * 额外忽略的文件 glob\n */\n ignore?: string[];\n\n /**\n * 自定义 linter 规则覆盖(浅合并到默认规则上)\n */\n rules?: Record<string, Record<string, string>>;\n}\n\nconst DEFAULT_IGNORE = [\".vscode/**/*\", \"node_modules/**/*\", \"dist/**/*\", \".ywkf/**/*\"];\n\n/**\n * Biome 代码规范插件\n *\n * 在 setup 阶段自动生成 biome.json,为项目提供统一的\n * Lint / Format / Import Sorting 规范。\n *\n * 默认配置参考 modern.js 的 biome 方案,并适配 React + Ant Design 项目。\n *\n * @example\n * ```ts\n * import { defineConfig, biomePlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * biomePlugin(),\n * ],\n * });\n * ```\n */\nexport const biomePlugin = createPlugin<BiomePluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-biome\",\n version: \"1.0.0\",\n description: \"Biome 代码规范集成\",\n\n setup(context) {\n const {\n scaffold = true,\n indentStyle = \"space\",\n quoteStyle = \"double\",\n arrowParentheses = \"always\",\n lineWidth = 100,\n organizeImports = true,\n ignore = [],\n rules: customRules = {},\n } = options;\n\n const { cwd, logger } = context;\n\n if (scaffold) {\n const biomeConfigPath = join(cwd, \"biome.json\");\n if (!existsSync(biomeConfigPath)) {\n const config = buildBiomeConfig({\n indentStyle,\n quoteStyle,\n arrowParentheses,\n lineWidth,\n organizeImports,\n ignore: [...DEFAULT_IGNORE, ...ignore],\n customRules,\n });\n writeFileSync(biomeConfigPath, `${JSON.stringify(config, null, 2)}\\n`, \"utf-8\");\n logger.info(\"已生成 biome.json\");\n }\n }\n\n const hooks: PluginHooks = {\n modifyRspackConfig(rspackConfig) {\n logger.info(\"Biome 代码规范已启用\");\n return rspackConfig;\n },\n };\n\n return hooks;\n },\n}));\n\ninterface BuildConfigParams {\n indentStyle: string;\n quoteStyle: string;\n arrowParentheses: string;\n lineWidth: number;\n organizeImports: boolean;\n ignore: string[];\n customRules: Record<string, Record<string, string>>;\n}\n\nfunction buildBiomeConfig(params: BuildConfigParams) {\n const {\n indentStyle,\n quoteStyle,\n arrowParentheses,\n lineWidth,\n organizeImports: enableOrganizeImports,\n ignore,\n customRules,\n } = params;\n\n const defaultRules: Record<string, Record<string, string>> = {\n recommended: { \"\": \"true\" } as unknown as Record<string, string>,\n style: {\n useNodejsImportProtocol: \"off\",\n noNonNullAssertion: \"off\",\n noUnusedTemplateLiteral: \"off\",\n noUselessElse: \"off\",\n useNumberNamespace: \"off\",\n },\n suspicious: {\n noExplicitAny: \"off\",\n noConfusingVoidType: \"off\",\n noImplicitAnyLet: \"off\",\n noAssignInExpressions: \"off\",\n noPrototypeBuiltins: \"off\",\n },\n complexity: {\n noForEach: \"off\",\n noBannedTypes: \"off\",\n useArrowFunction: \"off\",\n },\n correctness: {\n useExhaustiveDependencies: \"off\",\n },\n a11y: {\n useAltText: \"off\",\n useKeyWithClickEvents: \"off\",\n useButtonType: \"off\",\n noSvgWithoutTitle: \"off\",\n },\n performance: {\n noDelete: \"off\",\n },\n security: {\n noDangerouslySetInnerHtml: \"off\",\n },\n };\n\n const mergedRules: Record<string, unknown> = { recommended: true };\n for (const [category, categoryRules] of Object.entries(defaultRules)) {\n if (category === \"recommended\") continue;\n const customCategoryRules = customRules[category] || {};\n mergedRules[category] = { ...categoryRules, ...customCategoryRules };\n }\n\n const includesPatterns = [\"**\", ...ignore.map((p) => `!${p}`)];\n\n return {\n $schema: \"https://biomejs.dev/schemas/2.3.2/schema.json\",\n vcs: {\n enabled: true,\n defaultBranch: \"main\",\n clientKind: \"git\",\n useIgnoreFile: true,\n },\n formatter: {\n enabled: true,\n indentStyle,\n },\n css: {\n formatter: {\n quoteStyle: \"single\",\n },\n },\n javascript: {\n formatter: {\n quoteStyle,\n arrowParentheses,\n jsxQuoteStyle: \"double\",\n lineWidth,\n },\n },\n linter: {\n enabled: true,\n rules: mergedRules,\n },\n assist: {\n actions: {\n source: {\n organizeImports: enableOrganizeImports ? \"on\" : \"off\",\n },\n },\n },\n files: {\n ignoreUnknown: true,\n includes: includesPatterns,\n },\n };\n}\n\n/**\n * 生成默认 biome.json 配置内容(纯数据,供 CLI 脚手架使用)\n */\nexport function getDefaultBiomeConfig(): Record<string, unknown> {\n return buildBiomeConfig({\n indentStyle: \"space\",\n quoteStyle: \"double\",\n arrowParentheses: \"always\",\n lineWidth: 100,\n organizeImports: true,\n ignore: DEFAULT_IGNORE,\n customRules: {},\n });\n}\n","import { createPlugin } from \"../define.js\";\nimport type { CodeInjection, GeneratorContext, PluginHooks } from \"../types.js\";\n\nexport interface GarfishPluginOptions {\n /** 应用名称(微前端标识) */\n appName?: string;\n /** 是否作为主应用 */\n master?: boolean;\n /** 子应用列表(主应用模式) */\n apps?: {\n name: string;\n entry: string;\n activeRule: string;\n basename?: string;\n }[];\n /** 沙箱配置 */\n sandbox?: {\n /** 是否开启 JS 沙箱 */\n open?: boolean;\n /** 是否开启快照沙箱 */\n snapshot?: boolean;\n /** 样式隔离 */\n strictStyleIsolation?: boolean;\n };\n}\n\n/**\n * Garfish 微前端插件\n *\n * 通过插件方式启用微前端功能,支持子应用和主应用两种模式。\n *\n * @example\n * ```ts\n * // ywkf.config.ts - 子应用模式\n * import { defineConfig, garfishPlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * garfishPlugin({\n * appName: \"sub-app\",\n * }),\n * ],\n * });\n * ```\n *\n * @example\n * ```ts\n * // ywkf.config.ts - 主应用模式\n * import { defineConfig, garfishPlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * garfishPlugin({\n * master: true,\n * apps: [\n * { name: \"sub-app\", entry: \"http://localhost:3001\", activeRule: \"/sub\" },\n * ],\n * }),\n * ],\n * });\n * ```\n */\nexport const garfishPlugin = createPlugin<GarfishPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-garfish\",\n version: \"1.0.0\",\n description: \"Garfish 微前端插件\",\n\n setup(context) {\n const { appName, master = false, apps = [], sandbox = {} } = options;\n const { config, logger, isDev } = context;\n const finalAppName = appName || config.appName;\n\n const hooks: PluginHooks = {\n // ===== 构建阶段钩子 =====\n modifyRspackConfig(rspackConfig) {\n // 微前端子应用需要 UMD 输出 + CORS\n if (!master) {\n rspackConfig.output = {\n ...rspackConfig.output,\n library: finalAppName,\n libraryTarget: \"umd\",\n globalObject: \"window\",\n chunkLoadingGlobal: `garfish_${finalAppName}`,\n };\n\n // 子应用 dev server 必须允许跨域(主应用需要跨域加载子应用资源)\n rspackConfig.devServer = {\n ...rspackConfig.devServer,\n headers: {\n ...(((rspackConfig.devServer as Record<string, unknown>)?.headers as Record<\n string,\n string\n >) || {}),\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET, POST, PUT, DELETE, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"*\",\n },\n };\n\n logger.info(`配置 UMD 输出: ${finalAppName}`);\n }\n\n return rspackConfig;\n },\n\n beforeDevServer() {\n if (master) {\n logger.info(\"Garfish 主应用模式\");\n logger.info(`子应用列表: ${apps.map((a) => a.name).join(\", \")}`);\n } else {\n logger.info(`Garfish 子应用模式: ${finalAppName}`);\n }\n },\n\n // ===== 代码生成阶段钩子 =====\n injectEntry(_ctx: GeneratorContext): CodeInjection {\n if (master && apps.length > 0) {\n return {\n imports: [`import { initGarfishMaster } from \"./bootstrap\";`],\n topLevel: [`// Garfish 主应用:初始化微前端并注册子应用`, `await initGarfishMaster();`],\n };\n }\n\n if (!master) {\n return {\n imports: [`import { garfishProvider, isMicroAppEnv } from \"./bootstrap\";`],\n exports: [\n `// Garfish 子应用生命周期导出(provider 函数格式)`,\n `export const provider = garfishProvider;`,\n ],\n topLevel: [\n `// Garfish 微前端:独立运行判断`,\n `const shouldRunIndependently = !isMicroAppEnv();`,\n ],\n };\n }\n\n return {};\n },\n\n injectBootstrap(_ctx: GeneratorContext): CodeInjection {\n const imports: string[] = [];\n const exports: string[] = [];\n const topLevel: string[] = [];\n\n if (master) {\n // 主应用模式\n if (apps.length > 0) {\n imports.push(`import Garfish from \"garfish\";`);\n topLevel.push(generateMasterInitCode(apps, config.router.basename));\n }\n } else {\n // 子应用模式:使用 Garfish 专用 provider 格式\n imports.push(\n `import { createGarfishProvider, isMicroAppEnv } from \"@4399ywkf/core/runtime\";`,\n );\n exports.push(\n `/**`,\n ` * Garfish 子应用 provider(render/destroy 格式)`,\n ` */`,\n `export const garfishProvider = createGarfishProvider(createAppConfig);`,\n ``,\n `/**`,\n ` * 判断是否在微前端环境`,\n ` */`,\n `export { isMicroAppEnv };`,\n );\n }\n\n return { imports, exports, topLevel };\n },\n\n modifyBootstrapCode(code: string, _ctx: GeneratorContext): string {\n // 微前端子应用禁用 antd 配置(由主应用管理)\n if (!master) {\n return code.replace(/antd:\\s*\\{\\s*enabled:\\s*true/, \"antd: { enabled: false\");\n }\n return code;\n },\n\n // ===== 运行时阶段钩子 =====\n modifyAppConfig(appConfig) {\n return {\n ...appConfig,\n // 微前端模式下禁用 antd 样式注入(由主应用管理)\n antd: {\n ...appConfig.antd,\n enabled: master,\n },\n };\n },\n };\n\n return hooks;\n },\n}));\n\n/**\n * 生成主应用初始化代码\n */\nfunction generateMasterInitCode(\n apps: NonNullable<GarfishPluginOptions[\"apps\"]>,\n basename?: string,\n): string {\n const appConfigs = apps\n .map(\n (app) => `{\n name: \"${app.name}\",\n entry: \"${app.entry}\",\n activeWhen: \"${app.activeRule}\",\n ${app.basename ? `basename: \"${app.basename}\",` : \"\"}\n }`,\n )\n .join(\",\\n \");\n\n return `\n/**\n * Garfish 主应用初始化\n * 在 runApp 之前调用\n */\nexport async function initGarfishMaster(): Promise<void> {\n await Garfish.run({\n basename: \"${basename || \"/\"}\",\n domGetter: \"#subapp-container\",\n apps: [\n ${appConfigs}\n ],\n });\n}\n`;\n}\n\nexport default garfishPlugin;\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createPlugin } from \"../define.js\";\nimport type { CodeInjection, GeneratedFile, GeneratorContext, PluginHooks } from \"../types.js\";\n\nexport interface I18nPluginOptions {\n /**\n * 默认语言\n * @default \"zh-CN\"\n */\n defaultLocale?: string;\n\n /**\n * 支持的语言列表\n * @default [\"zh-CN\", \"en-US\"]\n */\n locales?: string[];\n\n /**\n * 翻译 JSON 文件目录(相对于项目根目录)\n * 非默认语言的 JSON 翻译文件存放位置\n * @default \"locales\"\n */\n localesDir?: string;\n\n /**\n * 默认语言 TS 源文件目录(相对于项目根目录)\n * 开发者在此编写 TypeScript 翻译源文件,作为 i18n 的 single source of truth\n * @default \"src/locales/default\"\n */\n sourceDir?: string;\n\n /**\n * 默认命名空间\n * @default [\"common\"]\n */\n defaultNS?: string[];\n\n /**\n * 是否自动生成初始脚手架文件\n * @default true\n */\n autoScaffold?: boolean;\n}\n\n/**\n * 国际化插件(TS-first 工作流)\n *\n * 开发流程:\n * 1. 开发者在 src/locales/default/ 中编写 TypeScript 翻译源文件(有类型推导 + IDE 补全)\n * 2. 运行 `pnpm i18n:gen` 将 TS 源文件转换为 locales/{defaultLocale}/*.json\n * 3. 运行 `pnpm i18n` 使用 @lobehub/i18n-cli 将默认语言 JSON 翻译为其他语言\n * 4. 运行时:开发模式下默认语言直接 import TS,其他场景懒加载 JSON\n *\n * @example\n * ```ts\n * import { defineConfig, i18nPlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * i18nPlugin({\n * defaultLocale: \"zh-CN\",\n * locales: [\"zh-CN\", \"en-US\", \"ja-JP\"],\n * }),\n * ],\n * });\n * ```\n */\nexport const i18nPlugin = createPlugin<I18nPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-i18n\",\n version: \"1.0.0\",\n description: \"国际化 (i18next) 插件 — TS-first 工作流\",\n\n setup(context) {\n const {\n defaultLocale = \"zh-CN\",\n locales = [\"zh-CN\", \"en-US\"],\n localesDir = \"locales\",\n sourceDir = \"src/locales/default\",\n defaultNS = [\"common\"],\n autoScaffold = true,\n } = options;\n const { cwd, logger, isDev } = context;\n\n if (autoScaffold) {\n scaffoldSourceFiles(cwd, sourceDir, defaultNS, logger);\n scaffoldResourcesFile(cwd, sourceDir, defaultNS, locales, defaultLocale, logger);\n scaffoldConvertScript(cwd, sourceDir, localesDir, defaultLocale, logger);\n scaffoldI18nRc(cwd, localesDir, defaultLocale, locales, logger);\n scaffoldLocaleJsonDirs(cwd, localesDir, locales, defaultLocale, defaultNS, logger);\n }\n\n const hooks: PluginHooks = {\n modifyRspackConfig(rspackConfig) {\n const aliases = (rspackConfig.resolve?.alias || {}) as Record<string, string>;\n if (!aliases[\"@locales\"]) {\n aliases[\"@locales\"] = join(cwd, localesDir);\n }\n rspackConfig.resolve = { ...rspackConfig.resolve, alias: aliases };\n return rspackConfig;\n },\n\n generateFiles(_ctx: GeneratorContext): GeneratedFile[] {\n return [\n {\n path: \"i18n.ts\",\n content: generateI18nCode({\n defaultLocale,\n locales,\n localesDir,\n sourceDir,\n defaultNS,\n isDev,\n }),\n },\n ];\n },\n\n injectBootstrap(_ctx: GeneratorContext): CodeInjection {\n return {\n imports: [`import { initI18n } from \"./i18n\";`],\n topLevel: [`await initI18n();`],\n };\n },\n };\n\n return hooks;\n },\n}));\n\n// ============ 代码生成 ============\n\nfunction generateI18nCode(opts: {\n defaultLocale: string;\n locales: string[];\n localesDir: string;\n sourceDir: string;\n defaultNS: string[];\n isDev: boolean;\n}): string {\n const { defaultLocale, locales, defaultNS, sourceDir } = opts;\n\n // sourceDir = \"src/locales/default\"\n // → defaultDirAlias = \"locales/default\" (相对于 @/ 的路径)\n // → parentDirAlias = \"locales\" (resources.ts 所在目录)\n const defaultDirAlias = sourceDir.replace(/^src\\//, \"\");\n const parentDirAlias = defaultDirAlias.replace(/\\/[^/]+$/, \"\");\n\n return `// 此文件由 @4399ywkf/plugin-i18n 自动生成\nimport i18n from \"i18next\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\nimport resourcesToBackend from \"i18next-resources-to-backend\";\nimport { initReactI18next } from \"react-i18next\";\nimport { normalizeLocale, SUPPORTED_LOCALES, DEFAULT_LOCALE } from \"@/${parentDirAlias}/resources\";\n\nexport { DEFAULT_LOCALE, SUPPORTED_LOCALES, normalizeLocale };\nexport type { SupportedLocale, NS } from \"@/${parentDirAlias}/resources\";\n\nconst isDev = process.env.NODE_ENV === \"development\";\n\nconst instance = i18n\n .use(initReactI18next)\n .use(LanguageDetector)\n .use(\n resourcesToBackend(async (lng: string, ns: string) => {\n const normalizedLng = normalizeLocale(lng);\n\n // 开发模式下,默认语言直接 import TS(即时生效,无需先生成 JSON)\n if (isDev && normalizedLng === \"${defaultLocale}\") {\n return import(\"@/${defaultDirAlias}/\" + ns);\n }\n\n // 其他语言 / 生产模式:懒加载 JSON\n return import(\n /* webpackInclude: /\\\\.json$/ */\n /* webpackChunkName: \"locales-[request]\" */\n \\`@locales/\\${normalizedLng}/\\${ns}.json\\`\n );\n })\n );\n\nlet initialized = false;\n\nexport async function initI18n(lang?: string): Promise<typeof i18n> {\n if (initialized) return instance;\n\n await instance.init({\n defaultNS: ${JSON.stringify(defaultNS)},\n fallbackLng: DEFAULT_LOCALE,\n interpolation: { escapeValue: false },\n lng: lang,\n });\n\n initialized = true;\n return instance;\n}\n\nexport { instance as i18n };\nexport default instance;\n`;\n}\n\n// ============ 脚手架:TS 源文件 ============\n\nfunction scaffoldSourceFiles(\n cwd: string,\n sourceDir: string,\n namespaces: string[],\n logger: { info: (msg: string) => void },\n): void {\n const dir = join(cwd, sourceDir);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n for (const ns of namespaces) {\n const filePath = join(dir, `${ns}.ts`);\n if (!existsSync(filePath)) {\n writeFileSync(filePath, buildDefaultNsFile(ns), \"utf-8\");\n logger.info(`已生成翻译源文件: ${sourceDir}/${ns}.ts`);\n }\n }\n\n // 生成 index.ts barrel\n const indexPath = join(dir, \"index.ts\");\n if (!existsSync(indexPath)) {\n const imports = namespaces.map((ns) => `import ${ns} from \"./${ns}\";`).join(\"\\n\");\n const entries = namespaces.join(\",\\n \");\n const content = `${imports}\n\nconst resources = {\n ${entries},\n} as const;\n\nexport default resources;\n`;\n writeFileSync(indexPath, content, \"utf-8\");\n logger.info(`已生成翻译索引: ${sourceDir}/index.ts`);\n }\n}\n\nfunction buildDefaultNsFile(ns: string): string {\n if (ns === \"common\") {\n return `export default {\n welcome: \"欢迎使用\",\n loading: \"加载中...\",\n confirm: \"确定\",\n cancel: \"取消\",\n save: \"保存\",\n delete: \"删除\",\n edit: \"编辑\",\n back: \"返回\",\n} as const;\n`;\n }\n\n return `export default {\n title: \"${ns}\",\n} as const;\n`;\n}\n\n// ============ 脚手架:resources.ts 类型文件 ============\n\nfunction scaffoldResourcesFile(\n cwd: string,\n sourceDir: string,\n _namespaces: string[],\n locales: string[],\n defaultLocale: string,\n logger: { info: (msg: string) => void },\n): void {\n const parentDir = join(cwd, sourceDir, \"..\");\n const filePath = join(parentDir, \"resources.ts\");\n if (existsSync(filePath)) return;\n\n const content = `import resources from \"./default\";\n\nexport const DEFAULT_LOCALE = \"${defaultLocale}\";\n\nexport const SUPPORTED_LOCALES = ${JSON.stringify(locales)} as const;\n\nexport type SupportedLocale = (typeof SUPPORTED_LOCALES)[number];\n\nexport type DefaultResources = typeof resources;\n\nexport type NS = keyof DefaultResources;\n\nexport const normalizeLocale = (locale?: string): SupportedLocale => {\n if (!locale) return DEFAULT_LOCALE as SupportedLocale;\n\n for (const l of SUPPORTED_LOCALES) {\n if (l.startsWith(locale) || locale.startsWith(l.split(\"-\")[0])) {\n return l;\n }\n }\n\n return DEFAULT_LOCALE as SupportedLocale;\n};\n\nexport const localeOptions = ${JSON.stringify(\n locales.map((l) => ({ value: l, label: getLocaleLabel(l) })),\n null,\n 2,\n )} as const;\n`;\n\n writeFileSync(filePath, content, \"utf-8\");\n logger.info(`已生成类型文件: ${sourceDir}/../resources.ts`);\n}\n\nfunction getLocaleLabel(locale: string): string {\n const map: Record<string, string> = {\n \"zh-CN\": \"简体中文\",\n \"zh-TW\": \"繁體中文\",\n \"en-US\": \"English\",\n \"ja-JP\": \"日本語\",\n \"ko-KR\": \"한국어\",\n \"de-DE\": \"Deutsch\",\n \"fr-FR\": \"Français\",\n \"es-ES\": \"Español\",\n \"pt-BR\": \"Português\",\n \"ru-RU\": \"Русский\",\n \"it-IT\": \"Italiano\",\n \"vi-VN\": \"Tiếng Việt\",\n ar: \"العربية\",\n };\n return map[locale] || locale;\n}\n\n// ============ 脚手架:转换脚本 ============\n\nfunction scaffoldConvertScript(\n cwd: string,\n sourceDir: string,\n localesDir: string,\n defaultLocale: string,\n logger: { info: (msg: string) => void },\n): void {\n const scriptsDir = join(cwd, \"scripts\");\n const scriptPath = join(scriptsDir, \"i18n-gen.js\");\n if (existsSync(scriptPath)) return;\n\n if (!existsSync(scriptsDir)) {\n mkdirSync(scriptsDir, { recursive: true });\n }\n\n const content = `const fs = require(\"fs\");\nconst path = require(\"path\");\n\nconst sourceDir = path.join(__dirname, \"../${sourceDir}\");\nconst targetDir = path.join(__dirname, \"../${localesDir}/${defaultLocale}\");\n\nconst files = fs\n .readdirSync(sourceDir)\n .filter((file) => file.endsWith(\".ts\") && file !== \"index.ts\")\n .map((file) => path.basename(file, \".ts\"));\n\nrequire(\"ts-node/register\");\n\nif (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n}\n\nconsole.log(\"开始转换 TypeScript 文件到 JSON...\\\\n\");\n\nfiles.forEach((fileName) => {\n try {\n const modulePath = path.join(sourceDir, \\`\\${fileName}.ts\\`);\n delete require.cache[require.resolve(modulePath)];\n const moduleContent = require(modulePath).default;\n const jsonContent = JSON.stringify(moduleContent, null, 2);\n const targetPath = path.join(targetDir, \\`\\${fileName}.json\\`);\n fs.writeFileSync(targetPath, jsonContent, \"utf8\");\n console.log(\\` \\${fileName}.ts → \\${fileName}.json\\`);\n } catch (error) {\n console.error(\\` 转换 \\${fileName}.ts 失败:\\`, error.message);\n }\n});\n\nconsole.log(\"\\\\n转换完成!\");\n`;\n\n writeFileSync(scriptPath, content, \"utf-8\");\n logger.info(\"已生成转换脚本: scripts/i18n-gen.js\");\n}\n\n// ============ 脚手架:.i18nrc.js(@lobehub/i18n-cli 配置) ============\n\nfunction scaffoldI18nRc(\n cwd: string,\n localesDir: string,\n defaultLocale: string,\n locales: string[],\n logger: { info: (msg: string) => void },\n): void {\n const filePath = join(cwd, \".i18nrc.js\");\n if (existsSync(filePath)) return;\n\n const outputLocales = locales\n .filter((l) => l !== defaultLocale)\n .map((l) => `\"${l}\"`)\n .join(\", \");\n\n const content = `const { defineConfig } = require(\"@lobehub/i18n-cli\");\n\nmodule.exports = defineConfig({\n entry: \"${localesDir}/${defaultLocale}\",\n entryLocale: \"${defaultLocale}\",\n output: \"${localesDir}\",\n outputLocales: [${outputLocales}],\n});\n`;\n\n writeFileSync(filePath, content, \"utf-8\");\n logger.info(\"已生成翻译配置: .i18nrc.js(@lobehub/i18n-cli)\");\n}\n\n// ============ 脚手架:非默认语言的 JSON 目录 ============\n\nfunction scaffoldLocaleJsonDirs(\n cwd: string,\n localesDir: string,\n locales: string[],\n defaultLocale: string,\n namespaces: string[],\n logger: { info: (msg: string) => void },\n): void {\n const baseDir = join(cwd, localesDir);\n\n for (const locale of locales) {\n const localeDir = join(baseDir, locale);\n if (!existsSync(localeDir)) {\n mkdirSync(localeDir, { recursive: true });\n }\n\n // 只为非默认语言生成占位 JSON(默认语言由脚本从 TS 生成)\n if (locale === defaultLocale) continue;\n\n for (const ns of namespaces) {\n const filePath = join(localeDir, `${ns}.json`);\n if (!existsSync(filePath)) {\n const placeholder =\n ns === \"common\"\n ? JSON.stringify(\n {\n welcome: \"Welcome\",\n loading: \"Loading...\",\n confirm: \"OK\",\n cancel: \"Cancel\",\n save: \"Save\",\n delete: \"Delete\",\n edit: \"Edit\",\n back: \"Back\",\n },\n null,\n 2,\n )\n : JSON.stringify({ title: ns }, null, 2);\n writeFileSync(filePath, `${placeholder}\\n`, \"utf-8\");\n logger.info(`已生成翻译文件: ${localesDir}/${locale}/${ns}.json`);\n }\n }\n }\n}\n\nexport default i18nPlugin;\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { createPlugin } from \"../define.js\";\nimport type { PluginHooks } from \"../types.js\";\n\nexport interface MockPluginOptions {\n /** Mock 文件目录 */\n mockDir?: string;\n /** 是否在生产环境启用 */\n enableInProd?: boolean;\n /** 延迟时间(模拟网络延迟) */\n delay?: number;\n /** 前缀路径 */\n prefix?: string;\n}\n\n/**\n * Mock 数据插件\n *\n * @example\n * ```ts\n * // ywkf.config.ts\n * import { mockPlugin } from \"@4399ywkf/core/plugin\";\n *\n * export default defineConfig({\n * plugins: [\n * mockPlugin({\n * mockDir: \"mock\",\n * prefix: \"/api\",\n * }),\n * ],\n * });\n * ```\n *\n * Mock 文件示例 (mock/user.ts):\n * ```ts\n * export default {\n * \"GET /api/users\": [\n * { id: 1, name: \"张三\" },\n * ],\n * \"POST /api/users\": (req, res) => {\n * res.json({ success: true });\n * },\n * };\n * ```\n */\nexport const mockPlugin = createPlugin<MockPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-mock\",\n version: \"1.0.0\",\n description: \"Mock 数据插件\",\n\n setup(context) {\n const { mockDir = \"mock\", enableInProd = false, delay = 0, prefix = \"\" } = options;\n const { cwd, isDev, logger } = context;\n\n // 生产环境且未启用则跳过\n if (!isDev && !enableInProd) {\n logger.info(\"生产环境已禁用 Mock\");\n return {};\n }\n\n const mockPath = resolve(cwd, mockDir);\n\n // 检查 mock 目录是否存在\n if (!existsSync(mockPath)) {\n logger.warn(`Mock 目录不存在: ${mockPath}`);\n return {};\n }\n\n const hooks: PluginHooks = {\n modifyRspackConfig(rspackConfig) {\n // 配置 devServer proxy 以支持 mock\n if (isDev && rspackConfig.devServer) {\n const mockFiles = scanMockFiles(mockPath);\n logger.info(`找到 ${mockFiles.length} 个 Mock 文件`);\n\n // 添加 mock 中间件配置\n rspackConfig.devServer.setupMiddlewares = (middlewares, _devServer) => {\n // 在其他中间件之前添加 mock 处理\n middlewares.unshift({\n name: \"mock-middleware\",\n middleware: createMockMiddleware(mockPath, { delay, prefix, logger }),\n });\n return middlewares;\n };\n }\n\n return rspackConfig;\n },\n\n beforeDevServer() {\n logger.info(`Mock 已启用,目录: ${mockPath}`);\n if (delay > 0) {\n logger.info(`模拟延迟: ${delay}ms`);\n }\n },\n };\n\n return hooks;\n },\n}));\n\n/**\n * 扫描 mock 文件\n */\nfunction scanMockFiles(dir: string): string[] {\n const files: string[] = [];\n\n if (!existsSync(dir)) {\n return files;\n }\n\n const entries = readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n\n if (stat.isFile() && /\\.(ts|js|mjs)$/.test(entry)) {\n files.push(fullPath);\n } else if (stat.isDirectory()) {\n files.push(...scanMockFiles(fullPath));\n }\n }\n\n return files;\n}\n\n/**\n * 创建 mock 中间件\n */\nfunction createMockMiddleware(\n mockPath: string,\n options: { delay: number; prefix: string; logger: { info: (msg: string) => void } },\n): (req: unknown, res: unknown, next: () => void) => Promise<void> {\n const { delay } = options;\n\n // 加载所有 mock 文件\n scanMockFiles(mockPath);\n\n return async (_req: unknown, _res: unknown, next: () => void) => {\n // 简化实现:实际应该加载 mock 文件并匹配请求\n // 这里直接传递给下一个中间件\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n next();\n };\n}\n\nexport default mockPlugin;\n","import { createPlugin } from \"../define.js\";\nimport type { CodeInjection, GeneratedFile, GeneratorContext, PluginHooks } from \"../types.js\";\n\nexport interface ReactQueryPluginOptions {\n /**\n * 默认 staleTime(毫秒)\n * @default 5 * 60 * 1000 (5 分钟)\n */\n staleTime?: number;\n\n /**\n * 默认 gcTime(毫秒)\n * @default 10 * 60 * 1000 (10 分钟)\n */\n gcTime?: number;\n\n /**\n * 默认重试次数\n * @default 1\n */\n retry?: number | boolean;\n\n /**\n * 是否开启 React Query DevTools(仅开发模式生效)\n * @default true\n */\n devtools?: boolean;\n\n /**\n * axios baseURL\n * @default \"\"\n */\n baseURL?: string;\n\n /**\n * 请求超时时间(毫秒)\n * @default 15000\n */\n timeout?: number;\n}\n\n/**\n * React Query + Axios 请求层插件\n *\n * - 自动注入 QueryClientProvider\n * - 生成 .ywkf/query-client.ts(QueryClient 实例 + 默认配置)\n * - 生成 .ywkf/request.ts(axios 封装 + 拦截器骨架)\n * - 开发模式可选开启 React Query DevTools\n *\n * @example\n * ```ts\n * import { defineConfig, reactQueryPlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * reactQueryPlugin({ staleTime: 5 * 60 * 1000 }),\n * ],\n * });\n * ```\n */\nexport const reactQueryPlugin = createPlugin<ReactQueryPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-react-query\",\n version: \"1.0.0\",\n description: \"React Query + Axios 请求层集成\",\n\n setup(context) {\n const {\n staleTime = 5 * 60 * 1000,\n gcTime = 10 * 60 * 1000,\n retry = 1,\n devtools = true,\n baseURL = \"\",\n timeout = 15000,\n } = options;\n\n const { logger, isDev } = context;\n\n const hooks: PluginHooks = {\n generateFiles(_ctx: GeneratorContext): GeneratedFile[] {\n logger.info(\"React Query 已启用\");\n\n const files: GeneratedFile[] = [\n {\n path: \"query-client.ts\",\n content: buildQueryClientFile({ staleTime, gcTime, retry, devtools, isDev }),\n },\n {\n path: \"request.ts\",\n content: buildRequestFile({ baseURL, timeout }),\n },\n ];\n\n return files;\n },\n\n injectBootstrap(_ctx: GeneratorContext): CodeInjection {\n return {\n imports: [\n `import { QueryClientProvider } from \"@tanstack/react-query\";`,\n `import { queryClient } from \"./query-client\";`,\n ],\n topLevel: [`// React Query Provider(由 @4399ywkf/plugin-react-query 注入)`],\n };\n },\n\n modifyBootstrapCode(code: string): string {\n // 在 createAppConfig 的 providers 数组中注入 QueryClientProvider\n const providerEntry = ` {\n component: QueryClientProvider as React.ComponentType<{ children: React.ReactNode }>,\n props: { client: queryClient },\n order: 20,\n }`;\n\n // 查找 providers: [] 并注入\n if (code.includes(\"providers: []\")) {\n code = code.replace(\"providers: []\", `providers: [\\n${providerEntry},\\n ]`);\n } else if (code.includes(\"providers: [\")) {\n code = code.replace(\"providers: [\", `providers: [\\n${providerEntry},`);\n }\n\n // 补充 React import(用于类型断言)\n if (!code.includes(\"import React\")) {\n code = code.replace(\n `import { bootstrap`,\n `import React from \"react\";\\nimport { bootstrap`,\n );\n }\n\n return code;\n },\n };\n\n return hooks;\n },\n}));\n\nfunction buildQueryClientFile(opts: {\n staleTime: number;\n gcTime: number;\n retry: number | boolean;\n devtools: boolean;\n isDev: boolean;\n}): string {\n const { staleTime, gcTime, retry, devtools, isDev } = opts;\n\n return `// 此文件由 @4399ywkf/plugin-react-query 自动生成\nimport { QueryClient } from \"@tanstack/react-query\";\n\n/**\n * 全局 QueryClient 实例\n *\n * 默认配置可在 ywkf.config.ts 的 reactQueryPlugin 选项中修改。\n * 运行时自定义可通过 src/app.config.ts 覆盖。\n */\nexport const queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: ${staleTime},\n gcTime: ${gcTime},\n retry: ${typeof retry === \"boolean\" ? retry : retry},\n refetchOnWindowFocus: false,\n },\n mutations: {\n retry: false,\n },\n },\n});\n\nexport default queryClient;\n`;\n}\n\nfunction buildRequestFile(opts: { baseURL: string; timeout: number }): string {\n const { baseURL, timeout } = opts;\n\n return `// 此文件由 @4399ywkf/plugin-react-query 自动生成,请勿手动修改\n// 如需定制拦截器,请编辑 src/request.ts\nimport axios from \"axios\";\nimport qs from \"qs\";\nimport type { AxiosInstance, AxiosRequestConfig, InternalAxiosRequestConfig, AxiosResponse, AxiosError } from \"axios\";\nimport type { RequestConfig, Result } from \"@4399ywkf/core/runtime\";\n\n// ============ 加载用户配置 ============\n\nlet userConfig: RequestConfig = {};\n\ntry {\n const mod = require(\"@/request\");\n userConfig = mod.default || mod;\n} catch {\n // src/request.ts 不存在,使用默认配置\n}\n\n// ============ 参数序列化(GET 请求专用)============\n\n/**\n * GET 请求参数序列化规则:\n * - 数组:repeat 模式(key=1&key=2)\n * - 对象:JSON.stringify 后作为字符串传递\n * - null / undefined:skipNulls 跳过\n * - 基本类型:原样传递\n */\nexport function paramsSerializer(params: Record<string, any>): string {\n const normalized: Record<string, any> = {};\n\n Object.keys(params).forEach((key) => {\n const value = params[key];\n\n if (value === null || value === undefined) {\n normalized[key] = value;\n } else if (Array.isArray(value)) {\n normalized[key] = value;\n } else if (typeof value === \"object\") {\n normalized[key] = JSON.stringify(value);\n } else {\n normalized[key] = value;\n }\n });\n\n return qs.stringify(normalized, { arrayFormat: \"repeat\", skipNulls: true });\n}\n\n// ============ 创建 Axios 实例 ============\n\nconst instance: AxiosInstance = axios.create({\n baseURL: userConfig.baseURL ?? (\"${baseURL}\" || \"\"),\n timeout: userConfig.timeout ?? ${timeout},\n withCredentials: userConfig.withCredentials ?? false,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(userConfig.headers || {}),\n },\n});\n\n// ============ 请求拦截器 ============\n\ninstance.interceptors.request.use(\n (config: InternalAxiosRequestConfig) => {\n // 1. Token 注入\n if (userConfig.getToken) {\n const token = userConfig.getToken();\n if (token && config.headers) {\n const prefix = userConfig.tokenPrefix ?? \"Bearer\";\n config.headers.Authorization = prefix ? \\`\\${prefix} \\${token}\\` : token;\n }\n } else {\n // 默认:从 localStorage 读取\n const token = typeof localStorage !== \"undefined\"\n ? localStorage.getItem(\"token\")\n : null;\n if (token && config.headers) {\n config.headers.Authorization = \\`Bearer \\${token}\\`;\n }\n }\n\n // 2. 用户自定义请求拦截\n if (userConfig.requestInterceptor) {\n return userConfig.requestInterceptor(config as any) as any;\n }\n\n return config;\n },\n (error: AxiosError) => Promise.reject(error)\n);\n\n// ============ 响应拦截器 ============\n\ninstance.interceptors.response.use(\n (response: AxiosResponse) => {\n // 用户自定义响应拦截\n if (userConfig.responseInterceptor) {\n return userConfig.responseInterceptor(response as any);\n }\n\n // 默认:直接返回 response.data\n return response.data;\n },\n (error: AxiosError) => {\n // 用户自定义错误处理\n if (userConfig.errorHandler) {\n return userConfig.errorHandler(error as any);\n }\n\n // 默认错误处理\n const status = error.response?.status;\n\n switch (status) {\n case 401:\n console.warn(\"[request] 未授权,请重新登录\");\n break;\n case 403:\n console.warn(\"[request] 无访问权限\");\n break;\n case 500:\n console.error(\"[request] 服务器内部错误\");\n break;\n default:\n if (!error.response) {\n console.error(\"[request] 网络异常,请检查网络连接\");\n }\n }\n\n return Promise.reject(error);\n }\n);\n\n// ============ 请求封装类 ============\n\ntype ExtraConfig = AxiosRequestConfig & { suppressErrorNotification?: boolean };\n\nclass Request {\n constructor(private readonly http: AxiosInstance) {}\n\n get<T = any>(url: string, params?: Record<string, any>, config?: ExtraConfig): Promise<Result<T>> {\n return this.http.get(url, {\n ...config,\n params,\n paramsSerializer,\n });\n }\n\n post<T = any>(url: string, data?: any, config?: ExtraConfig): Promise<Result<T>> {\n return this.http.post(url, data, config);\n }\n\n put<T = any>(url: string, data?: any, config?: ExtraConfig): Promise<Result<T>> {\n return this.http.put(url, data, config);\n }\n\n delete<T = any>(url: string, params?: Record<string, any>, config?: ExtraConfig): Promise<Result<T>> {\n return this.http.delete(url, {\n ...config,\n params,\n paramsSerializer,\n });\n }\n\n patch<T = any>(url: string, data?: any, config?: ExtraConfig): Promise<Result<T>> {\n return this.http.patch(url, data, config);\n }\n}\n\n// ============ 导出 ============\n\nexport const request = new Request(instance);\nexport type { Result };\nexport default request;\n`;\n}\n\nexport default reactQueryPlugin;\n","import { existsSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { rspack } from \"@rspack/core\";\nimport { createPlugin } from \"../define.js\";\nimport type { CodeInjection, GeneratedFile, GeneratorContext, PluginHooks } from \"../types.js\";\n\nexport interface TailwindPluginOptions {\n /**\n * 自定义暗色模式选择器\n * @default '&:where([data-theme=\"dark\"], [data-theme=\"dark\"] *)'\n */\n darkModeSelector?: string;\n\n /**\n * 是否生成 postcss.config.js(如果不存在)\n * @default true\n */\n autoConfig?: boolean;\n\n /**\n * 额外的 CSS 内容(追加到 index.css 之后)\n */\n extraCSS?: string;\n}\n\n/**\n * Tailwind CSS 插件\n *\n * 自动配置 Tailwind CSS:\n * - 注入 `@import \"tailwindcss\"` 到 index.css\n * - 确保 postcss.config.js 存在\n * - 修改 Rspack 配置添加 postcss-loader\n *\n * @example\n * ```ts\n * import { defineConfig, tailwindPlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * tailwindPlugin(),\n * ],\n * });\n * ```\n */\nexport const tailwindPlugin = createPlugin<TailwindPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-tailwind\",\n version: \"1.0.0\",\n description: \"Tailwind CSS 集成插件\",\n\n setup(context) {\n const {\n darkModeSelector = '&:where([data-theme=\"dark\"], [data-theme=\"dark\"] *)',\n autoConfig = true,\n extraCSS = \"\",\n } = options;\n const { cwd, logger } = context;\n\n // 确保 postcss.config.js 存在\n if (autoConfig) {\n ensurePostcssConfig(cwd, logger);\n }\n\n const hooks: PluginHooks = {\n modifyRspackConfig(rspackConfig) {\n logger.info(\"Tailwind CSS 已启用\");\n\n // 在 module.rules 中添加 .ywkf/tailwind.css 的 postcss-loader 规则\n const rules = rspackConfig.module?.rules || [];\n const postcssConfigPath = join(cwd, \"postcss.config.js\");\n\n // 根据 mode 选择 style-loader 或 CssExtractRspackPlugin.loader\n const isProd = rspackConfig.mode === \"production\";\n\n const tailwindRule = {\n test: /tailwind\\.css$/,\n use: [\n isProd ? rspack.CssExtractRspackPlugin.loader : \"style-loader\",\n \"css-loader\",\n {\n loader: \"postcss-loader\",\n options: {\n postcssOptions: {\n config: postcssConfigPath,\n },\n },\n },\n ],\n };\n\n rules.unshift(tailwindRule);\n rspackConfig.module = { ...rspackConfig.module, rules };\n\n return rspackConfig;\n },\n\n generateFiles(_ctx: GeneratorContext): GeneratedFile[] {\n const cssContent = buildTailwindCSS(darkModeSelector, extraCSS);\n return [\n {\n path: \"tailwind.css\",\n content: cssContent,\n },\n ];\n },\n\n injectEntry(_ctx: GeneratorContext): CodeInjection {\n return {\n imports: [`import \"./tailwind.css\";`],\n };\n },\n };\n\n return hooks;\n },\n}));\n\nfunction buildTailwindCSS(darkModeSelector: string, extraCSS: string): string {\n return `/* 此文件由 @4399ywkf/plugin-tailwind 自动生成 */\n@import \"tailwindcss\";\n@variant dark (${darkModeSelector});\n${extraCSS ? `\\n${extraCSS}` : \"\"}\n`;\n}\n\nfunction ensurePostcssConfig(cwd: string, logger: { info: (msg: string) => void }): void {\n const configPath = join(cwd, \"postcss.config.js\");\n if (!existsSync(configPath)) {\n writeFileSync(\n configPath,\n `module.exports = {\\n plugins: {\\n \"@tailwindcss/postcss\": {},\\n },\\n};\\n`,\n \"utf-8\",\n );\n logger.info(\"已自动生成 postcss.config.js\");\n }\n}\n\nexport default tailwindPlugin;\n","import { join } from \"node:path\";\nimport { createPlugin } from \"../define.js\";\nimport type {\n CodeInjection,\n GeneratedFile,\n GeneratorContext,\n PluginHooks,\n} from \"../types.js\";\n\nexport interface ThemePluginOptions {\n /**\n * 是否启用暗色模式切换能力\n * @default true\n */\n darkMode?: boolean;\n\n /**\n * 默认主题模式(运行时可通过 useThemeStore 动态切换)\n * @default \"light\"\n */\n defaultAppearance?: \"light\" | \"dark\" | \"auto\";\n\n /**\n * 主色调(Lobe-UI 命名预设,运行时可通过 useThemeStore 动态切换)\n *\n * 不设置时使用 Lobe-UI 默认 primary 色阶(黑色系),\n * 可选值:\"blue\" | \"cyan\" | \"geekblue\" | \"gold\" | \"green\" | \"lime\"\n * | \"magenta\" | \"orange\" | \"purple\" | \"red\" | \"volcano\" | \"yellow\"\n *\n * @default undefined\n */\n primaryColor?: string;\n\n /**\n * 中性色(Lobe-UI 命名预设)\n *\n * 可选值:\"mauve\" | \"olive\" | \"sage\" | \"sand\" | \"slate\"\n *\n * @default undefined\n */\n neutralColor?: string;\n\n /**\n * antd 组件前缀\n *\n * 支持三种配置方式(优先级从高到低):\n * 1. 运行时环境变量 process.env.YWKF_PREFIX_CLS\n * 2. 插件选项中直接指定\n * 3. 默认值 \"ant\"\n *\n * @default \"ant\"\n */\n prefixCls?: string;\n\n /**\n * 是否启用 CSS 变量\n * @default true\n */\n cssVar?: boolean;\n\n /**\n * 是否注入全局样式重置\n * @default true\n */\n globalReset?: boolean;\n\n /**\n * 是否启用外部主题注入(微前端场景)\n *\n * 启用后:\n * - 应用启动时读取 window.__YWKF_THEME__ 作为初始覆盖\n * - 监听 ywkf:theme-change 自定义事件,实现运行时主题同步\n *\n * @default false\n */\n externalTheme?: boolean;\n\n}\n\n/**\n * 响应式主题系统插件\n *\n * 基于 antd-style + @4399ywkf/theme-system + Zustand 提供运行时可变的主题管理:\n * - 使用 Lobe-UI 色彩体系(13 阶色阶 + 自定义算法)\n * - 支持 PrimaryColors / NeutralColors 命名预设\n * - 亮/暗色/跟随系统自动切换\n * - 支持微前端场景主应用注入主题\n *\n * @example\n * ```ts\n * import { defineConfig, themePlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * themePlugin({\n * defaultAppearance: \"light\",\n * primaryColor: \"geekblue\",\n * neutralColor: \"slate\",\n * prefixCls: \"my-app\",\n * }),\n * ],\n * });\n * ```\n */\nexport const themePlugin = createPlugin<ThemePluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-theme\",\n version: \"3.0.0\",\n description: \"Lobe-UI 风格响应式主题系统插件\",\n\n setup(context) {\n const {\n darkMode = true,\n defaultAppearance = \"light\",\n primaryColor,\n neutralColor,\n prefixCls = \"ant\",\n cssVar = true,\n globalReset = true,\n externalTheme = false,\n } = options;\n const { logger } = context;\n\n logger.info(\n `主题模式: ${defaultAppearance}, 主色: ${\n primaryColor ?? \"primary(默认黑)\"\n }, 响应式: ✓`,\n );\n\n const hooks: PluginHooks = {\n modifyRspackConfig(config, ctx) {\n const themePath = join(ctx.cwd, \".ywkf\", \"theme.tsx\");\n const currentAlias = (config.resolve?.alias ?? {}) as Record<\n string,\n string\n >;\n config.resolve = {\n ...config.resolve,\n alias: {\n ...currentAlias,\n \"@ywkf/theme\": themePath,\n },\n };\n return config;\n },\n\n generateFiles(_ctx: GeneratorContext): GeneratedFile[] {\n return [\n {\n path: \"theme.tsx\",\n content: generateThemeProvider({\n darkMode,\n defaultAppearance,\n primaryColor,\n neutralColor,\n prefixCls,\n cssVar,\n globalReset,\n externalTheme,\n }),\n },\n ];\n },\n\n injectBootstrap(_ctx: GeneratorContext): CodeInjection {\n return {\n imports: [`import { ThemeWrapper } from \"./theme\";`],\n };\n },\n\n modifyBootstrapCode(code: string): string {\n const providerEntry = ` {\n component: ThemeWrapper as React.ComponentType<{ children: React.ReactNode }>,\n props: {},\n order: 10,\n }`;\n\n if (code.includes(\"providers: []\")) {\n code = code.replace(\n \"providers: []\",\n `providers: [\\n${providerEntry},\\n ]`,\n );\n } else if (code.includes(\"providers: [\")) {\n code = code.replace(\n \"providers: [\",\n `providers: [\\n${providerEntry},`,\n );\n }\n\n if (!code.includes(\"import React\")) {\n code = code.replace(\n `import { bootstrap`,\n `import React from \"react\";\\nimport { bootstrap`,\n );\n }\n\n return code;\n },\n };\n\n return hooks;\n },\n}));\n\n// ═══════════════════════════════════════════════════════════\n// Code Generator\n// ═══════════════════════════════════════════════════════════\n\ninterface GenerateOptions {\n darkMode: boolean;\n defaultAppearance: string;\n primaryColor?: string;\n neutralColor?: string;\n prefixCls: string;\n cssVar: boolean;\n globalReset: boolean;\n externalTheme: boolean;\n}\n\nfunction generateThemeProvider(opts: GenerateOptions): string {\n const {\n darkMode,\n defaultAppearance,\n primaryColor,\n neutralColor,\n prefixCls,\n cssVar,\n globalReset,\n externalTheme,\n } = opts;\n\n const sections: string[] = [];\n\n sections.push(`// 此文件由 @4399ywkf/plugin-theme v3 自动生成,请勿手动修改`);\n sections.push(buildImports({ globalReset, cssVar }));\n sections.push(TYPES_CODE);\n sections.push(\n buildStoreCode({ defaultAppearance, primaryColor, neutralColor }),\n );\n sections.push(HOOKS_CODE);\n\n if (globalReset) sections.push(GLOBAL_RESET_CODE);\n if (cssVar) sections.push(buildCssVarSyncCode());\n if (darkMode) sections.push(APPEARANCE_SYNC_CODE);\n if (externalTheme) sections.push(EXTERNAL_THEME_CODE);\n\n sections.push(\n buildWrapperCode({\n darkMode,\n cssVar,\n globalReset,\n externalTheme,\n prefixCls,\n }),\n );\n\n return sections.join(\"\\n\");\n}\n\n// ── Import Builder ──\n\nfunction buildImports(opts: { globalReset: boolean; cssVar: boolean }): string {\n const reactImports = [\n \"useCallback\",\n \"useEffect\",\n \"useMemo\",\n \"useState\",\n ...(opts.cssVar ? [\"useLayoutEffect\", \"useRef\"] : []),\n \"type ReactNode\",\n ];\n\n const antdStyleImports = [\n \"ThemeProvider as AntdThemeProvider\",\n \"StyleProvider\",\n \"type GetAntdTheme\",\n ...(opts.globalReset ? [\"createGlobalStyle\", \"css\"] : []),\n ];\n\n return `\nimport React, { ${reactImports.join(\", \")} } from \"react\";\nimport { ${antdStyleImports.join(\", \")} } from \"antd-style\";\nimport { createWithEqualityFn } from \"zustand/traditional\";\nimport { shallow } from \"zustand/shallow\";\nimport { createThemeConfig, type PrimaryColors, type NeutralColors } from \"@4399ywkf/theme-system\";`;\n}\n\n// ── Types ──\n\nconst TYPES_CODE = `\n// ═══════════════ Types ═══════════════\n\nexport type ThemeAppearance = \"light\" | \"dark\" | \"auto\";\n\nexport interface ThemeState {\n appearance: ThemeAppearance;\n primaryColor?: PrimaryColors;\n neutralColor?: NeutralColors;\n}\n\nexport interface ThemeActions {\n setAppearance: (mode: ThemeAppearance) => void;\n setPrimaryColor: (color: PrimaryColors | undefined) => void;\n setNeutralColor: (color: NeutralColors | undefined) => void;\n setTheme: (partial: Partial<ThemeState>) => void;\n}\n\nexport type ThemeStore = ThemeState & ThemeActions;\n\nexport type { PrimaryColors, NeutralColors };`;\n\n// ── Store Builder ──\n\nfunction buildStoreCode(opts: {\n defaultAppearance: string;\n primaryColor?: string;\n neutralColor?: string;\n}): string {\n const primaryLine = opts.primaryColor\n ? ` primaryColor: \"${opts.primaryColor}\" as PrimaryColors,`\n : ` primaryColor: undefined,`;\n const neutralLine = opts.neutralColor\n ? ` neutralColor: \"${opts.neutralColor}\" as NeutralColors,`\n : ` neutralColor: undefined,`;\n\n return `\n// ═══════════════ Theme Store ═══════════════\n\nconst DEFAULT_THEME: ThemeState = {\n appearance: \"${opts.defaultAppearance}\",\n${primaryLine}\n${neutralLine}\n};\n\nexport const useThemeStore = createWithEqualityFn<ThemeStore>()(\n (set) => ({\n ...DEFAULT_THEME,\n setAppearance: (mode) => set({ appearance: mode }),\n setPrimaryColor: (color) => set({ primaryColor: color }),\n setNeutralColor: (color) => set({ neutralColor: color }),\n setTheme: (partial) => set(partial),\n }),\n shallow,\n);`;\n}\n\n// ── Convenience Hooks ──\n\nconst HOOKS_CODE = `\n// ═══════════════ Convenience Hooks ═══════════════\n\nexport const useTheme = () =>\n useThemeStore(\n (s) => ({\n appearance: s.appearance,\n primaryColor: s.primaryColor,\n neutralColor: s.neutralColor,\n }),\n shallow,\n );\n\nexport const useAppearance = () => useThemeStore((s) => s.appearance);\nexport const usePrimaryColor = () => useThemeStore((s) => s.primaryColor);`;\n\n// ── Global Reset Style ──\n\nconst GLOBAL_RESET_CODE = `\n// ═══════════════ Global Style ═══════════════\n\nconst GlobalReset = createGlobalStyle(({ theme }) => css\\`\n :root {\n --font-settings: \"cv01\", \"tnum\", \"kern\";\n --font-variations: \"opsz\" auto, tabular-nums;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n vertical-align: baseline;\n }\n\n * {\n scrollbar-color: \\${theme.colorFill} transparent;\n scrollbar-width: thin;\n }\n\n html {\n overscroll-behavior: none;\n color-scheme: \\${theme.isDarkMode ? \"dark\" : \"light\"};\n }\n\n html, body, #root, #app {\n height: 100%;\n margin: 0;\n padding: 0;\n }\n\n body {\n overflow: hidden auto;\n min-height: 100vh;\n font-family: \\${theme.fontFamily};\n font-size: \\${theme.fontSize}px;\n font-feature-settings: var(--font-settings);\n font-variation-settings: var(--font-variations);\n line-height: 1;\n color: \\${theme.colorTextBase};\n text-size-adjust: none;\n text-rendering: optimizelegibility;\n word-wrap: break-word;\n background-color: \\${theme.colorBgLayout};\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n -webkit-overflow-scrolling: touch;\n -webkit-tap-highlight-color: transparent;\n }\n\n code {\n font-family: \\${theme.fontFamilyCode} !important;\n }\n\n ::selection {\n -webkit-text-fill-color: unset !important;\n }\n\\`);`;\n\n// ── CSS Variable Class Sync ──\n\nfunction buildCssVarSyncCode(): string {\n return `\n// ═══════════════ CSS Variable Sync ═══════════════\n\nconst CSS_VAR_CLASS_RE = /(^|-)css-var(-|$)/;\n\nfunction isCssVarClassName(className: string): boolean {\n return CSS_VAR_CLASS_RE.test(className);\n}\n\nfunction useCssVarSync(ref: React.RefObject<HTMLDivElement | null>) {\n useLayoutEffect(() => {\n const node = ref.current;\n if (!node) return;\n\n const htmlEl = document.documentElement;\n let currentClasses: string[] = [];\n\n const sync = () => {\n for (const cls of currentClasses) {\n htmlEl.classList.remove(cls);\n }\n\n const nextSet = new Set<string>();\n let el: HTMLElement | null = node;\n\n while (el && el !== htmlEl) {\n for (const cls of el.classList) {\n if (isCssVarClassName(cls)) {\n nextSet.add(cls);\n }\n }\n el = el.parentElement;\n }\n\n const next = Array.from(nextSet);\n\n for (const cls of next) {\n htmlEl.classList.add(cls);\n }\n\n currentClasses = next;\n };\n\n sync();\n\n const observer = new MutationObserver(sync);\n let el: HTMLElement | null = node;\n while (el && el !== htmlEl) {\n observer.observe(el, { attributeFilter: [\"class\"] });\n el = el.parentElement;\n }\n\n return () => {\n observer.disconnect();\n for (const cls of currentClasses) {\n htmlEl.classList.remove(cls);\n }\n };\n }, []);\n}`;\n}\n\n// ── Appearance Sync ──\n\nconst APPEARANCE_SYNC_CODE = `\n// ═══════════════ Appearance Sync ═══════════════\n\nfunction useAppearanceSync(appearance: ThemeAppearance) {\n useEffect(() => {\n if (appearance !== \"auto\") {\n document.documentElement.dataset.theme = appearance;\n return;\n }\n\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n document.documentElement.dataset.theme = mq.matches ? \"dark\" : \"light\";\n\n function handleChange(e: MediaQueryListEvent) {\n document.documentElement.dataset.theme = e.matches ? \"dark\" : \"light\";\n }\n\n mq.addEventListener(\"change\", handleChange);\n return () => mq.removeEventListener(\"change\", handleChange);\n }, [appearance]);\n}`;\n\n// ── External Theme Injection ──\n\nconst EXTERNAL_THEME_CODE = `\n// ═══════════════ External Theme Injection ═══════════════\n\nfunction useExternalTheme() {\n useEffect(() => {\n const hostTheme = (window as any).__YWKF_THEME__;\n if (hostTheme && typeof hostTheme === \"object\") {\n useThemeStore.getState().setTheme(hostTheme);\n }\n\n const handler = (e: Event) => {\n const detail = (e as CustomEvent<Partial<ThemeState>>).detail;\n if (detail) useThemeStore.getState().setTheme(detail);\n };\n\n window.addEventListener(\"ywkf:theme-change\", handler);\n return () => window.removeEventListener(\"ywkf:theme-change\", handler);\n }, []);\n}`;\n\n// ── Wrapper Builder ──\n\nfunction buildWrapperCode(opts: {\n darkMode: boolean;\n cssVar: boolean;\n globalReset: boolean;\n externalTheme: boolean;\n prefixCls: string;\n}): string {\n const { darkMode, cssVar, globalReset, externalTheme, prefixCls } = opts;\n\n const refLine = cssVar\n ? \"\\n const containerRef = useRef<HTMLDivElement>(null);\"\n : \"\";\n const cssVarSyncLine = cssVar ? \"\\n useCssVarSync(containerRef);\" : \"\";\n const appearanceSyncLine = darkMode\n ? \"\\n useAppearanceSync(appearance);\"\n : \"\";\n const externalThemeLine = externalTheme ? \"\\n useExternalTheme();\" : \"\";\n\n const childrenSlot = cssVar\n ? `<div ref={containerRef} style={{ display: \"contents\" }}>\n {children}\n </div>`\n : \"{children}\";\n\n const antdProvider = `<AntdThemeProvider\n prefixCls={RUNTIME_PREFIX_CLS}\n appearance={resolvedAppearance}\n themeMode={appearance}\n theme={theme}${cssVar ? \"\\n customToken={{ cssVar: true }}\" : \"\"}\n >\n ${globalReset ? \"<GlobalReset />\" : \"\"}\n ${childrenSlot}\n </AntdThemeProvider>`;\n\n return `\n// ═══════════════ ThemeWrapper ═══════════════\n\n// 运行时判断是否处于 Garfish 子应用环境,同一 bundle 支持独立部署与微前端两种模式。\nconst IS_MICRO_APP = typeof window !== \"undefined\" && !!(window as any).__GARFISH__;\n\nconst RUNTIME_PREFIX_CLS = typeof process !== \"undefined\"\n && process.env?.YWKF_PREFIX_CLS\n || \"${prefixCls}\";\n\ninterface ThemeWrapperProps {\n children: ReactNode;\n}\n\nexport function ThemeWrapper({ children }: ThemeWrapperProps) {${refLine}\n const { appearance, primaryColor, neutralColor } = useThemeStore(\n (s) => ({ appearance: s.appearance, primaryColor: s.primaryColor, neutralColor: s.neutralColor }),\n shallow,\n );${cssVarSyncLine}${appearanceSyncLine}${externalThemeLine}\n\n // 微前端模式下,将 CSS-in-JS 样式注入到 Garfish 子应用容器而非 document.head,\n // 避免与主应用共享的 @ant-design/cssinjs StyleContext 产生冲突。\n // useState lazy initializer 同步读取(Garfish 挂载时容器已提前创建),\n // useEffect 兜底处理极端竞态(如 SSR hydration)。\n const [styleContainer, setStyleContainer] = useState<HTMLElement | undefined>(() => {\n if (!IS_MICRO_APP || typeof document === \"undefined\") return undefined;\n return document.getElementById(RUNTIME_PREFIX_CLS)?.parentElement ?? undefined;\n });\n\n useEffect(() => {\n if (!IS_MICRO_APP) return;\n const el = document.getElementById(RUNTIME_PREFIX_CLS)?.parentElement;\n if (el) setStyleContainer(el);\n }, []);\n\n const resolvedAppearance = useMemo(() => {\n if (appearance !== \"auto\") return appearance;\n if (typeof window === \"undefined\") return \"light\";\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n }, [appearance]);\n\n const theme = useCallback<GetAntdTheme>(\n (ap) => createThemeConfig({\n appearance: ap as \"light\" | \"dark\",\n primaryColor,\n neutralColor,\n }),\n [primaryColor, neutralColor],\n );\n\n const provider = (\n ${antdProvider}\n );\n\n return IS_MICRO_APP && styleContainer ? (\n <StyleProvider container={styleContainer}>{provider}</StyleProvider>\n ) : provider;\n}\n\nexport default ThemeWrapper;\n`;\n}\n\nexport default themePlugin;\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createPlugin } from \"../define.js\";\nimport type { GeneratedFile, GeneratorContext, PluginHooks } from \"../types.js\";\n\nexport interface ZustandPluginOptions {\n /**\n * 是否自动生成 store 脚手架(仅在 store/ 目录不存在时)\n * @default true\n */\n scaffold?: boolean;\n\n /**\n * store 目录路径(相对于项目根目录)\n * @default \"store\"\n */\n storeDir?: string;\n}\n\n/**\n * Zustand 状态管理插件\n *\n * 采用扁平域/Slice 架构:\n * - store/{domain}/slices/ 按业务域拆分\n * - 每个 slice 拆为 initialState.ts + actions.ts\n * - 域级 store.ts 聚合所有 slice\n * - 使用 StateCreator<Store, [['zustand/devtools', never]], [], Action> 标准范式\n * - 内置 devtools + subscribeWithSelector 中间件\n *\n * @example\n * ```ts\n * import { defineConfig, zustandPlugin } from \"@4399ywkf/core\";\n *\n * export default defineConfig({\n * plugins: [\n * zustandPlugin(),\n * ],\n * });\n * ```\n */\nexport const zustandPlugin = createPlugin<ZustandPluginOptions>((options = {}) => ({\n name: \"@4399ywkf/plugin-zustand\",\n version: \"1.0.0\",\n description: \"Zustand 状态管理集成\",\n\n setup(context) {\n const { scaffold = true, storeDir = \"store\" } = options;\n const { cwd, logger } = context;\n\n const storePath = join(cwd, storeDir);\n\n if (scaffold && !existsSync(storePath)) {\n scaffoldStore(storePath, logger);\n }\n\n const hooks: PluginHooks = {\n modifyRspackConfig(rspackConfig) {\n logger.info(\"Zustand 已启用\");\n\n const resolve = rspackConfig.resolve || {};\n const alias = (resolve.alias || {}) as Record<string, string>;\n alias[\"@store\"] = storePath;\n resolve.alias = alias;\n rspackConfig.resolve = resolve;\n\n return rspackConfig;\n },\n\n generateFiles(_ctx: GeneratorContext): GeneratedFile[] {\n return [\n {\n path: \"store.ts\",\n content: buildStoreHelperFile(),\n },\n ];\n },\n };\n\n return hooks;\n },\n}));\n\nfunction scaffoldStore(storePath: string, logger: { info: (msg: string) => void }): void {\n const dirs = [\n storePath,\n join(storePath, \"middleware\"),\n join(storePath, \"app\"),\n join(storePath, \"app\", \"slices\"),\n join(storePath, \"app\", \"slices\", \"counter\"),\n ];\n\n for (const dir of dirs) {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n // store/middleware/createDevtools.ts\n writeFileSync(join(storePath, \"middleware\", \"createDevtools.ts\"), TPL_CREATE_DEVTOOLS, \"utf-8\");\n\n // store/app/slices/counter/initialState.ts\n writeFileSync(\n join(storePath, \"app\", \"slices\", \"counter\", \"initialState.ts\"),\n TPL_COUNTER_INITIAL_STATE,\n \"utf-8\",\n );\n\n // store/app/slices/counter/actions.ts\n writeFileSync(\n join(storePath, \"app\", \"slices\", \"counter\", \"actions.ts\"),\n TPL_COUNTER_ACTIONS,\n \"utf-8\",\n );\n\n // store/app/initialState.ts\n writeFileSync(join(storePath, \"app\", \"initialState.ts\"), TPL_APP_INITIAL_STATE, \"utf-8\");\n\n // store/app/store.ts\n writeFileSync(join(storePath, \"app\", \"store.ts\"), TPL_APP_STORE, \"utf-8\");\n\n // store/app/index.tsx\n writeFileSync(join(storePath, \"app\", \"index.tsx\"), TPL_APP_INDEX, \"utf-8\");\n\n // store/index.ts\n writeFileSync(join(storePath, \"index.ts\"), TPL_STORE_INDEX, \"utf-8\");\n\n logger.info(\"已生成 store/ 脚手架(Agent/Slice 架构)\");\n}\n\n// ==================== 模板内容 ====================\n\nconst TPL_CREATE_DEVTOOLS = `import type { DevtoolsOptions } from \"zustand/middleware\";\nimport { devtools as devtoolsMiddleware } from \"zustand/middleware\";\nimport type { StateCreator, StoreMutatorIdentifier } from \"zustand/vanilla\";\n\n/**\n * 封装 zustand devtools 中间件\n * 生产环境自动禁用,开发环境启用 trace\n */\nexport const createDevtools =\n (name: string, options?: DevtoolsOptions) =>\n <\n T,\n Mps extends [StoreMutatorIdentifier, unknown][] = [],\n Mcs extends [StoreMutatorIdentifier, unknown][] = [],\n >(\n initializer: StateCreator<T, [...Mps, [\"zustand/devtools\", never]], Mcs>,\n ) =>\n devtoolsMiddleware(initializer, {\n name,\n enabled: process.env.NODE_ENV === \"development\",\n trace: process.env.NODE_ENV === \"development\",\n ...options,\n });\n`;\n\nconst TPL_COUNTER_INITIAL_STATE = `export interface CounterState {\n count: number;\n loading: boolean;\n error: string | null;\n}\n\nexport const initialCounterState: CounterState = {\n count: 0,\n loading: false,\n error: null,\n};\n`;\n\nconst TPL_COUNTER_ACTIONS = `import type { StateCreator } from \"zustand/vanilla\";\nimport type { AppStore } from \"../../store\";\n\nexport interface CounterAction {\n increment: () => void;\n decrement: () => void;\n reset: () => void;\n setLoading: (loading: boolean) => void;\n setError: (error: string | null) => void;\n fetchCount: () => Promise<void>;\n}\n\nexport const createCounterSlice: StateCreator<\n AppStore,\n [[\"zustand/devtools\", never]],\n [],\n CounterAction\n> = (set, get) => ({\n increment: () => set((s) => ({ count: s.count + 1 })),\n decrement: () => set((s) => ({ count: s.count - 1 })),\n reset: () => set({ count: 0, error: null }),\n setLoading: (loading) => set({ loading }),\n setError: (error) => set({ error }),\n\n fetchCount: async () => {\n set({ loading: true, error: null });\n try {\n // 替换为实际 API 调用\n // import request from \"@ywkf/request\";\n // const res = await request.get(\"/api/count\");\n // set({ count: res.data, loading: false });\n await new Promise((r) => setTimeout(r, 500));\n set({ count: 42, loading: false });\n } catch (err) {\n set({\n error: err instanceof Error ? err.message : \"未知错误\",\n loading: false,\n });\n }\n },\n});\n`;\n\nconst TPL_APP_INITIAL_STATE = `import {\n type CounterState,\n initialCounterState,\n} from \"./slices/counter/initialState\";\n\n// ============== 聚合所有 Slice 状态 ============== //\n\nexport type AppStoreState = CounterState;\n\nexport const initialState: AppStoreState = {\n ...initialCounterState,\n};\n`;\n\nconst TPL_APP_STORE = `import { subscribeWithSelector } from \"zustand/middleware\";\nimport { shallow } from \"zustand/shallow\";\nimport { createWithEqualityFn } from \"zustand/traditional\";\nimport type { StateCreator } from \"zustand/vanilla\";\n\nimport { createDevtools } from \"../middleware/createDevtools\";\nimport { type AppStoreState, initialState } from \"./initialState\";\n\nimport {\n type CounterAction,\n createCounterSlice,\n} from \"./slices/counter/actions\";\n\n// ============== 聚合 Store 类型 ============== //\n\nexport type AppStore = AppStoreState & CounterAction;\n\n// ============== 创建 Store ============== //\n\nconst createStore: StateCreator<AppStore, [[\"zustand/devtools\", never]]> = (\n ...parameters\n) => ({\n ...initialState,\n ...createCounterSlice(...parameters),\n});\n\n// ============== 实装 useStore ============== //\n\nconst devtools = createDevtools(\"app\");\n\nexport const useAppStore = createWithEqualityFn<AppStore>()(\n subscribeWithSelector(devtools(createStore)),\n shallow,\n);\n\nexport const getAppStoreState = () => useAppStore.getState();\n`;\n\nconst TPL_APP_INDEX = `export { useAppStore, getAppStoreState } from \"./store\";\nexport type { AppStore } from \"./store\";\nexport { initialState } from \"./initialState\";\nexport type { AppStoreState } from \"./initialState\";\n`;\n\nconst TPL_STORE_INDEX = `/**\n * Store 聚合入口\n *\n * 架构:\n * - store/middleware/ — 中间件(devtools 等)\n * - store/{domain}/ — 每个域代表一个业务子系统\n * - store/{domain}/slices — 每个 slice 拆为 initialState + actions\n *\n * 约束:\n * - initialState:纯数据定义,不含逻辑\n * - actions:同步状态变更 + 异步副作用\n * - slice 之间禁止直接修改彼此状态\n * - 域层负责跨 slice 协调\n */\nexport { useAppStore, getAppStoreState } from \"./app\";\nexport type { AppStore, AppStoreState } from \"./app\";\n`;\n\nfunction buildStoreHelperFile(): string {\n return `// 此文件由 @4399ywkf/plugin-zustand 自动生成\n// 提供 Zustand 工具函数的 re-export,方便业务代码引用\n\nexport { useShallow } from \"zustand/react/shallow\";\nexport type { StateCreator, StoreApi } from \"zustand\";\n`;\n}\n\nexport default zustandPlugin;\n","import type { Compiler } from \"@rspack/core\";\nimport { existsSync, watch } from \"fs\";\nimport { join } from \"path\";\nimport { ConventionalRouteGenerator } from \"./generator.js\";\n\nexport interface ConventionalRoutePluginOptions {\n /** 页面目录 */\n pagesDir: string;\n /** 输出目录 */\n outputDir: string;\n /** 路由 basename */\n basename?: string;\n /** 是否监听文件变化(开发模式) */\n watch?: boolean;\n}\n\n/**\n * 约定式路由 Rspack 插件\n *\n * 在编译开始前扫描 src/pages 目录,生成 .ywkf/routes.tsx\n */\nexport class ConventionalRoutePlugin {\n private options: ConventionalRoutePluginOptions;\n private isWatching = false;\n private hasGenerated = false;\n private lastGeneratedContent = \"\";\n\n constructor(options: ConventionalRoutePluginOptions) {\n this.options = options;\n }\n\n apply(compiler: Compiler): void {\n const pluginName = \"ConventionalRoutePlugin\";\n\n // 只在首次编译时生成路由\n compiler.hooks.beforeCompile.tapAsync(pluginName, (_params, callback) => {\n if (!this.hasGenerated) {\n this.generateRoutes();\n this.hasGenerated = true;\n }\n callback();\n });\n\n // 开发模式下监听文件变化\n if (this.options.watch && !this.isWatching) {\n this.watchPages();\n }\n }\n\n /**\n * 生成路由文件(带内容比对,避免不必要的重复生成)\n */\n private generateRoutes(): void {\n try {\n const generator = new ConventionalRouteGenerator({\n pagesDir: this.options.pagesDir,\n outputDir: this.options.outputDir,\n basename: this.options.basename,\n });\n\n const newContent = generator.generateCode();\n const _outputPath = join(this.options.outputDir, \"routes.tsx\");\n\n // 比对内容,如果相同则跳过(去掉时间戳后比较)\n const normalizedNew = this.normalizeContent(newContent);\n const normalizedOld = this.normalizeContent(this.lastGeneratedContent);\n\n if (normalizedNew === normalizedOld) {\n return; // 内容相同,跳过生成\n }\n\n generator.write();\n this.lastGeneratedContent = newContent;\n } catch (error) {\n console.error(\"[ywkf] 生成路由失败:\", error);\n }\n }\n\n /**\n * 标准化内容(去掉时间戳等动态部分)\n */\n private normalizeContent(content: string): string {\n return content.replace(/\\/\\/ Generated at: .+/g, \"\");\n }\n\n /**\n * 监听页面目录变化\n */\n private watchPages(): void {\n if (!existsSync(this.options.pagesDir)) {\n return;\n }\n\n this.isWatching = true;\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const watcher = watch(this.options.pagesDir, { recursive: true }, (_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(() => {\n if (process.env.DEBUG) console.log(`[ywkf] 检测到页面变化: ${filename}`);\n this.generateRoutes();\n }, 500);\n });\n\n // 进程退出时关闭监听\n process.on(\"exit\", () => {\n watcher.close();\n });\n }\n}\n","import { createRoot, type Root } from \"react-dom/client\";\nimport { RootProvider } from \"./providers.js\";\nimport type { AppConfig, MicroAppConfig } from \"./types.js\";\n\nlet root: Root | null = null;\n\n/**\n * 解析应用配置,处理约定式路由\n */\nasync function resolveAppConfig(config: AppConfig): Promise<AppConfig> {\n // 如果已有 router 或未启用约定式路由,直接返回\n if (config.router || !config.conventionalRoutes) {\n return config;\n }\n\n try {\n // 动态导入约定式路由\n // @ts-expect-error @ywkf/routes 是编译时生成的模块\n const routesModule = await import(\"@ywkf/routes\");\n const createRouter = routesModule.createRouter || routesModule.default?.createRouter;\n\n if (typeof createRouter === \"function\") {\n const router = createRouter(config.basename);\n console.log(\"[ywkf] 已自动注入约定式路由\");\n return { ...config, router };\n } else {\n console.warn(\"[ywkf] @ywkf/routes 未导出 createRouter 函数\");\n }\n } catch (error) {\n console.error(\"[ywkf] 加载约定式路由失败:\", error);\n console.warn(\"[ywkf] 请确保已启用约定式路由且 src/pages 目录存在\");\n }\n\n return config;\n}\n\n/**\n * 启动应用\n */\nexport async function bootstrap(config: AppConfig): Promise<void> {\n const { rootId = \"root\", lifecycle } = config;\n\n // 解析约定式路由\n const resolvedConfig = await resolveAppConfig(config);\n\n // 执行挂载前钩子\n if (lifecycle?.onBeforeMount) {\n await lifecycle.onBeforeMount();\n }\n\n // 获取根元素\n const rootElement = document.getElementById(rootId);\n\n if (!rootElement) {\n throw new Error(`找不到根元素 #${rootId}`);\n }\n\n // 创建 React Root\n root = createRoot(rootElement);\n\n // 渲染应用\n root.render(<RootProvider config={resolvedConfig} />);\n\n // 执行挂载后钩子\n if (lifecycle?.onMounted) {\n // 使用 setTimeout 确保 React 渲染完成\n setTimeout(() => {\n lifecycle.onMounted?.();\n }, 0);\n }\n\n // 注册卸载钩子\n if (lifecycle?.onUnmount) {\n window.addEventListener(\"beforeunload\", () => {\n lifecycle.onUnmount?.();\n });\n }\n}\n\n/**\n * 卸载应用\n */\nexport function unmount(): void {\n if (root) {\n root.unmount();\n root = null;\n }\n}\n\n/**\n * 创建微前端应用入口\n *\n * 用于 qiankun/garfish 等微前端框架\n */\nexport function createMicroApp(getConfig: (props?: MicroAppConfig) => AppConfig) {\n let microRoot: Root | null = null;\n\n return {\n /**\n * 微前端 bootstrap 生命周期\n */\n async bootstrap() {\n console.log(\"[MicroApp] bootstrap\");\n },\n\n /**\n * 微前端 mount 生命周期\n */\n async mount(props?: MicroAppConfig) {\n console.log(\"[MicroApp] mount\", props);\n\n const config = getConfig(props);\n // 解析约定式路由\n const resolvedConfig = await resolveAppConfig(config);\n\n const container = props?.masterProps?.container as Element | undefined;\n const rootId = resolvedConfig.rootId || \"root\";\n\n // 获取根元素(优先使用微前端容器)\n const rootElement = container\n ? container.querySelector(`#${rootId}`)\n : document.getElementById(rootId);\n\n if (!rootElement) {\n throw new Error(`[MicroApp] 找不到根元素 #${rootId}`);\n }\n\n // 执行挂载前钩子\n if (resolvedConfig.lifecycle?.onBeforeMount) {\n await resolvedConfig.lifecycle.onBeforeMount();\n }\n\n // 创建 React Root\n microRoot = createRoot(rootElement);\n microRoot.render(<RootProvider config={resolvedConfig} />);\n\n // 执行挂载后钩子\n if (resolvedConfig.lifecycle?.onMounted) {\n setTimeout(() => {\n resolvedConfig.lifecycle?.onMounted?.();\n }, 0);\n }\n },\n\n /**\n * 微前端 unmount 生命周期\n */\n async unmount(props?: MicroAppConfig) {\n console.log(\"[MicroApp] unmount\", props);\n\n const config = getConfig(props);\n\n // 执行卸载钩子\n if (config.lifecycle?.onUnmount) {\n config.lifecycle.onUnmount();\n }\n\n if (microRoot) {\n microRoot.unmount();\n microRoot = null;\n }\n },\n\n /**\n * 微前端 update 生命周期(可选)\n */\n async update(props?: MicroAppConfig) {\n console.log(\"[MicroApp] update\", props);\n },\n };\n}\n\n/**\n * Garfish 子应用 provider\n *\n * Garfish 要求子应用导出 provider 函数,接收 { dom, basename, props },\n * 返回 { render, destroy } 对象。\n */\nexport function createGarfishProvider(getConfig: (overrides?: Partial<AppConfig>) => AppConfig) {\n let garfishRoot: Root | null = null;\n\n return function provider(providerContext: {\n dom: Element;\n basename: string;\n props?: Record<string, unknown>;\n }) {\n const { dom, basename } = providerContext;\n\n return {\n render() {\n const config = getConfig({ basename });\n const resolvedConfig = { ...config, basename };\n const rootId = resolvedConfig.rootId || \"root\";\n\n let rootElement = dom.querySelector(`#${rootId}`);\n if (!rootElement) {\n rootElement = document.createElement(\"div\");\n rootElement.id = rootId;\n dom.appendChild(rootElement);\n }\n\n garfishRoot = createRoot(rootElement);\n garfishRoot.render(<RootProvider config={resolvedConfig} />);\n\n if (resolvedConfig.lifecycle?.onMounted) {\n setTimeout(() => resolvedConfig.lifecycle?.onMounted?.(), 0);\n }\n },\n\n destroy() {\n if (garfishRoot) {\n garfishRoot.unmount();\n garfishRoot = null;\n }\n },\n };\n };\n}\n\n/**\n * 判断是否在微前端环境中运行\n */\nexport function isMicroAppEnv(): boolean {\n // qiankun\n if ((window as unknown as Record<string, unknown>).__POWERED_BY_QIANKUN__) {\n return true;\n }\n\n // garfish\n if ((window as unknown as Record<string, unknown>).__GARFISH__) {\n return true;\n }\n\n return false;\n}\n\n/**\n * 获取微前端公共路径\n */\nexport function getMicroAppPublicPath(): string {\n // qiankun 注入的公共路径\n if ((window as unknown as Record<string, string>).__INJECTED_PUBLIC_PATH_BY_QIANKUN__) {\n return (window as unknown as Record<string, string>).__INJECTED_PUBLIC_PATH_BY_QIANKUN__;\n }\n\n return \"/\";\n}\n","import { ConfigProvider } from \"antd\";\nimport zhCN from \"antd/locale/zh_CN.js\";\nimport { type ComponentType, type ReactNode, StrictMode, Suspense } from \"react\";\nimport { RouterProvider } from \"react-router\";\nimport { AppContextProvider } from \"./context.js\";\nimport { ErrorBoundary } from \"./error-boundary.js\";\nimport type { AppConfig, AppContextValue, ProviderConfig } from \"./types.js\";\n\n/**\n * 默认加载中组件\n */\nfunction DefaultLoading() {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100vh\",\n fontSize: 16,\n color: \"#999\",\n }}\n >\n 加载中...\n </div>\n );\n}\n\n/**\n * 组合多个 Provider\n */\nfunction composeProviders(providers: ProviderConfig[]): ComponentType<{ children: ReactNode }> {\n const sortedProviders = [...providers].sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n\n return function ComposedProviders({ children }: { children: ReactNode }) {\n return sortedProviders.reduceRight((acc, { component: Provider, props }) => {\n return <Provider {...props}>{acc}</Provider>;\n }, children);\n };\n}\n\nexport interface RootProviderProps {\n config: AppConfig;\n children?: ReactNode;\n}\n\n/**\n * 根 Provider 组件\n * 自动组合所有必要的 Provider\n */\nexport function RootProvider({ config, children }: RootProviderProps) {\n const {\n appName = \"app\",\n router,\n basename = \"/\",\n strictMode = true,\n antd = { enabled: true },\n providers = [],\n lifecycle,\n } = config;\n\n // 构建应用上下文\n const appContextValue: Partial<AppContextValue> = {\n appName,\n basename,\n isDev: process.env.NODE_ENV === \"development\",\n env: typeof process !== \"undefined\" ? (process.env as Record<string, string>) : {},\n };\n\n // 构建 Provider 列表\n const allProviders: ProviderConfig[] = [\n // 应用上下文 Provider(最外层)\n {\n component: AppContextProvider as ComponentType<{ children: ReactNode }>,\n props: { value: appContextValue },\n order: 0,\n },\n // Ant Design ConfigProvider\n ...(antd.enabled !== false\n ? [\n {\n component: ConfigProvider as ComponentType<{ children: ReactNode }>,\n props: {\n locale: antd.locale || zhCN,\n theme: antd.theme,\n ...antd.configProvider,\n },\n order: 10,\n },\n ]\n : []),\n // 用户自定义 Providers\n ...providers.map((p) => ({ ...p, order: p.order ?? 50 })),\n ];\n\n const ComposedProviders = composeProviders(allProviders);\n\n // 内容:路由或自定义 children\n const content = router ? (\n <Suspense fallback={<DefaultLoading />}>\n <RouterProvider router={router} />\n </Suspense>\n ) : (\n children\n );\n\n // 组装最终结构\n const app = (\n <ErrorBoundary onError={lifecycle?.onError}>\n <ComposedProviders>{content}</ComposedProviders>\n </ErrorBoundary>\n );\n\n // 严格模式包装\n if (strictMode) {\n return <StrictMode>{app}</StrictMode>;\n }\n\n return app;\n}\n\n/**\n * 创建自定义 Provider 配置的辅助函数\n */\nexport function createProvider<P extends Record<string, unknown>>(\n component: ComponentType<P & { children: ReactNode }>,\n props?: Omit<P, \"children\">,\n order?: number,\n): ProviderConfig {\n return {\n component: component as ComponentType<{ children: ReactNode }>,\n props,\n order,\n };\n}\n","import { createContext, type ReactNode, useContext } from \"react\";\nimport type { AppContextValue } from \"./types.js\";\n\n/**\n * 默认上下文值\n */\nconst defaultContextValue: AppContextValue = {\n appName: \"app\",\n basename: \"/\",\n isDev: process.env.NODE_ENV === \"development\",\n env: {},\n};\n\n/**\n * 应用上下文\n */\nexport const AppContext = createContext<AppContextValue>(defaultContextValue);\n\n/**\n * 应用上下文 Provider\n */\nexport interface AppContextProviderProps {\n value: Partial<AppContextValue>;\n children: ReactNode;\n}\n\nexport function AppContextProvider({ value, children }: AppContextProviderProps) {\n const contextValue: AppContextValue = {\n ...defaultContextValue,\n ...value,\n env: {\n ...defaultContextValue.env,\n ...value.env,\n },\n };\n\n return <AppContext.Provider value={contextValue}>{children}</AppContext.Provider>;\n}\n\n/**\n * 获取应用上下文的 Hook\n */\nexport function useApp(): AppContextValue {\n const context = useContext(AppContext);\n\n if (!context) {\n throw new Error(\"useApp must be used within AppContextProvider\");\n }\n\n return context;\n}\n\n/**\n * 获取应用名称\n */\nexport function useAppName(): string {\n return useApp().appName;\n}\n\n/**\n * 获取路由 basename\n */\nexport function useBasename(): string {\n return useApp().basename;\n}\n\n/**\n * 获取环境变量\n */\nexport function useEnv(): Record<string, string | undefined> {\n return useApp().env;\n}\n\n/**\n * 判断是否开发环境\n */\nexport function useIsDev(): boolean {\n return useApp().isDev;\n}\n","import { Component, type ErrorInfo, type ReactNode } from \"react\";\n\nexport interface ErrorBoundaryProps {\n /** 子组件 */\n children: ReactNode;\n /** 错误回退 UI */\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n /** 错误回调 */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * 错误边界组件\n */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n console.error(\"[ErrorBoundary] Caught error:\", error, errorInfo);\n this.props.onError?.(error, errorInfo);\n }\n\n reset = (): void => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n const { hasError, error } = this.state;\n const { children, fallback } = this.props;\n\n if (hasError && error) {\n if (typeof fallback === \"function\") {\n return fallback(error, this.reset);\n }\n\n if (fallback) {\n return fallback;\n }\n\n return <DefaultErrorFallback error={error} onReset={this.reset} />;\n }\n\n return children;\n }\n}\n\n/**\n * 默认错误回退 UI\n */\ninterface DefaultErrorFallbackProps {\n error: Error;\n onReset: () => void;\n}\n\nfunction DefaultErrorFallback({ error, onReset }: DefaultErrorFallbackProps) {\n const isDev = process.env.NODE_ENV === \"development\";\n\n return (\n <div\n style={{\n padding: 24,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n backgroundColor: \"#f5f5f5\",\n }}\n >\n <div\n style={{\n maxWidth: 600,\n padding: 32,\n backgroundColor: \"#fff\",\n borderRadius: 8,\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n }}\n >\n <h1 style={{ color: \"#ff4d4f\", marginBottom: 16 }}>页面出错了</h1>\n <p style={{ color: \"#666\", marginBottom: 16 }}>\n 抱歉,页面遇到了一些问题。请尝试刷新页面或联系管理员。\n </p>\n\n {isDev && (\n <details\n style={{\n marginBottom: 16,\n padding: 12,\n backgroundColor: \"#fff2f0\",\n borderRadius: 4,\n border: \"1px solid #ffccc7\",\n }}\n >\n <summary style={{ cursor: \"pointer\", fontWeight: \"bold\" }}>\n 错误详情(仅开发环境可见)\n </summary>\n <pre\n style={{\n marginTop: 8,\n padding: 8,\n backgroundColor: \"#fff\",\n borderRadius: 4,\n overflow: \"auto\",\n fontSize: 12,\n }}\n >\n {error.message}\n {\"\\n\\n\"}\n {error.stack}\n </pre>\n </details>\n )}\n\n <div style={{ display: \"flex\", gap: 8 }}>\n <button\n onClick={onReset}\n style={{\n padding: \"8px 16px\",\n backgroundColor: \"#1890ff\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: 4,\n cursor: \"pointer\",\n }}\n >\n 重试\n </button>\n <button\n onClick={() => window.location.reload()}\n style={{\n padding: \"8px 16px\",\n backgroundColor: \"#fff\",\n color: \"#666\",\n border: \"1px solid #d9d9d9\",\n borderRadius: 4,\n cursor: \"pointer\",\n }}\n >\n 刷新页面\n </button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["rspack","chalk","createRequire","join","existsSync","join","existsSync","mkdirSync","readFileSync","writeFileSync","join","existsSync","existsSync","join","join","existsSync","mkdirSync","readFileSync","writeFileSync","join","existsSync","require","join","createRequire","dev","rspack","merge","rspack","merge","existsSync","readFileSync","resolve","createRequire","dirname","join","fileURLToPath","__dirname","require","elapsed","chalk","rspack","resolve","stats","rspack","chalk","resolve","chalk","rspack","existsSync","writeFileSync","join","join","existsSync","writeFileSync","existsSync","mkdirSync","writeFileSync","join","join","existsSync","mkdirSync","writeFileSync","existsSync","readdirSync","statSync","join","resolve","resolve","existsSync","readdirSync","join","statSync","existsSync","writeFileSync","join","rspack","join","rspack","existsSync","writeFileSync","join","join","existsSync","mkdirSync","writeFileSync","join","join","existsSync","resolve","mkdirSync","writeFileSync","existsSync","watch","join","join","existsSync","watch","jsx","jsx","jsx"]}
|