@nasti-toolchain/nasti 1.6.1 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +104 -5
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +105 -6
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +103 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +104 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/defaults.ts","../src/config/index.ts","../src/core/plugin-container.ts","../src/core/module-graph.ts","../src/server/ws.ts","../src/core/transformer.ts","../src/plugins/html.ts","../src/core/env.ts","../src/server/middleware.ts","../src/server/hmr.ts","../src/plugins/resolve.ts","../src/plugins/css.ts","../src/plugins/assets.ts","../src/server/index.ts","../src/plugins/electron.ts","../src/build/index.ts","../src/build/electron.ts","../src/server/electron-dev.ts","../src/cli.ts"],"sourcesContent":["import type { NastiConfig, ResolvedConfig, BuildConfig, ServerConfig, ResolveConfig, ElectronConfig } from '../types.js'\n\nconst defaultResolve: Required<ResolveConfig> = {\n alias: {},\n extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.json', '.vue'],\n conditions: ['import', 'module', 'browser', 'default'],\n mainFields: ['module', 'jsnext:main', 'jsnext', 'main'],\n}\n\nconst defaultServer: Required<ServerConfig> = {\n port: 3000,\n host: 'localhost',\n https: false,\n open: false,\n proxy: {},\n cors: true,\n hmr: true,\n}\n\nconst defaultBuild: Required<BuildConfig> = {\n outDir: 'dist',\n assetsDir: 'assets',\n minify: true,\n sourcemap: false,\n target: 'es2022',\n rolldownOptions: {},\n emptyOutDir: true,\n}\n\n// Electron 41+ 捆绑 Node 22.x / Chromium 138,故主进程目标默认 node22\nconst defaultElectron: Required<ElectronConfig> = {\n main: 'src/electron/main.ts',\n preload: 'src/electron/preload.ts',\n renderer: 'index.html',\n nodeTarget: 'node22',\n mainFormat: 'cjs',\n preloadFormat: 'cjs',\n electronPath: '',\n electronArgs: [],\n autoRestart: true,\n minVersion: 41,\n external: ['electron'],\n}\n\nexport const defaults: Required<Omit<NastiConfig, 'plugins'>> & { plugins: [] } = {\n root: '.',\n base: '/',\n mode: 'development',\n target: 'web',\n framework: 'auto',\n resolve: defaultResolve,\n server: defaultServer,\n build: defaultBuild,\n electron: defaultElectron,\n plugins: [],\n envPrefix: ['NASTI_', 'VITE_'],\n logLevel: 'info',\n}\n","import { pathToFileURL } from 'node:url'\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport type { NastiConfig, ResolvedConfig, NastiPlugin } from '../types.js'\nimport { defaults } from './defaults.js'\n\n/** 读取 tsconfig.json 中的 paths,转换为 Nasti alias 格式 */\nfunction loadTsconfigPaths(root: string): Record<string, string> {\n const tsconfigPath = path.resolve(root, 'tsconfig.json')\n if (!fs.existsSync(tsconfigPath)) return {}\n\n try {\n const content = fs.readFileSync(tsconfigPath, 'utf-8')\n // 简单剥离注释后 JSON.parse(tsconfig 允许注释)\n const stripped = content.replace(/\\/\\/[^\\n]*/g, '').replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n const tsconfig = JSON.parse(stripped)\n const paths: Record<string, string[]> = tsconfig?.compilerOptions?.paths ?? {}\n const baseUrl: string = tsconfig?.compilerOptions?.baseUrl ?? '.'\n\n const alias: Record<string, string> = {}\n for (const [pattern, targets] of Object.entries(paths)) {\n if (!targets.length) continue\n // 只处理简单别名(不含通配符 * 的键),通配符形式留给插件处理\n const cleanKey = pattern.replace(/\\/\\*$/, '')\n const cleanTarget = targets[0].replace(/\\/\\*$/, '')\n alias[cleanKey] = path.resolve(root, baseUrl, cleanTarget)\n }\n return alias\n } catch {\n return {}\n }\n}\n\nexport function defineConfig(config: NastiConfig): NastiConfig {\n return config\n}\n\nconst CONFIG_FILES = [\n 'nasti.config.ts',\n 'nasti.config.js',\n 'nasti.config.mjs',\n 'nasti.config.mts',\n]\n\nexport async function loadConfigFromFile(root: string): Promise<NastiConfig> {\n for (const file of CONFIG_FILES) {\n const filePath = path.resolve(root, file)\n if (!fs.existsSync(filePath)) continue\n\n if (file.endsWith('.ts') || file.endsWith('.mts')) {\n return await loadTsConfig(filePath)\n }\n const mod = await import(pathToFileURL(filePath).href)\n return mod.default ?? mod\n }\n return {}\n}\n\nasync function loadTsConfig(filePath: string): Promise<NastiConfig> {\n // 使用 oxc-transform 转译 TS 配置文件\n const { transformSync } = await import('oxc-transform')\n const code = fs.readFileSync(filePath, 'utf-8')\n const result = transformSync(filePath, code, {\n typescript: {},\n })\n\n // 写入临时 .mjs 文件然后 import\n const tmpFile = filePath + '.timestamp-' + Date.now() + '.mjs'\n try {\n fs.writeFileSync(tmpFile, result.code)\n const mod = await import(pathToFileURL(tmpFile).href)\n return mod.default ?? mod\n } finally {\n fs.unlinkSync(tmpFile)\n }\n}\n\n/**\n * Resolve the final configuration by loading file-based config, merging with inline config, and applying plugin hooks.\n *\n * Loads configuration from the project root (derived from `inlineConfig.root` or defaults), deep-merges file config with `inlineConfig` (inline takes precedence), runs each plugin's `config` hook and incorporates any returned partial config, constructs the complete `ResolvedConfig` (filling defaults for missing values and resolving tsconfig paths), filters plugins according to their `apply` field, and then invokes each included plugin's `configResolved` hook.\n *\n * @param inlineConfig - User-provided configuration that overrides file config and defaults\n * @param command - The current command, either `\"build\"` or `\"serve\"`, which influences mode and plugin filtering\n * @returns The fully resolved configuration with defaults applied, plugins filtered, and plugin hooks executed\n */\nexport async function resolveConfig(\n inlineConfig: NastiConfig = {},\n command: 'build' | 'serve',\n): Promise<ResolvedConfig> {\n const root = path.resolve(inlineConfig.root ?? defaults.root)\n const fileConfig = await loadConfigFromFile(root)\n\n // 合并: fileConfig < inlineConfig\n const merged: NastiConfig = deepMerge(deepMerge({}, fileConfig), inlineConfig)\n\n // 收集插件\n const rawPlugins: NastiPlugin[] = [\n ...(fileConfig.plugins ?? []),\n ...(inlineConfig.plugins ?? []),\n ]\n\n // 执行插件 config 钩子\n const env = { mode: merged.mode ?? defaults.mode, command }\n for (const plugin of rawPlugins) {\n if (plugin.config) {\n const result = await plugin.config(merged, env)\n if (result) Object.assign(merged, result)\n }\n }\n\n // 先构建 resolved,plugins 稍后填入(避免过滤时引用未初始化变量)\n const resolved: ResolvedConfig = {\n root,\n base: merged.base ?? defaults.base,\n mode: (command === 'build' ? 'production' : 'development') as ResolvedConfig['mode'],\n target: (merged.target ?? defaults.target) as ResolvedConfig['target'],\n framework: merged.framework ?? defaults.framework,\n command,\n resolve: {\n // tsconfig paths 优先级最低:tsconfig < defaults < user config\n alias: { ...loadTsconfigPaths(root), ...defaults.resolve.alias, ...merged.resolve?.alias },\n extensions: (merged.resolve?.extensions ?? defaults.resolve.extensions) as string[],\n conditions: (merged.resolve?.conditions ?? defaults.resolve.conditions) as string[],\n mainFields: (merged.resolve?.mainFields ?? defaults.resolve.mainFields) as string[],\n },\n plugins: [],\n server: { ...defaults.server, ...merged.server } as ResolvedConfig['server'],\n build: { ...defaults.build, ...merged.build } as ResolvedConfig['build'],\n electron: { ...defaults.electron, ...merged.electron } as ResolvedConfig['electron'],\n envPrefix: (Array.isArray(merged.envPrefix)\n ? merged.envPrefix\n : merged.envPrefix\n ? [merged.envPrefix]\n : [...defaults.envPrefix]) as string[],\n logLevel: merged.logLevel ?? defaults.logLevel,\n }\n\n // 过滤插件(apply 为函数时可安全访问已初始化的 resolved)\n const filteredPlugins = rawPlugins.filter((p) => {\n if (!p.apply) return true\n if (typeof p.apply === 'function') return p.apply(resolved, env)\n return p.apply === command\n })\n resolved.plugins = filteredPlugins\n\n // Electron 目标:扫描 dependencies 自动外部化 native 模块\n // (带 binding.gyp、gypfile:true,或 node_modules 内存在 *.node 的包)。\n // rolldown 尝试把 .node 打进 main 会直接爆,提前标为 external 才能正常 require。\n if (resolved.target === 'electron') {\n const autoExternal = detectNativeDeps(root)\n if (autoExternal.length > 0) {\n const current = new Set(resolved.electron.external ?? [])\n for (const dep of autoExternal) current.add(dep)\n resolved.electron.external = [...current]\n }\n }\n\n // 执行插件 configResolved 钩子\n for (const plugin of resolved.plugins) {\n if (plugin.configResolved) {\n await plugin.configResolved(resolved)\n }\n }\n\n return resolved\n}\n\n/**\n * 扫描项目 dependencies,返回需要从 Electron 主进程 bundle 中外部化的 native 模块列表。\n *\n * 判定依据(任一满足即视为 native):\n * - 包根目录存在 binding.gyp\n * - package.json 有 gypfile: true\n * - 包内存在 *.node 预编译产物\n * - 常见已知 native 包白名单(对付有些包不走 node-gyp 但运行时仍需原生 addon 的场景)\n */\nexport function detectNativeDeps(root: string): string[] {\n const result = new Set<string>()\n const pkgJsonPath = path.resolve(root, 'package.json')\n if (!fs.existsSync(pkgJsonPath)) return []\n let pkg: Record<string, any>\n try {\n pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'))\n } catch {\n return []\n }\n const deps = {\n ...(pkg.dependencies ?? {}),\n ...(pkg.optionalDependencies ?? {}),\n }\n // 已知需要外部化的 Electron 生态 native 模块\n const KNOWN_NATIVE = new Set([\n 'node-pty',\n 'better-sqlite3',\n 'sharp',\n 'serialport',\n '@vscode/tree-sitter-wasm',\n 'keytar',\n 'nodegit',\n 'sqlite3',\n 'fsevents',\n ])\n for (const dep of Object.keys(deps)) {\n if (KNOWN_NATIVE.has(dep)) {\n result.add(dep)\n continue\n }\n const depDir = path.resolve(root, 'node_modules', dep)\n if (!fs.existsSync(depDir)) continue\n // binding.gyp\n if (fs.existsSync(path.join(depDir, 'binding.gyp'))) {\n result.add(dep)\n continue\n }\n // package.json: gypfile\n const subPkg = path.join(depDir, 'package.json')\n if (fs.existsSync(subPkg)) {\n try {\n const sub = JSON.parse(fs.readFileSync(subPkg, 'utf-8'))\n if (sub.gypfile === true || sub.binary?.module_name) {\n result.add(dep)\n continue\n }\n } catch {\n /* ignore */\n }\n }\n // 浅层扫 *.node 文件(build/Release 或 prebuilds 目录)\n if (hasDotNodeFile(depDir)) {\n result.add(dep)\n }\n }\n return [...result]\n}\n\nfunction hasDotNodeFile(dir: string, depth = 0): boolean {\n if (depth > 3) return false\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n for (const e of entries) {\n if (e.isFile() && e.name.endsWith('.node')) return true\n if (e.isDirectory() && (e.name === 'build' || e.name === 'prebuilds' || e.name === 'Release')) {\n if (hasDotNodeFile(path.join(dir, e.name), depth + 1)) return true\n }\n }\n } catch {\n /* ignore */\n }\n return false\n}\n\nfunction deepMerge<T extends Record<string, any>>(target: T, source: Record<string, any>): T {\n const result = { ...target }\n for (const key of Object.keys(source)) {\n const val = source[key]\n if (val && typeof val === 'object' && !Array.isArray(val)) {\n result[key as keyof T] = deepMerge(\n (result[key as keyof T] as Record<string, any>) ?? {},\n val,\n ) as T[keyof T]\n } else if (val !== undefined) {\n result[key as keyof T] = val\n }\n }\n return result\n}\n","// Vite 兼容插件容器\n// 管理插件生命周期,实现 resolveId → load → transform 管道\n\nimport type {\n NastiPlugin,\n ResolvedConfig,\n PluginContext,\n ResolveIdResult,\n LoadResult,\n TransformResult,\n ModuleInfo,\n} from '../types.js'\n\nexport class PluginContainer {\n private plugins: NastiPlugin[]\n private config: ResolvedConfig\n private ctx: PluginContext\n private emittedFiles: Map<string, { fileName: string; source: string | Uint8Array }> = new Map()\n\n constructor(config: ResolvedConfig) {\n this.config = config\n // 按 enforce 排序: pre → normal → post\n this.plugins = sortPlugins(config.plugins)\n this.ctx = this.createContext()\n }\n\n private createContext(): PluginContext {\n const container = this\n return {\n async resolve(source: string, importer?: string) {\n return container.resolveId(source, importer)\n },\n emitFile(file) {\n const fileName = file.fileName ?? file.name ?? `asset-${container.emittedFiles.size}`\n const id = `emitted:${fileName}`\n container.emittedFiles.set(id, {\n fileName,\n source: file.source ?? '',\n })\n return id\n },\n getModuleInfo(_id): ModuleInfo | null {\n return null\n },\n }\n }\n\n /** 返回所有通过 emitFile() 输出的文件 */\n getEmittedFiles(): Array<{ fileName: string; source: string | Uint8Array }> {\n return Array.from(this.emittedFiles.values())\n }\n\n async buildStart(): Promise<void> {\n for (const plugin of this.plugins) {\n if (plugin.buildStart) {\n await plugin.buildStart.call(this.ctx)\n }\n }\n }\n\n async buildEnd(error?: Error): Promise<void> {\n for (const plugin of this.plugins) {\n if (plugin.buildEnd) {\n await plugin.buildEnd.call(this.ctx, error)\n }\n }\n }\n\n async resolveId(\n source: string,\n importer?: string,\n options: { isEntry?: boolean } = {},\n ): Promise<ResolveIdResult> {\n for (const plugin of this.plugins) {\n if (!plugin.resolveId) continue\n const result = await plugin.resolveId.call(\n this.ctx,\n source,\n importer ?? undefined,\n { isEntry: options.isEntry ?? false, ssr: false },\n )\n if (result != null) return result\n }\n return null\n }\n\n async load(id: string): Promise<LoadResult> {\n for (const plugin of this.plugins) {\n if (!plugin.load) continue\n const result = await plugin.load.call(this.ctx, id)\n if (result != null) return result\n }\n return null\n }\n\n async transform(code: string, id: string): Promise<TransformResult> {\n let currentCode = code\n for (const plugin of this.plugins) {\n if (!plugin.transform) continue\n const result = await plugin.transform.call(this.ctx, currentCode, id)\n if (result == null) continue\n if (typeof result === 'string') {\n currentCode = result\n } else {\n currentCode = result.code\n }\n }\n return currentCode === code ? null : { code: currentCode }\n }\n\n /** 完整的模块处理管道: resolveId → load → transform */\n async processModule(\n source: string,\n importer?: string,\n ): Promise<{ id: string; code: string } | null> {\n // 1. resolveId\n const resolveResult = await this.resolveId(source, importer, {\n isEntry: !importer,\n })\n if (resolveResult == null) return null\n const id = typeof resolveResult === 'string' ? resolveResult : resolveResult.id\n\n // 2. load\n const loadResult = await this.load(id)\n if (loadResult == null) return null\n const loadedCode = typeof loadResult === 'string' ? loadResult : loadResult.code\n\n // 3. transform\n const transformResult = await this.transform(loadedCode, id)\n const finalCode = transformResult == null\n ? loadedCode\n : typeof transformResult === 'string'\n ? transformResult\n : transformResult.code\n\n return { id, code: finalCode }\n }\n\n getPlugins(): NastiPlugin[] {\n return this.plugins\n }\n}\n\nfunction sortPlugins(plugins: NastiPlugin[]): NastiPlugin[] {\n const pre: NastiPlugin[] = []\n const normal: NastiPlugin[] = []\n const post: NastiPlugin[] = []\n\n for (const plugin of plugins) {\n if (plugin.enforce === 'pre') pre.push(plugin)\n else if (plugin.enforce === 'post') post.push(plugin)\n else normal.push(plugin)\n }\n\n return [...pre, ...normal, ...post]\n}\n","// 模块依赖图 - 用于 HMR 追踪模块关系\n\nimport type { ModuleNode, TransformResult } from '../types.js'\n\nexport class ModuleGraph {\n private urlToModuleMap = new Map<string, ModuleNode>()\n private idToModuleMap = new Map<string, ModuleNode>()\n private fileToModulesMap = new Map<string, Set<ModuleNode>>()\n\n getModuleByUrl(url: string): ModuleNode | undefined {\n return this.urlToModuleMap.get(url)\n }\n\n getModuleById(id: string): ModuleNode | undefined {\n return this.idToModuleMap.get(id)\n }\n\n getModulesByFile(file: string): Set<ModuleNode> | undefined {\n return this.fileToModulesMap.get(file)\n }\n\n async ensureEntryFromUrl(url: string): Promise<ModuleNode> {\n let mod = this.urlToModuleMap.get(url)\n if (mod) return mod\n\n mod = this.createModule(url)\n this.urlToModuleMap.set(url, mod)\n return mod\n }\n\n createModule(url: string, id?: string): ModuleNode {\n const mod: ModuleNode = {\n id: id ?? url,\n file: null,\n url,\n type: url.endsWith('.css') ? 'css' : 'js',\n importers: new Set(),\n importedModules: new Set(),\n acceptedHmrDeps: new Set(),\n transformResult: null,\n lastHMRTimestamp: 0,\n isSelfAccepting: false,\n }\n this.idToModuleMap.set(mod.id, mod)\n return mod\n }\n\n /** 注册文件路径到模块的映射 */\n registerModule(mod: ModuleNode, file: string): void {\n mod.file = file\n let mods = this.fileToModulesMap.get(file)\n if (!mods) {\n mods = new Set()\n this.fileToModulesMap.set(file, mods)\n }\n mods.add(mod)\n }\n\n /** 更新模块依赖关系 */\n updateModuleImports(mod: ModuleNode, importedIds: Set<string>): void {\n // 清除旧的导入关系\n for (const imported of mod.importedModules) {\n imported.importers.delete(mod)\n }\n mod.importedModules.clear()\n\n // 建立新的导入关系\n for (const id of importedIds) {\n const importedMod = this.idToModuleMap.get(id)\n if (importedMod) {\n mod.importedModules.add(importedMod)\n importedMod.importers.add(mod)\n }\n }\n }\n\n /** 使模块的转换缓存失效 */\n invalidateModule(mod: ModuleNode): void {\n mod.transformResult = null\n mod.lastHMRTimestamp = Date.now()\n }\n\n /** 使所有模块缓存失效 */\n invalidateAll(): void {\n for (const mod of this.idToModuleMap.values()) {\n this.invalidateModule(mod)\n }\n }\n\n /** 获取 HMR 传播边界 - 从变更模块向上遍历找到接受更新的边界 */\n getHmrBoundaries(mod: ModuleNode): { boundary: ModuleNode; acceptedVia: ModuleNode }[] {\n const boundaries: { boundary: ModuleNode; acceptedVia: ModuleNode }[] = []\n const visited = new Set<ModuleNode>()\n\n const propagate = (node: ModuleNode, via: ModuleNode): boolean => {\n if (visited.has(node)) return true\n visited.add(node)\n\n // 如果模块自身接受热更新\n if (node.isSelfAccepting) {\n boundaries.push({ boundary: node, acceptedVia: via })\n return true\n }\n\n // 如果模块被其他模块作为 HMR 依赖接受\n if (node.acceptedHmrDeps.has(via)) {\n boundaries.push({ boundary: node, acceptedVia: via })\n return true\n }\n\n // 没有 importer 意味着到达了入口,需要 full reload\n if (node.importers.size === 0) return false\n\n // 向上传播\n for (const importer of node.importers) {\n if (!propagate(importer, node)) return false\n }\n return true\n }\n\n // 从自身开始,如果自身接受就直接返回\n if (mod.isSelfAccepting) {\n boundaries.push({ boundary: mod, acceptedVia: mod })\n return boundaries\n }\n\n // 否则向 importer 传播\n for (const importer of mod.importers) {\n if (!propagate(importer, mod)) {\n // 传播到了根模块,需要 full reload\n return []\n }\n }\n\n return boundaries\n }\n}\n","// WebSocket 服务封装 - HMR 通信\nimport { WebSocketServer as WsServer, type WebSocket } from 'ws'\nimport type { WebSocketServer as IWebSocketServer, HmrPayload } from '../types.js'\n\nexport function createWebSocketServer(server: any): IWebSocketServer {\n const wss = new WsServer({ noServer: true })\n const clients = new Set<WebSocket>()\n\n // 处理 HTTP server 的 upgrade 请求\n server.on('upgrade', (req: any, socket: any, head: any) => {\n if (req.headers['sec-websocket-protocol'] === 'nasti-hmr') {\n wss.handleUpgrade(req, socket, head, (ws) => {\n wss.emit('connection', ws, req)\n })\n }\n })\n\n wss.on('connection', (ws) => {\n clients.add(ws)\n ws.send(JSON.stringify({ type: 'connected' }))\n\n ws.on('close', () => {\n clients.delete(ws)\n })\n\n ws.on('error', (err) => {\n console.error('[nasti] WebSocket error:', err)\n clients.delete(ws)\n })\n })\n\n return {\n send(payload: HmrPayload) {\n const data = JSON.stringify(payload)\n for (const client of clients) {\n if (client.readyState === 1) { // WebSocket.OPEN\n client.send(data)\n }\n }\n },\n close() {\n clients.clear()\n wss.close()\n },\n }\n}\n","// OXC Transform 封装 - 高性能 TS/JSX/TSX 转译\nimport { transformSync } from 'oxc-transform'\n\nexport interface TransformOptions {\n jsx?: boolean\n jsxRuntime?: 'automatic' | 'classic'\n jsxImportSource?: string\n typescript?: boolean\n sourcemap?: boolean\n reactRefresh?: boolean\n}\n\nexport interface TransformOutput {\n code: string\n map: string | null\n}\n\nconst JS_EXTENSIONS = /\\.(js|mjs|cjs)$/\nconst TS_EXTENSIONS = /\\.(ts|mts|cts)$/\nconst JSX_EXTENSIONS = /\\.(jsx|tsx)$/\nconst VUE_EXTENSION = /\\.vue$/\n\nexport function shouldTransform(id: string): boolean {\n return (\n TS_EXTENSIONS.test(id) ||\n JSX_EXTENSIONS.test(id) ||\n (JS_EXTENSIONS.test(id) && false) // JS 文件默认不转译,除非包含 JSX\n )\n}\n\nexport function transformCode(\n filename: string,\n code: string,\n options: TransformOptions = {},\n): TransformOutput {\n const isTS = TS_EXTENSIONS.test(filename) || /\\.tsx$/.test(filename)\n const isJSX = JSX_EXTENSIONS.test(filename)\n\n const result = transformSync(filename, code, {\n typescript: isTS ? {} : undefined,\n jsx: isJSX || /\\.tsx$/.test(filename)\n ? {\n runtime: options.jsxRuntime ?? 'automatic',\n importSource: options.jsxImportSource ?? 'react',\n refresh: options.reactRefresh ?? false,\n }\n : undefined,\n sourcemap: options.sourcemap ?? true,\n })\n\n if (result.errors && result.errors.length > 0) {\n const msg = result.errors.map((e: any) => e.message ?? String(e)).join('\\n')\n throw new Error(`OXC transform failed for ${filename}:\\n${msg}`)\n }\n\n return {\n code: result.code,\n map: result.map ? JSON.stringify(result.map) : null,\n }\n}\n\n/** 获取文件的模块类型 */\nexport function getModuleType(id: string): 'ts' | 'tsx' | 'js' | 'jsx' | 'css' | 'json' | 'vue' | 'asset' {\n if (/\\.tsx$/.test(id)) return 'tsx'\n if (/\\.ts$/.test(id) || /\\.mts$/.test(id)) return 'ts'\n if (/\\.jsx$/.test(id)) return 'jsx'\n if (/\\.css$/.test(id)) return 'css'\n if (/\\.json$/.test(id)) return 'json'\n if (VUE_EXTENSION.test(id)) return 'vue'\n if (JS_EXTENSIONS.test(id)) return 'js'\n return 'asset'\n}\n","// HTML 入口处理插件 - index.html 处理与脚本注入\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport type { NastiPlugin, ResolvedConfig, HtmlTagDescriptor } from '../types.js'\n\n/** 运行在用户脚本之前、安装 React Fast Refresh 全局钩子的 preamble。 */\nconst REACT_REFRESH_HTML_PREAMBLE = `\nimport RefreshRuntime from \"/@react-refresh\";\nRefreshRuntime.injectIntoGlobalHook(window);\nwindow.$RefreshReg$ = () => {};\nwindow.$RefreshSig$ = () => (type) => type;\nwindow.__vite_plugin_react_preamble_installed__ = true;\n`.trim()\n\nexport function htmlPlugin(config: ResolvedConfig): NastiPlugin {\n return {\n name: 'nasti:html',\n enforce: 'post',\n\n transformIndexHtml(html) {\n const tags: HtmlTagDescriptor[] = []\n\n if (config.command === 'serve') {\n const isReactLike = config.framework === 'react' || config.framework === 'auto'\n\n // 先装 Fast Refresh 钩子(必须在任何用户模块之前,因为 JSX 模块 wrapper\n // 会校验 window.__vite_plugin_react_preamble_installed__)\n if (isReactLike) {\n tags.push({\n tag: 'script',\n attrs: { type: 'module' },\n children: REACT_REFRESH_HTML_PREAMBLE,\n injectTo: 'head-prepend',\n })\n }\n\n // HMR 客户端(内置 createHotContext 命名导出,供模块 wrapper 调用)\n tags.push({\n tag: 'script',\n attrs: { type: 'module', src: '/@nasti/client' },\n injectTo: 'head-prepend',\n })\n }\n\n return { html, tags }\n },\n }\n}\n\n/** 处理 HTML,注入标签并重写 script src */\nexport function processHtml(\n html: string,\n tags: HtmlTagDescriptor[],\n): string {\n const headPrepend = tags.filter((t) => t.injectTo === 'head-prepend')\n const head = tags.filter((t) => t.injectTo === 'head' || !t.injectTo)\n const bodyPrepend = tags.filter((t) => t.injectTo === 'body-prepend')\n const body = tags.filter((t) => t.injectTo === 'body')\n\n if (headPrepend.length) {\n html = html.replace(/<head([^>]*)>/i, `<head$1>\\n${serializeTags(headPrepend)}`)\n }\n if (head.length) {\n html = html.replace(/<\\/head>/i, `${serializeTags(head)}\\n</head>`)\n }\n if (bodyPrepend.length) {\n html = html.replace(/<body([^>]*)>/i, `<body$1>\\n${serializeTags(bodyPrepend)}`)\n }\n if (body.length) {\n html = html.replace(/<\\/body>/i, `${serializeTags(body)}\\n</body>`)\n }\n\n return html\n}\n\nfunction serializeTags(tags: HtmlTagDescriptor[]): string {\n return tags.map(serializeTag).join('\\n')\n}\n\nfunction serializeTag(tag: HtmlTagDescriptor): string {\n const attrs = tag.attrs\n ? ' ' +\n Object.entries(tag.attrs)\n .map(([k, v]) => (v === true ? k : `${k}=\"${v}\"`))\n .join(' ')\n : ''\n const children =\n typeof tag.children === 'string'\n ? tag.children\n : tag.children\n ? serializeTags(tag.children)\n : ''\n\n const selfClosing = ['link', 'meta', 'br', 'hr', 'img', 'input'].includes(tag.tag)\n if (selfClosing && !children) {\n return ` <${tag.tag}${attrs} />`\n }\n return ` <${tag.tag}${attrs}>${children}</${tag.tag}>`\n}\n\n/** 读取并处理 HTML 入口文件 */\nexport async function readHtmlFile(root: string): Promise<string | null> {\n const htmlPath = path.resolve(root, 'index.html')\n if (!fs.existsSync(htmlPath)) return null\n return fs.readFileSync(htmlPath, 'utf-8')\n}\n","// 环境变量加载 - 读取 .env 文件并生成 import.meta.env 定义\nimport path from 'node:path'\nimport fs from 'node:fs'\n\nexport interface EnvRecord {\n [key: string]: string\n}\n\n/**\n * 从 .env 文件加载环境变量,按优先级合并:\n * .env < .env.[mode] < .env.local < .env.[mode].local\n */\nexport function loadEnv(mode: string, root: string, prefixes: string[]): EnvRecord {\n const envFiles = [\n '.env',\n `.env.${mode}`,\n '.env.local',\n `.env.${mode}.local`,\n ]\n\n const raw: EnvRecord = {}\n\n for (const file of envFiles) {\n const filePath = path.resolve(root, file)\n if (!fs.existsSync(filePath)) continue\n const content = fs.readFileSync(filePath, 'utf-8')\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eqIdx = trimmed.indexOf('=')\n if (eqIdx === -1) continue\n const key = trimmed.slice(0, eqIdx).trim()\n let value = trimmed.slice(eqIdx + 1).trim()\n // 去除引号\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1)\n }\n raw[key] = value\n }\n }\n\n // 只保留符合 prefix 的变量\n const filtered: EnvRecord = {}\n for (const [key, value] of Object.entries(raw)) {\n if (prefixes.some((prefix) => key.startsWith(prefix))) {\n filtered[key] = value\n }\n }\n\n return filtered\n}\n\n/**\n * 将过滤后的 env 转为 Rolldown define 对象\n * 例: { VITE_FOO: 'bar' } → { 'import.meta.env.VITE_FOO': '\"bar\"' }\n * 同时注入 import.meta.env.MODE / DEV / PROD\n */\nexport function buildEnvDefine(env: EnvRecord, mode: string): Record<string, string> {\n const define: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(env)) {\n define[`import.meta.env.${key}`] = JSON.stringify(value)\n }\n\n define['import.meta.env.MODE'] = JSON.stringify(mode)\n define['import.meta.env.DEV'] = mode !== 'production' ? 'true' : 'false'\n define['import.meta.env.PROD'] = mode === 'production' ? 'true' : 'false'\n define['import.meta.env.SSR'] = 'false'\n\n return define\n}\n\n/**\n * 在代码字符串中替换 import.meta.env.KEY(用于 dev 服务器按需转换)\n */\nexport function replaceEnvInCode(code: string, define: Record<string, string>): string {\n let result = code\n for (const [key, value] of Object.entries(define)) {\n // 转义正则特殊字符\n const escaped = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n result = result.replace(new RegExp(escaped, 'g'), value)\n }\n return result\n}\n","// HTTP 中间件 - 请求拦截与按需转译\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport type { ResolvedConfig } from '../types.js'\nimport { PluginContainer } from '../core/plugin-container.js'\nimport { ModuleGraph } from '../core/module-graph.js'\nimport { transformCode, shouldTransform, getModuleType } from '../core/transformer.js'\nimport { readHtmlFile, processHtml } from '../plugins/html.js'\nimport { loadEnv, buildEnvDefine, replaceEnvInCode } from '../core/env.js'\n\nconst __dirname_esm = path.dirname(fileURLToPath(import.meta.url))\nconst __require = createRequire(import.meta.url)\n\n/**\n * 将 react-refresh 的 CJS 运行时包装成浏览器可用的 ESM。\n * 原 CJS 通过 `exports.xxx = fn` 写入导出;我们用假的 module/exports/process\n * 对象跑一遍,再显式 re-export 出来。\n *\n * 读一次缓存一次:dev server 生命周期内不会变。\n */\nlet __refreshRuntimeCache: string | null = null\nfunction getReactRefreshRuntimeEsm(): string {\n if (__refreshRuntimeCache) return __refreshRuntimeCache\n // react-refresh 的 package.json `exports` 没有暴露 ./cjs/*,Node 24 严格执行\n // exports 后 `require.resolve('react-refresh/cjs/...')` 会抛 ERR_PACKAGE_PATH_NOT_EXPORTED。\n // 改为先 resolve 受支持的 ./package.json,再手动拼 cjs 子路径,绕开 exports 校验。\n let cjsPath: string\n try {\n const pkgPath = __require.resolve('react-refresh/package.json')\n cjsPath = path.join(path.dirname(pkgPath), 'cjs', 'react-refresh-runtime.development.js')\n } catch (err) {\n // 兜底:从 dist 向上找\n cjsPath = path.resolve(__dirname_esm, '../../node_modules/react-refresh/cjs/react-refresh-runtime.development.js')\n if (!fs.existsSync(cjsPath)) {\n const origMsg = err instanceof Error ? err.message : String(err)\n throw new Error(\n `[nasti] Missing dependency \"react-refresh\". Install it with: npm install react-refresh\\nOriginal resolve error: ${origMsg}`,\n )\n }\n }\n const cjsSource = fs.readFileSync(cjsPath, 'utf-8')\n // 这些命名对应 react-refresh-runtime 的公共导出,与\n // node -e \"Object.keys(require('react-refresh/runtime'))\" 对齐。\n __refreshRuntimeCache = `// Wrapped react-refresh runtime -> ESM\nconst exports = {};\nconst module = { exports };\nconst process = { env: { NODE_ENV: 'development' } };\n${cjsSource}\nconst __rt = module.exports;\nexport const injectIntoGlobalHook = __rt.injectIntoGlobalHook;\nexport const register = __rt.register;\nexport const createSignatureFunctionForTransform = __rt.createSignatureFunctionForTransform;\nexport const performReactRefresh = __rt.performReactRefresh;\nexport const isLikelyComponentType = __rt.isLikelyComponentType;\nexport const hasUnrecoverableErrors = __rt.hasUnrecoverableErrors;\nexport const setSignature = __rt.setSignature;\nexport const getFamilyByID = __rt.getFamilyByID;\nexport const getFamilyByType = __rt.getFamilyByType;\nexport const findAffectedHostInstances = __rt.findAffectedHostInstances;\nexport const collectCustomHooksForSignature = __rt.collectCustomHooksForSignature;\nexport default __rt;\n`\n return __refreshRuntimeCache\n}\n\n/**\n * React Fast Refresh 全局钩子安装脚本。\n * 必须在用户代码之前执行,由 html.ts 以 head-prepend 的方式注入到 index.html。\n */\nexport const REACT_REFRESH_GLOBAL_PREAMBLE = `\nimport RefreshRuntime from \"/@react-refresh\";\nRefreshRuntime.injectIntoGlobalHook(window);\nwindow.$RefreshReg$ = () => {};\nwindow.$RefreshSig$ = () => (type) => type;\nwindow.__vite_plugin_react_preamble_installed__ = true;\n`.trim()\n\n/**\n * 单模块的 Fast Refresh 包装。\n *\n * 包装前先把 transformed 代码里的 `import.meta.hot` 替换为本地 `__nasti_hot__`\n * 变量 —— 规避 `import.meta` 属性赋值在某些引擎下不可写的问题,并统一 JSX/非 JSX\n * 路径的 hot 来源。\n */\nfunction buildReactRefreshWrapper(moduleUrl: string, transformedCode: string): string {\n const urlLit = JSON.stringify(moduleUrl)\n const userCode = transformedCode.replace(/\\bimport\\.meta\\.hot\\b/g, '__nasti_hot__')\n return `import * as RefreshRuntime from \"/@react-refresh\";\nimport { createHotContext as __nasti_createHotContext__ } from \"/@nasti/client\";\nconst __nasti_hot__ = __nasti_createHotContext__(${urlLit});\n\nif (!window.__vite_plugin_react_preamble_installed__) {\n throw new Error(\"[nasti] React Fast Refresh preamble missing. Make sure nasti:html is wired with framework: 'react'.\");\n}\n\nconst prevRefreshReg = window.$RefreshReg$;\nconst prevRefreshSig = window.$RefreshSig$;\nwindow.$RefreshReg$ = (type, id) => {\n RefreshRuntime.register(type, ${urlLit} + \" \" + id);\n};\nwindow.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;\n\n${userCode}\n\nwindow.$RefreshReg$ = prevRefreshReg;\nwindow.$RefreshSig$ = prevRefreshSig;\n\nif (__nasti_hot__) {\n __nasti_hot__.accept(() => {\n clearTimeout(window.__nasti_refresh_timer__);\n window.__nasti_refresh_timer__ = setTimeout(() => {\n RefreshRuntime.performReactRefresh();\n }, 30);\n });\n}\n`\n}\n\n/**\n * 非 JSX 模块里用户显式写了 import.meta.hot —— 注入一段 hot context 头部并替换属性访问为本地变量。\n */\nfunction injectImportMetaHot(code: string, moduleUrl: string): string {\n if (!/\\bimport\\.meta\\.hot\\b/.test(code)) return code\n const urlLit = JSON.stringify(moduleUrl)\n const header = `import { createHotContext as __nasti_createHotContext__ } from \"/@nasti/client\";\nconst __nasti_hot__ = __nasti_createHotContext__(${urlLit});\n`\n return header + code.replace(/\\bimport\\.meta\\.hot\\b/g, '__nasti_hot__')\n}\n\nexport interface TransformMiddlewareContext {\n config: ResolvedConfig\n pluginContainer: PluginContainer\n moduleGraph: ModuleGraph\n envDefine?: Record<string, string>\n}\n\n/** 主转译中间件 - 处理模块请求 */\nexport function transformMiddleware(ctx: TransformMiddlewareContext) {\n // 预加载环境变量,避免每次请求都重新读取 .env 文件\n ctx.envDefine = buildEnvDefine(\n loadEnv(ctx.config.mode, ctx.config.root, ctx.config.envPrefix),\n ctx.config.mode,\n )\n return async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const url = req.url ?? '/'\n\n // 设置 CORS 响应头\n if (ctx.config.server.cors) {\n const origin = req.headers.origin ?? '*'\n res.setHeader('Access-Control-Allow-Origin', origin)\n res.setHeader('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type')\n if (req.method === 'OPTIONS') {\n res.statusCode = 204\n res.end()\n return\n }\n }\n\n // 跳过非 GET 请求\n if (req.method !== 'GET') return next()\n\n // 处理 HMR 客户端请求\n if (url === '/@nasti/client') {\n res.setHeader('Content-Type', 'application/javascript')\n res.end(getHmrClientCode())\n return\n }\n\n // 处理 HTML 请求\n if (url === '/' || url.endsWith('.html')) {\n const html = await readHtmlFile(ctx.config.root)\n if (html) {\n let processedHtml = html\n\n // 执行 transformIndexHtml 钩子\n for (const plugin of ctx.config.plugins) {\n if (plugin.transformIndexHtml) {\n const result = await plugin.transformIndexHtml(processedHtml)\n if (typeof result === 'string') {\n processedHtml = result\n } else if (result && 'html' in result) {\n processedHtml = processHtml(result.html, result.tags)\n } else if (Array.isArray(result)) {\n processedHtml = processHtml(processedHtml, result)\n }\n }\n }\n\n res.setHeader('Content-Type', 'text/html')\n res.end(processedHtml)\n return\n }\n }\n\n // 处理模块请求(.ts, .tsx, .jsx, .vue, .css 等)\n if (isModuleRequest(url)) {\n try {\n const result = await transformRequest(url, ctx)\n if (result) {\n const contentType = url.endsWith('.css')\n ? 'application/javascript' // CSS 已转为 JS 模块\n : 'application/javascript'\n res.setHeader('Content-Type', contentType)\n res.setHeader('Cache-Control', 'no-cache')\n res.end(typeof result === 'string' ? result : result.code)\n return\n }\n } catch (err: any) {\n console.error(`[nasti] Transform error: ${url}`, err.message)\n res.statusCode = 500\n res.end(`Transform error: ${err.message}`)\n return\n }\n }\n\n next()\n }\n}\n\n/** 转译单个模块 */\nexport async function transformRequest(\n url: string,\n ctx: TransformMiddlewareContext,\n): Promise<{ code: string; map?: unknown } | null> {\n const { config, pluginContainer, moduleGraph } = ctx\n\n const cleanReqUrl = url.split('?')[0]\n\n // 检查缓存\n const cached = moduleGraph.getModuleByUrl(url)\n if (cached?.transformResult) {\n return cached.transformResult as { code: string; map?: unknown }\n }\n\n // React Refresh 真实运行时(来自 react-refresh/cjs 包装为 ESM)\n if (cleanReqUrl === '/@react-refresh') {\n return { code: getReactRefreshRuntimeEsm() }\n }\n\n // 解析文件路径\n const filePath = resolveUrlToFile(url, config.root)\n if (!filePath || !fs.existsSync(filePath)) return null\n\n // 创建/获取模块节点\n const mod = await moduleGraph.ensureEntryFromUrl(url)\n moduleGraph.registerModule(mod, filePath)\n\n // node_modules 模块:用 rolldown 打成浏览器可用的 ESM\n // 解决 CJS 包(如 react)无法在浏览器中作为 ESM 使用的问题\n if (cleanReqUrl.startsWith('/@modules/')) {\n const code = await bundlePackageAsEsm(filePath)\n const transformResult = { code }\n mod.transformResult = transformResult\n return transformResult\n }\n\n // 读取源码\n let code = fs.readFileSync(filePath, 'utf-8')\n\n // 通过插件管道 transform\n const pluginResult = await pluginContainer.transform(code, filePath)\n if (pluginResult) {\n code = typeof pluginResult === 'string' ? pluginResult : pluginResult.code\n }\n\n // Fast Refresh / HMR 键必须在同一文件的多次 import(?t=xxx 变化)间稳定\n const stableUrl = cleanReqUrl\n\n // OXC 转译 (TS/JSX/TSX)\n let wrappedWithRefresh = false\n if (shouldTransform(filePath)) {\n const isJsx = /\\.[jt]sx$/.test(filePath)\n const useRefresh = isJsx && config.framework !== 'vue'\n const result = transformCode(filePath, code, {\n sourcemap: true,\n jsxRuntime: 'automatic',\n jsxImportSource: config.framework === 'vue' ? 'vue' : 'react',\n reactRefresh: useRefresh,\n })\n code = result.code\n if (useRefresh) {\n // 把模块包装起来:安装 $RefreshReg$/$RefreshSig$、建 hot context、尾部触发 performReactRefresh\n code = buildReactRefreshWrapper(stableUrl, code)\n wrappedWithRefresh = true\n // 标记为自接受,HMR 传播到此为止,不再 full-reload\n mod.isSelfAccepting = true\n }\n }\n\n // 非 Fast-Refresh 模块里用户自己写了 import.meta.hot 的,注入 hot context\n if (!wrappedWithRefresh) {\n code = injectImportMetaHot(code, stableUrl)\n }\n\n // 替换 import.meta.env.* 为实际值\n const envDefine = ctx.envDefine ?? buildEnvDefine(\n loadEnv(config.mode, config.root, config.envPrefix),\n config.mode,\n )\n code = replaceEnvInCode(code, envDefine)\n\n // 重写 import 规范:alias / 相对路径 → 解析后的绝对 URL(带扩展名),bare → /@modules/\n code = rewriteImports(code, config, filePath)\n\n const transformResult = { code }\n mod.transformResult = transformResult\n return transformResult\n}\n\n/** 用 rolldown 将 node_modules 包打包为浏览器可用的 ESM(含 CJS→ESM 转换) */\n// Promise 缓存:同一入口文件只打包一次,防止并发重复打包\nconst esmBundleCache = new Map<string, Promise<string>>()\n\nasync function bundlePackageAsEsm(entryFile: string): Promise<string> {\n if (!esmBundleCache.has(entryFile)) {\n esmBundleCache.set(entryFile, doBundlePackage(entryFile))\n }\n return esmBundleCache.get(entryFile)!\n}\n\nasync function doBundlePackage(entryFile: string): Promise<string> {\n const { rolldown } = await import('rolldown')\n\n const bundle = await rolldown({\n input: entryFile,\n // 仅将其他 npm 包外部化;相对路径(包内部文件)全部内联打包\n external: (id: string) => {\n if (id.startsWith('.') || id.startsWith('/') || /^[A-Za-z]:\\\\/.test(id)) return false\n return true\n },\n })\n\n const result = await bundle.generate({ format: 'esm', exports: 'named' })\n await bundle.close()\n\n let code = result.output[0].code\n\n // 替换 process.env.NODE_ENV(rolldown 的 define 选项在此版本无效)\n code = code.replace(/process\\.env\\.NODE_ENV/g, '\"development\"')\n\n // 将外部化的 bare specifier 改写为 /@modules/ 路径供浏览器加载\n // ⚠️ 必须用 ^ + m 锚定行首,只匹配真正的 import/export 声明,\n // 避免误匹配字符串内出现的 from \"...\" 导致 SyntaxError\n code = code\n .replace(/^(import\\b[^;'\"]*?\\bfrom\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`)\n .replace(/^(export\\b[^;'\"]*?\\bfrom\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`)\n .replace(/^(import\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`)\n\n // CJS 外部 require 改写:\n // rolldown 将 CJS 的 require(\"pkg\") 转为 __require(\"pkg\"),在浏览器中抛异常。\n // 收集所有 __require(\"pkg\"),替换为顶层 ESM import 的变量引用。\n code = rewriteExternalRequires(code)\n\n // CJS 包的具名导出补全:\n // rolldown 将 CJS 包包装为 __commonJSMin,只输出 export default,\n // 导致 import { parse } from '/@modules/cookie' 等具名导入失败。\n // 通过 createRequire 在 Node.js 侧加载 CJS 模块,取出 exports 的 key,\n // 在 ESM bundle 末尾补上静态具名 export。\n if (code.includes('__commonJSMin')) {\n code = await injectCjsNamedExports(code, entryFile)\n }\n\n return code\n}\n\n/** 将 rolldown 生成的 __require(\"pkg\") 调用转换为顶层 ESM import\n * 使用 namespace import + default 回退,兼容 CJS 和 ESM 模块:\n * - CJS 包有 default export(__cjsMod)→ 取 .default\n * - ESM 包只有 named exports → 取 namespace 本身 */\nfunction rewriteExternalRequires(code: string): string {\n const pkgs = new Set<string>()\n const re = /__require\\([\"']([^\"']+)[\"']\\)/g\n let m\n while ((m = re.exec(code)) !== null) {\n pkgs.add(m[1])\n }\n if (pkgs.size === 0) return code\n\n let result = code\n const imports: string[] = []\n for (const pkg of pkgs) {\n const safe = pkg.replace(/[^a-zA-Z0-9_$]/g, '_')\n imports.push(`import * as __ns_${safe} from \"/@modules/${pkg}\";`)\n imports.push(`var __req_${safe} = \"default\" in __ns_${safe} ? __ns_${safe}[\"default\"] : __ns_${safe};`)\n result = result.replaceAll(`__require(\"${pkg}\")`, `__req_${safe}`)\n result = result.replaceAll(`__require('${pkg}')`, `__req_${safe}`)\n }\n\n return imports.join('\\n') + '\\n' + result\n}\n\nconst VALID_IDENT = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/\n\nasync function injectCjsNamedExports(code: string, entryFile: string): Promise<string> {\n try {\n const { createRequire } = await import('module')\n const req = createRequire(entryFile)\n const cjsExports = req(entryFile)\n if (!cjsExports || (typeof cjsExports !== 'object' && typeof cjsExports !== 'function') || Array.isArray(cjsExports)) return code\n\n const namedKeys = Object.keys(cjsExports).filter(\n (k) => k !== '__esModule' && k !== 'default' && VALID_IDENT.test(k),\n )\n if (namedKeys.length === 0) return code\n\n // 把末尾的 \"export default require_xxx();\" 改写为带具名 export 的形式\n return code.replace(\n /^export default (\\w+\\(\\));?\\s*$/m,\n (_, call) => [\n `const __cjsMod = ${call};`,\n `export default __cjsMod;`,\n ...namedKeys.map((k) => `export const ${k} = __cjsMod[${JSON.stringify(k)}];`),\n ].join('\\n'),\n )\n } catch {\n return code\n }\n}\n\n/**\n * 重写 import/export 语句的模块规范:\n * - alias(如 `@/lib/api`)→ 解析后的项目内绝对 URL(带扩展名)\n * - 相对路径(`./x`、`../x`)→ 同样解析后回写为绝对 URL\n * - 项目内绝对路径(`/src/x`)→ 补扩展名\n * - 其余 bare specifier → `/@modules/<spec>`\n *\n * 浏览器加载无扩展名 URL(如 `/src/i18n`)时,里面的相对路径 `./locales/en`\n * 会按字面拼接得到 `/src/locales/en`,不会自动补 `.ts` 也不知道导入文件原先在\n * `/src/i18n/`。直接按 alias / fs 解析、回写绝对 URL,浏览器就能命中正确文件。\n */\nfunction rewriteImports(code: string, config: ResolvedConfig, filePath: string): string {\n const root = config.root\n const fileDir = path.dirname(filePath)\n // 按 key 长度降序:避免短 alias(如 `@`)抢在更具体的(如 `@/utils`)之前命中\n const aliasEntries = Object.entries(config.resolve.alias).sort(\n ([a], [b]) => b.length - a.length,\n )\n\n const toRootUrl = (abs: string): string =>\n '/' + path.relative(root, abs).replace(/\\\\/g, '/')\n\n const transformSpec = (spec: string): string => {\n // 解析时剥离 ?query / #hash(如 svg?url、json?import),回写时再附加到结果 URL\n const suffixMatch = spec.match(/[?#].*$/)\n const suffix = suffixMatch ? suffixMatch[0] : ''\n const baseSpec = suffix ? spec.slice(0, -suffix.length) : spec\n\n // 1) alias —— 必须排在 bare 分支前,否则 `@/x` 会被当成 npm 包发到 /@modules/\n for (const [key, value] of aliasEntries) {\n if (baseSpec === key || baseSpec.startsWith(key + '/')) {\n const aliasBase = resolveAliasTarget(value, root)\n const sub = baseSpec.slice(key.length).replace(/^\\//, '')\n const target = sub ? path.join(aliasBase, sub) : aliasBase\n const resolved = tryResolveDiskPath(target)\n // 解析失败时保留原 spec:让浏览器照旧请求,由后续中间件返回 404,\n // 而不是把 `@/x` 错误地转成 `/@modules/@/x`。\n return resolved && isUnderRoot(resolved, root) ? toRootUrl(resolved) + suffix : spec\n }\n }\n\n // 2) 相对路径\n if (baseSpec.startsWith('./') || baseSpec.startsWith('../')) {\n const target = path.resolve(fileDir, baseSpec)\n const resolved = tryResolveDiskPath(target)\n return resolved && isUnderRoot(resolved, root) ? toRootUrl(resolved) + suffix : spec\n }\n\n // 3) 项目内绝对路径\n if (baseSpec.startsWith('/') && !baseSpec.startsWith('/@')) {\n const target = path.join(root, baseSpec.replace(/^\\//, ''))\n const resolved = tryResolveDiskPath(target)\n return resolved && isUnderRoot(resolved, root) ? toRootUrl(resolved) + suffix : spec\n }\n\n // 4) 已经被前面步骤改写过的内部 URL(/@modules/、/@react-refresh 等)原样保留\n if (baseSpec.startsWith('/')) return spec\n\n // 5) bare specifier\n return `/@modules/${spec}`\n }\n\n return code\n // import ... from '...' / export ... from '...'\n .replace(\n /\\bfrom\\s+(['\"])([^'\"]+)\\1/g,\n (_m, q: string, s: string) => `from ${q}${transformSpec(s)}${q}`,\n )\n // 副作用 import: import '...'\n .replace(\n /\\bimport\\s+(['\"])([^'\"]+)\\1/g,\n (_m, q: string, s: string) => `import ${q}${transformSpec(s)}${q}`,\n )\n // 动态 import('...')\n .replace(\n /\\bimport\\s*\\(\\s*(['\"])([^'\"]+)\\1\\s*\\)/g,\n (_m, q: string, s: string) => `import(${q}${transformSpec(s)}${q})`,\n )\n}\n\n/**\n * 把 alias 值统一成磁盘绝对路径。\n * - `/Users/.../src` 这类绝对路径直接用\n * - `/src` 这类用户写的「项目根相对」路径按 `<root>/src` 处理\n * - 其余字符串相对 root 解析\n */\nfunction resolveAliasTarget(value: string, root: string): string {\n if (path.isAbsolute(value) && fs.existsSync(value)) return value\n if (value.startsWith('/')) return path.join(root, value.slice(1))\n return path.resolve(root, value)\n}\n\n/** 把磁盘上的目标路径补全为存在的文件(扩展名 / index 兜底)。 */\nfunction tryResolveDiskPath(target: string): string | null {\n if (fs.existsSync(target) && fs.statSync(target).isFile()) return target\n for (const ext of RESOLVE_EXTENSIONS) {\n const withExt = target + ext\n if (fs.existsSync(withExt) && fs.statSync(withExt).isFile()) return withExt\n }\n if (fs.existsSync(target) && fs.statSync(target).isDirectory()) {\n for (const ext of RESOLVE_EXTENSIONS) {\n const idx = path.join(target, 'index' + ext)\n if (fs.existsSync(idx) && fs.statSync(idx).isFile()) return idx\n }\n }\n return null\n}\n\n/** alias 目标可能在 root 之外(symlink、monorepo),那种情况无法生成项目内 URL。 */\nfunction isUnderRoot(abs: string, root: string): boolean {\n const rel = path.relative(root, abs)\n return !!rel && !rel.startsWith('..') && !path.isAbsolute(rel)\n}\n\nconst RESOLVE_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js', '.mjs', '.json', '.vue']\nconst ESM_CONDITIONS = ['import', 'browser', 'module', 'default']\n\n/** 从 /@modules/pkgName/... URL 中提取包名(支持 scoped 包) */\nfunction modulesUrlToPkgName(url: string): string {\n const modulePath = url.slice('/@modules/'.length).split('?')[0]\n if (modulePath.startsWith('@')) {\n return modulePath.split('/').slice(0, 2).join('/')\n }\n return modulePath.split('/')[0]\n}\n\n/** 从 root 开始向上查找包目录 */\nfunction findPkgDir(root: string, pkgName: string): string | null {\n let dir = root\n for (;;) {\n const candidate = path.join(dir, 'node_modules', pkgName)\n if (fs.existsSync(candidate)) return candidate\n const parent = path.dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n return null\n}\n\n/**\n * 将 node_modules 文件中的相对导入改写为 /@modules/pkgName/subpath 形式。\n * 浏览器加载 /@modules/pkgName 时,相对路径 ./foo.js 会被解析为 /@modules/foo.js\n * 而非正确的 /@modules/pkgName/dist/foo.js,因此必须在服务端将其改写为绝对路径。\n */\nfunction rewriteNodeModuleRelativeImports(\n code: string,\n pkgName: string,\n filePath: string,\n pkgDir: string,\n): string {\n const fileDir = path.dirname(filePath)\n const rewrite = (spec: string): string => {\n const abs = path.resolve(fileDir, spec)\n const rel = path.relative(pkgDir, abs).replace(/\\\\/g, '/')\n return `/@modules/${pkgName}/${rel}`\n }\n return code\n .replace(/\\bfrom\\s+(['\"])(\\.\\.?\\/[^'\"]*)\\1/g, (_, q, spec) => `from ${q}${rewrite(spec)}${q}`)\n .replace(/\\bimport\\s+(['\"])(\\.\\.?\\/[^'\"]*)\\1/g, (_, q, spec) => `import ${q}${rewrite(spec)}${q}`)\n .replace(/\\bimport\\s*\\(\\s*(['\"])(\\.\\.?\\/[^'\"]*)\\1\\s*\\)/g, (_, q, spec) => `import(${q}${rewrite(spec)}${q})`)\n}\n\n/**\n * ESM-aware node_modules 解析:支持 package.json exports 字段的 import/browser/module/default 条件,\n * 兼容 ESM-only 包(如只有 \"import\" 条件而无 \"require\" 的包)。\n * createRequire 使用 CJS 解析逻辑,遇到 ESM-only exports 会抛异常,因此不能用于此场景。\n */\nfunction resolveNodeModule(root: string, moduleName: string): string | null {\n // 解析包名和子路径(处理 scoped 包如 @scope/pkg/sub)\n let pkgName: string\n let subpath: string\n if (moduleName.startsWith('@')) {\n const parts = moduleName.split('/')\n pkgName = parts.slice(0, 2).join('/')\n subpath = parts.slice(2).join('/')\n } else {\n const slash = moduleName.indexOf('/')\n pkgName = slash === -1 ? moduleName : moduleName.slice(0, slash)\n subpath = slash === -1 ? '' : moduleName.slice(slash + 1)\n }\n\n // 向上查找 node_modules\n let pkgDir: string | null = null\n let dir = root\n for (;;) {\n const candidate = path.join(dir, 'node_modules', pkgName)\n if (fs.existsSync(candidate)) { pkgDir = candidate; break }\n const parent = path.dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n if (!pkgDir) return null\n\n const pkgJsonPath = path.join(pkgDir, 'package.json')\n if (!fs.existsSync(pkgJsonPath)) return null\n let pkg: Record<string, any>\n try { pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8')) } catch { return null }\n\n // 优先使用 exports 字段(ESM-aware 条件解析)\n if (pkg.exports) {\n const exportKey = subpath ? `./${subpath}` : '.'\n const resolved = resolvePackageExports(pkg.exports, exportKey, pkgDir)\n if (resolved) return resolved\n }\n\n // 子路径直接文件\n if (subpath) {\n // 收集候选目录:包根目录 + module/main 字段所在的目录\n // 如 dom-helpers 的 module: 'esm/index.js',子路径 addClass 应查找 esm/addClass.js\n const subDirs = ['']\n for (const field of ['module', 'main']) {\n if (typeof pkg[field] === 'string') {\n const dir = path.dirname(pkg[field])\n if (dir && dir !== '.' && !subDirs.includes(dir)) subDirs.push(dir)\n }\n }\n for (const dir of subDirs) {\n const direct = path.join(pkgDir, dir, subpath)\n if (fs.existsSync(direct) && fs.statSync(direct).isFile()) return direct\n for (const ext of RESOLVE_EXTENSIONS) {\n if (fs.existsSync(direct + ext)) return direct + ext\n }\n }\n return null\n }\n\n // 主入口回退:module > main\n for (const field of ['module', 'jsnext:main', 'jsnext', 'main']) {\n if (typeof pkg[field] === 'string') {\n const entry = path.join(pkgDir, pkg[field])\n if (fs.existsSync(entry)) return entry\n }\n }\n\n // 最终回退:index.js\n const indexFallback = path.join(pkgDir, 'index.js')\n if (fs.existsSync(indexFallback)) return indexFallback\n\n return null\n}\n\nfunction resolvePackageExports(exports: any, key: string, pkgDir: string): string | null {\n if (typeof exports === 'string') {\n return key === '.' ? path.join(pkgDir, exports) : null\n }\n const entry = exports[key]\n if (entry === undefined) return null\n return resolveExportValue(entry, pkgDir)\n}\n\nfunction resolveExportValue(value: any, pkgDir: string): string | null {\n if (typeof value === 'string') return path.join(pkgDir, value)\n if (Array.isArray(value)) {\n for (const item of value) {\n const r = resolveExportValue(item, pkgDir)\n if (r) return r\n }\n return null\n }\n if (value && typeof value === 'object') {\n for (const cond of ESM_CONDITIONS) {\n if (cond in value) {\n const r = resolveExportValue(value[cond], pkgDir)\n if (r) return r\n }\n }\n }\n return null\n}\n\nfunction resolveUrlToFile(url: string, root: string): string | null {\n // 去除查询参数\n const cleanUrl = url.split('?')[0]\n\n // /@modules/ 前缀 → node_modules 预构建\n if (cleanUrl.startsWith('/@modules/')) {\n const moduleName = cleanUrl.slice('/@modules/'.length)\n return resolveNodeModule(root, moduleName)\n }\n\n // 普通路径\n const filePath = path.resolve(root, cleanUrl.replace(/^\\//, ''))\n\n // 精确路径存在\n if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {\n return filePath\n }\n\n // 扩展名补全(处理无扩展名导入,如 ./App → ./App.tsx)\n for (const ext of RESOLVE_EXTENSIONS) {\n const withExt = filePath + ext\n if (fs.existsSync(withExt)) return withExt\n }\n\n // 目录 index 文件(如 ./utils → ./utils/index.ts)\n for (const ext of RESOLVE_EXTENSIONS) {\n const indexFile = path.join(filePath, 'index' + ext)\n if (fs.existsSync(indexFile)) return indexFile\n }\n\n return null\n}\n\nfunction isModuleRequest(url: string): boolean {\n const cleanUrl = url.split('?')[0]\n if (/\\.(ts|tsx|jsx|js|mjs|vue|css|json)$/.test(cleanUrl)) return true\n if (cleanUrl.startsWith('/@modules/')) return true\n // 无扩展名路径可能是省略扩展名的模块导入(如 /src/App)\n if (!path.extname(cleanUrl)) return true\n return false\n}\n\nfunction getHmrClientCode(): string {\n return `\n// Nasti HMR Client\nconst socket = new WebSocket(\\`ws://\\${location.host}\\`, 'nasti-hmr');\nconst hotModulesMap = new Map();\nconst disposeMap = new Map();\nconst pruneMap = new Map();\n\nsocket.addEventListener('message', ({ data }) => {\n const payload = JSON.parse(data);\n switch (payload.type) {\n case 'connected':\n console.log('[nasti] connected.');\n clearErrorOverlay();\n break;\n case 'update':\n payload.updates.forEach((update) => {\n if (update.type === 'js-update') {\n fetchUpdate(update);\n } else if (update.type === 'css-update') {\n updateCss(update.path);\n }\n });\n clearErrorOverlay();\n break;\n case 'full-reload':\n console.log('[nasti] full reload');\n location.reload();\n break;\n case 'prune':\n payload.paths.forEach((p) => {\n const cb = pruneMap.get(p);\n if (cb) cb();\n });\n break;\n case 'error':\n console.error('[nasti] error:', payload.err.message);\n showErrorOverlay(payload.err);\n break;\n }\n});\n\n// 自动重连(断线时指数退避)\nlet reconnectTimer = 0;\nsocket.addEventListener('close', () => {\n clearTimeout(reconnectTimer);\n reconnectTimer = setTimeout(() => location.reload(), 1000);\n});\n\nasync function fetchUpdate(update) {\n const mod = hotModulesMap.get(update.path);\n // 先跑 dispose(给模块机会清理副作用)\n const dispose = disposeMap.get(update.path);\n if (dispose) dispose();\n\n const newMod = await import(update.acceptedPath + '?t=' + update.timestamp);\n if (mod) {\n // 复制回调数组避免回调内部又修改 hotModulesMap 造成迭代异常\n [...mod.callbacks].forEach((cb) => cb(newMod));\n }\n}\n\nfunction updateCss(path) {\n const el = document.querySelector(\\`style[data-nasti-css=\"\\${path}\"]\\`);\n if (el) {\n fetch(path + '?t=' + Date.now())\n .then(r => r.text())\n .then(css => { el.textContent = css; });\n }\n}\n\nfunction clearErrorOverlay() {\n const el = document.getElementById('nasti-error-overlay');\n if (el) el.remove();\n}\n\nfunction showErrorOverlay(err) {\n clearErrorOverlay();\n const overlay = document.createElement('div');\n overlay.id = 'nasti-error-overlay';\n overlay.style.cssText = 'position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,0.85);color:#fff;font-family:monospace;padding:2rem;overflow:auto;';\n const title = document.createElement('h2');\n title.style.color = '#ff5555';\n title.textContent = 'Build Error';\n const pre = document.createElement('pre');\n pre.textContent = err.message + '\\\\n' + (err.stack || '');\n const btn = document.createElement('button');\n btn.style.cssText = 'margin-top:1rem;padding:0.5rem 1rem;cursor:pointer';\n btn.textContent = 'Close';\n btn.onclick = () => overlay.remove();\n overlay.appendChild(title);\n overlay.appendChild(pre);\n overlay.appendChild(btn);\n document.body.appendChild(overlay);\n}\n\n/**\n * 生成 import.meta.hot 的 hot context。\n * 关键约束:同一 ownerPath 的 accept 回调必须替换(不是 append)。\n * 每次模块重新 import 都会调用 createHotContext,旧回调会被 fetchUpdate 调用后立即被新 import\n * 里的 accept 替换。不替换的话每编辑一次就多一个回调,越跑越慢。\n */\nexport function createHotContext(ownerPath) {\n return {\n accept(deps, callback) {\n // 自接受: hot.accept() 或 hot.accept(callback)\n if (typeof deps === 'function' || deps === undefined) {\n hotModulesMap.set(ownerPath, { callbacks: [deps || (() => {})] });\n return;\n }\n // 依赖接受: hot.accept(deps, callback),多次调用追加\n const existing = hotModulesMap.get(ownerPath)?.callbacks ?? [];\n hotModulesMap.set(ownerPath, { callbacks: [...existing, callback] });\n },\n prune(callback) {\n pruneMap.set(ownerPath, callback);\n },\n dispose(callback) {\n disposeMap.set(ownerPath, callback);\n },\n invalidate() {\n location.reload();\n },\n data: {},\n };\n}\n`\n}\n","// HMR 逻辑 - 文件变更 → 模块失效 → 通知客户端\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport type { DevServer, ModuleNode, HmrPayload, HmrUpdate, HmrContext } from '../types.js'\nimport { ModuleGraph } from '../core/module-graph.js'\n\nexport async function handleFileChange(\n file: string,\n server: DevServer,\n): Promise<void> {\n const { moduleGraph, ws, config } = server\n const relativePath = '/' + path.relative(config.root, file)\n\n // 找到受影响的模块\n const mods = moduleGraph.getModulesByFile(file)\n if (!mods || mods.size === 0) {\n // 未跟踪的文件变更,可能需要 full reload\n return\n }\n\n const updates: HmrUpdate[] = []\n const timestamp = Date.now()\n\n for (const mod of mods) {\n // 使缓存失效\n moduleGraph.invalidateModule(mod)\n\n // 执行插件的 handleHotUpdate 钩子\n const ctx: HmrContext = {\n file,\n timestamp,\n modules: [mod],\n read: () => fs.readFileSync(file, 'utf-8'),\n server,\n }\n\n let affectedModules: ModuleNode[] = [mod]\n for (const plugin of config.plugins) {\n if (plugin.handleHotUpdate) {\n const result = await plugin.handleHotUpdate(ctx)\n if (result) {\n affectedModules = result\n }\n }\n }\n\n // 检查 HMR 边界\n for (const affected of affectedModules) {\n const boundaries = (moduleGraph as ModuleGraph).getHmrBoundaries(affected)\n if (boundaries.length === 0) {\n // 无法热更新,full reload\n ws.send({ type: 'full-reload', path: relativePath })\n return\n }\n\n for (const { boundary } of boundaries) {\n updates.push({\n type: boundary.type === 'css' ? 'css-update' : 'js-update',\n path: boundary.url,\n acceptedPath: affected.url,\n timestamp,\n })\n }\n }\n }\n\n if (updates.length > 0) {\n ws.send({ type: 'update', updates })\n }\n}\n","// 模块解析插件 - 处理 bare imports、路径 alias、文件扩展名\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nexport function resolvePlugin(config: ResolvedConfig): NastiPlugin {\n const { alias, extensions } = config.resolve\n const require = createRequire(path.resolve(config.root, 'package.json'))\n\n return {\n name: 'nasti:resolve',\n enforce: 'pre',\n\n resolveId(source, importer) {\n // 1. 处理 alias\n for (const [key, value] of Object.entries(alias)) {\n if (source === key || source.startsWith(key + '/')) {\n source = source.replace(key, value)\n // 如果 alias 值是绝对路径就直接用,否则相对于 root 解析\n if (!path.isAbsolute(source)) {\n source = path.resolve(config.root, source)\n }\n break\n }\n }\n\n // 2. 绝对路径\n if (path.isAbsolute(source)) {\n const resolved = tryResolveFile(source, extensions)\n if (resolved) return resolved\n }\n\n // 3. 相对路径\n if (source.startsWith('.')) {\n const dir = importer ? path.dirname(importer) : config.root\n const absolute = path.resolve(dir, source)\n const resolved = tryResolveFile(absolute, extensions)\n if (resolved) return resolved\n }\n\n // 4. bare import (node_modules)\n if (!source.startsWith('/') && !source.startsWith('.')) {\n try {\n const resolved = require.resolve(source, {\n paths: [importer ? path.dirname(importer) : config.root],\n })\n return resolved\n } catch {\n return null\n }\n }\n\n return null\n },\n\n load(id) {\n if (!fs.existsSync(id)) return null\n // JSON 文件包装为 ES 模块\n if (id.endsWith('.json')) {\n const content = fs.readFileSync(id, 'utf-8')\n return `export default ${content}`\n }\n return fs.readFileSync(id, 'utf-8')\n },\n }\n}\n\n/** 尝试解析文件,带扩展名补全和 index 文件查找 */\nfunction tryResolveFile(file: string, extensions: string[]): string | null {\n // 精确路径\n if (fs.existsSync(file) && fs.statSync(file).isFile()) {\n return file\n }\n\n // 尝试加扩展名\n for (const ext of extensions) {\n const withExt = file + ext\n if (fs.existsSync(withExt) && fs.statSync(withExt).isFile()) {\n return withExt\n }\n }\n\n // 尝试作为目录查找 index 文件\n if (fs.existsSync(file) && fs.statSync(file).isDirectory()) {\n for (const ext of extensions) {\n const indexFile = path.join(file, 'index' + ext)\n if (fs.existsSync(indexFile)) {\n return indexFile\n }\n }\n }\n\n return null\n}\n","// CSS 处理插件 - 处理 .css 导入\nimport path from 'node:path'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nexport function cssPlugin(config: ResolvedConfig): NastiPlugin {\n return {\n name: 'nasti:css',\n\n resolveId(source) {\n if (source.endsWith('.css')) return null // 交给 resolve 插件处理\n return null\n },\n\n transform(code, id) {\n if (!id.endsWith('.css')) return null\n\n // 将 CSS 中的相对 url() 路径重写为绝对路径,确保打包后资源路径正确\n const rewritten = rewriteCssUrls(code, id, config.root)\n\n if (config.command === 'serve') {\n // Dev 模式: 将 CSS 转为 JS 模块,通过 style 标签注入\n const escaped = JSON.stringify(rewritten)\n return {\n code: `\nconst css = ${escaped};\nconst __nasti_css_id__ = ${JSON.stringify(id)};\nconst __nasti_existing__ = document.querySelector('style[data-nasti-css=' + JSON.stringify(__nasti_css_id__) + ']');\nif (__nasti_existing__) __nasti_existing__.remove();\nconst style = document.createElement('style');\nstyle.setAttribute('data-nasti-css', __nasti_css_id__);\nstyle.textContent = css;\ndocument.head.appendChild(style);\n\n// HMR\nif (import.meta.hot) {\n import.meta.hot.accept();\n import.meta.hot.prune(() => {\n style.remove();\n });\n}\n\nexport default css;\n`,\n }\n }\n\n // Build 模式: 返回重写后的 CSS,由 rolldown 处理提取\n return rewritten !== code ? { code: rewritten } : null\n },\n }\n}\n\n/** CSS URL 重写(将相对路径转为绝对路径) */\nexport function rewriteCssUrls(css: string, from: string, root: string): string {\n return css.replace(/url\\(\\s*['\"]?([^'\")\\s]+)['\"]?\\s*\\)/g, (match, url: string) => {\n // 跳过绝对路径、data URI、http(s) URL\n if (url.startsWith('/') || url.startsWith('data:') || url.startsWith('http')) {\n return match\n }\n const resolved = path.resolve(path.dirname(from), url)\n const relative = '/' + path.relative(root, resolved)\n return `url(${relative})`\n })\n}\n","// 静态资源处理插件 - 图片、字体等\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport crypto from 'node:crypto'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nconst ASSET_EXTENSIONS = new Set([\n '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.webp', '.avif',\n '.mp4', '.webm', '.ogg', '.mp3', '.wav', '.flac', '.aac',\n '.woff', '.woff2', '.eot', '.ttf', '.otf',\n '.pdf', '.txt',\n])\n\nexport function assetsPlugin(config: ResolvedConfig): NastiPlugin {\n return {\n name: 'nasti:assets',\n\n resolveId(source) {\n // 处理 ?url 和 ?raw 后缀\n if (source.endsWith('?url') || source.endsWith('?raw')) {\n return source\n }\n return null\n },\n\n load(id) {\n const ext = path.extname(id.replace(/\\?.*$/, ''))\n\n // ?raw 查询: 返回文件原始内容\n if (id.endsWith('?raw')) {\n const file = id.slice(0, -4)\n if (fs.existsSync(file)) {\n const content = fs.readFileSync(file, 'utf-8')\n return `export default ${JSON.stringify(content)}`\n }\n }\n\n // ?url 查询或静态资源扩展名: 返回 URL\n if (id.endsWith('?url') || ASSET_EXTENSIONS.has(ext)) {\n const file = id.replace(/\\?.*$/, '')\n if (!fs.existsSync(file)) return null\n\n if (config.command === 'serve') {\n // Dev 模式: 返回相对于 root 的路径\n const url = '/' + path.relative(config.root, file)\n return `export default ${JSON.stringify(url)}`\n }\n\n // Build 模式: 计算内容哈希用于文件名\n const content = fs.readFileSync(file)\n const hash = crypto.createHash('sha256').update(content).digest('hex').slice(0, 8)\n const basename = path.basename(file, ext)\n const hashedName = `${config.build.assetsDir}/${basename}.${hash}${ext}`\n return `export default ${JSON.stringify(config.base + hashedName)}`\n }\n\n return null\n },\n }\n}\n\nexport function isAssetFile(id: string): boolean {\n const ext = path.extname(id.replace(/\\?.*$/, ''))\n return ASSET_EXTENSIONS.has(ext)\n}\n","// Dev Server 主逻辑\nimport http from 'node:http'\nimport path from 'node:path'\nimport os from 'node:os'\nimport connect from 'connect'\nimport sirv from 'sirv'\nimport { watch } from 'chokidar'\nimport pc from 'picocolors'\nimport type { NastiConfig, ResolvedConfig, DevServer } from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { PluginContainer } from '../core/plugin-container.js'\nimport { ModuleGraph } from '../core/module-graph.js'\nimport { createWebSocketServer } from './ws.js'\nimport { transformMiddleware } from './middleware.js'\nimport { handleFileChange } from './hmr.js'\nimport { resolvePlugin } from '../plugins/resolve.js'\nimport { cssPlugin } from '../plugins/css.js'\nimport { assetsPlugin } from '../plugins/assets.js'\nimport { htmlPlugin } from '../plugins/html.js'\n\nexport async function createServer(inlineConfig: NastiConfig = {}): Promise<DevServer> {\n const config = await resolveConfig(inlineConfig, 'serve')\n\n // 组装内置插件 + 用户插件\n const allPlugins = [\n resolvePlugin(config),\n cssPlugin(config),\n assetsPlugin(config),\n htmlPlugin(config),\n ...config.plugins,\n ]\n const configWithPlugins: ResolvedConfig = { ...config, plugins: allPlugins }\n\n const moduleGraph = new ModuleGraph()\n const pluginContainer = new PluginContainer(configWithPlugins)\n\n // HTTP 服务\n const app = connect()\n\n // 转译中间件(处理 .ts, .tsx, .jsx, .css, .vue 等)\n app.use(transformMiddleware({\n config: configWithPlugins,\n pluginContainer,\n moduleGraph,\n }))\n\n // 静态文件服务(public 目录 + 项目根目录)\n const publicDir = path.resolve(config.root, 'public')\n app.use(sirv(publicDir, { dev: true, etag: true }))\n app.use(sirv(config.root, { dev: true, etag: true }))\n\n const httpServer = http.createServer(app)\n const ws = createWebSocketServer(httpServer)\n\n // 文件监听\n // chokidar v4 不再把 `ignored` 字符串当作 glob 处理,而是按字面值精确匹配\n // (见 chokidar/esm/index.js 的 createPattern),原先的 `**/node_modules/**`\n // 等模式根本不会命中任何路径,导致 watcher 递归进入 node_modules 并对每个\n // 子目录调用 fs.watch,在 macOS 上很快耗尽 fd 触发 EMFILE。改用函数 matcher\n // 显式判定相对段。\n const ignoredSegments = new Set(['node_modules', '.git', '.nasti'])\n const outDirAbs = path.resolve(config.root, config.build.outDir)\n const watcher = watch(config.root, {\n ignored: (filePath: string) => {\n if (filePath === config.root) return false\n if (filePath === outDirAbs || filePath.startsWith(outDirAbs + path.sep)) return true\n const rel = path.relative(config.root, filePath)\n if (!rel || rel.startsWith('..') || path.isAbsolute(rel)) return false\n for (const seg of rel.split(path.sep)) {\n if (ignoredSegments.has(seg)) return true\n }\n return false\n },\n ignoreInitial: true,\n })\n\n // 先声明 server 变量,再赋值\n let server: DevServer\n\n watcher.on('change', (file: string) => {\n handleFileChange(file, server)\n })\n\n watcher.on('add', (file: string) => {\n handleFileChange(file, server)\n })\n\n server = {\n config: configWithPlugins,\n middlewares: app,\n moduleGraph: moduleGraph as any,\n watcher,\n ws,\n\n async listen(port?: number) {\n const finalPort = port ?? config.server.port\n const host = config.server.host === true ? '0.0.0.0' : (config.server.host as string)\n\n await pluginContainer.buildStart()\n\n return new Promise((resolve, reject) => {\n let currentPort = finalPort\n\n const onListening = () => {\n const actualPort = (httpServer.address() as any)?.port ?? currentPort\n config.server.port = actualPort\n const localUrl = `http://localhost:${actualPort}`\n const networkUrl = host === '0.0.0.0' ? `http://${getNetworkAddress()}:${actualPort}` : null\n\n console.log()\n console.log(pc.cyan(' nasti dev server') + pc.dim(` v${__NASTI_VERSION__}`))\n console.log()\n console.log(` ${pc.green('>')} Local: ${pc.cyan(localUrl)}`)\n if (networkUrl) {\n console.log(` ${pc.green('>')} Network: ${pc.cyan(networkUrl)}`)\n }\n console.log()\n\n resolve(server)\n }\n\n httpServer.on('listening', onListening)\n httpServer.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n currentPort++\n console.log(pc.yellow(`Port ${currentPort - 1} is in use, trying ${currentPort}...`))\n httpServer.listen(currentPort, host)\n } else {\n reject(err)\n }\n })\n\n httpServer.listen(currentPort, host)\n })\n },\n\n async transformRequest(url: string) {\n const { transformRequest } = await import('./middleware.js')\n return transformRequest(url, { config: configWithPlugins, pluginContainer, moduleGraph })\n },\n\n async close() {\n await pluginContainer.buildEnd()\n watcher.close()\n ws.close()\n httpServer.close()\n },\n }\n\n // 执行插件的 configureServer 钩子(此时 server 已完全初始化,\n // 插件可安全访问 server.middlewares / server.watcher 等)\n const postMiddlewares: Array<() => void> = []\n for (const plugin of allPlugins) {\n if (plugin.configureServer) {\n const result = await plugin.configureServer(server)\n if (typeof result === 'function') {\n postMiddlewares.push(result)\n }\n }\n }\n // 插件返回的函数会在内置中间件之后执行\n for (const run of postMiddlewares) run()\n\n return server\n}\n\nfunction getNetworkAddress(): string {\n const interfaces = os.networkInterfaces()\n for (const name of Object.keys(interfaces)) {\n for (const iface of interfaces[name] ?? []) {\n if (iface.family === 'IPv4' && !iface.internal) {\n return iface.address\n }\n }\n }\n return 'localhost'\n}\n","// Electron 内置插件\n//\n// 负责:将 Electron 模块(electron、electron/*)与 Node 内建模块(fs、path、...)\n// 标记为 external,避免被打包进主进程/Preload 产物。\n//\n// 仅在 config.target === 'electron' 时启用\nimport { builtinModules } from 'node:module'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nconst NODE_BUILTINS = new Set([\n ...builtinModules,\n ...builtinModules.map((m) => `node:${m}`),\n])\n\nconst ELECTRON_MODULES = new Set([\n 'electron',\n 'electron/main',\n 'electron/common',\n 'electron/renderer',\n])\n\n/**\n * Create a Vite/Rollup plugin that externalizes Electron and Node built-in imports according to the resolved config.\n *\n * @param config - Resolved build config; any entries in `config.electron.external` are added to the externalized modules set.\n * @returns A plugin that marks `electron` and `electron/*` imports and Node built-in modules (including `node:`-prefixed names) as external.\n */\nexport function electronPlugin(config: ResolvedConfig): NastiPlugin {\n const external = new Set([\n ...ELECTRON_MODULES,\n ...NODE_BUILTINS,\n ...(config.electron.external ?? []),\n ])\n\n return {\n name: 'nasti:electron',\n enforce: 'pre',\n\n resolveId(source) {\n // 显式外部化 electron 与 Node 内建模块\n if (external.has(source)) {\n return { id: source, external: true }\n }\n // 形如 `electron/xxx` 的子路径一律标记外部\n if (source.startsWith('electron/')) {\n return { id: source, external: true }\n }\n return null\n },\n }\n}\n","// 生产构建 - 调用 Rolldown API 打包\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { rolldown } from 'rolldown'\nimport type { NastiConfig, ResolvedConfig } from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { resolvePlugin } from '../plugins/resolve.js'\nimport { cssPlugin } from '../plugins/css.js'\nimport { assetsPlugin } from '../plugins/assets.js'\nimport { htmlPlugin, readHtmlFile, processHtml } from '../plugins/html.js'\nimport { transformCode, shouldTransform } from '../core/transformer.js'\nimport { loadEnv, buildEnvDefine } from '../core/env.js'\nimport { PluginContainer } from '../core/plugin-container.js'\nimport pc from 'picocolors'\n\nexport interface BuildResult {\n output: Array<{ fileName: string; type: string; code?: string; source?: Uint8Array | string }>\n}\n\nexport async function build(inlineConfig: NastiConfig = {}): Promise<BuildResult> {\n const config = await resolveConfig(inlineConfig, 'build')\n const startTime = performance.now()\n\n console.log(pc.cyan('\\n🔨 nasti build') + pc.dim(` v${__NASTI_VERSION__}`))\n console.log(pc.dim(` root: ${config.root}`))\n console.log(pc.dim(` mode: ${config.mode}`))\n\n const outDir = path.resolve(config.root, config.build.outDir)\n\n // 清空输出目录\n if (config.build.emptyOutDir && fs.existsSync(outDir)) {\n fs.rmSync(outDir, { recursive: true, force: true })\n }\n fs.mkdirSync(outDir, { recursive: true })\n\n // 查找 HTML 入口中的 script 标签作为 entry\n const html = await readHtmlFile(config.root)\n let entryPoints: string[] = []\n\n if (html) {\n const scriptMatches = html.matchAll(/<script[^>]+src=[\"']([^\"']+)[\"'][^>]*>/gi)\n for (const match of scriptMatches) {\n const src = match[1]\n if (src && !src.startsWith('http')) {\n entryPoints.push(path.resolve(config.root, src.replace(/^\\//, '')))\n }\n }\n }\n\n if (entryPoints.length === 0) {\n // 回退: 尝试常见入口\n const fallbackEntries = ['src/main.ts', 'src/main.tsx', 'src/main.js', 'src/index.ts', 'src/index.tsx', 'src/index.js']\n for (const entry of fallbackEntries) {\n const fullPath = path.resolve(config.root, entry)\n if (fs.existsSync(fullPath)) {\n entryPoints.push(fullPath)\n break\n }\n }\n }\n\n if (entryPoints.length === 0) {\n throw new Error('No entry point found. Add a <script> tag to index.html or create src/main.ts')\n }\n\n // 构建内置插件 + 用户插件作为 Rolldown 插件\n const builtinPlugins = [\n resolvePlugin(config),\n cssPlugin(config),\n assetsPlugin(config),\n ]\n const allPlugins = [...builtinPlugins, ...config.plugins]\n\n // 运行插件的 buildStart 钩子,并收集 emitFile 输出文件\n const pluginContainer = new PluginContainer(config)\n await pluginContainer.buildStart()\n\n // oxc-transform 插件(作为 Rolldown 插件)\n const oxcTransformPlugin = {\n name: 'nasti:oxc-transform',\n transform(code: string, id: string) {\n if (!shouldTransform(id)) return null\n const result = transformCode(id, code, {\n sourcemap: !!config.build.sourcemap,\n jsxRuntime: 'automatic',\n jsxImportSource: config.framework === 'vue' ? 'vue' : 'react',\n })\n return { code: result.code, map: result.map ? JSON.parse(result.map) : undefined }\n },\n }\n\n // 加载环境变量并生成 define 替换表\n const env = loadEnv(config.mode, config.root, config.envPrefix)\n const envDefine = buildEnvDefine(env, config.mode)\n\n // 调用 Rolldown\n const bundle = await rolldown({\n input: entryPoints,\n define: envDefine,\n plugins: [\n oxcTransformPlugin,\n // 转换 Nasti 插件为 Rolldown 插件格式\n ...allPlugins.map((p) => ({\n name: p.name,\n resolveId: p.resolveId as any,\n load: p.load as any,\n transform: p.transform as any,\n buildStart: p.buildStart as any,\n buildEnd: p.buildEnd as any,\n })),\n ],\n ...(config.build.rolldownOptions as any),\n })\n\n const { output } = await bundle.write({\n dir: outDir,\n format: 'esm',\n sourcemap: !!config.build.sourcemap,\n minify: !!config.build.minify,\n entryFileNames: 'assets/[name].[hash].js',\n chunkFileNames: 'assets/[name].[hash].js',\n assetFileNames: 'assets/[name].[hash][extname]',\n })\n\n await bundle.close()\n await pluginContainer.buildEnd()\n\n // 将 emitFile 产出的文件写入输出目录\n for (const ef of pluginContainer.getEmittedFiles()) {\n const dest = path.resolve(outDir, ef.fileName)\n fs.mkdirSync(path.dirname(dest), { recursive: true })\n fs.writeFileSync(dest, ef.source)\n }\n\n // 处理 HTML\n if (html) {\n let processedHtml = html\n\n // 执行插件的 transformIndexHtml 钩子\n const htmlPlugin_ = htmlPlugin(config)\n if (htmlPlugin_.transformIndexHtml) {\n const result = await htmlPlugin_.transformIndexHtml(processedHtml)\n if (typeof result === 'string') {\n processedHtml = result\n } else if (result && 'html' in result) {\n processedHtml = processHtml(result.html, result.tags)\n } else if (Array.isArray(result)) {\n processedHtml = processHtml(processedHtml, result)\n }\n }\n\n // 替换 script src 为打包后的路径(支持多入口)\n for (const chunk of output) {\n if (chunk.type === 'chunk' && chunk.isEntry && chunk.facadeModuleId) {\n const originalEntry = path.relative(config.root, chunk.facadeModuleId)\n processedHtml = processedHtml.replace(\n new RegExp(`(src=[\"'])/?(${escapeRegExp(originalEntry)})([\"'])`, 'g'),\n `$1${config.base}${chunk.fileName}$3`,\n )\n }\n }\n\n fs.writeFileSync(path.resolve(outDir, 'index.html'), processedHtml)\n }\n\n const elapsed = ((performance.now() - startTime) / 1000).toFixed(2)\n const totalSize = output.reduce((sum, chunk) => {\n if (chunk.type === 'chunk' && chunk.code) return sum + chunk.code.length\n return sum\n }, 0)\n\n console.log(pc.green(`\\n✓ Built in ${elapsed}s`))\n console.log(pc.dim(` ${output.length} files, ${formatSize(totalSize)} total`))\n console.log(pc.dim(` output: ${config.build.outDir}/\\n`))\n\n return { output: output as any }\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} kB`\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n","// Electron 构建入口\n//\n// 流水线:\n// 1. 渲染进程(Web)构建 —— 复用现有 build() 流水线,输出到 outDir/renderer\n// 2. 主进程构建 —— 独立 Rolldown,target=node22,external=electron+内建模块\n// 3. Preload 构建 —— 独立 Rolldown,默认 cjs,contextIsolation 友好\n//\n// 产物目录结构(默认):\n// dist/\n// ├── renderer/ Web 渲染层,与 nasti build 一致\n// ├── main.{cjs,mjs}\n// └── preload.{cjs,mjs}\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { rolldown } from 'rolldown'\nimport pc from 'picocolors'\nimport type { NastiConfig, ResolvedConfig } from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { resolvePlugin } from '../plugins/resolve.js'\nimport { electronPlugin } from '../plugins/electron.js'\nimport { transformCode, shouldTransform } from '../core/transformer.js'\nimport { loadEnv, buildEnvDefine } from '../core/env.js'\n\nexport interface ElectronBuildResult {\n rendererOutDir: string\n mainFile: string\n preloadFiles: string[]\n}\n\n/**\n * Performs a full Electron build pipeline producing renderer, main, and preload artifacts.\n *\n * Resolves an Electron-targeted config, validates the installed Electron version, prepares the output directory, builds the renderer (via the web build), bundles the main process, bundles configured preload scripts, and logs a summary.\n *\n * @param inlineConfig - Optional config overrides merged into the resolved build configuration\n * @returns An object with `rendererOutDir` (renderer output directory), `mainFile` (bundled main process file path), and `preloadFiles` (array of bundled preload file paths)\n * @throws Error if the configured Electron main entry file does not exist\n */\nexport async function buildElectron(inlineConfig: NastiConfig = {}): Promise<ElectronBuildResult> {\n const config = await resolveConfig({ ...inlineConfig, target: 'electron' }, 'build')\n const startTime = performance.now()\n\n assertElectronVersion(config)\n\n console.log(pc.cyan('\\n⚡ nasti build (electron)') + pc.dim(` v${__NASTI_VERSION__}`))\n console.log(pc.dim(` root: ${config.root}`))\n console.log(pc.dim(` mode: ${config.mode}`))\n console.log(pc.dim(` target: electron (≥ ${config.electron.minVersion})`))\n\n const outDir = path.resolve(config.root, config.build.outDir)\n if (config.build.emptyOutDir && fs.existsSync(outDir)) {\n fs.rmSync(outDir, { recursive: true, force: true })\n }\n fs.mkdirSync(outDir, { recursive: true })\n\n // ---- 1. 渲染进程(复用 Web 构建)----\n const rendererOutDir = path.join(outDir, 'renderer')\n const { build } = await import('./index.js')\n await build({\n ...inlineConfig,\n target: 'web',\n build: {\n ...inlineConfig.build,\n outDir: rendererOutDir,\n emptyOutDir: false,\n },\n })\n\n // ---- 2. 主进程 ----\n const mainEntry = path.resolve(config.root, config.electron.main)\n if (!fs.existsSync(mainEntry)) {\n throw new Error(\n `Electron main entry not found: ${config.electron.main}\\n` +\n `在 nasti.config.ts 的 electron.main 指定主进程入口文件。`,\n )\n }\n const mainFile = await bundleNode(config, mainEntry, {\n outFile: outFileName(outDir, 'main', config.electron.mainFormat),\n format: config.electron.mainFormat,\n label: 'main',\n })\n\n // ---- 3. Preload ----\n const preloadEntries = normalizePreload(config.electron.preload, config.root)\n const preloadFiles: string[] = []\n for (const entry of preloadEntries) {\n if (!fs.existsSync(entry)) {\n console.warn(pc.yellow(` ⚠ preload entry not found, skipped: ${entry}`))\n continue\n }\n const base = path.basename(entry).replace(/\\.[^.]+$/, '')\n const out = outFileName(outDir, base, config.electron.preloadFormat)\n await bundleNode(config, entry, {\n outFile: out,\n format: config.electron.preloadFormat,\n label: `preload (${base})`,\n })\n preloadFiles.push(out)\n }\n\n const elapsed = ((performance.now() - startTime) / 1000).toFixed(2)\n console.log(pc.green(`\\n✓ Electron build complete in ${elapsed}s`))\n console.log(pc.dim(` renderer: ${path.relative(config.root, rendererOutDir)}/`))\n console.log(pc.dim(` main: ${path.relative(config.root, mainFile)}`))\n for (const pf of preloadFiles) {\n console.log(pc.dim(` preload: ${path.relative(config.root, pf)}`))\n }\n console.log()\n\n return { rendererOutDir, mainFile, preloadFiles }\n}\n\ninterface BundleNodeOptions {\n outFile: string\n format: 'cjs' | 'esm'\n label: string\n}\n\n/**\n * Bundles a Node-targeted entry for Electron into a single output file using Rolldown and the OXC transform.\n *\n * @param config - Fully resolved build configuration used to drive transforms, defines, plugins, and output options\n * @param entry - Absolute path to the entry file to bundle\n * @param opts - Bundle options; expects `outFile` (destination path), `format` (`'cjs'` or `'esm'`), and `label` (human-readable name for logging)\n * @returns The path to the written bundle file (`opts.outFile`)\n */\nasync function bundleNode(\n config: ResolvedConfig,\n entry: string,\n opts: BundleNodeOptions,\n): Promise<string> {\n const env = loadEnv(config.mode, config.root, config.envPrefix)\n const envDefine = {\n ...buildEnvDefine(env, config.mode),\n __ELECTRON__: 'true',\n __NASTI_TARGET__: JSON.stringify('electron'),\n }\n\n const oxcTransformPlugin = {\n name: 'nasti:oxc-transform',\n transform(code: string, id: string) {\n if (!shouldTransform(id)) return null\n const result = transformCode(id, code, {\n sourcemap: !!config.build.sourcemap,\n jsxRuntime: 'automatic',\n jsxImportSource: config.framework === 'vue' ? 'vue' : 'react',\n })\n return { code: result.code, map: result.map ? JSON.parse(result.map) : undefined }\n },\n }\n\n const bundle = await rolldown({\n input: entry,\n define: envDefine,\n platform: 'node',\n plugins: [oxcTransformPlugin, electronPlugin(config), resolvePlugin(config)] as any,\n ...(config.build.rolldownOptions as any),\n })\n\n fs.mkdirSync(path.dirname(opts.outFile), { recursive: true })\n\n await bundle.write({\n file: opts.outFile,\n format: opts.format === 'cjs' ? 'cjs' : 'esm',\n sourcemap: !!config.build.sourcemap,\n minify: !!config.build.minify,\n codeSplitting: false,\n })\n\n await bundle.close()\n\n console.log(pc.dim(` ✓ ${opts.label} → ${path.relative(config.root, opts.outFile)}`))\n return opts.outFile\n}\n\n/**\n * Compute an output file path for a given base name and module format.\n *\n * @param outDir - Directory where the output file will be placed\n * @param base - Base filename without extension\n * @param format - Module format; `cjs` yields a `.cjs` extension, `esm` yields a `.mjs` extension\n * @returns The resolved file path combining `outDir` and `base` with the appropriate extension\n */\nfunction outFileName(outDir: string, base: string, format: 'cjs' | 'esm'): string {\n const ext = format === 'cjs' ? '.cjs' : '.mjs'\n return path.join(outDir, base + ext)\n}\n\n/**\n * Normalize Electron preload entries into absolute file paths.\n *\n * @param preload - A single preload path or an array of preload paths; a falsy value produces an empty list\n * @param root - Root directory used to resolve relative preload entries\n * @returns An array of absolute file paths for each preload entry\n */\nexport function normalizePreload(preload: string | string[] | undefined, root: string): string[] {\n const list = Array.isArray(preload) ? preload : preload ? [preload] : []\n return list.map((p) => path.resolve(root, p))\n}\n\n/**\n * Warns when the detected Electron major version is lower than the configured minimum.\n *\n * Checks the project for an installed Electron package and, if its major version\n * is less than `config.electron.minVersion`, logs a yellow warning describing the mismatch.\n *\n * @param config - Resolved build configuration that contains `electron.minVersion` and project `root`\n */\nfunction assertElectronVersion(config: ResolvedConfig): void {\n const min = config.electron.minVersion\n const installed = detectInstalledElectron(config.root)\n if (installed && installed < min) {\n console.warn(\n pc.yellow(\n ` ⚠ 检测到 Electron ${installed},Nasti 要求 ≥ ${min}。旧版本可能缺少 ESM 主进程支持。`,\n ),\n )\n }\n}\n\n/**\n * Detects the installed Electron major version in the given project root.\n *\n * @param root - Project root directory used to locate `node_modules/electron/package.json`\n * @returns The major Electron version as a number, or `null` if Electron is not installed or the version cannot be determined\n */\nexport function detectInstalledElectron(root: string): number | null {\n try {\n const pkgPath = path.resolve(root, 'node_modules/electron/package.json')\n if (!fs.existsSync(pkgPath)) return null\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n const major = parseInt(String(pkg.version).split('.')[0], 10)\n return Number.isFinite(major) ? major : null\n } catch {\n return null\n }\n}\n","// Electron 开发模式\n//\n// 启动流程:\n// 1. 启动 Nasti dev server(渲染进程由 Chromium 加载 http://localhost:PORT/)\n// 2. 编译主进程与 preload 到 .nasti/ 临时目录(watch 模式)\n// 3. spawn Electron 可执行文件,传入主进程入口\n// 4. 监听主/preload 变化 -> 重编译 -> kill & respawn\n//\n// 渲染进程的 HMR 由标准 Nasti dev server 提供,无需额外处理\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { spawn, type ChildProcess } from 'node:child_process'\nimport chokidar from 'chokidar'\nimport pc from 'picocolors'\nimport type { NastiConfig, ResolvedConfig } from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { rolldown } from 'rolldown'\nimport { electronPlugin } from '../plugins/electron.js'\nimport { resolvePlugin } from '../plugins/resolve.js'\nimport { transformCode, shouldTransform } from '../core/transformer.js'\nimport { loadEnv, buildEnvDefine } from '../core/env.js'\nimport { detectInstalledElectron, normalizePreload } from '../build/electron.js'\n\nexport interface ElectronDevOptions extends NastiConfig {\n /** 不启动 Electron 进程,只编译主/preload(CI 场景) */\n noSpawn?: boolean\n}\n\n/**\n * Start an Electron-focused development workflow: run the renderer dev server, build the main and preload bundles into .nasti/, and optionally spawn Electron with automatic restarts.\n *\n * @param inlineConfig - Development options; when `inlineConfig.noSpawn` is `true`, only compiles main/preload into `.nasti/` and does not start the Electron process.\n */\nexport async function startElectronDev(inlineConfig: ElectronDevOptions = {}): Promise<void> {\n const { noSpawn, ...rest } = inlineConfig\n const config = await resolveConfig({ ...rest, target: 'electron' }, 'serve')\n\n warnElectronVersion(config)\n\n console.log(pc.cyan('\\n⚡ nasti electron dev') + pc.dim(` v${__NASTI_VERSION__}`))\n\n // 1. 启动 dev server(渲染进程)\n const { createServer } = await import('./index.js')\n const server = await createServer({ ...rest, target: 'electron' })\n await server.listen()\n\n const devUrl = `http://localhost:${server.config.server.port}/`\n console.log(pc.dim(` renderer: ${devUrl}`))\n\n // 2. 编译主进程 + preload 到 .nasti/\n const stageDir = path.resolve(config.root, '.nasti')\n fs.mkdirSync(stageDir, { recursive: true })\n\n const mainEntry = path.resolve(config.root, config.electron.main)\n const preloadEntries = normalizePreload(config.electron.preload, config.root)\n\n const builtMainFile = path.join(stageDir, 'main' + extFor(config.electron.mainFormat))\n const builtPreloadFiles: string[] = []\n\n const compileAll = async () => {\n await compileNode(config, mainEntry, {\n outFile: builtMainFile,\n format: config.electron.mainFormat,\n devUrl,\n })\n builtPreloadFiles.length = 0\n for (const entry of preloadEntries) {\n if (!fs.existsSync(entry)) continue\n const base = path.basename(entry).replace(/\\.[^.]+$/, '')\n const out = path.join(stageDir, base + extFor(config.electron.preloadFormat))\n await compileNode(config, entry, {\n outFile: out,\n format: config.electron.preloadFormat,\n devUrl,\n })\n builtPreloadFiles.push(out)\n }\n }\n\n await compileAll()\n\n if (noSpawn) {\n console.log(pc.dim(' (noSpawn) 已编译主/preload,跳过启动 Electron。'))\n return\n }\n\n // 3. 启动 Electron\n const electronBin = resolveElectronBinary(config)\n if (!electronBin) {\n console.warn(\n pc.yellow(\n ' ⚠ 未找到 Electron 可执行文件,请先安装:npm install -D electron\\n 已编译主/preload 至 .nasti/,可手动运行。',\n ),\n )\n return\n }\n\n let child: ChildProcess | null = null\n const spawnElectron = () => {\n const args = [builtMainFile, ...config.electron.electronArgs]\n child = spawn(electronBin, args, {\n stdio: 'inherit',\n env: { ...process.env, NASTI_DEV_SERVER_URL: devUrl, NASTI_TARGET: 'electron' },\n })\n child.on('exit', (code) => {\n if (code !== null && child && (child as any).__nastiKilled !== true) {\n console.log(pc.dim(` Electron exited (${code}).`))\n process.exit(code ?? 0)\n }\n })\n }\n spawnElectron()\n\n // 4. 监听主/preload 变化并重启\n if (config.electron.autoRestart) {\n const watchTargets = [mainEntry, ...preloadEntries].filter(fs.existsSync)\n const watcher = chokidar.watch(watchTargets, { ignoreInitial: true })\n // 旧实现:重启进行中就 return,丢弃变更。场景:改主进程后立刻改 preload\n // 会漏掉第二次。现在用 pending 标记 coalesce:等本轮完成后若 pending\n // 为真再跑一次,保证最后一次编辑必被编进去。\n let restarting: Promise<void> | null = null\n let pending = false\n const restart = async (): Promise<void> => {\n if (restarting) {\n pending = true\n return\n }\n restarting = (async () => {\n do {\n pending = false\n console.log(pc.cyan('\\n ♻ 主/preload 变更,重启 Electron...'))\n if (child && !child.killed) {\n ;(child as any).__nastiKilled = true\n const dying = child\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => resolve(), 3000)\n dying.once('exit', () => {\n clearTimeout(timer)\n resolve()\n })\n dying.kill()\n })\n }\n try {\n await compileAll()\n spawnElectron()\n } catch (e: any) {\n console.warn(pc.yellow(` ⚠ 重启编译失败,保留上一次进程: ${e.message}`))\n }\n // 若 pending 在本轮期间被再次置位,立即再跑一轮\n } while (pending)\n restarting = null\n })()\n return restarting\n }\n // chokidar 会对一次保存触发多次事件;小窗口去抖避免过早发起重启\n let debounceTimer: NodeJS.Timeout | null = null\n watcher.on('all', () => {\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(() => {\n debounceTimer = null\n void restart()\n }, 80)\n })\n }\n}\n\n/**\n * Map a module format identifier to its corresponding output file extension.\n *\n * @param format - 'cjs' for CommonJS or 'esm' for ECMAScript modules\n * @returns The file extension to use: '.cjs' for `cjs`, '.mjs' for `esm`\n */\nfunction extFor(format: 'cjs' | 'esm'): string {\n return format === 'cjs' ? '.cjs' : '.mjs'\n}\n\ninterface CompileNodeOpts {\n outFile: string\n format: 'cjs' | 'esm'\n devUrl: string\n}\n\n/**\n * Compile a Node-target entry (Electron main or preload) into a single output file for development.\n *\n * Injects environment defines (including `__ELECTRON__`, `__NASTI_TARGET__`, and `__NASTI_DEV_SERVER_URL__`), applies source transforms, and writes a bundled file using rolldown.\n *\n * @param config - Resolved Nasti configuration used for transforms and plugin resolution\n * @param entry - Path to the entry file to bundle\n * @param opts - Compilation options\n * @param opts.outFile - Destination path for the bundled output\n * @param opts.format - Output module format, either `'cjs'` or `'esm'`\n * @param opts.devUrl - Dev server URL injected into the bundle as `__NASTI_DEV_SERVER_URL__`\n */\nasync function compileNode(config: ResolvedConfig, entry: string, opts: CompileNodeOpts): Promise<void> {\n const env = loadEnv(config.mode, config.root, config.envPrefix)\n const envDefine = {\n ...buildEnvDefine(env, config.mode),\n __ELECTRON__: 'true',\n __NASTI_TARGET__: JSON.stringify('electron'),\n __NASTI_DEV_SERVER_URL__: JSON.stringify(opts.devUrl),\n }\n\n const oxcTransformPlugin = {\n name: 'nasti:oxc-transform',\n transform(code: string, id: string) {\n if (!shouldTransform(id)) return null\n const result = transformCode(id, code, {\n sourcemap: !!config.build.sourcemap,\n jsxRuntime: 'automatic',\n jsxImportSource: config.framework === 'vue' ? 'vue' : 'react',\n })\n return { code: result.code, map: result.map ? JSON.parse(result.map) : undefined }\n },\n }\n\n const bundle = await rolldown({\n input: entry,\n transform: { define: envDefine },\n platform: 'node',\n plugins: [oxcTransformPlugin, electronPlugin(config), resolvePlugin(config)] as any,\n })\n fs.mkdirSync(path.dirname(opts.outFile), { recursive: true })\n await bundle.write({\n file: opts.outFile,\n format: opts.format === 'cjs' ? 'cjs' : 'esm',\n sourcemap: false,\n minify: false,\n // rolldown 已弃用 inlineDynamicImports,改用 codeSplitting:false 表达\n // 同样语义(单 chunk、内联 dynamic import)\n codeSplitting: false,\n })\n await bundle.close()\n}\n\n/**\n * Locate the Electron executable for the given project configuration.\n *\n * Checks `config.electron.electronPath` first (returns it if the file exists), otherwise attempts to resolve the `electron` package export from the project's dependencies and returns that path if it exists.\n *\n * @param config - Resolved project configuration used to determine project root and configured Electron path\n * @returns The file system path to the Electron executable if found, `null` otherwise\n */\nfunction resolveElectronBinary(config: ResolvedConfig): string | null {\n if (config.electron.electronPath && fs.existsSync(config.electron.electronPath)) {\n return config.electron.electronPath\n }\n try {\n const require = createRequire(path.resolve(config.root, 'package.json'))\n // electron 包导出其可执行文件路径\n const pathFile = require.resolve('electron')\n const electronModule = require(pathFile)\n if (typeof electronModule === 'string' && fs.existsSync(electronModule)) {\n return electronModule\n }\n } catch {\n // ignore\n }\n return null\n}\n\n/**\n * Emit console warnings when Electron is missing or its installed version is lower than configured.\n *\n * @param config - Resolved configuration containing the project root and `electron.minVersion` to check against\n */\nfunction warnElectronVersion(config: ResolvedConfig): void {\n const installed = detectInstalledElectron(config.root)\n if (installed === null) {\n console.warn(\n pc.yellow(\n ` ⚠ 未检测到 Electron,请安装:npm install -D electron@^${config.electron.minVersion}`,\n ),\n )\n return\n }\n if (installed < config.electron.minVersion) {\n console.warn(\n pc.yellow(\n ` ⚠ Electron ${installed} 低于 Nasti 要求的 ${config.electron.minVersion},某些特性(如 ESM 主进程)不可用。`,\n ),\n )\n }\n}\n","// Nasti CLI - 命令行入口\nimport { cac } from 'cac'\nimport pc from 'picocolors'\n\nconst cli = cac('nasti')\n\n// nasti dev\ncli\n .command('[root]', 'Start dev server')\n .alias('dev')\n .option('--port <port>', 'Port number', { default: 3000 })\n .option('--host [host]', 'Hostname')\n .option('--open [path]', 'Open browser on startup')\n .option('--mode <mode>', 'Set env mode')\n .action(async (root: string | undefined, options: any) => {\n try {\n const { createServer } = await import('./server/index.js')\n const server = await createServer({\n root: root ?? '.',\n mode: options.mode ?? 'development',\n server: {\n port: options.port,\n host: options.host,\n open: options.open,\n },\n })\n await server.listen()\n } catch (err: any) {\n console.error(pc.red(`\\n Error starting dev server:\\n ${err.message}\\n`))\n if (err.stack) console.error(pc.dim(err.stack))\n process.exit(1)\n }\n })\n\n// nasti build\ncli\n .command('build [root]', 'Build for production')\n .option('--outDir <dir>', 'Output directory', { default: 'dist' })\n .option('--sourcemap', 'Generate source map')\n .option('--minify', 'Minify output', { default: true })\n .option('--mode <mode>', 'Set env mode')\n .option('--target <target>', 'Build target: web | electron', { default: 'web' })\n .action(async (root: string | undefined, options: any) => {\n try {\n const target = options.target\n if (target !== 'web' && target !== 'electron') {\n throw new Error(`Invalid --target \"${target}\". Expected \"web\" or \"electron\".`)\n }\n const inline = {\n root: root ?? '.',\n mode: options.mode ?? 'production',\n target,\n build: {\n outDir: options.outDir,\n sourcemap: options.sourcemap,\n minify: options.minify,\n },\n }\n if (target === 'electron') {\n const { buildElectron } = await import('./build/electron.js')\n await buildElectron(inline)\n } else {\n const { build } = await import('./build/index.js')\n await build(inline)\n }\n } catch (err: any) {\n console.error(pc.red(`\\n Build failed:\\n ${err.message}\\n`))\n if (err.stack) console.error(pc.dim(err.stack))\n process.exit(1)\n }\n })\n\n// nasti electron - 启动 Electron 开发模式\ncli\n .command('electron [root]', 'Start Electron dev mode (requires electron ^41)')\n .alias('electron-dev')\n .option('--port <port>', 'Renderer dev server port', { default: 3000 })\n .option('--host [host]', 'Hostname')\n .option('--mode <mode>', 'Set env mode')\n .option('--no-spawn', 'Compile main/preload but do not spawn Electron')\n .option('--no-restart', 'Disable auto-restart on main/preload changes')\n .action(async (root: string | undefined, options: any) => {\n try {\n const { startElectronDev } = await import('./server/electron-dev.js')\n await startElectronDev({\n root: root ?? '.',\n mode: options.mode ?? 'development',\n target: 'electron',\n server: {\n port: options.port,\n host: options.host,\n },\n electron: {\n autoRestart: options.restart !== false,\n },\n noSpawn: options.spawn === false,\n })\n } catch (err: any) {\n console.error(pc.red(`\\n Electron dev failed:\\n ${err.message}\\n`))\n if (err.stack) console.error(pc.dim(err.stack))\n process.exit(1)\n }\n })\n\n// nasti electron-build - Electron 生产构建\ncli\n .command('electron-build [root]', 'Build Electron app for production')\n .option('--outDir <dir>', 'Output directory', { default: 'dist' })\n .option('--sourcemap', 'Generate source map')\n .option('--minify', 'Minify output', { default: true })\n .option('--mode <mode>', 'Set env mode')\n .action(async (root: string | undefined, options: any) => {\n try {\n const { buildElectron } = await import('./build/electron.js')\n await buildElectron({\n root: root ?? '.',\n mode: options.mode ?? 'production',\n target: 'electron',\n build: {\n outDir: options.outDir,\n sourcemap: options.sourcemap,\n minify: options.minify,\n },\n })\n } catch (err: any) {\n console.error(pc.red(`\\n Electron build failed:\\n ${err.message}\\n`))\n if (err.stack) console.error(pc.dim(err.stack))\n process.exit(1)\n }\n })\n\n// nasti preview\ncli\n .command('preview [root]', 'Preview production build')\n .option('--port <port>', 'Port number', { default: 4173 })\n .option('--host [host]', 'Hostname')\n .option('--outDir <dir>', 'Output directory to serve', { default: 'dist' })\n .action(async (root: string | undefined, options: any) => {\n try {\n const http = await import('node:http')\n const path = await import('node:path')\n const sirv = (await import('sirv')).default\n const connect = (await import('connect')).default\n\n const resolvedRoot = path.resolve(root ?? '.')\n const outDir = path.resolve(resolvedRoot, options.outDir)\n\n const app = connect()\n app.use(sirv(outDir, { single: true, etag: true, gzip: true, brotli: true }))\n\n const port = options.port\n const host = options.host === true ? '0.0.0.0' : (options.host ?? 'localhost')\n\n http.createServer(app).listen(port, host, () => {\n console.log()\n console.log(pc.cyan(' 🔍 nasti preview'))\n console.log()\n console.log(` ${pc.green('➜')} Local: ${pc.cyan(`http://localhost:${port}`)}`)\n console.log()\n })\n } catch (err: any) {\n console.error(pc.red(`\\n Preview failed:\\n ${err.message}\\n`))\n process.exit(1)\n }\n })\n\ncli.help()\ncli.version(__NASTI_VERSION__)\n\ncli.parse()\n"],"mappings":"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","names":["path","fs","transformSync","WsServer","path","fs","import_node_path","import_node_fs","path","fs","import_node_path","import_node_fs","path","fs","code","transformResult","rolldown","createRequire","dir","exports","import_node_path","import_node_fs","import_node_url","path","fs","import_node_path","import_node_fs","require","path","fs","import_node_path","import_node_fs","import_node_module","path","import_node_path","path","fs","crypto","import_node_path","import_node_fs","connect","path","sirv","http","pc","transformRequest","os","import_node_path","import_node_module","pc","path","fs","import_node_path","import_node_fs","import_picocolors","pc","path","fs","build","import_node_path","import_node_fs","import_rolldown","import_picocolors","init_electron","pc","createServer","path","fs","chokidar","require","import_node_path","import_node_fs","import_node_module","import_chokidar","import_picocolors","import_rolldown","init_electron","import_picocolors","createServer","pc","buildElectron","build","startElectronDev","http","path","sirv","connect"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/defaults.ts","../src/config/index.ts","../src/core/plugin-container.ts","../src/core/module-graph.ts","../src/server/ws.ts","../src/core/transformer.ts","../src/plugins/html.ts","../src/core/env.ts","../src/server/middleware.ts","../src/server/hmr.ts","../src/plugins/resolve.ts","../src/plugins/css.ts","../src/plugins/assets.ts","../src/server/index.ts","../src/plugins/electron.ts","../src/build/index.ts","../src/build/electron.ts","../src/server/electron-dev.ts","../src/cli.ts"],"sourcesContent":["import type { NastiConfig, ResolvedConfig, BuildConfig, ServerConfig, ResolveConfig, ElectronConfig } from '../types.js'\n\nconst defaultResolve: Required<ResolveConfig> = {\n alias: {},\n extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.json', '.vue'],\n conditions: ['import', 'module', 'browser', 'default'],\n mainFields: ['module', 'jsnext:main', 'jsnext', 'main'],\n}\n\nconst defaultServer: Required<ServerConfig> = {\n port: 3000,\n host: 'localhost',\n https: false,\n open: false,\n proxy: {},\n cors: true,\n hmr: true,\n}\n\nconst defaultBuild: Required<BuildConfig> = {\n outDir: 'dist',\n assetsDir: 'assets',\n minify: true,\n sourcemap: false,\n target: 'es2022',\n rolldownOptions: {},\n emptyOutDir: true,\n}\n\n// Electron 41+ 捆绑 Node 22.x / Chromium 138,故主进程目标默认 node22\nconst defaultElectron: Required<ElectronConfig> = {\n main: 'src/electron/main.ts',\n preload: 'src/electron/preload.ts',\n renderer: 'index.html',\n nodeTarget: 'node22',\n mainFormat: 'cjs',\n preloadFormat: 'cjs',\n electronPath: '',\n electronArgs: [],\n autoRestart: true,\n minVersion: 41,\n external: ['electron'],\n}\n\nexport const defaults: Required<Omit<NastiConfig, 'plugins'>> & { plugins: [] } = {\n root: '.',\n base: '/',\n mode: 'development',\n target: 'web',\n framework: 'auto',\n resolve: defaultResolve,\n server: defaultServer,\n build: defaultBuild,\n electron: defaultElectron,\n plugins: [],\n envPrefix: ['NASTI_', 'VITE_'],\n logLevel: 'info',\n}\n","import { pathToFileURL } from 'node:url'\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport type { NastiConfig, ResolvedConfig, NastiPlugin } from '../types.js'\nimport { defaults } from './defaults.js'\n\n/** 读取 tsconfig.json 中的 paths,转换为 Nasti alias 格式 */\nfunction loadTsconfigPaths(root: string): Record<string, string> {\n const tsconfigPath = path.resolve(root, 'tsconfig.json')\n if (!fs.existsSync(tsconfigPath)) return {}\n\n try {\n const content = fs.readFileSync(tsconfigPath, 'utf-8')\n // 简单剥离注释后 JSON.parse(tsconfig 允许注释)\n const stripped = content.replace(/\\/\\/[^\\n]*/g, '').replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n const tsconfig = JSON.parse(stripped)\n const paths: Record<string, string[]> = tsconfig?.compilerOptions?.paths ?? {}\n const baseUrl: string = tsconfig?.compilerOptions?.baseUrl ?? '.'\n\n const alias: Record<string, string> = {}\n for (const [pattern, targets] of Object.entries(paths)) {\n if (!targets.length) continue\n // 只处理简单别名(不含通配符 * 的键),通配符形式留给插件处理\n const cleanKey = pattern.replace(/\\/\\*$/, '')\n const cleanTarget = targets[0].replace(/\\/\\*$/, '')\n alias[cleanKey] = path.resolve(root, baseUrl, cleanTarget)\n }\n return alias\n } catch {\n return {}\n }\n}\n\nexport function defineConfig(config: NastiConfig): NastiConfig {\n return config\n}\n\nconst CONFIG_FILES = [\n 'nasti.config.ts',\n 'nasti.config.js',\n 'nasti.config.mjs',\n 'nasti.config.mts',\n]\n\nexport async function loadConfigFromFile(root: string): Promise<NastiConfig> {\n for (const file of CONFIG_FILES) {\n const filePath = path.resolve(root, file)\n if (!fs.existsSync(filePath)) continue\n\n if (file.endsWith('.ts') || file.endsWith('.mts')) {\n return await loadTsConfig(filePath)\n }\n const mod = await import(pathToFileURL(filePath).href)\n return mod.default ?? mod\n }\n return {}\n}\n\nasync function loadTsConfig(filePath: string): Promise<NastiConfig> {\n // 使用 oxc-transform 转译 TS 配置文件\n const { transformSync } = await import('oxc-transform')\n const code = fs.readFileSync(filePath, 'utf-8')\n const result = transformSync(filePath, code, {\n typescript: {},\n })\n\n // 写入临时 .mjs 文件然后 import\n const tmpFile = filePath + '.timestamp-' + Date.now() + '.mjs'\n try {\n fs.writeFileSync(tmpFile, result.code)\n const mod = await import(pathToFileURL(tmpFile).href)\n return mod.default ?? mod\n } finally {\n fs.unlinkSync(tmpFile)\n }\n}\n\n/**\n * Resolve the final configuration by loading file-based config, merging with inline config, and applying plugin hooks.\n *\n * Loads configuration from the project root (derived from `inlineConfig.root` or defaults), deep-merges file config with `inlineConfig` (inline takes precedence), runs each plugin's `config` hook and incorporates any returned partial config, constructs the complete `ResolvedConfig` (filling defaults for missing values and resolving tsconfig paths), filters plugins according to their `apply` field, and then invokes each included plugin's `configResolved` hook.\n *\n * @param inlineConfig - User-provided configuration that overrides file config and defaults\n * @param command - The current command, either `\"build\"` or `\"serve\"`, which influences mode and plugin filtering\n * @returns The fully resolved configuration with defaults applied, plugins filtered, and plugin hooks executed\n */\nexport async function resolveConfig(\n inlineConfig: NastiConfig = {},\n command: 'build' | 'serve',\n): Promise<ResolvedConfig> {\n const root = path.resolve(inlineConfig.root ?? defaults.root)\n const fileConfig = await loadConfigFromFile(root)\n\n // 合并: fileConfig < inlineConfig\n const merged: NastiConfig = deepMerge(deepMerge({}, fileConfig), inlineConfig)\n\n // 收集插件\n const rawPlugins: NastiPlugin[] = [\n ...(fileConfig.plugins ?? []),\n ...(inlineConfig.plugins ?? []),\n ]\n\n // 执行插件 config 钩子\n const env = { mode: merged.mode ?? defaults.mode, command }\n for (const plugin of rawPlugins) {\n if (plugin.config) {\n const result = await plugin.config(merged, env)\n if (result) Object.assign(merged, result)\n }\n }\n\n // 先构建 resolved,plugins 稍后填入(避免过滤时引用未初始化变量)\n const resolved: ResolvedConfig = {\n root,\n base: merged.base ?? defaults.base,\n mode: (command === 'build' ? 'production' : 'development') as ResolvedConfig['mode'],\n target: (merged.target ?? defaults.target) as ResolvedConfig['target'],\n framework: merged.framework ?? defaults.framework,\n command,\n resolve: {\n // tsconfig paths 优先级最低:tsconfig < defaults < user config\n alias: { ...loadTsconfigPaths(root), ...defaults.resolve.alias, ...merged.resolve?.alias },\n extensions: (merged.resolve?.extensions ?? defaults.resolve.extensions) as string[],\n conditions: (merged.resolve?.conditions ?? defaults.resolve.conditions) as string[],\n mainFields: (merged.resolve?.mainFields ?? defaults.resolve.mainFields) as string[],\n },\n plugins: [],\n server: { ...defaults.server, ...merged.server } as ResolvedConfig['server'],\n build: { ...defaults.build, ...merged.build } as ResolvedConfig['build'],\n electron: { ...defaults.electron, ...merged.electron } as ResolvedConfig['electron'],\n envPrefix: (Array.isArray(merged.envPrefix)\n ? merged.envPrefix\n : merged.envPrefix\n ? [merged.envPrefix]\n : [...defaults.envPrefix]) as string[],\n logLevel: merged.logLevel ?? defaults.logLevel,\n }\n\n // 过滤插件(apply 为函数时可安全访问已初始化的 resolved)\n const filteredPlugins = rawPlugins.filter((p) => {\n if (!p.apply) return true\n if (typeof p.apply === 'function') return p.apply(resolved, env)\n return p.apply === command\n })\n resolved.plugins = filteredPlugins\n\n // Electron 目标:扫描 dependencies 自动外部化 native 模块\n // (带 binding.gyp、gypfile:true,或 node_modules 内存在 *.node 的包)。\n // rolldown 尝试把 .node 打进 main 会直接爆,提前标为 external 才能正常 require。\n if (resolved.target === 'electron') {\n const autoExternal = detectNativeDeps(root)\n if (autoExternal.length > 0) {\n const current = new Set(resolved.electron.external ?? [])\n for (const dep of autoExternal) current.add(dep)\n resolved.electron.external = [...current]\n }\n }\n\n // 执行插件 configResolved 钩子\n for (const plugin of resolved.plugins) {\n if (plugin.configResolved) {\n await plugin.configResolved(resolved)\n }\n }\n\n return resolved\n}\n\n/**\n * 扫描项目 dependencies,返回需要从 Electron 主进程 bundle 中外部化的 native 模块列表。\n *\n * 判定依据(任一满足即视为 native):\n * - 包根目录存在 binding.gyp\n * - package.json 有 gypfile: true\n * - 包内存在 *.node 预编译产物\n * - 常见已知 native 包白名单(对付有些包不走 node-gyp 但运行时仍需原生 addon 的场景)\n */\nexport function detectNativeDeps(root: string): string[] {\n const result = new Set<string>()\n const pkgJsonPath = path.resolve(root, 'package.json')\n if (!fs.existsSync(pkgJsonPath)) return []\n let pkg: Record<string, any>\n try {\n pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'))\n } catch {\n return []\n }\n const deps = {\n ...(pkg.dependencies ?? {}),\n ...(pkg.optionalDependencies ?? {}),\n }\n // 已知需要外部化的 Electron 生态 native 模块\n const KNOWN_NATIVE = new Set([\n 'node-pty',\n 'better-sqlite3',\n 'sharp',\n 'serialport',\n '@vscode/tree-sitter-wasm',\n 'keytar',\n 'nodegit',\n 'sqlite3',\n 'fsevents',\n ])\n for (const dep of Object.keys(deps)) {\n if (KNOWN_NATIVE.has(dep)) {\n result.add(dep)\n continue\n }\n const depDir = path.resolve(root, 'node_modules', dep)\n if (!fs.existsSync(depDir)) continue\n // binding.gyp\n if (fs.existsSync(path.join(depDir, 'binding.gyp'))) {\n result.add(dep)\n continue\n }\n // package.json: gypfile\n const subPkg = path.join(depDir, 'package.json')\n if (fs.existsSync(subPkg)) {\n try {\n const sub = JSON.parse(fs.readFileSync(subPkg, 'utf-8'))\n if (sub.gypfile === true || sub.binary?.module_name) {\n result.add(dep)\n continue\n }\n } catch {\n /* ignore */\n }\n }\n // 浅层扫 *.node 文件(build/Release 或 prebuilds 目录)\n if (hasDotNodeFile(depDir)) {\n result.add(dep)\n }\n }\n return [...result]\n}\n\nfunction hasDotNodeFile(dir: string, depth = 0): boolean {\n if (depth > 3) return false\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n for (const e of entries) {\n if (e.isFile() && e.name.endsWith('.node')) return true\n if (e.isDirectory() && (e.name === 'build' || e.name === 'prebuilds' || e.name === 'Release')) {\n if (hasDotNodeFile(path.join(dir, e.name), depth + 1)) return true\n }\n }\n } catch {\n /* ignore */\n }\n return false\n}\n\nfunction deepMerge<T extends Record<string, any>>(target: T, source: Record<string, any>): T {\n const result = { ...target }\n for (const key of Object.keys(source)) {\n const val = source[key]\n if (val && typeof val === 'object' && !Array.isArray(val)) {\n result[key as keyof T] = deepMerge(\n (result[key as keyof T] as Record<string, any>) ?? {},\n val,\n ) as T[keyof T]\n } else if (val !== undefined) {\n result[key as keyof T] = val\n }\n }\n return result\n}\n","// Vite 兼容插件容器\n// 管理插件生命周期,实现 resolveId → load → transform 管道\n\nimport type {\n NastiPlugin,\n ResolvedConfig,\n PluginContext,\n ResolveIdResult,\n LoadResult,\n TransformResult,\n ModuleInfo,\n} from '../types.js'\n\nexport class PluginContainer {\n private plugins: NastiPlugin[]\n private config: ResolvedConfig\n private ctx: PluginContext\n private emittedFiles: Map<string, { fileName: string; source: string | Uint8Array }> = new Map()\n\n constructor(config: ResolvedConfig) {\n this.config = config\n // 按 enforce 排序: pre → normal → post\n this.plugins = sortPlugins(config.plugins)\n this.ctx = this.createContext()\n }\n\n private createContext(): PluginContext {\n const container = this\n return {\n async resolve(source: string, importer?: string) {\n return container.resolveId(source, importer)\n },\n emitFile(file) {\n const fileName = file.fileName ?? file.name ?? `asset-${container.emittedFiles.size}`\n const id = `emitted:${fileName}`\n container.emittedFiles.set(id, {\n fileName,\n source: file.source ?? '',\n })\n return id\n },\n getModuleInfo(_id): ModuleInfo | null {\n return null\n },\n }\n }\n\n /** 返回所有通过 emitFile() 输出的文件 */\n getEmittedFiles(): Array<{ fileName: string; source: string | Uint8Array }> {\n return Array.from(this.emittedFiles.values())\n }\n\n async buildStart(): Promise<void> {\n for (const plugin of this.plugins) {\n if (plugin.buildStart) {\n await plugin.buildStart.call(this.ctx)\n }\n }\n }\n\n async buildEnd(error?: Error): Promise<void> {\n for (const plugin of this.plugins) {\n if (plugin.buildEnd) {\n await plugin.buildEnd.call(this.ctx, error)\n }\n }\n }\n\n async resolveId(\n source: string,\n importer?: string,\n options: { isEntry?: boolean } = {},\n ): Promise<ResolveIdResult> {\n for (const plugin of this.plugins) {\n if (!plugin.resolveId) continue\n const result = await plugin.resolveId.call(\n this.ctx,\n source,\n importer ?? undefined,\n { isEntry: options.isEntry ?? false, ssr: false },\n )\n if (result != null) return result\n }\n return null\n }\n\n async load(id: string): Promise<LoadResult> {\n for (const plugin of this.plugins) {\n if (!plugin.load) continue\n const result = await plugin.load.call(this.ctx, id)\n if (result != null) return result\n }\n return null\n }\n\n async transform(code: string, id: string): Promise<TransformResult> {\n let currentCode = code\n for (const plugin of this.plugins) {\n if (!plugin.transform) continue\n const result = await plugin.transform.call(this.ctx, currentCode, id)\n if (result == null) continue\n if (typeof result === 'string') {\n currentCode = result\n } else {\n currentCode = result.code\n }\n }\n return currentCode === code ? null : { code: currentCode }\n }\n\n /** 完整的模块处理管道: resolveId → load → transform */\n async processModule(\n source: string,\n importer?: string,\n ): Promise<{ id: string; code: string } | null> {\n // 1. resolveId\n const resolveResult = await this.resolveId(source, importer, {\n isEntry: !importer,\n })\n if (resolveResult == null) return null\n const id = typeof resolveResult === 'string' ? resolveResult : resolveResult.id\n\n // 2. load\n const loadResult = await this.load(id)\n if (loadResult == null) return null\n const loadedCode = typeof loadResult === 'string' ? loadResult : loadResult.code\n\n // 3. transform\n const transformResult = await this.transform(loadedCode, id)\n const finalCode = transformResult == null\n ? loadedCode\n : typeof transformResult === 'string'\n ? transformResult\n : transformResult.code\n\n return { id, code: finalCode }\n }\n\n getPlugins(): NastiPlugin[] {\n return this.plugins\n }\n}\n\nfunction sortPlugins(plugins: NastiPlugin[]): NastiPlugin[] {\n const pre: NastiPlugin[] = []\n const normal: NastiPlugin[] = []\n const post: NastiPlugin[] = []\n\n for (const plugin of plugins) {\n if (plugin.enforce === 'pre') pre.push(plugin)\n else if (plugin.enforce === 'post') post.push(plugin)\n else normal.push(plugin)\n }\n\n return [...pre, ...normal, ...post]\n}\n","// 模块依赖图 - 用于 HMR 追踪模块关系\n\nimport type { ModuleNode, TransformResult } from '../types.js'\n\nexport class ModuleGraph {\n private urlToModuleMap = new Map<string, ModuleNode>()\n private idToModuleMap = new Map<string, ModuleNode>()\n private fileToModulesMap = new Map<string, Set<ModuleNode>>()\n\n getModuleByUrl(url: string): ModuleNode | undefined {\n return this.urlToModuleMap.get(url)\n }\n\n getModuleById(id: string): ModuleNode | undefined {\n return this.idToModuleMap.get(id)\n }\n\n getModulesByFile(file: string): Set<ModuleNode> | undefined {\n return this.fileToModulesMap.get(file)\n }\n\n async ensureEntryFromUrl(url: string): Promise<ModuleNode> {\n let mod = this.urlToModuleMap.get(url)\n if (mod) return mod\n\n mod = this.createModule(url)\n this.urlToModuleMap.set(url, mod)\n return mod\n }\n\n createModule(url: string, id?: string): ModuleNode {\n const mod: ModuleNode = {\n id: id ?? url,\n file: null,\n url,\n type: url.endsWith('.css') ? 'css' : 'js',\n importers: new Set(),\n importedModules: new Set(),\n acceptedHmrDeps: new Set(),\n transformResult: null,\n lastHMRTimestamp: 0,\n isSelfAccepting: false,\n }\n this.idToModuleMap.set(mod.id, mod)\n return mod\n }\n\n /** 注册文件路径到模块的映射 */\n registerModule(mod: ModuleNode, file: string): void {\n mod.file = file\n let mods = this.fileToModulesMap.get(file)\n if (!mods) {\n mods = new Set()\n this.fileToModulesMap.set(file, mods)\n }\n mods.add(mod)\n }\n\n /** 更新模块依赖关系 */\n updateModuleImports(mod: ModuleNode, importedIds: Set<string>): void {\n // 清除旧的导入关系\n for (const imported of mod.importedModules) {\n imported.importers.delete(mod)\n }\n mod.importedModules.clear()\n\n // 建立新的导入关系\n for (const id of importedIds) {\n const importedMod = this.idToModuleMap.get(id)\n if (importedMod) {\n mod.importedModules.add(importedMod)\n importedMod.importers.add(mod)\n }\n }\n }\n\n /** 使模块的转换缓存失效 */\n invalidateModule(mod: ModuleNode): void {\n mod.transformResult = null\n mod.lastHMRTimestamp = Date.now()\n }\n\n /** 使所有模块缓存失效 */\n invalidateAll(): void {\n for (const mod of this.idToModuleMap.values()) {\n this.invalidateModule(mod)\n }\n }\n\n /** 获取 HMR 传播边界 - 从变更模块向上遍历找到接受更新的边界 */\n getHmrBoundaries(mod: ModuleNode): { boundary: ModuleNode; acceptedVia: ModuleNode }[] {\n const boundaries: { boundary: ModuleNode; acceptedVia: ModuleNode }[] = []\n const visited = new Set<ModuleNode>()\n\n const propagate = (node: ModuleNode, via: ModuleNode): boolean => {\n if (visited.has(node)) return true\n visited.add(node)\n\n // 如果模块自身接受热更新\n if (node.isSelfAccepting) {\n boundaries.push({ boundary: node, acceptedVia: via })\n return true\n }\n\n // 如果模块被其他模块作为 HMR 依赖接受\n if (node.acceptedHmrDeps.has(via)) {\n boundaries.push({ boundary: node, acceptedVia: via })\n return true\n }\n\n // 没有 importer 意味着到达了入口,需要 full reload\n if (node.importers.size === 0) return false\n\n // 向上传播\n for (const importer of node.importers) {\n if (!propagate(importer, node)) return false\n }\n return true\n }\n\n // 从自身开始,如果自身接受就直接返回\n if (mod.isSelfAccepting) {\n boundaries.push({ boundary: mod, acceptedVia: mod })\n return boundaries\n }\n\n // 否则向 importer 传播\n for (const importer of mod.importers) {\n if (!propagate(importer, mod)) {\n // 传播到了根模块,需要 full reload\n return []\n }\n }\n\n return boundaries\n }\n}\n","// WebSocket 服务封装 - HMR 通信\nimport { WebSocketServer as WsServer, type WebSocket } from 'ws'\nimport type { WebSocketServer as IWebSocketServer, HmrPayload } from '../types.js'\n\nexport function createWebSocketServer(server: any): IWebSocketServer {\n const wss = new WsServer({ noServer: true })\n const clients = new Set<WebSocket>()\n\n // 处理 HTTP server 的 upgrade 请求\n server.on('upgrade', (req: any, socket: any, head: any) => {\n if (req.headers['sec-websocket-protocol'] === 'nasti-hmr') {\n wss.handleUpgrade(req, socket, head, (ws) => {\n wss.emit('connection', ws, req)\n })\n }\n })\n\n wss.on('connection', (ws) => {\n clients.add(ws)\n ws.send(JSON.stringify({ type: 'connected' }))\n\n ws.on('close', () => {\n clients.delete(ws)\n })\n\n ws.on('error', (err) => {\n console.error('[nasti] WebSocket error:', err)\n clients.delete(ws)\n })\n })\n\n return {\n send(payload: HmrPayload) {\n const data = JSON.stringify(payload)\n for (const client of clients) {\n if (client.readyState === 1) { // WebSocket.OPEN\n client.send(data)\n }\n }\n },\n close() {\n clients.clear()\n wss.close()\n },\n }\n}\n","// OXC Transform 封装 - 高性能 TS/JSX/TSX 转译\nimport { transformSync } from 'oxc-transform'\n\nexport interface TransformOptions {\n jsx?: boolean\n jsxRuntime?: 'automatic' | 'classic'\n jsxImportSource?: string\n typescript?: boolean\n sourcemap?: boolean\n reactRefresh?: boolean\n}\n\nexport interface TransformOutput {\n code: string\n map: string | null\n}\n\nconst JS_EXTENSIONS = /\\.(js|mjs|cjs)$/\nconst TS_EXTENSIONS = /\\.(ts|mts|cts)$/\nconst JSX_EXTENSIONS = /\\.(jsx|tsx)$/\nconst VUE_EXTENSION = /\\.vue$/\n\nexport function shouldTransform(id: string): boolean {\n return (\n TS_EXTENSIONS.test(id) ||\n JSX_EXTENSIONS.test(id) ||\n (JS_EXTENSIONS.test(id) && false) // JS 文件默认不转译,除非包含 JSX\n )\n}\n\nexport function transformCode(\n filename: string,\n code: string,\n options: TransformOptions = {},\n): TransformOutput {\n const isTS = TS_EXTENSIONS.test(filename) || /\\.tsx$/.test(filename)\n const isJSX = JSX_EXTENSIONS.test(filename)\n\n const result = transformSync(filename, code, {\n typescript: isTS ? {} : undefined,\n jsx: isJSX || /\\.tsx$/.test(filename)\n ? {\n runtime: options.jsxRuntime ?? 'automatic',\n importSource: options.jsxImportSource ?? 'react',\n refresh: options.reactRefresh ?? false,\n }\n : undefined,\n sourcemap: options.sourcemap ?? true,\n })\n\n if (result.errors && result.errors.length > 0) {\n const msg = result.errors.map((e: any) => e.message ?? String(e)).join('\\n')\n throw new Error(`OXC transform failed for ${filename}:\\n${msg}`)\n }\n\n return {\n code: result.code,\n map: result.map ? JSON.stringify(result.map) : null,\n }\n}\n\n/** 获取文件的模块类型 */\nexport function getModuleType(id: string): 'ts' | 'tsx' | 'js' | 'jsx' | 'css' | 'json' | 'vue' | 'asset' {\n if (/\\.tsx$/.test(id)) return 'tsx'\n if (/\\.ts$/.test(id) || /\\.mts$/.test(id)) return 'ts'\n if (/\\.jsx$/.test(id)) return 'jsx'\n if (/\\.css$/.test(id)) return 'css'\n if (/\\.json$/.test(id)) return 'json'\n if (VUE_EXTENSION.test(id)) return 'vue'\n if (JS_EXTENSIONS.test(id)) return 'js'\n return 'asset'\n}\n","// HTML 入口处理插件 - index.html 处理与脚本注入\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport type { NastiPlugin, ResolvedConfig, HtmlTagDescriptor } from '../types.js'\n\n/** 运行在用户脚本之前、安装 React Fast Refresh 全局钩子的 preamble。 */\nconst REACT_REFRESH_HTML_PREAMBLE = `\nimport RefreshRuntime from \"/@react-refresh\";\nRefreshRuntime.injectIntoGlobalHook(window);\nwindow.$RefreshReg$ = () => {};\nwindow.$RefreshSig$ = () => (type) => type;\nwindow.__vite_plugin_react_preamble_installed__ = true;\n`.trim()\n\nexport function htmlPlugin(config: ResolvedConfig): NastiPlugin {\n return {\n name: 'nasti:html',\n enforce: 'post',\n\n transformIndexHtml(html) {\n const tags: HtmlTagDescriptor[] = []\n\n if (config.command === 'serve') {\n const isReactLike = config.framework === 'react' || config.framework === 'auto'\n\n // 先装 Fast Refresh 钩子(必须在任何用户模块之前,因为 JSX 模块 wrapper\n // 会校验 window.__vite_plugin_react_preamble_installed__)\n if (isReactLike) {\n tags.push({\n tag: 'script',\n attrs: { type: 'module' },\n children: REACT_REFRESH_HTML_PREAMBLE,\n injectTo: 'head-prepend',\n })\n }\n\n // HMR 客户端(内置 createHotContext 命名导出,供模块 wrapper 调用)\n tags.push({\n tag: 'script',\n attrs: { type: 'module', src: '/@nasti/client' },\n injectTo: 'head-prepend',\n })\n }\n\n return { html, tags }\n },\n }\n}\n\n/** 处理 HTML,注入标签并重写 script src */\nexport function processHtml(\n html: string,\n tags: HtmlTagDescriptor[],\n): string {\n const headPrepend = tags.filter((t) => t.injectTo === 'head-prepend')\n const head = tags.filter((t) => t.injectTo === 'head' || !t.injectTo)\n const bodyPrepend = tags.filter((t) => t.injectTo === 'body-prepend')\n const body = tags.filter((t) => t.injectTo === 'body')\n\n if (headPrepend.length) {\n html = html.replace(/<head([^>]*)>/i, `<head$1>\\n${serializeTags(headPrepend)}`)\n }\n if (head.length) {\n html = html.replace(/<\\/head>/i, `${serializeTags(head)}\\n</head>`)\n }\n if (bodyPrepend.length) {\n html = html.replace(/<body([^>]*)>/i, `<body$1>\\n${serializeTags(bodyPrepend)}`)\n }\n if (body.length) {\n html = html.replace(/<\\/body>/i, `${serializeTags(body)}\\n</body>`)\n }\n\n return html\n}\n\nfunction serializeTags(tags: HtmlTagDescriptor[]): string {\n return tags.map(serializeTag).join('\\n')\n}\n\nfunction serializeTag(tag: HtmlTagDescriptor): string {\n const attrs = tag.attrs\n ? ' ' +\n Object.entries(tag.attrs)\n .map(([k, v]) => (v === true ? k : `${k}=\"${v}\"`))\n .join(' ')\n : ''\n const children =\n typeof tag.children === 'string'\n ? tag.children\n : tag.children\n ? serializeTags(tag.children)\n : ''\n\n const selfClosing = ['link', 'meta', 'br', 'hr', 'img', 'input'].includes(tag.tag)\n if (selfClosing && !children) {\n return ` <${tag.tag}${attrs} />`\n }\n return ` <${tag.tag}${attrs}>${children}</${tag.tag}>`\n}\n\n/** 读取并处理 HTML 入口文件 */\nexport async function readHtmlFile(root: string): Promise<string | null> {\n const htmlPath = path.resolve(root, 'index.html')\n if (!fs.existsSync(htmlPath)) return null\n return fs.readFileSync(htmlPath, 'utf-8')\n}\n","// 环境变量加载 - 读取 .env 文件并生成 import.meta.env 定义\nimport path from 'node:path'\nimport fs from 'node:fs'\n\nexport interface EnvRecord {\n [key: string]: string\n}\n\n/**\n * 从 .env 文件加载环境变量,按优先级合并:\n * .env < .env.[mode] < .env.local < .env.[mode].local\n */\nexport function loadEnv(mode: string, root: string, prefixes: string[]): EnvRecord {\n const envFiles = [\n '.env',\n `.env.${mode}`,\n '.env.local',\n `.env.${mode}.local`,\n ]\n\n const raw: EnvRecord = {}\n\n for (const file of envFiles) {\n const filePath = path.resolve(root, file)\n if (!fs.existsSync(filePath)) continue\n const content = fs.readFileSync(filePath, 'utf-8')\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eqIdx = trimmed.indexOf('=')\n if (eqIdx === -1) continue\n const key = trimmed.slice(0, eqIdx).trim()\n let value = trimmed.slice(eqIdx + 1).trim()\n // 去除引号\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1)\n }\n raw[key] = value\n }\n }\n\n // 只保留符合 prefix 的变量\n const filtered: EnvRecord = {}\n for (const [key, value] of Object.entries(raw)) {\n if (prefixes.some((prefix) => key.startsWith(prefix))) {\n filtered[key] = value\n }\n }\n\n return filtered\n}\n\n/**\n * 将过滤后的 env 转为 Rolldown define 对象\n * 例: { VITE_FOO: 'bar' } → { 'import.meta.env.VITE_FOO': '\"bar\"' }\n * 同时注入 import.meta.env.MODE / DEV / PROD\n */\nexport function buildEnvDefine(env: EnvRecord, mode: string): Record<string, string> {\n const define: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(env)) {\n define[`import.meta.env.${key}`] = JSON.stringify(value)\n }\n\n define['import.meta.env.MODE'] = JSON.stringify(mode)\n define['import.meta.env.DEV'] = mode !== 'production' ? 'true' : 'false'\n define['import.meta.env.PROD'] = mode === 'production' ? 'true' : 'false'\n define['import.meta.env.SSR'] = 'false'\n\n return define\n}\n\n/**\n * 在代码字符串中替换 import.meta.env.KEY(用于 dev 服务器按需转换)\n */\nexport function replaceEnvInCode(code: string, define: Record<string, string>): string {\n let result = code\n for (const [key, value] of Object.entries(define)) {\n // 转义正则特殊字符\n const escaped = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n result = result.replace(new RegExp(escaped, 'g'), value)\n }\n return result\n}\n","// HTTP 中间件 - 请求拦截与按需转译\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport type { ResolvedConfig } from '../types.js'\nimport { PluginContainer } from '../core/plugin-container.js'\nimport { ModuleGraph } from '../core/module-graph.js'\nimport { transformCode, shouldTransform, getModuleType } from '../core/transformer.js'\nimport { readHtmlFile, processHtml } from '../plugins/html.js'\nimport { loadEnv, buildEnvDefine, replaceEnvInCode } from '../core/env.js'\n\nconst __dirname_esm = path.dirname(fileURLToPath(import.meta.url))\nconst __require = createRequire(import.meta.url)\n\n/**\n * 将 react-refresh 的 CJS 运行时包装成浏览器可用的 ESM。\n * 原 CJS 通过 `exports.xxx = fn` 写入导出;我们用假的 module/exports/process\n * 对象跑一遍,再显式 re-export 出来。\n *\n * 读一次缓存一次:dev server 生命周期内不会变。\n */\nlet __refreshRuntimeCache: string | null = null\nfunction getReactRefreshRuntimeEsm(): string {\n if (__refreshRuntimeCache) return __refreshRuntimeCache\n // react-refresh 的 package.json `exports` 没有暴露 ./cjs/*,Node 24 严格执行\n // exports 后 `require.resolve('react-refresh/cjs/...')` 会抛 ERR_PACKAGE_PATH_NOT_EXPORTED。\n // 改为先 resolve 受支持的 ./package.json,再手动拼 cjs 子路径,绕开 exports 校验。\n let cjsPath: string\n try {\n const pkgPath = __require.resolve('react-refresh/package.json')\n cjsPath = path.join(path.dirname(pkgPath), 'cjs', 'react-refresh-runtime.development.js')\n } catch (err) {\n // 兜底:从 dist 向上找\n cjsPath = path.resolve(__dirname_esm, '../../node_modules/react-refresh/cjs/react-refresh-runtime.development.js')\n if (!fs.existsSync(cjsPath)) {\n const origMsg = err instanceof Error ? err.message : String(err)\n throw new Error(\n `[nasti] Missing dependency \"react-refresh\". Install it with: npm install react-refresh\\nOriginal resolve error: ${origMsg}`,\n )\n }\n }\n const cjsSource = fs.readFileSync(cjsPath, 'utf-8')\n // 这些命名对应 react-refresh-runtime 的公共导出,与\n // node -e \"Object.keys(require('react-refresh/runtime'))\" 对齐。\n __refreshRuntimeCache = `// Wrapped react-refresh runtime -> ESM\nconst exports = {};\nconst module = { exports };\nconst process = { env: { NODE_ENV: 'development' } };\n${cjsSource}\nconst __rt = module.exports;\nexport const injectIntoGlobalHook = __rt.injectIntoGlobalHook;\nexport const register = __rt.register;\nexport const createSignatureFunctionForTransform = __rt.createSignatureFunctionForTransform;\nexport const performReactRefresh = __rt.performReactRefresh;\nexport const isLikelyComponentType = __rt.isLikelyComponentType;\nexport const hasUnrecoverableErrors = __rt.hasUnrecoverableErrors;\nexport const setSignature = __rt.setSignature;\nexport const getFamilyByID = __rt.getFamilyByID;\nexport const getFamilyByType = __rt.getFamilyByType;\nexport const findAffectedHostInstances = __rt.findAffectedHostInstances;\nexport const collectCustomHooksForSignature = __rt.collectCustomHooksForSignature;\nexport default __rt;\n`\n return __refreshRuntimeCache\n}\n\n/**\n * React Fast Refresh 全局钩子安装脚本。\n * 必须在用户代码之前执行,由 html.ts 以 head-prepend 的方式注入到 index.html。\n */\nexport const REACT_REFRESH_GLOBAL_PREAMBLE = `\nimport RefreshRuntime from \"/@react-refresh\";\nRefreshRuntime.injectIntoGlobalHook(window);\nwindow.$RefreshReg$ = () => {};\nwindow.$RefreshSig$ = () => (type) => type;\nwindow.__vite_plugin_react_preamble_installed__ = true;\n`.trim()\n\n/**\n * 单模块的 Fast Refresh 包装。\n *\n * 包装前先把 transformed 代码里的 `import.meta.hot` 替换为本地 `__nasti_hot__`\n * 变量 —— 规避 `import.meta` 属性赋值在某些引擎下不可写的问题,并统一 JSX/非 JSX\n * 路径的 hot 来源。\n */\nfunction buildReactRefreshWrapper(moduleUrl: string, transformedCode: string): string {\n const urlLit = JSON.stringify(moduleUrl)\n const userCode = transformedCode.replace(/\\bimport\\.meta\\.hot\\b/g, '__nasti_hot__')\n return `import * as RefreshRuntime from \"/@react-refresh\";\nimport { createHotContext as __nasti_createHotContext__ } from \"/@nasti/client\";\nconst __nasti_hot__ = __nasti_createHotContext__(${urlLit});\n\nif (!window.__vite_plugin_react_preamble_installed__) {\n throw new Error(\"[nasti] React Fast Refresh preamble missing. Make sure nasti:html is wired with framework: 'react'.\");\n}\n\nconst prevRefreshReg = window.$RefreshReg$;\nconst prevRefreshSig = window.$RefreshSig$;\nwindow.$RefreshReg$ = (type, id) => {\n RefreshRuntime.register(type, ${urlLit} + \" \" + id);\n};\nwindow.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;\n\n${userCode}\n\nwindow.$RefreshReg$ = prevRefreshReg;\nwindow.$RefreshSig$ = prevRefreshSig;\n\nif (__nasti_hot__) {\n __nasti_hot__.accept(() => {\n clearTimeout(window.__nasti_refresh_timer__);\n window.__nasti_refresh_timer__ = setTimeout(() => {\n RefreshRuntime.performReactRefresh();\n }, 30);\n });\n}\n`\n}\n\n/**\n * 非 JSX 模块里用户显式写了 import.meta.hot —— 注入一段 hot context 头部并替换属性访问为本地变量。\n */\nfunction injectImportMetaHot(code: string, moduleUrl: string): string {\n if (!/\\bimport\\.meta\\.hot\\b/.test(code)) return code\n const urlLit = JSON.stringify(moduleUrl)\n const header = `import { createHotContext as __nasti_createHotContext__ } from \"/@nasti/client\";\nconst __nasti_hot__ = __nasti_createHotContext__(${urlLit});\n`\n return header + code.replace(/\\bimport\\.meta\\.hot\\b/g, '__nasti_hot__')\n}\n\nexport interface TransformMiddlewareContext {\n config: ResolvedConfig\n pluginContainer: PluginContainer\n moduleGraph: ModuleGraph\n envDefine?: Record<string, string>\n}\n\n/** 主转译中间件 - 处理模块请求 */\nexport function transformMiddleware(ctx: TransformMiddlewareContext) {\n // 预加载环境变量,避免每次请求都重新读取 .env 文件\n ctx.envDefine = buildEnvDefine(\n loadEnv(ctx.config.mode, ctx.config.root, ctx.config.envPrefix),\n ctx.config.mode,\n )\n return async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const url = req.url ?? '/'\n\n // 设置 CORS 响应头\n if (ctx.config.server.cors) {\n const origin = req.headers.origin ?? '*'\n res.setHeader('Access-Control-Allow-Origin', origin)\n res.setHeader('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS')\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type')\n if (req.method === 'OPTIONS') {\n res.statusCode = 204\n res.end()\n return\n }\n }\n\n // 跳过非 GET 请求\n if (req.method !== 'GET') return next()\n\n // 处理 HMR 客户端请求\n if (url === '/@nasti/client') {\n res.setHeader('Content-Type', 'application/javascript')\n res.end(getHmrClientCode())\n return\n }\n\n // 处理 HTML 请求\n if (url === '/' || url.endsWith('.html')) {\n const html = await readHtmlFile(ctx.config.root)\n if (html) {\n let processedHtml = html\n\n // 执行 transformIndexHtml 钩子\n for (const plugin of ctx.config.plugins) {\n if (plugin.transformIndexHtml) {\n const result = await plugin.transformIndexHtml(processedHtml)\n if (typeof result === 'string') {\n processedHtml = result\n } else if (result && 'html' in result) {\n processedHtml = processHtml(result.html, result.tags)\n } else if (Array.isArray(result)) {\n processedHtml = processHtml(processedHtml, result)\n }\n }\n }\n\n res.setHeader('Content-Type', 'text/html')\n res.end(processedHtml)\n return\n }\n }\n\n // 处理模块请求(.ts, .tsx, .jsx, .vue, .css 等)\n if (isModuleRequest(url)) {\n try {\n const result = await transformRequest(url, ctx)\n if (result) {\n const contentType = url.endsWith('.css')\n ? 'application/javascript' // CSS 已转为 JS 模块\n : 'application/javascript'\n res.setHeader('Content-Type', contentType)\n res.setHeader('Cache-Control', 'no-cache')\n res.end(typeof result === 'string' ? result : result.code)\n return\n }\n } catch (err: any) {\n console.error(`[nasti] Transform error: ${url}`, err.message)\n res.statusCode = 500\n res.end(`Transform error: ${err.message}`)\n return\n }\n }\n\n next()\n }\n}\n\n/** 转译单个模块 */\nexport async function transformRequest(\n url: string,\n ctx: TransformMiddlewareContext,\n): Promise<{ code: string; map?: unknown } | null> {\n const { config, pluginContainer, moduleGraph } = ctx\n\n const cleanReqUrl = url.split('?')[0]\n\n // 检查缓存\n const cached = moduleGraph.getModuleByUrl(url)\n if (cached?.transformResult) {\n return cached.transformResult as { code: string; map?: unknown }\n }\n\n // React Refresh 真实运行时(来自 react-refresh/cjs 包装为 ESM)\n if (cleanReqUrl === '/@react-refresh') {\n return { code: getReactRefreshRuntimeEsm() }\n }\n\n // 解析文件路径\n const filePath = resolveUrlToFile(url, config.root)\n if (!filePath || !fs.existsSync(filePath)) return null\n\n // 创建/获取模块节点\n const mod = await moduleGraph.ensureEntryFromUrl(url)\n moduleGraph.registerModule(mod, filePath)\n\n // node_modules 模块:用 rolldown 打成浏览器可用的 ESM\n // 解决 CJS 包(如 react)无法在浏览器中作为 ESM 使用的问题\n if (cleanReqUrl.startsWith('/@modules/')) {\n const code = await bundlePackageAsEsm(filePath)\n const transformResult = { code }\n mod.transformResult = transformResult\n return transformResult\n }\n\n // 读取源码\n let code = fs.readFileSync(filePath, 'utf-8')\n\n // 通过插件管道 transform\n const pluginResult = await pluginContainer.transform(code, filePath)\n if (pluginResult) {\n code = typeof pluginResult === 'string' ? pluginResult : pluginResult.code\n }\n\n // Fast Refresh / HMR 键必须在同一文件的多次 import(?t=xxx 变化)间稳定\n const stableUrl = cleanReqUrl\n\n // OXC 转译 (TS/JSX/TSX)\n let wrappedWithRefresh = false\n if (shouldTransform(filePath)) {\n const isJsx = /\\.[jt]sx$/.test(filePath)\n const useRefresh = isJsx && config.framework !== 'vue'\n const result = transformCode(filePath, code, {\n sourcemap: true,\n jsxRuntime: 'automatic',\n jsxImportSource: config.framework === 'vue' ? 'vue' : 'react',\n reactRefresh: useRefresh,\n })\n code = result.code\n if (useRefresh) {\n // 把模块包装起来:安装 $RefreshReg$/$RefreshSig$、建 hot context、尾部触发 performReactRefresh\n code = buildReactRefreshWrapper(stableUrl, code)\n wrappedWithRefresh = true\n // 标记为自接受,HMR 传播到此为止,不再 full-reload\n mod.isSelfAccepting = true\n }\n }\n\n // 非 Fast-Refresh 模块里用户自己写了 import.meta.hot 的,注入 hot context\n if (!wrappedWithRefresh) {\n code = injectImportMetaHot(code, stableUrl)\n }\n\n // 替换 import.meta.env.* 为实际值\n const envDefine = ctx.envDefine ?? buildEnvDefine(\n loadEnv(config.mode, config.root, config.envPrefix),\n config.mode,\n )\n code = replaceEnvInCode(code, envDefine)\n\n // 重写 import 规范:alias / 相对路径 → 解析后的绝对 URL(带扩展名),bare → /@modules/\n code = rewriteImports(code, config, filePath)\n\n const transformResult = { code }\n mod.transformResult = transformResult\n return transformResult\n}\n\n/** 用 rolldown 将 node_modules 包打包为浏览器可用的 ESM(含 CJS→ESM 转换) */\n// Promise 缓存:同一入口文件只打包一次,防止并发重复打包\nconst esmBundleCache = new Map<string, Promise<string>>()\n\nasync function bundlePackageAsEsm(entryFile: string): Promise<string> {\n if (!esmBundleCache.has(entryFile)) {\n esmBundleCache.set(entryFile, doBundlePackage(entryFile))\n }\n return esmBundleCache.get(entryFile)!\n}\n\nasync function doBundlePackage(entryFile: string): Promise<string> {\n // 子路径入口(如 `react-aria-components/Select`)尝试生成 re-export shim,\n // 指向同包主入口。否则每个子路径会被 rolldown 各自打成独立 bundle,\n // 把同一份 `private/*.cjs` 内联多份 → 多个 `createContext(null)` 实例 →\n // React Aria 之类对 context identity 敏感的库会出现「provider 与 consumer\n // 看到的不是同一个 context」、`useContext` 返回 null 的运行期崩溃。\n // 详见: https://github.com/zixiao-labs/Nasti/pull/16\n const shim = await tryGenerateSubpathShim(entryFile)\n if (shim != null) return shim\n\n const { rolldown } = await import('rolldown')\n\n const bundle = await rolldown({\n input: entryFile,\n // 仅将其他 npm 包外部化;相对路径(包内部文件)全部内联打包\n external: (id: string) => {\n if (id.startsWith('.') || id.startsWith('/') || /^[A-Za-z]:\\\\/.test(id)) return false\n return true\n },\n })\n\n const result = await bundle.generate({ format: 'esm', exports: 'named' })\n await bundle.close()\n\n let code = result.output[0].code\n\n // 替换 process.env.NODE_ENV(rolldown 的 define 选项在此版本无效)\n code = code.replace(/process\\.env\\.NODE_ENV/g, '\"development\"')\n\n // 将外部化的 bare specifier 改写为 /@modules/ 路径供浏览器加载\n // ⚠️ 必须用 ^ + m 锚定行首,只匹配真正的 import/export 声明,\n // 避免误匹配字符串内出现的 from \"...\" 导致 SyntaxError\n code = code\n .replace(/^(import\\b[^;'\"]*?\\bfrom\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`)\n .replace(/^(export\\b[^;'\"]*?\\bfrom\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`)\n .replace(/^(import\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`)\n\n // CJS 外部 require 改写:\n // rolldown 将 CJS 的 require(\"pkg\") 转为 __require(\"pkg\"),在浏览器中抛异常。\n // 收集所有 __require(\"pkg\"),替换为顶层 ESM import 的变量引用。\n code = rewriteExternalRequires(code)\n\n // CJS 包的具名导出补全:\n // rolldown 将 CJS 包包装为 __commonJSMin,只输出 export default,\n // 导致 import { parse } from '/@modules/cookie' 等具名导入失败。\n // 通过 createRequire 在 Node.js 侧加载 CJS 模块,取出 exports 的 key,\n // 在 ESM bundle 末尾补上静态具名 export。\n if (code.includes('__commonJSMin')) {\n code = await injectCjsNamedExports(code, entryFile)\n }\n\n return code\n}\n\n/**\n * 当入口是 npm 包的「子路径」(即 `pkg/sub` 形式,对应 `node_modules/pkg/`\n * 内部的某个非主入口文件)时,尝试改用一个薄薄的 re-export shim 替代独立 bundle,\n * shim 通过 `/@modules/<pkgName>` 复用主入口 bundle 的导出。\n *\n * 这样做是为了避免「同一份代码被打到多个 bundle 里」造成的运行时 bug:\n * 例如 `react-aria-components/Select` 与 `react-aria-components` 主入口都内部\n * 依赖 `private/Select.*`,而 rolldown 会把这份相对依赖内联到各自的 bundle 中。\n * 结果是浏览器侧出现两个独立的 `SelectContext = createContext(null)` 实例 ——\n * `<Select>` 写入的 Provider 与下方 `<SelectValue>` 读到的 Consumer 不再指向\n * 同一个 context,`useContext` 返回 null 直接崩。React Aria 的 Tabs / Collection\n * / DialogTrigger 等都属于这一类对 context identity 敏感的设计。\n *\n * 安全前提:shim 仅在主入口 **完整覆盖** 子路径所有具名导出、且各导出值\n * 与主入口下的对应值是 **同一引用**(identity 相等)时生成;否则回退到普通\n * bundling,避免错误改写有副作用的子路径(如真正分裂的入口、wrapped exports)。\n *\n * 仅 dev server 使用:build 模式走单一 rolldown 整图打包,本身不会重复内联。\n */\nasync function tryGenerateSubpathShim(entryFile: string): Promise<string | null> {\n // 1. 必须位于 node_modules 内\n const NM = `${path.sep}node_modules${path.sep}`\n if (!entryFile.includes(NM)) return null\n\n // 2. 自下而上找第一份带 `name` 的 package.json,确认所属包根目录\n let pkgDir: string | null = null\n let pkgName: string | null = null\n let dir = path.dirname(entryFile)\n while (true) {\n const pkgJsonPath = path.join(dir, 'package.json')\n if (fs.existsSync(pkgJsonPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'))\n if (typeof pkg?.name === 'string' && pkg.name) {\n pkgDir = dir\n pkgName = pkg.name\n break\n }\n } catch {\n // 解析失败:继续向上找,但通常意味着这不是合法包\n }\n }\n const parent = path.dirname(dir)\n if (parent === dir) return null\n dir = parent\n // 一旦走出 node_modules 就放弃(用户源码不应进入此分支)\n if (!dir.includes(NM)) return null\n }\n if (!pkgDir || !pkgName) return null\n\n // 3. 选择与入口 **同扩展名** 的主入口路径。这一步至关重要:\n // 主入口的 `.cjs` 与子路径的 `.js`(ESM)在 Node 中会走不同的加载器,\n // 各自独立产生模块实例 —— 在 step 5 的 identity 校验里永远不等。\n // 而 dev server 上游 (`resolveUrlToFile`) 优先选取 `.js`/`.mjs` 而非 `.cjs`,\n // 因此我们必须按入口实际格式去拿匹配的主入口,避免跨格式比较。\n const entryExt = path.extname(entryFile)\n const mainEntry = pickMainEntryByExtension(pkgDir, entryExt)\n if (!mainEntry) return null\n if (path.resolve(mainEntry) === path.resolve(entryFile)) return null\n\n // 4. 用 `import()` 加载两侧(兼容 CJS / ESM;Node 会按文件扩展名自动选用\n // 正确的加载器,并以 file URL 共享模块缓存 —— 内部对相对依赖的 `require`\n // 会命中同一份 module instance)\n let mainNs: Record<string, unknown>\n let subNs: Record<string, unknown>\n try {\n mainNs = await import(pathToFileURL(mainEntry).href)\n subNs = await import(pathToFileURL(entryFile).href)\n } catch {\n return null\n }\n if (!mainNs || typeof mainNs !== 'object') return null\n if (!subNs || typeof subNs !== 'object') return null\n\n const subKeys = Object.keys(subNs).filter(\n (k) => k !== '__esModule' && k !== 'default' && VALID_IDENT.test(k),\n )\n if (subKeys.length === 0) return null\n\n // 5. 所有具名导出都必须存在于主入口、且引用相等\n for (const k of subKeys) {\n if (!(k in mainNs)) return null\n if (mainNs[k] !== subNs[k]) return null\n }\n\n // 子路径的 default 也必须由主入口承载且引用相等,否则下方的\n // `export default __pkg[\"default\"]` 会暴露错误(甚至 undefined)的 default。\n if ('default' in subNs) {\n if (!('default' in mainNs)) return null\n if (mainNs['default'] !== subNs['default']) return null\n }\n\n // 6. 生成 ESM shim:浏览器从 `/@modules/<pkgName>` 取到主 bundle 的命名空间,\n // 再按子路径所声明的导出名重新对外暴露\n const lines: string[] = [\n `// Nasti subpath shim → ${pkgName} (avoid duplicate bundling)`,\n `import * as __pkg from \"/@modules/${pkgName}\";`,\n ]\n for (const k of subKeys) {\n lines.push(`export const ${k} = __pkg[${JSON.stringify(k)}];`)\n }\n if ('default' in subNs) {\n lines.push(`export default (\"default\" in __pkg ? __pkg[\"default\"] : __pkg);`)\n }\n return lines.join('\\n') + '\\n'\n}\n\n/**\n * 解析包主入口绝对路径,**优先匹配指定扩展名**,再回退到任意可用主入口。\n * 主入口候选来自 `exports[\\\".\\\"]`(按 import / module / default / require / node 顺序展开嵌套条件)\n * 以及顶层 `module` / `main` 字段。\n */\nfunction pickMainEntryByExtension(pkgDir: string, preferredExt: string): string | null {\n const pkgJsonPath = path.join(pkgDir, 'package.json')\n let pkg: Record<string, any>\n try {\n pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'))\n } catch {\n return null\n }\n\n const candidates: string[] = []\n const collectFromExportObject = (obj: any) => {\n if (!obj || typeof obj !== 'object') return\n for (const cond of ['import', 'module', 'default', 'require', 'node']) {\n const v = obj[cond]\n if (typeof v === 'string') candidates.push(v)\n else if (v && typeof v === 'object') collectFromExportObject(v)\n }\n }\n const dot = pkg?.exports?.['.']\n if (typeof dot === 'string') candidates.push(dot)\n else if (dot && typeof dot === 'object') collectFromExportObject(dot)\n if (typeof pkg.module === 'string') candidates.push(pkg.module)\n if (typeof pkg.main === 'string') candidates.push(pkg.main)\n\n // 同扩展名优先\n for (const cand of candidates) {\n if (path.extname(cand) === preferredExt) {\n const full = path.resolve(pkgDir, cand)\n if (fs.existsSync(full)) return full\n }\n }\n // 任意可用候选\n for (const cand of candidates) {\n const full = path.resolve(pkgDir, cand)\n if (fs.existsSync(full)) return full\n }\n return null\n}\n\n/** 将 rolldown 生成的 __require(\"pkg\") 调用转换为顶层 ESM import\n * 使用 namespace import + default 回退,兼容 CJS 和 ESM 模块:\n * - CJS 包有 default export(__cjsMod)→ 取 .default\n * - ESM 包只有 named exports → 取 namespace 本身 */\nfunction rewriteExternalRequires(code: string): string {\n const pkgs = new Set<string>()\n const re = /__require\\([\"']([^\"']+)[\"']\\)/g\n let m\n while ((m = re.exec(code)) !== null) {\n pkgs.add(m[1])\n }\n if (pkgs.size === 0) return code\n\n let result = code\n const imports: string[] = []\n for (const pkg of pkgs) {\n const safe = pkg.replace(/[^a-zA-Z0-9_$]/g, '_')\n imports.push(`import * as __ns_${safe} from \"/@modules/${pkg}\";`)\n imports.push(`var __req_${safe} = \"default\" in __ns_${safe} ? __ns_${safe}[\"default\"] : __ns_${safe};`)\n result = result.replaceAll(`__require(\"${pkg}\")`, `__req_${safe}`)\n result = result.replaceAll(`__require('${pkg}')`, `__req_${safe}`)\n }\n\n return imports.join('\\n') + '\\n' + result\n}\n\nconst VALID_IDENT = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/\n\nasync function injectCjsNamedExports(code: string, entryFile: string): Promise<string> {\n try {\n const { createRequire } = await import('module')\n const req = createRequire(entryFile)\n const cjsExports = req(entryFile)\n if (!cjsExports || (typeof cjsExports !== 'object' && typeof cjsExports !== 'function') || Array.isArray(cjsExports)) return code\n\n const namedKeys = Object.keys(cjsExports).filter(\n (k) => k !== '__esModule' && k !== 'default' && VALID_IDENT.test(k),\n )\n if (namedKeys.length === 0) return code\n\n // 把末尾的 \"export default require_xxx();\" 改写为带具名 export 的形式\n return code.replace(\n /^export default (\\w+\\(\\));?\\s*$/m,\n (_, call) => [\n `const __cjsMod = ${call};`,\n `export default __cjsMod;`,\n ...namedKeys.map((k) => `export const ${k} = __cjsMod[${JSON.stringify(k)}];`),\n ].join('\\n'),\n )\n } catch {\n return code\n }\n}\n\n/**\n * 重写 import/export 语句的模块规范:\n * - alias(如 `@/lib/api`)→ 解析后的项目内绝对 URL(带扩展名)\n * - 相对路径(`./x`、`../x`)→ 同样解析后回写为绝对 URL\n * - 项目内绝对路径(`/src/x`)→ 补扩展名\n * - 其余 bare specifier → `/@modules/<spec>`\n *\n * 浏览器加载无扩展名 URL(如 `/src/i18n`)时,里面的相对路径 `./locales/en`\n * 会按字面拼接得到 `/src/locales/en`,不会自动补 `.ts` 也不知道导入文件原先在\n * `/src/i18n/`。直接按 alias / fs 解析、回写绝对 URL,浏览器就能命中正确文件。\n */\nfunction rewriteImports(code: string, config: ResolvedConfig, filePath: string): string {\n const root = config.root\n const fileDir = path.dirname(filePath)\n // 按 key 长度降序:避免短 alias(如 `@`)抢在更具体的(如 `@/utils`)之前命中\n const aliasEntries = Object.entries(config.resolve.alias).sort(\n ([a], [b]) => b.length - a.length,\n )\n\n const toRootUrl = (abs: string): string =>\n '/' + path.relative(root, abs).replace(/\\\\/g, '/')\n\n const transformSpec = (spec: string): string => {\n // 解析时剥离 ?query / #hash(如 svg?url、json?import),回写时再附加到结果 URL\n const suffixMatch = spec.match(/[?#].*$/)\n const suffix = suffixMatch ? suffixMatch[0] : ''\n const baseSpec = suffix ? spec.slice(0, -suffix.length) : spec\n\n // 1) alias —— 必须排在 bare 分支前,否则 `@/x` 会被当成 npm 包发到 /@modules/\n for (const [key, value] of aliasEntries) {\n if (baseSpec === key || baseSpec.startsWith(key + '/')) {\n const aliasBase = resolveAliasTarget(value, root)\n const sub = baseSpec.slice(key.length).replace(/^\\//, '')\n const target = sub ? path.join(aliasBase, sub) : aliasBase\n const resolved = tryResolveDiskPath(target)\n // 解析失败时保留原 spec:让浏览器照旧请求,由后续中间件返回 404,\n // 而不是把 `@/x` 错误地转成 `/@modules/@/x`。\n return resolved && isUnderRoot(resolved, root) ? toRootUrl(resolved) + suffix : spec\n }\n }\n\n // 2) 相对路径\n if (baseSpec.startsWith('./') || baseSpec.startsWith('../')) {\n const target = path.resolve(fileDir, baseSpec)\n const resolved = tryResolveDiskPath(target)\n return resolved && isUnderRoot(resolved, root) ? toRootUrl(resolved) + suffix : spec\n }\n\n // 3) 项目内绝对路径\n if (baseSpec.startsWith('/') && !baseSpec.startsWith('/@')) {\n const target = path.join(root, baseSpec.replace(/^\\//, ''))\n const resolved = tryResolveDiskPath(target)\n return resolved && isUnderRoot(resolved, root) ? toRootUrl(resolved) + suffix : spec\n }\n\n // 4) 已经被前面步骤改写过的内部 URL(/@modules/、/@react-refresh 等)原样保留\n if (baseSpec.startsWith('/')) return spec\n\n // 5) bare specifier\n return `/@modules/${spec}`\n }\n\n return code\n // import ... from '...' / export ... from '...'\n .replace(\n /\\bfrom\\s+(['\"])([^'\"]+)\\1/g,\n (_m, q: string, s: string) => `from ${q}${transformSpec(s)}${q}`,\n )\n // 副作用 import: import '...'\n .replace(\n /\\bimport\\s+(['\"])([^'\"]+)\\1/g,\n (_m, q: string, s: string) => `import ${q}${transformSpec(s)}${q}`,\n )\n // 动态 import('...')\n .replace(\n /\\bimport\\s*\\(\\s*(['\"])([^'\"]+)\\1\\s*\\)/g,\n (_m, q: string, s: string) => `import(${q}${transformSpec(s)}${q})`,\n )\n}\n\n/**\n * 把 alias 值统一成磁盘绝对路径。\n * - `/Users/.../src` 这类绝对路径直接用\n * - `/src` 这类用户写的「项目根相对」路径按 `<root>/src` 处理\n * - 其余字符串相对 root 解析\n */\nfunction resolveAliasTarget(value: string, root: string): string {\n if (path.isAbsolute(value) && fs.existsSync(value)) return value\n if (value.startsWith('/')) return path.join(root, value.slice(1))\n return path.resolve(root, value)\n}\n\n/** 把磁盘上的目标路径补全为存在的文件(扩展名 / index 兜底)。 */\nfunction tryResolveDiskPath(target: string): string | null {\n if (fs.existsSync(target) && fs.statSync(target).isFile()) return target\n for (const ext of RESOLVE_EXTENSIONS) {\n const withExt = target + ext\n if (fs.existsSync(withExt) && fs.statSync(withExt).isFile()) return withExt\n }\n if (fs.existsSync(target) && fs.statSync(target).isDirectory()) {\n for (const ext of RESOLVE_EXTENSIONS) {\n const idx = path.join(target, 'index' + ext)\n if (fs.existsSync(idx) && fs.statSync(idx).isFile()) return idx\n }\n }\n return null\n}\n\n/** alias 目标可能在 root 之外(symlink、monorepo),那种情况无法生成项目内 URL。 */\nfunction isUnderRoot(abs: string, root: string): boolean {\n const rel = path.relative(root, abs)\n return !!rel && !rel.startsWith('..') && !path.isAbsolute(rel)\n}\n\nconst RESOLVE_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js', '.mjs', '.json', '.vue']\nconst ESM_CONDITIONS = ['import', 'browser', 'module', 'default']\n\n/** 从 /@modules/pkgName/... URL 中提取包名(支持 scoped 包) */\nfunction modulesUrlToPkgName(url: string): string {\n const modulePath = url.slice('/@modules/'.length).split('?')[0]\n if (modulePath.startsWith('@')) {\n return modulePath.split('/').slice(0, 2).join('/')\n }\n return modulePath.split('/')[0]\n}\n\n/** 从 root 开始向上查找包目录 */\nfunction findPkgDir(root: string, pkgName: string): string | null {\n let dir = root\n for (;;) {\n const candidate = path.join(dir, 'node_modules', pkgName)\n if (fs.existsSync(candidate)) return candidate\n const parent = path.dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n return null\n}\n\n/**\n * 将 node_modules 文件中的相对导入改写为 /@modules/pkgName/subpath 形式。\n * 浏览器加载 /@modules/pkgName 时,相对路径 ./foo.js 会被解析为 /@modules/foo.js\n * 而非正确的 /@modules/pkgName/dist/foo.js,因此必须在服务端将其改写为绝对路径。\n */\nfunction rewriteNodeModuleRelativeImports(\n code: string,\n pkgName: string,\n filePath: string,\n pkgDir: string,\n): string {\n const fileDir = path.dirname(filePath)\n const rewrite = (spec: string): string => {\n const abs = path.resolve(fileDir, spec)\n const rel = path.relative(pkgDir, abs).replace(/\\\\/g, '/')\n return `/@modules/${pkgName}/${rel}`\n }\n return code\n .replace(/\\bfrom\\s+(['\"])(\\.\\.?\\/[^'\"]*)\\1/g, (_, q, spec) => `from ${q}${rewrite(spec)}${q}`)\n .replace(/\\bimport\\s+(['\"])(\\.\\.?\\/[^'\"]*)\\1/g, (_, q, spec) => `import ${q}${rewrite(spec)}${q}`)\n .replace(/\\bimport\\s*\\(\\s*(['\"])(\\.\\.?\\/[^'\"]*)\\1\\s*\\)/g, (_, q, spec) => `import(${q}${rewrite(spec)}${q})`)\n}\n\n/**\n * ESM-aware node_modules 解析:支持 package.json exports 字段的 import/browser/module/default 条件,\n * 兼容 ESM-only 包(如只有 \"import\" 条件而无 \"require\" 的包)。\n * createRequire 使用 CJS 解析逻辑,遇到 ESM-only exports 会抛异常,因此不能用于此场景。\n */\nfunction resolveNodeModule(root: string, moduleName: string): string | null {\n // 解析包名和子路径(处理 scoped 包如 @scope/pkg/sub)\n let pkgName: string\n let subpath: string\n if (moduleName.startsWith('@')) {\n const parts = moduleName.split('/')\n pkgName = parts.slice(0, 2).join('/')\n subpath = parts.slice(2).join('/')\n } else {\n const slash = moduleName.indexOf('/')\n pkgName = slash === -1 ? moduleName : moduleName.slice(0, slash)\n subpath = slash === -1 ? '' : moduleName.slice(slash + 1)\n }\n\n // 向上查找 node_modules\n let pkgDir: string | null = null\n let dir = root\n for (;;) {\n const candidate = path.join(dir, 'node_modules', pkgName)\n if (fs.existsSync(candidate)) { pkgDir = candidate; break }\n const parent = path.dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n if (!pkgDir) return null\n\n const pkgJsonPath = path.join(pkgDir, 'package.json')\n if (!fs.existsSync(pkgJsonPath)) return null\n let pkg: Record<string, any>\n try { pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8')) } catch { return null }\n\n // 优先使用 exports 字段(ESM-aware 条件解析)\n if (pkg.exports) {\n const exportKey = subpath ? `./${subpath}` : '.'\n const resolved = resolvePackageExports(pkg.exports, exportKey, pkgDir)\n if (resolved) return resolved\n }\n\n // 子路径直接文件\n if (subpath) {\n // 收集候选目录:包根目录 + module/main 字段所在的目录\n // 如 dom-helpers 的 module: 'esm/index.js',子路径 addClass 应查找 esm/addClass.js\n const subDirs = ['']\n for (const field of ['module', 'main']) {\n if (typeof pkg[field] === 'string') {\n const dir = path.dirname(pkg[field])\n if (dir && dir !== '.' && !subDirs.includes(dir)) subDirs.push(dir)\n }\n }\n for (const dir of subDirs) {\n const direct = path.join(pkgDir, dir, subpath)\n if (fs.existsSync(direct) && fs.statSync(direct).isFile()) return direct\n for (const ext of RESOLVE_EXTENSIONS) {\n if (fs.existsSync(direct + ext)) return direct + ext\n }\n }\n return null\n }\n\n // 主入口回退:module > main\n for (const field of ['module', 'jsnext:main', 'jsnext', 'main']) {\n if (typeof pkg[field] === 'string') {\n const entry = path.join(pkgDir, pkg[field])\n if (fs.existsSync(entry)) return entry\n }\n }\n\n // 最终回退:index.js\n const indexFallback = path.join(pkgDir, 'index.js')\n if (fs.existsSync(indexFallback)) return indexFallback\n\n return null\n}\n\nfunction resolvePackageExports(exports: any, key: string, pkgDir: string): string | null {\n if (typeof exports === 'string') {\n return key === '.' ? path.join(pkgDir, exports) : null\n }\n const entry = exports[key]\n if (entry === undefined) return null\n return resolveExportValue(entry, pkgDir)\n}\n\nfunction resolveExportValue(value: any, pkgDir: string): string | null {\n if (typeof value === 'string') return path.join(pkgDir, value)\n if (Array.isArray(value)) {\n for (const item of value) {\n const r = resolveExportValue(item, pkgDir)\n if (r) return r\n }\n return null\n }\n if (value && typeof value === 'object') {\n for (const cond of ESM_CONDITIONS) {\n if (cond in value) {\n const r = resolveExportValue(value[cond], pkgDir)\n if (r) return r\n }\n }\n }\n return null\n}\n\nfunction resolveUrlToFile(url: string, root: string): string | null {\n // 去除查询参数\n const cleanUrl = url.split('?')[0]\n\n // /@modules/ 前缀 → node_modules 预构建\n if (cleanUrl.startsWith('/@modules/')) {\n const moduleName = cleanUrl.slice('/@modules/'.length)\n return resolveNodeModule(root, moduleName)\n }\n\n // 普通路径\n const filePath = path.resolve(root, cleanUrl.replace(/^\\//, ''))\n\n // 精确路径存在\n if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {\n return filePath\n }\n\n // 扩展名补全(处理无扩展名导入,如 ./App → ./App.tsx)\n for (const ext of RESOLVE_EXTENSIONS) {\n const withExt = filePath + ext\n if (fs.existsSync(withExt)) return withExt\n }\n\n // 目录 index 文件(如 ./utils → ./utils/index.ts)\n for (const ext of RESOLVE_EXTENSIONS) {\n const indexFile = path.join(filePath, 'index' + ext)\n if (fs.existsSync(indexFile)) return indexFile\n }\n\n return null\n}\n\nfunction isModuleRequest(url: string): boolean {\n const cleanUrl = url.split('?')[0]\n if (/\\.(ts|tsx|jsx|js|mjs|vue|css|json)$/.test(cleanUrl)) return true\n if (cleanUrl.startsWith('/@modules/')) return true\n // 无扩展名路径可能是省略扩展名的模块导入(如 /src/App)\n if (!path.extname(cleanUrl)) return true\n return false\n}\n\nfunction getHmrClientCode(): string {\n return `\n// Nasti HMR Client\nconst socket = new WebSocket(\\`ws://\\${location.host}\\`, 'nasti-hmr');\nconst hotModulesMap = new Map();\nconst disposeMap = new Map();\nconst pruneMap = new Map();\n\nsocket.addEventListener('message', ({ data }) => {\n const payload = JSON.parse(data);\n switch (payload.type) {\n case 'connected':\n console.log('[nasti] connected.');\n clearErrorOverlay();\n break;\n case 'update':\n payload.updates.forEach((update) => {\n if (update.type === 'js-update') {\n fetchUpdate(update);\n } else if (update.type === 'css-update') {\n updateCss(update.path);\n }\n });\n clearErrorOverlay();\n break;\n case 'full-reload':\n console.log('[nasti] full reload');\n location.reload();\n break;\n case 'prune':\n payload.paths.forEach((p) => {\n const cb = pruneMap.get(p);\n if (cb) cb();\n });\n break;\n case 'error':\n console.error('[nasti] error:', payload.err.message);\n showErrorOverlay(payload.err);\n break;\n }\n});\n\n// 自动重连(断线时指数退避)\nlet reconnectTimer = 0;\nsocket.addEventListener('close', () => {\n clearTimeout(reconnectTimer);\n reconnectTimer = setTimeout(() => location.reload(), 1000);\n});\n\nasync function fetchUpdate(update) {\n const mod = hotModulesMap.get(update.path);\n // 先跑 dispose(给模块机会清理副作用)\n const dispose = disposeMap.get(update.path);\n if (dispose) dispose();\n\n const newMod = await import(update.acceptedPath + '?t=' + update.timestamp);\n if (mod) {\n // 复制回调数组避免回调内部又修改 hotModulesMap 造成迭代异常\n [...mod.callbacks].forEach((cb) => cb(newMod));\n }\n}\n\nfunction updateCss(path) {\n const el = document.querySelector(\\`style[data-nasti-css=\"\\${path}\"]\\`);\n if (el) {\n fetch(path + '?t=' + Date.now())\n .then(r => r.text())\n .then(css => { el.textContent = css; });\n }\n}\n\nfunction clearErrorOverlay() {\n const el = document.getElementById('nasti-error-overlay');\n if (el) el.remove();\n}\n\nfunction showErrorOverlay(err) {\n clearErrorOverlay();\n const overlay = document.createElement('div');\n overlay.id = 'nasti-error-overlay';\n overlay.style.cssText = 'position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,0.85);color:#fff;font-family:monospace;padding:2rem;overflow:auto;';\n const title = document.createElement('h2');\n title.style.color = '#ff5555';\n title.textContent = 'Build Error';\n const pre = document.createElement('pre');\n pre.textContent = err.message + '\\\\n' + (err.stack || '');\n const btn = document.createElement('button');\n btn.style.cssText = 'margin-top:1rem;padding:0.5rem 1rem;cursor:pointer';\n btn.textContent = 'Close';\n btn.onclick = () => overlay.remove();\n overlay.appendChild(title);\n overlay.appendChild(pre);\n overlay.appendChild(btn);\n document.body.appendChild(overlay);\n}\n\n/**\n * 生成 import.meta.hot 的 hot context。\n * 关键约束:同一 ownerPath 的 accept 回调必须替换(不是 append)。\n * 每次模块重新 import 都会调用 createHotContext,旧回调会被 fetchUpdate 调用后立即被新 import\n * 里的 accept 替换。不替换的话每编辑一次就多一个回调,越跑越慢。\n */\nexport function createHotContext(ownerPath) {\n return {\n accept(deps, callback) {\n // 自接受: hot.accept() 或 hot.accept(callback)\n if (typeof deps === 'function' || deps === undefined) {\n hotModulesMap.set(ownerPath, { callbacks: [deps || (() => {})] });\n return;\n }\n // 依赖接受: hot.accept(deps, callback),多次调用追加\n const existing = hotModulesMap.get(ownerPath)?.callbacks ?? [];\n hotModulesMap.set(ownerPath, { callbacks: [...existing, callback] });\n },\n prune(callback) {\n pruneMap.set(ownerPath, callback);\n },\n dispose(callback) {\n disposeMap.set(ownerPath, callback);\n },\n invalidate() {\n location.reload();\n },\n data: {},\n };\n}\n`\n}\n","// HMR 逻辑 - 文件变更 → 模块失效 → 通知客户端\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport type { DevServer, ModuleNode, HmrPayload, HmrUpdate, HmrContext } from '../types.js'\nimport { ModuleGraph } from '../core/module-graph.js'\n\nexport async function handleFileChange(\n file: string,\n server: DevServer,\n): Promise<void> {\n const { moduleGraph, ws, config } = server\n const relativePath = '/' + path.relative(config.root, file)\n\n // 找到受影响的模块\n const mods = moduleGraph.getModulesByFile(file)\n if (!mods || mods.size === 0) {\n // 未跟踪的文件变更,可能需要 full reload\n return\n }\n\n const updates: HmrUpdate[] = []\n const timestamp = Date.now()\n\n for (const mod of mods) {\n // 使缓存失效\n moduleGraph.invalidateModule(mod)\n\n // 执行插件的 handleHotUpdate 钩子\n const ctx: HmrContext = {\n file,\n timestamp,\n modules: [mod],\n read: () => fs.readFileSync(file, 'utf-8'),\n server,\n }\n\n let affectedModules: ModuleNode[] = [mod]\n for (const plugin of config.plugins) {\n if (plugin.handleHotUpdate) {\n const result = await plugin.handleHotUpdate(ctx)\n if (result) {\n affectedModules = result\n }\n }\n }\n\n // 检查 HMR 边界\n for (const affected of affectedModules) {\n const boundaries = (moduleGraph as ModuleGraph).getHmrBoundaries(affected)\n if (boundaries.length === 0) {\n // 无法热更新,full reload\n ws.send({ type: 'full-reload', path: relativePath })\n return\n }\n\n for (const { boundary } of boundaries) {\n updates.push({\n type: boundary.type === 'css' ? 'css-update' : 'js-update',\n path: boundary.url,\n acceptedPath: affected.url,\n timestamp,\n })\n }\n }\n }\n\n if (updates.length > 0) {\n ws.send({ type: 'update', updates })\n }\n}\n","// 模块解析插件 - 处理 bare imports、路径 alias、文件扩展名\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nexport function resolvePlugin(config: ResolvedConfig): NastiPlugin {\n const { alias, extensions } = config.resolve\n const require = createRequire(path.resolve(config.root, 'package.json'))\n\n return {\n name: 'nasti:resolve',\n enforce: 'pre',\n\n resolveId(source, importer) {\n // 1. 处理 alias\n for (const [key, value] of Object.entries(alias)) {\n if (source === key || source.startsWith(key + '/')) {\n source = source.replace(key, value)\n // 如果 alias 值是绝对路径就直接用,否则相对于 root 解析\n if (!path.isAbsolute(source)) {\n source = path.resolve(config.root, source)\n }\n break\n }\n }\n\n // 2. 绝对路径\n if (path.isAbsolute(source)) {\n const resolved = tryResolveFile(source, extensions)\n if (resolved) return resolved\n }\n\n // 3. 相对路径\n if (source.startsWith('.')) {\n const dir = importer ? path.dirname(importer) : config.root\n const absolute = path.resolve(dir, source)\n const resolved = tryResolveFile(absolute, extensions)\n if (resolved) return resolved\n }\n\n // 4. bare import (node_modules)\n if (!source.startsWith('/') && !source.startsWith('.')) {\n try {\n const resolved = require.resolve(source, {\n paths: [importer ? path.dirname(importer) : config.root],\n })\n return resolved\n } catch {\n return null\n }\n }\n\n return null\n },\n\n load(id) {\n if (!fs.existsSync(id)) return null\n // JSON 文件包装为 ES 模块\n if (id.endsWith('.json')) {\n const content = fs.readFileSync(id, 'utf-8')\n return `export default ${content}`\n }\n return fs.readFileSync(id, 'utf-8')\n },\n }\n}\n\n/** 尝试解析文件,带扩展名补全和 index 文件查找 */\nfunction tryResolveFile(file: string, extensions: string[]): string | null {\n // 精确路径\n if (fs.existsSync(file) && fs.statSync(file).isFile()) {\n return file\n }\n\n // 尝试加扩展名\n for (const ext of extensions) {\n const withExt = file + ext\n if (fs.existsSync(withExt) && fs.statSync(withExt).isFile()) {\n return withExt\n }\n }\n\n // 尝试作为目录查找 index 文件\n if (fs.existsSync(file) && fs.statSync(file).isDirectory()) {\n for (const ext of extensions) {\n const indexFile = path.join(file, 'index' + ext)\n if (fs.existsSync(indexFile)) {\n return indexFile\n }\n }\n }\n\n return null\n}\n","// CSS 处理插件 - 处理 .css 导入\nimport path from 'node:path'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nexport function cssPlugin(config: ResolvedConfig): NastiPlugin {\n return {\n name: 'nasti:css',\n\n resolveId(source) {\n if (source.endsWith('.css')) return null // 交给 resolve 插件处理\n return null\n },\n\n transform(code, id) {\n if (!id.endsWith('.css')) return null\n\n // 将 CSS 中的相对 url() 路径重写为绝对路径,确保打包后资源路径正确\n const rewritten = rewriteCssUrls(code, id, config.root)\n\n if (config.command === 'serve') {\n // Dev 模式: 将 CSS 转为 JS 模块,通过 style 标签注入\n const escaped = JSON.stringify(rewritten)\n return {\n code: `\nconst css = ${escaped};\nconst __nasti_css_id__ = ${JSON.stringify(id)};\nconst __nasti_existing__ = document.querySelector('style[data-nasti-css=' + JSON.stringify(__nasti_css_id__) + ']');\nif (__nasti_existing__) __nasti_existing__.remove();\nconst style = document.createElement('style');\nstyle.setAttribute('data-nasti-css', __nasti_css_id__);\nstyle.textContent = css;\ndocument.head.appendChild(style);\n\n// HMR\nif (import.meta.hot) {\n import.meta.hot.accept();\n import.meta.hot.prune(() => {\n style.remove();\n });\n}\n\nexport default css;\n`,\n }\n }\n\n // Build 模式: 返回重写后的 CSS,由 rolldown 处理提取\n return rewritten !== code ? { code: rewritten } : null\n },\n }\n}\n\n/** CSS URL 重写(将相对路径转为绝对路径) */\nexport function rewriteCssUrls(css: string, from: string, root: string): string {\n return css.replace(/url\\(\\s*['\"]?([^'\")\\s]+)['\"]?\\s*\\)/g, (match, url: string) => {\n // 跳过绝对路径、data URI、http(s) URL\n if (url.startsWith('/') || url.startsWith('data:') || url.startsWith('http')) {\n return match\n }\n const resolved = path.resolve(path.dirname(from), url)\n const relative = '/' + path.relative(root, resolved)\n return `url(${relative})`\n })\n}\n","// 静态资源处理插件 - 图片、字体等\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport crypto from 'node:crypto'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nconst ASSET_EXTENSIONS = new Set([\n '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.webp', '.avif',\n '.mp4', '.webm', '.ogg', '.mp3', '.wav', '.flac', '.aac',\n '.woff', '.woff2', '.eot', '.ttf', '.otf',\n '.pdf', '.txt',\n])\n\nexport function assetsPlugin(config: ResolvedConfig): NastiPlugin {\n return {\n name: 'nasti:assets',\n\n resolveId(source) {\n // 处理 ?url 和 ?raw 后缀\n if (source.endsWith('?url') || source.endsWith('?raw')) {\n return source\n }\n return null\n },\n\n load(id) {\n const ext = path.extname(id.replace(/\\?.*$/, ''))\n\n // ?raw 查询: 返回文件原始内容\n if (id.endsWith('?raw')) {\n const file = id.slice(0, -4)\n if (fs.existsSync(file)) {\n const content = fs.readFileSync(file, 'utf-8')\n return `export default ${JSON.stringify(content)}`\n }\n }\n\n // ?url 查询或静态资源扩展名: 返回 URL\n if (id.endsWith('?url') || ASSET_EXTENSIONS.has(ext)) {\n const file = id.replace(/\\?.*$/, '')\n if (!fs.existsSync(file)) return null\n\n if (config.command === 'serve') {\n // Dev 模式: 返回相对于 root 的路径\n const url = '/' + path.relative(config.root, file)\n return `export default ${JSON.stringify(url)}`\n }\n\n // Build 模式: 计算内容哈希用于文件名\n const content = fs.readFileSync(file)\n const hash = crypto.createHash('sha256').update(content).digest('hex').slice(0, 8)\n const basename = path.basename(file, ext)\n const hashedName = `${config.build.assetsDir}/${basename}.${hash}${ext}`\n return `export default ${JSON.stringify(config.base + hashedName)}`\n }\n\n return null\n },\n }\n}\n\nexport function isAssetFile(id: string): boolean {\n const ext = path.extname(id.replace(/\\?.*$/, ''))\n return ASSET_EXTENSIONS.has(ext)\n}\n","// Dev Server 主逻辑\nimport http from 'node:http'\nimport path from 'node:path'\nimport os from 'node:os'\nimport connect from 'connect'\nimport sirv from 'sirv'\nimport { watch } from 'chokidar'\nimport pc from 'picocolors'\nimport type { NastiConfig, ResolvedConfig, DevServer } from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { PluginContainer } from '../core/plugin-container.js'\nimport { ModuleGraph } from '../core/module-graph.js'\nimport { createWebSocketServer } from './ws.js'\nimport { transformMiddleware } from './middleware.js'\nimport { handleFileChange } from './hmr.js'\nimport { resolvePlugin } from '../plugins/resolve.js'\nimport { cssPlugin } from '../plugins/css.js'\nimport { assetsPlugin } from '../plugins/assets.js'\nimport { htmlPlugin } from '../plugins/html.js'\n\nexport async function createServer(inlineConfig: NastiConfig = {}): Promise<DevServer> {\n const config = await resolveConfig(inlineConfig, 'serve')\n\n // 组装内置插件 + 用户插件\n const allPlugins = [\n resolvePlugin(config),\n cssPlugin(config),\n assetsPlugin(config),\n htmlPlugin(config),\n ...config.plugins,\n ]\n const configWithPlugins: ResolvedConfig = { ...config, plugins: allPlugins }\n\n const moduleGraph = new ModuleGraph()\n const pluginContainer = new PluginContainer(configWithPlugins)\n\n // HTTP 服务\n const app = connect()\n\n // 转译中间件(处理 .ts, .tsx, .jsx, .css, .vue 等)\n app.use(transformMiddleware({\n config: configWithPlugins,\n pluginContainer,\n moduleGraph,\n }))\n\n // 静态文件服务(public 目录 + 项目根目录)\n const publicDir = path.resolve(config.root, 'public')\n app.use(sirv(publicDir, { dev: true, etag: true }))\n app.use(sirv(config.root, { dev: true, etag: true }))\n\n const httpServer = http.createServer(app)\n const ws = createWebSocketServer(httpServer)\n\n // 文件监听\n // chokidar v4 不再把 `ignored` 字符串当作 glob 处理,而是按字面值精确匹配\n // (见 chokidar/esm/index.js 的 createPattern),原先的 `**/node_modules/**`\n // 等模式根本不会命中任何路径,导致 watcher 递归进入 node_modules 并对每个\n // 子目录调用 fs.watch,在 macOS 上很快耗尽 fd 触发 EMFILE。改用函数 matcher\n // 显式判定相对段。\n const ignoredSegments = new Set(['node_modules', '.git', '.nasti'])\n const outDirAbs = path.resolve(config.root, config.build.outDir)\n const watcher = watch(config.root, {\n ignored: (filePath: string) => {\n if (filePath === config.root) return false\n if (filePath === outDirAbs || filePath.startsWith(outDirAbs + path.sep)) return true\n const rel = path.relative(config.root, filePath)\n if (!rel || rel.startsWith('..') || path.isAbsolute(rel)) return false\n for (const seg of rel.split(path.sep)) {\n if (ignoredSegments.has(seg)) return true\n }\n return false\n },\n ignoreInitial: true,\n })\n\n // 先声明 server 变量,再赋值\n let server: DevServer\n\n watcher.on('change', (file: string) => {\n handleFileChange(file, server)\n })\n\n watcher.on('add', (file: string) => {\n handleFileChange(file, server)\n })\n\n server = {\n config: configWithPlugins,\n middlewares: app,\n moduleGraph: moduleGraph as any,\n watcher,\n ws,\n\n async listen(port?: number) {\n const finalPort = port ?? config.server.port\n const host = config.server.host === true ? '0.0.0.0' : (config.server.host as string)\n\n await pluginContainer.buildStart()\n\n return new Promise((resolve, reject) => {\n let currentPort = finalPort\n\n const onListening = () => {\n const actualPort = (httpServer.address() as any)?.port ?? currentPort\n config.server.port = actualPort\n const localUrl = `http://localhost:${actualPort}`\n const networkUrl = host === '0.0.0.0' ? `http://${getNetworkAddress()}:${actualPort}` : null\n\n console.log()\n console.log(pc.cyan(' nasti dev server') + pc.dim(` v${__NASTI_VERSION__}`))\n console.log()\n console.log(` ${pc.green('>')} Local: ${pc.cyan(localUrl)}`)\n if (networkUrl) {\n console.log(` ${pc.green('>')} Network: ${pc.cyan(networkUrl)}`)\n }\n console.log()\n\n resolve(server)\n }\n\n httpServer.on('listening', onListening)\n httpServer.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n currentPort++\n console.log(pc.yellow(`Port ${currentPort - 1} is in use, trying ${currentPort}...`))\n httpServer.listen(currentPort, host)\n } else {\n reject(err)\n }\n })\n\n httpServer.listen(currentPort, host)\n })\n },\n\n async transformRequest(url: string) {\n const { transformRequest } = await import('./middleware.js')\n return transformRequest(url, { config: configWithPlugins, pluginContainer, moduleGraph })\n },\n\n async close() {\n await pluginContainer.buildEnd()\n watcher.close()\n ws.close()\n httpServer.close()\n },\n }\n\n // 执行插件的 configureServer 钩子(此时 server 已完全初始化,\n // 插件可安全访问 server.middlewares / server.watcher 等)\n const postMiddlewares: Array<() => void> = []\n for (const plugin of allPlugins) {\n if (plugin.configureServer) {\n const result = await plugin.configureServer(server)\n if (typeof result === 'function') {\n postMiddlewares.push(result)\n }\n }\n }\n // 插件返回的函数会在内置中间件之后执行\n for (const run of postMiddlewares) run()\n\n return server\n}\n\nfunction getNetworkAddress(): string {\n const interfaces = os.networkInterfaces()\n for (const name of Object.keys(interfaces)) {\n for (const iface of interfaces[name] ?? []) {\n if (iface.family === 'IPv4' && !iface.internal) {\n return iface.address\n }\n }\n }\n return 'localhost'\n}\n","// Electron 内置插件\n//\n// 负责:将 Electron 模块(electron、electron/*)与 Node 内建模块(fs、path、...)\n// 标记为 external,避免被打包进主进程/Preload 产物。\n//\n// 仅在 config.target === 'electron' 时启用\nimport { builtinModules } from 'node:module'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nconst NODE_BUILTINS = new Set([\n ...builtinModules,\n ...builtinModules.map((m) => `node:${m}`),\n])\n\nconst ELECTRON_MODULES = new Set([\n 'electron',\n 'electron/main',\n 'electron/common',\n 'electron/renderer',\n])\n\n/**\n * Create a Vite/Rollup plugin that externalizes Electron and Node built-in imports according to the resolved config.\n *\n * @param config - Resolved build config; any entries in `config.electron.external` are added to the externalized modules set.\n * @returns A plugin that marks `electron` and `electron/*` imports and Node built-in modules (including `node:`-prefixed names) as external.\n */\nexport function electronPlugin(config: ResolvedConfig): NastiPlugin {\n const external = new Set([\n ...ELECTRON_MODULES,\n ...NODE_BUILTINS,\n ...(config.electron.external ?? []),\n ])\n\n return {\n name: 'nasti:electron',\n enforce: 'pre',\n\n resolveId(source) {\n // 显式外部化 electron 与 Node 内建模块\n if (external.has(source)) {\n return { id: source, external: true }\n }\n // 形如 `electron/xxx` 的子路径一律标记外部\n if (source.startsWith('electron/')) {\n return { id: source, external: true }\n }\n return null\n },\n }\n}\n","// 生产构建 - 调用 Rolldown API 打包\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { rolldown } from 'rolldown'\nimport type { NastiConfig, ResolvedConfig } from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { resolvePlugin } from '../plugins/resolve.js'\nimport { cssPlugin } from '../plugins/css.js'\nimport { assetsPlugin } from '../plugins/assets.js'\nimport { htmlPlugin, readHtmlFile, processHtml } from '../plugins/html.js'\nimport { transformCode, shouldTransform } from '../core/transformer.js'\nimport { loadEnv, buildEnvDefine } from '../core/env.js'\nimport { PluginContainer } from '../core/plugin-container.js'\nimport pc from 'picocolors'\n\nexport interface BuildResult {\n output: Array<{ fileName: string; type: string; code?: string; source?: Uint8Array | string }>\n}\n\nexport async function build(inlineConfig: NastiConfig = {}): Promise<BuildResult> {\n const config = await resolveConfig(inlineConfig, 'build')\n const startTime = performance.now()\n\n console.log(pc.cyan('\\n🔨 nasti build') + pc.dim(` v${__NASTI_VERSION__}`))\n console.log(pc.dim(` root: ${config.root}`))\n console.log(pc.dim(` mode: ${config.mode}`))\n\n const outDir = path.resolve(config.root, config.build.outDir)\n\n // 清空输出目录\n if (config.build.emptyOutDir && fs.existsSync(outDir)) {\n fs.rmSync(outDir, { recursive: true, force: true })\n }\n fs.mkdirSync(outDir, { recursive: true })\n\n // 查找 HTML 入口中的 script 标签作为 entry\n const html = await readHtmlFile(config.root)\n let entryPoints: string[] = []\n\n if (html) {\n const scriptMatches = html.matchAll(/<script[^>]+src=[\"']([^\"']+)[\"'][^>]*>/gi)\n for (const match of scriptMatches) {\n const src = match[1]\n if (src && !src.startsWith('http')) {\n entryPoints.push(path.resolve(config.root, src.replace(/^\\//, '')))\n }\n }\n }\n\n if (entryPoints.length === 0) {\n // 回退: 尝试常见入口\n const fallbackEntries = ['src/main.ts', 'src/main.tsx', 'src/main.js', 'src/index.ts', 'src/index.tsx', 'src/index.js']\n for (const entry of fallbackEntries) {\n const fullPath = path.resolve(config.root, entry)\n if (fs.existsSync(fullPath)) {\n entryPoints.push(fullPath)\n break\n }\n }\n }\n\n if (entryPoints.length === 0) {\n throw new Error('No entry point found. Add a <script> tag to index.html or create src/main.ts')\n }\n\n // 构建内置插件 + 用户插件作为 Rolldown 插件\n const builtinPlugins = [\n resolvePlugin(config),\n cssPlugin(config),\n assetsPlugin(config),\n ]\n const allPlugins = [...builtinPlugins, ...config.plugins]\n\n // 运行插件的 buildStart 钩子,并收集 emitFile 输出文件\n const pluginContainer = new PluginContainer(config)\n await pluginContainer.buildStart()\n\n // oxc-transform 插件(作为 Rolldown 插件)\n const oxcTransformPlugin = {\n name: 'nasti:oxc-transform',\n transform(code: string, id: string) {\n if (!shouldTransform(id)) return null\n const result = transformCode(id, code, {\n sourcemap: !!config.build.sourcemap,\n jsxRuntime: 'automatic',\n jsxImportSource: config.framework === 'vue' ? 'vue' : 'react',\n })\n return { code: result.code, map: result.map ? JSON.parse(result.map) : undefined }\n },\n }\n\n // 加载环境变量并生成 define 替换表\n const env = loadEnv(config.mode, config.root, config.envPrefix)\n const envDefine = buildEnvDefine(env, config.mode)\n\n // 调用 Rolldown\n const bundle = await rolldown({\n input: entryPoints,\n define: envDefine,\n plugins: [\n oxcTransformPlugin,\n // 转换 Nasti 插件为 Rolldown 插件格式\n ...allPlugins.map((p) => ({\n name: p.name,\n resolveId: p.resolveId as any,\n load: p.load as any,\n transform: p.transform as any,\n buildStart: p.buildStart as any,\n buildEnd: p.buildEnd as any,\n })),\n ],\n ...(config.build.rolldownOptions as any),\n })\n\n const { output } = await bundle.write({\n dir: outDir,\n format: 'esm',\n sourcemap: !!config.build.sourcemap,\n minify: !!config.build.minify,\n entryFileNames: 'assets/[name].[hash].js',\n chunkFileNames: 'assets/[name].[hash].js',\n assetFileNames: 'assets/[name].[hash][extname]',\n })\n\n await bundle.close()\n await pluginContainer.buildEnd()\n\n // 将 emitFile 产出的文件写入输出目录\n for (const ef of pluginContainer.getEmittedFiles()) {\n const dest = path.resolve(outDir, ef.fileName)\n fs.mkdirSync(path.dirname(dest), { recursive: true })\n fs.writeFileSync(dest, ef.source)\n }\n\n // 处理 HTML\n if (html) {\n let processedHtml = html\n\n // 执行插件的 transformIndexHtml 钩子\n const htmlPlugin_ = htmlPlugin(config)\n if (htmlPlugin_.transformIndexHtml) {\n const result = await htmlPlugin_.transformIndexHtml(processedHtml)\n if (typeof result === 'string') {\n processedHtml = result\n } else if (result && 'html' in result) {\n processedHtml = processHtml(result.html, result.tags)\n } else if (Array.isArray(result)) {\n processedHtml = processHtml(processedHtml, result)\n }\n }\n\n // 替换 script src 为打包后的路径(支持多入口)\n for (const chunk of output) {\n if (chunk.type === 'chunk' && chunk.isEntry && chunk.facadeModuleId) {\n const originalEntry = path.relative(config.root, chunk.facadeModuleId)\n processedHtml = processedHtml.replace(\n new RegExp(`(src=[\"'])/?(${escapeRegExp(originalEntry)})([\"'])`, 'g'),\n `$1${config.base}${chunk.fileName}$3`,\n )\n }\n }\n\n fs.writeFileSync(path.resolve(outDir, 'index.html'), processedHtml)\n }\n\n const elapsed = ((performance.now() - startTime) / 1000).toFixed(2)\n const totalSize = output.reduce((sum, chunk) => {\n if (chunk.type === 'chunk' && chunk.code) return sum + chunk.code.length\n return sum\n }, 0)\n\n console.log(pc.green(`\\n✓ Built in ${elapsed}s`))\n console.log(pc.dim(` ${output.length} files, ${formatSize(totalSize)} total`))\n console.log(pc.dim(` output: ${config.build.outDir}/\\n`))\n\n return { output: output as any }\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} kB`\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n","// Electron 构建入口\n//\n// 流水线:\n// 1. 渲染进程(Web)构建 —— 复用现有 build() 流水线,输出到 outDir/renderer\n// 2. 主进程构建 —— 独立 Rolldown,target=node22,external=electron+内建模块\n// 3. Preload 构建 —— 独立 Rolldown,默认 cjs,contextIsolation 友好\n//\n// 产物目录结构(默认):\n// dist/\n// ├── renderer/ Web 渲染层,与 nasti build 一致\n// ├── main.{cjs,mjs}\n// └── preload.{cjs,mjs}\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { rolldown } from 'rolldown'\nimport pc from 'picocolors'\nimport type { NastiConfig, ResolvedConfig } from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { resolvePlugin } from '../plugins/resolve.js'\nimport { electronPlugin } from '../plugins/electron.js'\nimport { transformCode, shouldTransform } from '../core/transformer.js'\nimport { loadEnv, buildEnvDefine } from '../core/env.js'\n\nexport interface ElectronBuildResult {\n rendererOutDir: string\n mainFile: string\n preloadFiles: string[]\n}\n\n/**\n * Performs a full Electron build pipeline producing renderer, main, and preload artifacts.\n *\n * Resolves an Electron-targeted config, validates the installed Electron version, prepares the output directory, builds the renderer (via the web build), bundles the main process, bundles configured preload scripts, and logs a summary.\n *\n * @param inlineConfig - Optional config overrides merged into the resolved build configuration\n * @returns An object with `rendererOutDir` (renderer output directory), `mainFile` (bundled main process file path), and `preloadFiles` (array of bundled preload file paths)\n * @throws Error if the configured Electron main entry file does not exist\n */\nexport async function buildElectron(inlineConfig: NastiConfig = {}): Promise<ElectronBuildResult> {\n const config = await resolveConfig({ ...inlineConfig, target: 'electron' }, 'build')\n const startTime = performance.now()\n\n assertElectronVersion(config)\n\n console.log(pc.cyan('\\n⚡ nasti build (electron)') + pc.dim(` v${__NASTI_VERSION__}`))\n console.log(pc.dim(` root: ${config.root}`))\n console.log(pc.dim(` mode: ${config.mode}`))\n console.log(pc.dim(` target: electron (≥ ${config.electron.minVersion})`))\n\n const outDir = path.resolve(config.root, config.build.outDir)\n if (config.build.emptyOutDir && fs.existsSync(outDir)) {\n fs.rmSync(outDir, { recursive: true, force: true })\n }\n fs.mkdirSync(outDir, { recursive: true })\n\n // ---- 1. 渲染进程(复用 Web 构建)----\n const rendererOutDir = path.join(outDir, 'renderer')\n const { build } = await import('./index.js')\n await build({\n ...inlineConfig,\n target: 'web',\n build: {\n ...inlineConfig.build,\n outDir: rendererOutDir,\n emptyOutDir: false,\n },\n })\n\n // ---- 2. 主进程 ----\n const mainEntry = path.resolve(config.root, config.electron.main)\n if (!fs.existsSync(mainEntry)) {\n throw new Error(\n `Electron main entry not found: ${config.electron.main}\\n` +\n `在 nasti.config.ts 的 electron.main 指定主进程入口文件。`,\n )\n }\n const mainFile = await bundleNode(config, mainEntry, {\n outFile: outFileName(outDir, 'main', config.electron.mainFormat),\n format: config.electron.mainFormat,\n label: 'main',\n })\n\n // ---- 3. Preload ----\n const preloadEntries = normalizePreload(config.electron.preload, config.root)\n const preloadFiles: string[] = []\n for (const entry of preloadEntries) {\n if (!fs.existsSync(entry)) {\n console.warn(pc.yellow(` ⚠ preload entry not found, skipped: ${entry}`))\n continue\n }\n const base = path.basename(entry).replace(/\\.[^.]+$/, '')\n const out = outFileName(outDir, base, config.electron.preloadFormat)\n await bundleNode(config, entry, {\n outFile: out,\n format: config.electron.preloadFormat,\n label: `preload (${base})`,\n })\n preloadFiles.push(out)\n }\n\n const elapsed = ((performance.now() - startTime) / 1000).toFixed(2)\n console.log(pc.green(`\\n✓ Electron build complete in ${elapsed}s`))\n console.log(pc.dim(` renderer: ${path.relative(config.root, rendererOutDir)}/`))\n console.log(pc.dim(` main: ${path.relative(config.root, mainFile)}`))\n for (const pf of preloadFiles) {\n console.log(pc.dim(` preload: ${path.relative(config.root, pf)}`))\n }\n console.log()\n\n return { rendererOutDir, mainFile, preloadFiles }\n}\n\ninterface BundleNodeOptions {\n outFile: string\n format: 'cjs' | 'esm'\n label: string\n}\n\n/**\n * Bundles a Node-targeted entry for Electron into a single output file using Rolldown and the OXC transform.\n *\n * @param config - Fully resolved build configuration used to drive transforms, defines, plugins, and output options\n * @param entry - Absolute path to the entry file to bundle\n * @param opts - Bundle options; expects `outFile` (destination path), `format` (`'cjs'` or `'esm'`), and `label` (human-readable name for logging)\n * @returns The path to the written bundle file (`opts.outFile`)\n */\nasync function bundleNode(\n config: ResolvedConfig,\n entry: string,\n opts: BundleNodeOptions,\n): Promise<string> {\n const env = loadEnv(config.mode, config.root, config.envPrefix)\n const envDefine = {\n ...buildEnvDefine(env, config.mode),\n __ELECTRON__: 'true',\n __NASTI_TARGET__: JSON.stringify('electron'),\n }\n\n const oxcTransformPlugin = {\n name: 'nasti:oxc-transform',\n transform(code: string, id: string) {\n if (!shouldTransform(id)) return null\n const result = transformCode(id, code, {\n sourcemap: !!config.build.sourcemap,\n jsxRuntime: 'automatic',\n jsxImportSource: config.framework === 'vue' ? 'vue' : 'react',\n })\n return { code: result.code, map: result.map ? JSON.parse(result.map) : undefined }\n },\n }\n\n const bundle = await rolldown({\n input: entry,\n define: envDefine,\n platform: 'node',\n plugins: [oxcTransformPlugin, electronPlugin(config), resolvePlugin(config)] as any,\n ...(config.build.rolldownOptions as any),\n })\n\n fs.mkdirSync(path.dirname(opts.outFile), { recursive: true })\n\n await bundle.write({\n file: opts.outFile,\n format: opts.format === 'cjs' ? 'cjs' : 'esm',\n sourcemap: !!config.build.sourcemap,\n minify: !!config.build.minify,\n codeSplitting: false,\n })\n\n await bundle.close()\n\n console.log(pc.dim(` ✓ ${opts.label} → ${path.relative(config.root, opts.outFile)}`))\n return opts.outFile\n}\n\n/**\n * Compute an output file path for a given base name and module format.\n *\n * @param outDir - Directory where the output file will be placed\n * @param base - Base filename without extension\n * @param format - Module format; `cjs` yields a `.cjs` extension, `esm` yields a `.mjs` extension\n * @returns The resolved file path combining `outDir` and `base` with the appropriate extension\n */\nfunction outFileName(outDir: string, base: string, format: 'cjs' | 'esm'): string {\n const ext = format === 'cjs' ? '.cjs' : '.mjs'\n return path.join(outDir, base + ext)\n}\n\n/**\n * Normalize Electron preload entries into absolute file paths.\n *\n * @param preload - A single preload path or an array of preload paths; a falsy value produces an empty list\n * @param root - Root directory used to resolve relative preload entries\n * @returns An array of absolute file paths for each preload entry\n */\nexport function normalizePreload(preload: string | string[] | undefined, root: string): string[] {\n const list = Array.isArray(preload) ? preload : preload ? [preload] : []\n return list.map((p) => path.resolve(root, p))\n}\n\n/**\n * Warns when the detected Electron major version is lower than the configured minimum.\n *\n * Checks the project for an installed Electron package and, if its major version\n * is less than `config.electron.minVersion`, logs a yellow warning describing the mismatch.\n *\n * @param config - Resolved build configuration that contains `electron.minVersion` and project `root`\n */\nfunction assertElectronVersion(config: ResolvedConfig): void {\n const min = config.electron.minVersion\n const installed = detectInstalledElectron(config.root)\n if (installed && installed < min) {\n console.warn(\n pc.yellow(\n ` ⚠ 检测到 Electron ${installed},Nasti 要求 ≥ ${min}。旧版本可能缺少 ESM 主进程支持。`,\n ),\n )\n }\n}\n\n/**\n * Detects the installed Electron major version in the given project root.\n *\n * @param root - Project root directory used to locate `node_modules/electron/package.json`\n * @returns The major Electron version as a number, or `null` if Electron is not installed or the version cannot be determined\n */\nexport function detectInstalledElectron(root: string): number | null {\n try {\n const pkgPath = path.resolve(root, 'node_modules/electron/package.json')\n if (!fs.existsSync(pkgPath)) return null\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n const major = parseInt(String(pkg.version).split('.')[0], 10)\n return Number.isFinite(major) ? major : null\n } catch {\n return null\n }\n}\n","// Electron 开发模式\n//\n// 启动流程:\n// 1. 启动 Nasti dev server(渲染进程由 Chromium 加载 http://localhost:PORT/)\n// 2. 编译主进程与 preload 到 .nasti/ 临时目录(watch 模式)\n// 3. spawn Electron 可执行文件,传入主进程入口\n// 4. 监听主/preload 变化 -> 重编译 -> kill & respawn\n//\n// 渲染进程的 HMR 由标准 Nasti dev server 提供,无需额外处理\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { spawn, type ChildProcess } from 'node:child_process'\nimport chokidar from 'chokidar'\nimport pc from 'picocolors'\nimport type { NastiConfig, ResolvedConfig } from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { rolldown } from 'rolldown'\nimport { electronPlugin } from '../plugins/electron.js'\nimport { resolvePlugin } from '../plugins/resolve.js'\nimport { transformCode, shouldTransform } from '../core/transformer.js'\nimport { loadEnv, buildEnvDefine } from '../core/env.js'\nimport { detectInstalledElectron, normalizePreload } from '../build/electron.js'\n\nexport interface ElectronDevOptions extends NastiConfig {\n /** 不启动 Electron 进程,只编译主/preload(CI 场景) */\n noSpawn?: boolean\n}\n\n/**\n * Start an Electron-focused development workflow: run the renderer dev server, build the main and preload bundles into .nasti/, and optionally spawn Electron with automatic restarts.\n *\n * @param inlineConfig - Development options; when `inlineConfig.noSpawn` is `true`, only compiles main/preload into `.nasti/` and does not start the Electron process.\n */\nexport async function startElectronDev(inlineConfig: ElectronDevOptions = {}): Promise<void> {\n const { noSpawn, ...rest } = inlineConfig\n const config = await resolveConfig({ ...rest, target: 'electron' }, 'serve')\n\n warnElectronVersion(config)\n\n console.log(pc.cyan('\\n⚡ nasti electron dev') + pc.dim(` v${__NASTI_VERSION__}`))\n\n // 1. 启动 dev server(渲染进程)\n const { createServer } = await import('./index.js')\n const server = await createServer({ ...rest, target: 'electron' })\n await server.listen()\n\n const devUrl = `http://localhost:${server.config.server.port}/`\n console.log(pc.dim(` renderer: ${devUrl}`))\n\n // 2. 编译主进程 + preload 到 .nasti/\n const stageDir = path.resolve(config.root, '.nasti')\n fs.mkdirSync(stageDir, { recursive: true })\n\n const mainEntry = path.resolve(config.root, config.electron.main)\n const preloadEntries = normalizePreload(config.electron.preload, config.root)\n\n const builtMainFile = path.join(stageDir, 'main' + extFor(config.electron.mainFormat))\n const builtPreloadFiles: string[] = []\n\n const compileAll = async () => {\n await compileNode(config, mainEntry, {\n outFile: builtMainFile,\n format: config.electron.mainFormat,\n devUrl,\n })\n builtPreloadFiles.length = 0\n for (const entry of preloadEntries) {\n if (!fs.existsSync(entry)) continue\n const base = path.basename(entry).replace(/\\.[^.]+$/, '')\n const out = path.join(stageDir, base + extFor(config.electron.preloadFormat))\n await compileNode(config, entry, {\n outFile: out,\n format: config.electron.preloadFormat,\n devUrl,\n })\n builtPreloadFiles.push(out)\n }\n }\n\n await compileAll()\n\n if (noSpawn) {\n console.log(pc.dim(' (noSpawn) 已编译主/preload,跳过启动 Electron。'))\n return\n }\n\n // 3. 启动 Electron\n const electronBin = resolveElectronBinary(config)\n if (!electronBin) {\n console.warn(\n pc.yellow(\n ' ⚠ 未找到 Electron 可执行文件,请先安装:npm install -D electron\\n 已编译主/preload 至 .nasti/,可手动运行。',\n ),\n )\n return\n }\n\n let child: ChildProcess | null = null\n const spawnElectron = () => {\n const args = [builtMainFile, ...config.electron.electronArgs]\n child = spawn(electronBin, args, {\n stdio: 'inherit',\n env: { ...process.env, NASTI_DEV_SERVER_URL: devUrl, NASTI_TARGET: 'electron' },\n })\n child.on('exit', (code) => {\n if (code !== null && child && (child as any).__nastiKilled !== true) {\n console.log(pc.dim(` Electron exited (${code}).`))\n process.exit(code ?? 0)\n }\n })\n }\n spawnElectron()\n\n // 4. 监听主/preload 变化并重启\n if (config.electron.autoRestart) {\n const watchTargets = [mainEntry, ...preloadEntries].filter(fs.existsSync)\n const watcher = chokidar.watch(watchTargets, { ignoreInitial: true })\n // 旧实现:重启进行中就 return,丢弃变更。场景:改主进程后立刻改 preload\n // 会漏掉第二次。现在用 pending 标记 coalesce:等本轮完成后若 pending\n // 为真再跑一次,保证最后一次编辑必被编进去。\n let restarting: Promise<void> | null = null\n let pending = false\n const restart = async (): Promise<void> => {\n if (restarting) {\n pending = true\n return\n }\n restarting = (async () => {\n do {\n pending = false\n console.log(pc.cyan('\\n ♻ 主/preload 变更,重启 Electron...'))\n if (child && !child.killed) {\n ;(child as any).__nastiKilled = true\n const dying = child\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => resolve(), 3000)\n dying.once('exit', () => {\n clearTimeout(timer)\n resolve()\n })\n dying.kill()\n })\n }\n try {\n await compileAll()\n spawnElectron()\n } catch (e: any) {\n console.warn(pc.yellow(` ⚠ 重启编译失败,保留上一次进程: ${e.message}`))\n }\n // 若 pending 在本轮期间被再次置位,立即再跑一轮\n } while (pending)\n restarting = null\n })()\n return restarting\n }\n // chokidar 会对一次保存触发多次事件;小窗口去抖避免过早发起重启\n let debounceTimer: NodeJS.Timeout | null = null\n watcher.on('all', () => {\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(() => {\n debounceTimer = null\n void restart()\n }, 80)\n })\n }\n}\n\n/**\n * Map a module format identifier to its corresponding output file extension.\n *\n * @param format - 'cjs' for CommonJS or 'esm' for ECMAScript modules\n * @returns The file extension to use: '.cjs' for `cjs`, '.mjs' for `esm`\n */\nfunction extFor(format: 'cjs' | 'esm'): string {\n return format === 'cjs' ? '.cjs' : '.mjs'\n}\n\ninterface CompileNodeOpts {\n outFile: string\n format: 'cjs' | 'esm'\n devUrl: string\n}\n\n/**\n * Compile a Node-target entry (Electron main or preload) into a single output file for development.\n *\n * Injects environment defines (including `__ELECTRON__`, `__NASTI_TARGET__`, and `__NASTI_DEV_SERVER_URL__`), applies source transforms, and writes a bundled file using rolldown.\n *\n * @param config - Resolved Nasti configuration used for transforms and plugin resolution\n * @param entry - Path to the entry file to bundle\n * @param opts - Compilation options\n * @param opts.outFile - Destination path for the bundled output\n * @param opts.format - Output module format, either `'cjs'` or `'esm'`\n * @param opts.devUrl - Dev server URL injected into the bundle as `__NASTI_DEV_SERVER_URL__`\n */\nasync function compileNode(config: ResolvedConfig, entry: string, opts: CompileNodeOpts): Promise<void> {\n const env = loadEnv(config.mode, config.root, config.envPrefix)\n const envDefine = {\n ...buildEnvDefine(env, config.mode),\n __ELECTRON__: 'true',\n __NASTI_TARGET__: JSON.stringify('electron'),\n __NASTI_DEV_SERVER_URL__: JSON.stringify(opts.devUrl),\n }\n\n const oxcTransformPlugin = {\n name: 'nasti:oxc-transform',\n transform(code: string, id: string) {\n if (!shouldTransform(id)) return null\n const result = transformCode(id, code, {\n sourcemap: !!config.build.sourcemap,\n jsxRuntime: 'automatic',\n jsxImportSource: config.framework === 'vue' ? 'vue' : 'react',\n })\n return { code: result.code, map: result.map ? JSON.parse(result.map) : undefined }\n },\n }\n\n const bundle = await rolldown({\n input: entry,\n transform: { define: envDefine },\n platform: 'node',\n plugins: [oxcTransformPlugin, electronPlugin(config), resolvePlugin(config)] as any,\n })\n fs.mkdirSync(path.dirname(opts.outFile), { recursive: true })\n await bundle.write({\n file: opts.outFile,\n format: opts.format === 'cjs' ? 'cjs' : 'esm',\n sourcemap: false,\n minify: false,\n // rolldown 已弃用 inlineDynamicImports,改用 codeSplitting:false 表达\n // 同样语义(单 chunk、内联 dynamic import)\n codeSplitting: false,\n })\n await bundle.close()\n}\n\n/**\n * Locate the Electron executable for the given project configuration.\n *\n * Checks `config.electron.electronPath` first (returns it if the file exists), otherwise attempts to resolve the `electron` package export from the project's dependencies and returns that path if it exists.\n *\n * @param config - Resolved project configuration used to determine project root and configured Electron path\n * @returns The file system path to the Electron executable if found, `null` otherwise\n */\nfunction resolveElectronBinary(config: ResolvedConfig): string | null {\n if (config.electron.electronPath && fs.existsSync(config.electron.electronPath)) {\n return config.electron.electronPath\n }\n try {\n const require = createRequire(path.resolve(config.root, 'package.json'))\n // electron 包导出其可执行文件路径\n const pathFile = require.resolve('electron')\n const electronModule = require(pathFile)\n if (typeof electronModule === 'string' && fs.existsSync(electronModule)) {\n return electronModule\n }\n } catch {\n // ignore\n }\n return null\n}\n\n/**\n * Emit console warnings when Electron is missing or its installed version is lower than configured.\n *\n * @param config - Resolved configuration containing the project root and `electron.minVersion` to check against\n */\nfunction warnElectronVersion(config: ResolvedConfig): void {\n const installed = detectInstalledElectron(config.root)\n if (installed === null) {\n console.warn(\n pc.yellow(\n ` ⚠ 未检测到 Electron,请安装:npm install -D electron@^${config.electron.minVersion}`,\n ),\n )\n return\n }\n if (installed < config.electron.minVersion) {\n console.warn(\n pc.yellow(\n ` ⚠ Electron ${installed} 低于 Nasti 要求的 ${config.electron.minVersion},某些特性(如 ESM 主进程)不可用。`,\n ),\n )\n }\n}\n","// Nasti CLI - 命令行入口\nimport { cac } from 'cac'\nimport pc from 'picocolors'\n\nconst cli = cac('nasti')\n\n// nasti dev\ncli\n .command('[root]', 'Start dev server')\n .alias('dev')\n .option('--port <port>', 'Port number', { default: 3000 })\n .option('--host [host]', 'Hostname')\n .option('--open [path]', 'Open browser on startup')\n .option('--mode <mode>', 'Set env mode')\n .action(async (root: string | undefined, options: any) => {\n try {\n const { createServer } = await import('./server/index.js')\n const server = await createServer({\n root: root ?? '.',\n mode: options.mode ?? 'development',\n server: {\n port: options.port,\n host: options.host,\n open: options.open,\n },\n })\n await server.listen()\n } catch (err: any) {\n console.error(pc.red(`\\n Error starting dev server:\\n ${err.message}\\n`))\n if (err.stack) console.error(pc.dim(err.stack))\n process.exit(1)\n }\n })\n\n// nasti build\ncli\n .command('build [root]', 'Build for production')\n .option('--outDir <dir>', 'Output directory', { default: 'dist' })\n .option('--sourcemap', 'Generate source map')\n .option('--minify', 'Minify output', { default: true })\n .option('--mode <mode>', 'Set env mode')\n .option('--target <target>', 'Build target: web | electron', { default: 'web' })\n .action(async (root: string | undefined, options: any) => {\n try {\n const target = options.target\n if (target !== 'web' && target !== 'electron') {\n throw new Error(`Invalid --target \"${target}\". Expected \"web\" or \"electron\".`)\n }\n const inline = {\n root: root ?? '.',\n mode: options.mode ?? 'production',\n target,\n build: {\n outDir: options.outDir,\n sourcemap: options.sourcemap,\n minify: options.minify,\n },\n }\n if (target === 'electron') {\n const { buildElectron } = await import('./build/electron.js')\n await buildElectron(inline)\n } else {\n const { build } = await import('./build/index.js')\n await build(inline)\n }\n } catch (err: any) {\n console.error(pc.red(`\\n Build failed:\\n ${err.message}\\n`))\n if (err.stack) console.error(pc.dim(err.stack))\n process.exit(1)\n }\n })\n\n// nasti electron - 启动 Electron 开发模式\ncli\n .command('electron [root]', 'Start Electron dev mode (requires electron ^41)')\n .alias('electron-dev')\n .option('--port <port>', 'Renderer dev server port', { default: 3000 })\n .option('--host [host]', 'Hostname')\n .option('--mode <mode>', 'Set env mode')\n .option('--no-spawn', 'Compile main/preload but do not spawn Electron')\n .option('--no-restart', 'Disable auto-restart on main/preload changes')\n .action(async (root: string | undefined, options: any) => {\n try {\n const { startElectronDev } = await import('./server/electron-dev.js')\n await startElectronDev({\n root: root ?? '.',\n mode: options.mode ?? 'development',\n target: 'electron',\n server: {\n port: options.port,\n host: options.host,\n },\n electron: {\n autoRestart: options.restart !== false,\n },\n noSpawn: options.spawn === false,\n })\n } catch (err: any) {\n console.error(pc.red(`\\n Electron dev failed:\\n ${err.message}\\n`))\n if (err.stack) console.error(pc.dim(err.stack))\n process.exit(1)\n }\n })\n\n// nasti electron-build - Electron 生产构建\ncli\n .command('electron-build [root]', 'Build Electron app for production')\n .option('--outDir <dir>', 'Output directory', { default: 'dist' })\n .option('--sourcemap', 'Generate source map')\n .option('--minify', 'Minify output', { default: true })\n .option('--mode <mode>', 'Set env mode')\n .action(async (root: string | undefined, options: any) => {\n try {\n const { buildElectron } = await import('./build/electron.js')\n await buildElectron({\n root: root ?? '.',\n mode: options.mode ?? 'production',\n target: 'electron',\n build: {\n outDir: options.outDir,\n sourcemap: options.sourcemap,\n minify: options.minify,\n },\n })\n } catch (err: any) {\n console.error(pc.red(`\\n Electron build failed:\\n ${err.message}\\n`))\n if (err.stack) console.error(pc.dim(err.stack))\n process.exit(1)\n }\n })\n\n// nasti preview\ncli\n .command('preview [root]', 'Preview production build')\n .option('--port <port>', 'Port number', { default: 4173 })\n .option('--host [host]', 'Hostname')\n .option('--outDir <dir>', 'Output directory to serve', { default: 'dist' })\n .action(async (root: string | undefined, options: any) => {\n try {\n const http = await import('node:http')\n const path = await import('node:path')\n const sirv = (await import('sirv')).default\n const connect = (await import('connect')).default\n\n const resolvedRoot = path.resolve(root ?? '.')\n const outDir = path.resolve(resolvedRoot, options.outDir)\n\n const app = connect()\n app.use(sirv(outDir, { single: true, etag: true, gzip: true, brotli: true }))\n\n const port = options.port\n const host = options.host === true ? '0.0.0.0' : (options.host ?? 'localhost')\n\n http.createServer(app).listen(port, host, () => {\n console.log()\n console.log(pc.cyan(' 🔍 nasti preview'))\n console.log()\n console.log(` ${pc.green('➜')} Local: ${pc.cyan(`http://localhost:${port}`)}`)\n console.log()\n })\n } catch (err: any) {\n console.error(pc.red(`\\n Preview failed:\\n ${err.message}\\n`))\n process.exit(1)\n }\n })\n\ncli.help()\ncli.version(__NASTI_VERSION__)\n\ncli.parse()\n"],"mappings":"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","names":["path","fs","transformSync","WsServer","path","fs","import_node_path","import_node_fs","path","fs","import_node_path","import_node_fs","path","fs","code","transformResult","rolldown","createRequire","dir","exports","import_node_path","import_node_fs","import_node_url","path","fs","import_node_path","import_node_fs","require","path","fs","import_node_path","import_node_fs","import_node_module","path","import_node_path","path","fs","crypto","import_node_path","import_node_fs","connect","path","sirv","http","pc","transformRequest","os","import_node_path","import_node_module","pc","path","fs","import_node_path","import_node_fs","import_picocolors","pc","path","fs","build","import_node_path","import_node_fs","import_rolldown","import_picocolors","init_electron","pc","createServer","path","fs","chokidar","require","import_node_path","import_node_fs","import_node_module","import_chokidar","import_picocolors","import_rolldown","init_electron","import_picocolors","createServer","pc","buildElectron","build","startElectronDev","http","path","sirv","connect"]}
|