@nasti-toolchain/nasti 1.7.1 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/defaults.ts","../src/config/index.ts","../src/plugins/resolve.ts","../src/plugins/tailwind.ts","../src/plugins/css.ts","../src/plugins/assets.ts","../src/core/transformer.ts","../src/plugins/vue.ts","../src/plugins/html.ts","../src/core/env.ts","../src/core/plugin-container.ts","../src/build/index.ts","../src/core/module-graph.ts","../src/server/ws.ts","../src/server/middleware.ts","../src/server/hmr.ts","../src/server/index.ts","../src/index.ts","../src/build/electron.ts","../src/plugins/electron.ts","../src/server/electron-dev.ts","../src/plugins/monaco-editor.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 css: {},\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","// 模块解析插件 - 处理 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 // 长 key 优先,避免 `@` 抢在 `@/utils` 之前\n const aliasEntries = Object.entries(alias).sort(\n ([a], [b]) => b.length - a.length,\n )\n\n // Vue:require.resolve('vue') 走 CJS 解析,命中 `main` 指向的「含编译器全量构建」。\n // 预编译 SFC 的应用只需 runtime,应指向 `module` 字段的 runtime-only esm-bundler 构建,\n // 否则整套模板编译器(~500kB)会被打进生产包。仅在 framework==='vue' 时启用,且只对\n // **精确** 的 `vue` specifier 生效(不影响 `vue/xxx` 子路径)。启动时解析一次并缓存。\n let vueRuntimeEntry: string | null = null\n if (config.framework === 'vue') {\n try {\n const vuePkgJson = require.resolve('vue/package.json', { paths: [config.root] })\n const vueDir = path.dirname(vuePkgJson)\n const mod = JSON.parse(fs.readFileSync(vuePkgJson, 'utf-8')).module as string | undefined\n const entry = path.join(vueDir, mod ?? 'dist/vue.runtime.esm-bundler.js')\n if (fs.existsSync(entry)) vueRuntimeEntry = entry\n } catch {\n /* vue 尚未安装(如 configResolved 阶段):忽略,回落到默认解析 */\n }\n }\n\n return {\n name: 'nasti:resolve',\n enforce: 'pre',\n\n resolveId(source, importer) {\n // 1. alias —— 优先:直接解析到磁盘上的目标文件\n for (const [key, value] of aliasEntries) {\n if (source === key || source.startsWith(key + '/')) {\n const aliasBase = resolveAliasTarget(value, config.root)\n const sub = source.slice(key.length).replace(/^\\//, '')\n const target = sub ? path.join(aliasBase, sub) : aliasBase\n const resolved = tryResolveFile(target, extensions)\n if (resolved) return resolved\n // alias 未命中实际文件:跳出循环走下游分支,避免把 `@/x` 误当作 bare import\n break\n }\n }\n\n // 2. 项目根相对路径(Vite 约定):`/src/...` 指向 <root>/src/...\n // chen-the-dawnstreak 的虚拟路由模块会生成这种 import。\n // 必须排在「真正绝对路径」分支前 —— Unix 下二者无法靠 path.isAbsolute 区分。\n if (source.startsWith('/') && !source.startsWith('//')) {\n const rootRelative = path.join(config.root, source.slice(1))\n const resolved = tryResolveFile(rootRelative, extensions)\n if (resolved) return resolved\n }\n\n // 3. 真正的文件系统绝对路径(Windows `C:\\…` 或已被其它插件解析过的 Unix 路径)\n if (path.isAbsolute(source) && fs.existsSync(source)) {\n const resolved = tryResolveFile(source, extensions)\n if (resolved) return resolved\n }\n\n // 4. 相对路径\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 // 5. bare import (node_modules)\n if (!source.startsWith('/') && !source.startsWith('.')) {\n // Vue runtime-only 重定向(见上方说明)\n if (vueRuntimeEntry && source === 'vue') return vueRuntimeEntry\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 // 虚拟模块(Vite 约定的 `\\0` 前缀)交给提供它的插件处理\n if (id.startsWith('\\0')) return null\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/**\n * 把 alias 值统一成磁盘绝对路径,匹配 dev server 的语义:\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 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","// Tailwind v4 integration: when a stylesheet contains v4 directives\n// (`@import \"tailwindcss\"`, `@theme`, `@apply`, `@plugin`, `@source`,\n// `@utility`, `@variant`, `@custom-variant`, `@reference`, or `@tailwind`),\n// we hand the entire CSS to `@tailwindcss/node`'s `compile()` (which\n// internally resolves all `@import`s, including bare specifiers like\n// `@heroui/styles`) and then scan the project for candidate utilities via\n// `@tailwindcss/oxide`. Both packages are resolved from the project's own\n// `node_modules` — they are optional peer dependencies of Nasti.\nimport path from 'node:path'\nimport { createRequire } from 'node:module'\nimport { pathToFileURL } from 'node:url'\n\n// Matches the documented v4 at-rules. `@import \"tailwindcss...\"` is enough\n// to trigger the full pipeline; the other directives are recognized as a\n// safety net for stylesheets that bring their own preflight / utilities\n// scaffolding without going through the canonical entry.\nconst TAILWIND_DIRECTIVE_RE =\n /@(?:import\\s+[\"']tailwindcss(?:\\b|\\/)|tailwind\\b|theme\\b|apply\\b|plugin\\b|source\\b|utility\\b|variant\\b|custom-variant\\b|reference\\b)/\n\nexport function hasTailwindDirectives(css: string): boolean {\n // Strip comments to avoid false positives from commented-out directives\n const withoutBlockComments = css.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n const withoutLineComments = withoutBlockComments.replace(/\\/\\/.*$/gm, '')\n return TAILWIND_DIRECTIVE_RE.test(withoutLineComments)\n}\n\ntype SourceEntry = { base: string; pattern: string; negated: boolean }\n\ntype TailwindModules = {\n node: {\n compile(\n css: string,\n options: { base: string; from: string; onDependency: (p: string) => void },\n ): Promise<{ sources: SourceEntry[]; build(candidates: string[]): string }>\n }\n oxide: {\n Scanner: new (options: { sources?: SourceEntry[] }) => {\n scan(): string[]\n files: string[]\n }\n }\n}\n\nlet cached: TailwindModules | null = null\nlet cachedRoot: string | null = null\n\nasync function loadTailwind(projectRoot: string): Promise<TailwindModules> {\n if (cached && cachedRoot === projectRoot) return cached\n // createRequire anchored at a *file* under the project root, otherwise\n // Node interprets `projectRoot` as a parent directory and resolution\n // walks outside the project's node_modules.\n const req = createRequire(path.join(projectRoot, 'package.json'))\n let nodePath: string\n let oxidePath: string\n try {\n nodePath = req.resolve('@tailwindcss/node')\n oxidePath = req.resolve('@tailwindcss/oxide')\n } catch {\n throw new Error(\n '[nasti] CSS contains Tailwind v4 directives but `@tailwindcss/node` ' +\n 'and/or `@tailwindcss/oxide` are not installed in this project. ' +\n 'Install them with: npm i -D tailwindcss @tailwindcss/node @tailwindcss/oxide',\n )\n }\n const node = (await import(pathToFileURL(nodePath).href)) as TailwindModules['node']\n const oxide = (await import(pathToFileURL(oxidePath).href)) as TailwindModules['oxide']\n cached = { node, oxide }\n cachedRoot = projectRoot\n return cached\n}\n\nexport type TailwindCompileResult = {\n css: string\n dependencies: string[]\n}\n\nexport async function compileTailwind(\n css: string,\n fromFile: string,\n projectRoot: string,\n): Promise<TailwindCompileResult> {\n const { node, oxide } = await loadTailwind(projectRoot)\n\n const dependencies: string[] = []\n const compiler = await node.compile(css, {\n base: path.dirname(fromFile),\n from: fromFile,\n onDependency: (p: string) => dependencies.push(p),\n })\n\n // Tailwind reports the source roots it wants scanned for class candidates\n // (driven by the implicit project root for `@import \"tailwindcss\"` and by\n // any explicit `@source` directives). We forward them verbatim to the\n // oxide scanner.\n const scanner = new oxide.Scanner({ sources: compiler.sources })\n const candidates = scanner.scan()\n\n return {\n css: compiler.build(candidates),\n dependencies: [...dependencies, ...scanner.files],\n }\n}\n","// CSS 处理插件 - 处理 .css 导入\nimport path from 'node:path'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\nimport { compileTailwind, hasTailwindDirectives } from './tailwind.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 async transform(code, id) {\n if (!id.endsWith('.css')) return null\n\n // Tailwind v4: when the stylesheet uses any v4 directive, hand the\n // entire source to Tailwind. Tailwind's own compiler resolves all\n // `@import`s (including bare specifiers like `@heroui/styles`), runs\n // the oxide scanner to discover utility candidates, and emits a\n // fully-flattened stylesheet — which is exactly what the browser\n // needs when we inline the result into a `<style>` tag below.\n let cssSource = code\n if (hasTailwindDirectives(code)) {\n const compiled = await compileTailwind(code, id, config.root)\n cssSource = compiled.css\n }\n\n // 将 CSS 中的相对 url() 路径重写为绝对路径,确保打包后资源路径正确\n const rewritten = rewriteCssUrls(cssSource, id, config.root)\n const escaped = JSON.stringify(rewritten)\n\n if (config.command === 'serve') {\n // Dev 模式: 注入可热更新的 <style> 标签\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 模式: rolldown 1.x 移除了实验性的 CSS bundling,直接返回 CSS\n // 会触发 UNSUPPORTED_FEATURE。把样式包成纯 JS 模块,在运行时挂到 <style>\n // 上 —— 同 dev 一致,省掉 HMR 头部即可。还要把 `moduleType` 显式声明为\n // `js`,否则 rolldown 仍按 `.css` 扩展名走 CSS 流水线、再次抛错。\n // 参考: https://github.com/rolldown/rolldown/issues/4271\n\n const cssConfig = config.build.css || {}\n const nonce = cssConfig.nonce\n const emitCssFile = cssConfig.emitCssFile\n\n if (emitCssFile) {\n // Emit CSS as a separate asset file and return JS that injects a <link> tag\n const fileName = `assets/${path.basename(id, '.css')}.css`\n this.emitFile({\n type: 'asset',\n fileName,\n source: rewritten,\n })\n\n return {\n code: `\nconst link = document.createElement('link');\nlink.rel = 'stylesheet';\nlink.href = ${JSON.stringify('/' + fileName)};\ndocument.head.appendChild(link);\n\nexport default ${escaped};\n`,\n moduleType: 'js',\n }\n }\n\n // Default: inline <style> injection\n const nonceAttr = nonce ? `style.setAttribute('nonce', ${JSON.stringify(nonce)});` : ''\n return {\n code: `\nconst css = ${escaped};\nconst style = document.createElement('style');\nstyle.setAttribute('data-nasti-css', ${JSON.stringify(id)});\n${nonceAttr}\nstyle.textContent = css;\ndocument.head.appendChild(style);\n\nexport default css;\n`,\n moduleType: 'js',\n }\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","// 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","// 内置 Vue 插件 - SFC 编译 + Vue HMR\nimport crypto from 'node:crypto'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\nimport { transformCode } from '../core/transformer.js'\n\nconst VUE_FILE_RE = /\\.vue$/\nconst VUE_QUERY_RE = /\\.vue\\?vue&type=(script|template|style)(&index=\\d+)?(&lang=\\w+)?/\n\ninterface VueCompilerSfc {\n parse: (source: string, options?: any) => any\n compileScript: (sfc: any, options: any) => any\n compileTemplate: (options: any) => any\n compileStyleAsync: (options: any) => Promise<any>\n}\n\nlet compiler: VueCompilerSfc | null = null\n\nasync function loadVueCompiler(): Promise<VueCompilerSfc | null> {\n if (compiler) return compiler\n try {\n compiler = await import('@vue/compiler-sfc')\n return compiler\n } catch {\n return null\n }\n}\n\nexport function vuePlugin(config: ResolvedConfig): NastiPlugin {\n const isDev = config.command === 'serve'\n const descriptorCache = new Map<string, any>()\n\n return {\n name: 'nasti:vue',\n enforce: 'pre',\n\n async resolveId(source) {\n // 处理 .vue 虚拟模块请求 (?vue&type=...)\n if (VUE_QUERY_RE.test(source)) {\n return source\n }\n return null\n },\n\n async transform(code, id) {\n // 处理 .vue 文件\n if (!VUE_FILE_RE.test(id) && !VUE_QUERY_RE.test(id)) return null\n\n const sfc = await loadVueCompiler()\n if (!sfc) {\n console.warn('[nasti:vue] @vue/compiler-sfc not found. Install it: npm install @vue/compiler-sfc')\n return null\n }\n\n // 处理虚拟模块请求(子块)\n if (VUE_QUERY_RE.test(id)) {\n return handleVueSubBlock(id, sfc, descriptorCache, config)\n }\n\n // 解析 SFC\n const { descriptor, errors } = sfc.parse(code, { filename: id })\n if (errors.length) {\n console.error(`[nasti:vue] Parse error in ${id}:`, errors[0].message)\n return null\n }\n\n descriptorCache.set(id, descriptor)\n const scopeId = hashId(id)\n\n // 编译 script\n let scriptCode = ''\n if (descriptor.script || descriptor.scriptSetup) {\n const compiled = sfc.compileScript(descriptor, {\n id: scopeId,\n isProd: !isDev,\n inlineTemplate: true,\n // 让 compileScript 产出 `const __sfc__ = ...`(而非默认的 `export default {...}`)。\n // 否则下方追加的 `__sfc__.render` / `__sfc__.__scopeId` / HMR 记录会引用一个\n // 不存在的 `__sfc__`,并与 compileScript 自带的 `export default` 形成双重默认导出。\n genDefaultAs: '__sfc__',\n })\n scriptCode = compiled.content\n }\n\n // 编译 template(如果没有 inline)\n let templateCode = ''\n if (descriptor.template && !descriptor.scriptSetup) {\n const compiled = sfc.compileTemplate({\n source: descriptor.template.content,\n filename: id,\n id: scopeId,\n compilerOptions: { scopeId: `data-v-${scopeId}` },\n })\n templateCode = compiled.code\n }\n\n // 组装输出。若 SFC 只有 <template> 而无任何 <script>,scriptCode 为空,\n // 兜底一个空组件对象,保证后续 `__sfc__.render` / `__scopeId` 赋值成立。\n let output = scriptCode || 'const __sfc__ = {}'\n\n if (templateCode) {\n output += `\\n${templateCode}\\n`\n output += `\\n__sfc__.render = render\\n`\n }\n\n // style 导入\n if (descriptor.styles.length > 0) {\n for (let i = 0; i < descriptor.styles.length; i++) {\n const style = descriptor.styles[i]\n const lang = style.lang ?? 'css'\n output += `\\nimport \"${id}?vue&type=style&index=${i}&lang=${lang}\"\\n`\n }\n }\n\n // scoped 标记\n output += `\\n__sfc__.__scopeId = \"data-v-${scopeId}\"\\n`\n\n // HMR\n if (isDev) {\n output += `\n__sfc__.__hmrId = ${JSON.stringify(scopeId)}\nif (typeof __VUE_HMR_RUNTIME__ !== 'undefined') {\n __VUE_HMR_RUNTIME__.createRecord(__sfc__.__hmrId, __sfc__)\n}\nif (import.meta.hot) {\n import.meta.hot.accept((mod) => {\n if (!mod) return\n const { default: updated } = mod\n if (typeof __VUE_HMR_RUNTIME__ !== 'undefined') {\n __VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render)\n }\n })\n}\n`\n }\n\n output += `\\nexport default __sfc__\\n`\n\n // compileScript 对 lang=\"ts\" 的 SFC 会在产物里保留 TS 注解 —— 不仅是用户脚本,\n // 连内联 render 也带(如 `(_ctx: any, _cache: any) =>`、`($event: any) => ...`)。\n // Nasti 的 oxc 转译按扩展名只处理 .ts/.tsx,不碰 .vue,所以这里显式把组装后的\n // 产物按 TS 走一遍 oxc 剥离类型,产出纯 JS —— dev(浏览器原生 ESM)与 build\n // (Rolldown 解析)都需要这一步,否则裸 TS 会直接触发解析错误。\n const lang = descriptor.scriptSetup?.lang ?? descriptor.script?.lang\n if (lang === 'ts') {\n const transpiled = transformCode(`${id}.ts`, output, { sourcemap: false })\n return { code: transpiled.code }\n }\n\n return { code: output }\n },\n\n handleHotUpdate(ctx) {\n const { file, modules } = ctx\n if (VUE_FILE_RE.test(file)) {\n // Vue 文件更新: 标记为自接受\n for (const mod of modules) {\n mod.isSelfAccepting = true\n }\n // 清除缓存\n descriptorCache.delete(file)\n }\n return modules\n },\n }\n}\n\nasync function handleVueSubBlock(\n id: string,\n sfc: VueCompilerSfc,\n cache: Map<string, any>,\n config: ResolvedConfig,\n): Promise<{ code: string } | null> {\n const match = id.match(/(.+\\.vue)\\?vue&type=(\\w+)(?:&index=(\\d+))?(?:&lang=(\\w+))?/)\n if (!match) return null\n\n const [, filePath, type, indexStr, lang] = match\n const descriptor = cache.get(filePath)\n if (!descriptor) return null\n\n if (type === 'style') {\n const index = parseInt(indexStr ?? '0', 10)\n const style = descriptor.styles[index]\n if (!style) return null\n\n const scopeId = hashId(filePath)\n const result = await sfc.compileStyleAsync({\n source: style.content,\n filename: filePath,\n id: `data-v-${scopeId}`,\n scoped: style.scoped ?? false,\n })\n\n // 将 CSS 转为 JS 模块注入\n const cssCode = JSON.stringify(result.code)\n return {\n code: `\nconst css = ${cssCode};\nconst style = document.createElement('style');\nstyle.setAttribute('data-v-${scopeId}', '');\nstyle.textContent = css;\ndocument.head.appendChild(style);\n\nif (import.meta.hot) {\n import.meta.hot.accept();\n import.meta.hot.prune(() => style.remove());\n}\n`,\n }\n }\n\n return null\n}\n\nfunction hashId(filename: string): string {\n return crypto.createHash('sha256').update(filename).digest('hex').slice(0, 8)\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","// 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","// 生产构建 - 调用 Rolldown API 打包\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { rolldown } from 'rolldown'\nimport type { NastiConfig } 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 { vuePlugin } from '../plugins/vue.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 // vuePlugin 需排在最前(enforce: 'pre' 语义):先把 .vue 编译成 JS,再交给后续插件。\n const builtinPlugins = [\n ...(config.framework === 'vue' ? [vuePlugin(config)] : []),\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 // Rolldown 1.x 把 `define` 从顶层 InputOptions 移到了 `transform.define`,\n // 顶层传入会触发 \"Invalid key: Expected never but received 'define'\" 警告并\n // 静默丢弃 —— 导致 `import.meta.env.*` 不被替换。\n //\n // 从 build.rolldownOptions 拆出 output(合并进 bundle.write())与 transform\n // (需与 envDefine 合并),其余 input 选项(treeshake / resolve / external / platform 等)\n // 随 restInputOptions 透传给 rolldown()。Nasti 自管的 input / transform / plugins\n // 显式放在 spread 之后,确保始终覆盖用户传入的同名键。\n const { output: userOutput, transform: userTransform, ...restInputOptions } =\n config.build.rolldownOptions\n // 合并用户的 transform.define 和 envDefine,确保 envDefine 优先级更高\n // Vue(esm-bundler 构建)需要在打包期定义这些编译期常量,否则运行时会告警,\n // 且无法对 options API / devtools 分支做 tree-shaking。放在最低优先级,允许用户覆盖。\n const vueDefine: Record<string, string> = config.framework === 'vue'\n ? {\n __VUE_OPTIONS_API__: 'true',\n __VUE_PROD_DEVTOOLS__: 'false',\n __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false',\n }\n : {}\n const mergedDefine = { ...vueDefine, ...(userTransform?.define ?? {}), ...envDefine }\n const bundle = await rolldown({\n ...restInputOptions,\n input: entryPoints,\n transform: { ...userTransform, define: mergedDefine },\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 // Forward `closeBundle` to Rolldown — it invokes the hook during\n // `bundle.close()` below. This is the hook Vite plugins (e.g. PWA\n // manifest/SW writers) rely on for final-stage artifact emission.\n closeBundle: p.closeBundle as any,\n })),\n ],\n })\n\n const { output } = await bundle.write({\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 // 用户可覆盖默认输出:代码拆分(advancedChunks / codeSplitting)、chunk 命名等\n ...userOutput,\n // dir 始终由 Nasti 掌管 —— 下方 HTML 改写依赖固定的产物目录,故放在最后强制生效\n dir: outDir,\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","// 模块依赖图 - 用于 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 * Reindex a module under a plugin-provided canonical id (e.g. a `\\0virtual:foo`\n * id returned from `resolveId`). Plugins look up their own virtual modules via\n * `getModuleById(RESOLVED_ID)` to invalidate them on watcher events; without\n * this remap they'd never find the node because `ensureEntryFromUrl` keys by\n * the public URL only.\n */\n setModuleId(mod: ModuleNode, id: string): void {\n if (mod.id === id) return\n this.idToModuleMap.delete(mod.id)\n mod.id = id\n this.idToModuleMap.set(id, 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","// 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 //\n // Vite 风格的插件(如 chen-the-dawnstreak 的 file-based routing、virtual SVG sprite 等)\n // 用 `resolveId` 声称某个 bare specifier(例如 `virtual:chen-routes`),再用 `load` 提供模块源码。\n // `rewriteImports` 已经把 bare specifier 改写成 `/@modules/<spec>`,所以这里是它们落到 dev server 上的入口。\n //\n // 之前 dev server 仅做 `resolveUrlToFile` 的磁盘查找 → 直接 404。这里在落盘查找之前先问插件,\n // 如果有人接管这个 spec **并且** 解析后的 id 不是真实文件(`\\0`-前缀或不存在),就走插件\n // 的 load → transform 管道;real file 路径则交给原来的 `bundlePackageAsEsm` 分支处理。\n //\n // 没有任何插件认领的 spec 仍然回落到 `resolveNodeModule`,npm 包加载行为不变。\n if (cleanReqUrl.startsWith('/@modules/')) {\n const spec = cleanReqUrl.slice('/@modules/'.length)\n const virtual = await loadVirtualModule(spec, ctx)\n if (virtual) {\n const mod = await moduleGraph.ensureEntryFromUrl(url)\n moduleGraph.setModuleId(mod, virtual.id)\n mod.transformResult = virtual.result\n return virtual.result\n }\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/**\n * Run the plugin `resolveId` → `load` → `transform` pipeline for a bare specifier\n * that arrived as `/@modules/<spec>`, and return the prepared JS module if (and\n * only if) the result is a virtual module — i.e. its resolved id either uses the\n * Vite-convention `\\0` null-byte prefix or does not exist on disk.\n *\n * Real-file resolutions (e.g. an alias plugin remapping a bare specifier onto a\n * source file under the project) are intentionally skipped here so they fall\n * through to the normal `resolveUrlToFile` / `bundlePackageAsEsm` paths; this\n * keeps the npm-package loader and the React Refresh wrapper in charge of those.\n */\nasync function loadVirtualModule(\n spec: string,\n ctx: TransformMiddlewareContext,\n): Promise<{ id: string; result: { code: string } } | null> {\n const { config, pluginContainer } = ctx\n const resolved = await pluginContainer.resolveId(spec)\n if (resolved == null) return null\n const resolvedId = typeof resolved === 'string' ? resolved : resolved.id\n const looksVirtual = resolvedId.startsWith('\\0') || !fs.existsSync(resolvedId)\n if (!looksVirtual) return null\n\n const loadResult = await pluginContainer.load(resolvedId)\n if (loadResult == null) return null\n let code = typeof loadResult === 'string' ? loadResult : loadResult.code\n\n // Let other plugins transform the virtual source (e.g. macros, define-replace).\n const transformed = await pluginContainer.transform(code, resolvedId)\n if (transformed != null) {\n code = typeof transformed === 'string' ? transformed : transformed.code\n }\n\n // Replace `import.meta.env.*` and rewrite the inner import specifiers so the\n // browser can fetch them. Anchor at a synthetic file under the project root\n // so `./x` style imports inside generated code resolve from root (the same\n // contract Vite offers virtual modules whose ids don't map to a real dir).\n code = replaceEnvInCode(code, ctx.envDefine ?? buildEnvDefine(\n loadEnv(config.mode, config.root, config.envPrefix),\n config.mode,\n ))\n const anchor = path.join(config.root, '__nasti_virtual__.ts')\n code = rewriteImports(code, config, anchor)\n\n return { id: resolvedId, result: { code } }\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 包的具名导出补全 + ESM-interop default 解包:\n // rolldown 将 CJS 包包装为 __commonJSMin,只输出 `export default require_xxx()`,\n // 该调用返回的是整个 CJS exports 对象。这会引发两类问题:\n // 1. 具名导入失败:`import { parse } from '/@modules/cookie'` 没有静态命名导出。\n // 2. default 错误:当 CJS 模块自标 `__esModule: true` 且有 `default`\n // (tsc/babel 编译 ESM→CJS 的典型产物,如 `@gravity-ui/icons/Sun`),\n // `import X from '...'` 会拿到整个 namespace 对象而不是真正的 default 值,\n // 在 React 中表现为 \"Element type is invalid... got: object\"。\n // 通过 createRequire 在 Node.js 侧加载 CJS 模块、读取 exports,在 bundle\n // 末尾补具名 export,并按 Node import() interop 语义解包 default。\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\n // ESM-interop unwrap: when the CJS module marks itself as `__esModule` and\n // exposes a `default` (typical for tsc/babel-compiled ESM emitted as CJS),\n // rolldown's `export default require_xxx()` would expose the entire CJS\n // namespace object instead of the inner `.default` — so `import X from \"pkg/sub\"`\n // hands the consumer `{ __esModule: true, default: X }` rather than `X`,\n // which breaks `<X />` in React with \"Element type is invalid ... got: object\".\n // Mirror Node's `import()` interop and unwrap to `__cjsMod.default`.\n const hasEsmInterop = cjsExports.__esModule === true && 'default' in cjsExports\n\n if (!hasEsmInterop && 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 hasEsmInterop ? `export default __cjsMod.default;` : `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","// 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 { vuePlugin } from '../plugins/vue.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 // vuePlugin 排在最前(enforce: 'pre' 语义):.vue 先编译成 JS 再走后续管道。\n const allPlugins = [\n ...(config.framework === 'vue' ? [vuePlugin(config)] : []),\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","// Nasti - 基于 Rolldown/Oxc 的高性能 Web 打包器\n// 编程 API 入口\n\nexport { defineConfig, resolveConfig } from './config/index.js'\nexport { build } from './build/index.js'\nexport { buildElectron } from './build/electron.js'\nexport { createServer } from './server/index.js'\nexport { startElectronDev } from './server/electron-dev.js'\nexport { electronPlugin } from './plugins/electron.js'\nexport { monacoEditorPlugin } from './plugins/monaco-editor.js'\n\nexport type {\n NastiConfig,\n NastiPlugin,\n ResolvedConfig,\n ElectronConfig,\n BuildConfig,\n NastiRolldownOptions,\n DevServer,\n ModuleNode,\n HmrPayload,\n TransformResult,\n} from './types.js'\nexport type {\n MonacoEditorPluginOptions,\n MonacoEditorLanguageWorker,\n MonacoCustomWorker,\n} from './plugins/monaco-editor.js'\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 // 从 build.rolldownOptions 拆出 output(合并进 bundle.write())与 transform\n // (需与 envDefine 合并),其余 input 选项(treeshake 等)随 restInputOptions 透传。\n // Nasti 自管的 input / platform / transform / plugins 放在 spread 之后确保覆盖。\n const { output: userOutput, transform: userTransform, ...restInputOptions } =\n config.build.rolldownOptions\n // 合并用户的 transform.define 和 envDefine,确保 envDefine 优先级更高\n const mergedDefine = { ...(userTransform?.define ?? {}), ...envDefine }\n const bundle = await rolldown({\n ...restInputOptions,\n input: entry,\n platform: 'node',\n transform: { ...userTransform, define: mergedDefine },\n plugins: [oxcTransformPlugin, electronPlugin(config), resolvePlugin(config)] as any,\n })\n\n fs.mkdirSync(path.dirname(opts.outFile), { recursive: true })\n\n await bundle.write({\n sourcemap: !!config.build.sourcemap,\n minify: !!config.build.minify,\n // 允许用户微调 output;但主进程 / preload 的单文件约束由下方键强制保证\n ...userOutput,\n file: opts.outFile,\n format: opts.format === 'cjs' ? 'cjs' : 'esm',\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// 负责:将 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","// 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","// Monaco Editor 支持插件 - 仿照 vite-plugin-monaco-editor\n//\n// 解决两个核心问题:\n// 1. Monaco Editor 的 Web Worker 是独立入口,必须单独打包,\n// 并通过 self.MonacoEnvironment.getWorkerUrl 告诉 Monaco 去哪里加载\n// 2. monaco-editor 包含 2000+ 文件,若按 ESM 逐文件交给 dev server 转译,\n// 并发 HTTP + fs 读取会在 macOS 等低 fd 限制环境下触发 EMFILE。\n// 本插件将 Worker 预先打包为单文件并从磁盘缓存直接流式返回,\n// 同时把 monaco-editor 目录显式从 watcher 排除,避免 HMR 链式打爆 fd。\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport crypto from 'node:crypto'\nimport { createRequire } from 'node:module'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport type { NastiPlugin, ResolvedConfig, DevServer, HtmlTagDescriptor } from '../types.js'\n\nexport type MonacoEditorLanguageWorker =\n | 'editorWorkerService'\n | 'css'\n | 'html'\n | 'json'\n | 'typescript'\n\nexport interface MonacoCustomWorker {\n label: string\n entry: string\n}\n\nexport interface MonacoEditorPluginOptions {\n /** 启用的 Monaco 语言 Worker,默认启用全部 */\n languageWorkers?: MonacoEditorLanguageWorker[]\n /** 额外自定义 Worker(如 monaco-graphql/esm/graphql.worker) */\n customWorkers?: MonacoCustomWorker[]\n /** Worker 在 URL 上的公共路径,默认 'monacoeditorwork'。可填 CDN 绝对 URL */\n publicPath?: string\n /** 是否将 Monaco API 暴露到 window.monaco(兼容 0.22 之前的 globalAPI 模式) */\n globalAPI?: boolean\n /** publicPath 是 CDN 时仍强制本地打包 Worker 产物 */\n forceBuildCDN?: boolean\n /** 自定义生产构建下 Worker 产物目录(绝对路径) */\n customDistPath?: (root: string, outDir: string, base: string) => string\n}\n\nconst DEFAULT_WORKERS: Record<MonacoEditorLanguageWorker, string> = {\n editorWorkerService: 'monaco-editor/esm/vs/editor/editor.worker',\n css: 'monaco-editor/esm/vs/language/css/css.worker',\n html: 'monaco-editor/esm/vs/language/html/html.worker',\n json: 'monaco-editor/esm/vs/language/json/json.worker',\n typescript: 'monaco-editor/esm/vs/language/typescript/ts.worker',\n}\n\nconst DEFAULT_PUBLIC_PATH = 'monacoeditorwork'\n\nfunction isCDN(p: string): boolean {\n return /^((https?:)?\\/\\/|file:)/.test(p)\n}\n\n/** 规范化 publicPath:CDN 原样保留,本地路径保证以 / 开头、不以 / 结尾 */\nfunction normalizePublicPath(p: string): string {\n if (isCDN(p)) return p.replace(/\\/+$/, '')\n const withLead = p.startsWith('/') ? p : '/' + p\n return withLead.replace(/\\/+$/, '') || '/'\n}\n\n/** 读取 monaco-editor 版本号作为缓存命名,版本变更自动失效旧产物 */\nfunction readMonacoVersion(root: string): string {\n try {\n const require = createRequire(path.resolve(root, 'package.json'))\n const pkgJsonPath = require.resolve('monaco-editor/package.json', { paths: [root] })\n const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'))\n return typeof pkg.version === 'string' ? pkg.version : 'unknown'\n } catch {\n return 'unknown'\n }\n}\n\nexport function monacoEditorPlugin(options: MonacoEditorPluginOptions = {}): NastiPlugin {\n const languageWorkers =\n options.languageWorkers ?? (Object.keys(DEFAULT_WORKERS) as MonacoEditorLanguageWorker[])\n const customWorkers = options.customWorkers ?? []\n const publicPath = normalizePublicPath(options.publicPath ?? DEFAULT_PUBLIC_PATH)\n const globalAPI = !!options.globalAPI\n const forceBuildCDN = !!options.forceBuildCDN\n\n const workers: MonacoCustomWorker[] = [\n ...languageWorkers.map((label) => ({ label, entry: DEFAULT_WORKERS[label] })),\n ...customWorkers,\n ]\n\n let resolvedConfig: ResolvedConfig\n let cacheDir = ''\n // label → 构建 Promise,做并发去重,防止启动瞬间多次请求同一 Worker 时重复打包\n const building = new Map<string, Promise<string>>()\n\n async function buildWorker(worker: MonacoCustomWorker): Promise<string> {\n const cacheFile = path.join(cacheDir, `${worker.label}.worker.js`)\n if (fs.existsSync(cacheFile)) return cacheFile\n const existing = building.get(worker.label)\n if (existing) return existing\n\n const task = (async () => {\n const { rolldown } = await import('rolldown')\n const require = createRequire(path.resolve(resolvedConfig.root, 'package.json'))\n let entry: string\n try {\n entry = require.resolve(worker.entry, { paths: [resolvedConfig.root] })\n } catch {\n // 某些 Worker 入口无扩展名,补 .js 再试(如 editor.worker)\n entry = require.resolve(worker.entry + '.js', { paths: [resolvedConfig.root] })\n }\n\n fs.mkdirSync(cacheDir, { recursive: true })\n\n const bundle = await rolldown({\n input: entry,\n platform: 'browser',\n } as any)\n\n await bundle.write({\n file: cacheFile,\n format: 'iife',\n sourcemap: false,\n minify: true,\n codeSplitting: false,\n } as any)\n await bundle.close()\n\n return cacheFile\n })()\n\n building.set(worker.label, task)\n try {\n return await task\n } finally {\n building.delete(worker.label)\n }\n }\n\n function runtimeInitScript(): string {\n // Normalize local worker URL prefix: join base + publicPath, avoid double slashes\n let normalizedPrefix = publicPath\n if (!isCDN(publicPath)) {\n const base = resolvedConfig.base.replace(/\\/+$/, '') || ''\n const pub = publicPath.replace(/^\\/+/, '')\n normalizedPrefix = base ? `${base}/${pub}` : `/${pub}`\n }\n\n const map: Record<string, string> = {}\n for (const w of workers) {\n map[w.label] = `${normalizedPrefix}/${w.label}.worker.js`\n }\n return `;(function () {\n var map = ${JSON.stringify(map)};\n function getWorkerUrl(_moduleId, label) {\n var url = map[label] || map['editorWorkerService'];\n if (/^(https?:)?\\\\/\\\\//.test(url)) {\n // 跨域 Worker 需用 Blob + importScripts 绕过同源限制\n var blob = new Blob(\n ['importScripts(' + JSON.stringify(url) + ');'],\n { type: 'application/javascript' }\n );\n return URL.createObjectURL(blob);\n }\n return url;\n }\n self.MonacoEnvironment = self.MonacoEnvironment || {};\n if (!self.MonacoEnvironment.getWorker && !self.MonacoEnvironment.getWorkerUrl) {\n self.MonacoEnvironment.getWorkerUrl = getWorkerUrl;\n }\n})();`\n }\n\n return {\n name: 'nasti:monaco-editor',\n enforce: 'pre',\n\n configResolved(config) {\n resolvedConfig = config\n // 用 monaco 版本号作为缓存桶,换版本自动重新打包,老缓存不污染\n const version = readMonacoVersion(config.root)\n const key = crypto.createHash('sha1').update(version + '|' + publicPath).digest('hex').slice(0, 8)\n cacheDir = path.resolve(config.root, 'node_modules/.nasti/monaco', key)\n },\n\n async configureServer(server: DevServer) {\n const shouldBuild = !isCDN(publicPath) || forceBuildCDN\n\n // 显式把 monaco-editor 从 chokidar watcher 中剔除。node_modules 虽已在默认\n // ignored 列表,但 HMR EMFILE 多次报告源于 Monaco 的深层符号链接/嵌套 node_modules\n // 绕过了默认规则,这里做 defense-in-depth。\n const watcher: any = (server as any).watcher\n const monacoDir = path.resolve(resolvedConfig.root, 'node_modules/monaco-editor')\n try {\n watcher?.unwatch?.(monacoDir)\n } catch {\n /* ignore */\n }\n\n if (!shouldBuild) return\n\n // 预热:后台异步打包全部 Worker,避免首次打开页面时阻塞第一次 fetch\n void Promise.all(\n workers.map((w) =>\n buildWorker(w).catch((e: Error) => {\n console.warn(\n `[nasti:monaco-editor] worker build failed for \"${w.label}\": ${e.message}`,\n )\n }),\n ),\n )\n\n // Normalize dev middleware prefix to match runtime injection\n const base = resolvedConfig.base.replace(/\\/+$/, '') || ''\n const pub = publicPath.replace(/^\\/+/, '')\n const prefix = (base ? `${base}/${pub}` : `/${pub}`) + '/'\n server.middlewares.use(\n async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n if (req.method !== 'GET') return next()\n const url = (req.url ?? '').split('?')[0]\n if (!url.startsWith(prefix)) return next()\n\n const name = url.slice(prefix.length).replace(/\\.worker\\.js$/, '')\n const worker = workers.find((w) => w.label === name)\n if (!worker) return next()\n\n try {\n const file = await buildWorker(worker)\n res.setHeader('Content-Type', 'application/javascript; charset=utf-8')\n // 产物由版本号 + 打包结果决定,dev 期间可安全长缓存\n res.setHeader('Cache-Control', 'public, max-age=604800, immutable')\n fs.createReadStream(file).pipe(res)\n } catch (e: any) {\n res.statusCode = 500\n res.end(`Monaco worker build failed: ${e.message}`)\n }\n },\n )\n },\n\n transformIndexHtml(html) {\n const tags: HtmlTagDescriptor[] = [\n {\n tag: 'script',\n children: runtimeInitScript(),\n injectTo: 'head-prepend',\n },\n ]\n if (globalAPI) {\n // 需要 window.monaco 全局 API 时,用 ESM 入口再挂一次\n tags.push({\n tag: 'script',\n attrs: { type: 'module' },\n children:\n `import * as monaco from 'monaco-editor';\\n` +\n `self.monaco = monaco;`,\n injectTo: 'head',\n })\n }\n return { html, tags }\n },\n\n // 生产构建:把所有 Worker 预打包并拷到 outDir/<publicPath>/ 下\n async buildStart() {\n if (resolvedConfig.command !== 'build') return\n if (isCDN(publicPath) && !forceBuildCDN) return\n\n const outDir = options.customDistPath\n ? options.customDistPath(\n resolvedConfig.root,\n resolvedConfig.build.outDir,\n resolvedConfig.base,\n )\n : isCDN(publicPath)\n ? path.resolve(resolvedConfig.root, resolvedConfig.build.outDir, 'monaco')\n : path.resolve(\n resolvedConfig.root,\n resolvedConfig.build.outDir,\n publicPath.replace(/^\\//, ''),\n )\n fs.mkdirSync(outDir, { recursive: true })\n\n for (const worker of workers) {\n try {\n const cacheFile = await buildWorker(worker)\n fs.copyFileSync(cacheFile, path.join(outDir, `${worker.label}.worker.js`))\n } catch (e: any) {\n throw new Error(\n `[nasti:monaco-editor] worker build failed for \"${worker.label}\": ${e.message}\\n${e.stack || ''}`,\n )\n }\n }\n },\n }\n}\n"],"mappings":"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","names":["transformSync","path","fs","require","path","createRequire","pathToFileURL","compiler","path","path","fs","crypto","lang","path","fs","path","fs","path","fs","path","fs","createRequire","pathToFileURL","cached","mod","code","transformResult","rolldown","resolveAliasTarget","dir","path","fs","path","pc","transformRequest","path","fs","rolldown","pc","pc","path","fs","build","rolldown","path","fs","createRequire","pc","rolldown","pc","createServer","path","fs","rolldown","require","createRequire","path","fs","crypto","createRequire","require","rolldown"]}
1
+ {"version":3,"sources":["../src/config/defaults.ts","../src/core/logger.ts","../src/config/index.ts","../src/plugins/resolve.ts","../src/core/debug.ts","../node_modules/detect-libc/lib/process.js","../node_modules/detect-libc/lib/filesystem.js","../node_modules/detect-libc/lib/elf.js","../node_modules/detect-libc/lib/detect-libc.js","../node_modules/lightningcss/node/browserslistToTargets.js","../node_modules/lightningcss/node/composeVisitors.js","../node_modules/lightningcss/node/flags.js","../node_modules/lightningcss/node/index.js","../node_modules/lightningcss/node/index.mjs","../src/core/css-engine.ts","../src/plugins/tailwind.ts","../src/plugins/css.ts","../src/plugins/css-post.ts","../src/plugins/assets.ts","../src/core/transformer.ts","../src/plugins/vue.ts","../src/plugins/html.ts","../src/plugins/builtins.ts","../src/core/plugin-container.ts","../src/core/module-graph.ts","../src/core/hot-channel.ts","../src/core/environment.ts","../src/core/env.ts","../src/build/reporter.ts","../src/build/index.ts","../src/server/ws.ts","../src/server/middleware.ts","../src/server/hmr.ts","../src/server/runnable-environment.ts","../src/server/bundled/dev-engine.ts","../src/server/index.ts","../src/index.ts","../src/build/electron.ts","../src/plugins/electron.ts","../src/server/electron-dev.ts","../src/plugins/monaco-editor.ts"],"sourcesContent":["import type { NastiConfig, BuildConfig, ServerConfig, ResolveConfig, ElectronConfig, ExperimentalOptions } 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 css: {},\n reportCompressedSize: true,\n chunkSizeWarningLimit: 500,\n cssCodeSplit: true,\n // 默认跟随 build.minify(resolveConfig 中按 minify 取值填充)\n cssMinify: 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\nconst defaultExperimental: Required<ExperimentalOptions> = {\n bundledDev: false,\n}\n\nexport const defaults: Required<Omit<NastiConfig, 'plugins' | 'customLogger' | 'environments' | 'experimental'>> & {\n plugins: []\n experimental: Required<ExperimentalOptions>\n} = {\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 clearScreen: true,\n experimental: defaultExperimental,\n}\n","// Logger - 真正的日志系统(仿 Vite node/logger.ts)\n// 接线 config.logLevel,统一 dev/build 输出面\nimport readline from 'node:readline'\nimport pc from 'picocolors'\n\nexport type LogType = 'error' | 'warn' | 'info'\nexport type LogLevel = LogType | 'silent'\n\nexport interface LogOptions {\n /** 是否清屏(仅 allowClearScreen 且 TTY 下生效) */\n clear?: boolean\n /** 是否带 HH:mm:ss 时间戳前缀 */\n timestamp?: boolean\n /** 关联的 Error(用于 hasErrorLogged 去重) */\n error?: Error | null\n}\n\nexport interface Logger {\n info(msg: string, options?: LogOptions): void\n warn(msg: string, options?: LogOptions): void\n /** 同一条 warn 整个进程只输出一次 */\n warnOnce(msg: string, options?: LogOptions): void\n error(msg: string, options?: LogOptions): void\n clearScreen(type: LogType): void\n /** 该 Error 是否已经走 logger.error 输出过(避免 CLI 兜底重复打印) */\n hasErrorLogged(error: Error): boolean\n hasWarned: boolean\n}\n\nexport interface LoggerOptions {\n prefix?: string\n allowClearScreen?: boolean\n customLogger?: Logger\n console?: Console\n}\n\nexport const LogLevels: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n}\n\nlet lastType: LogType | undefined\nlet lastMsg: string | undefined\nlet sameCount = 0\n\nfunction getTimeFormatter(): Intl.DateTimeFormat {\n return new Intl.DateTimeFormat(undefined, {\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n })\n}\n\nexport function createLogger(\n level: LogLevel = 'info',\n options: LoggerOptions = {},\n): Logger {\n if (options.customLogger) {\n return options.customLogger\n }\n\n const timeFormatter = getTimeFormatter()\n const loggedErrors = new WeakSet<Error>()\n const { prefix = '[nasti]', allowClearScreen = true, console: console_ = console } = options\n const thresh = LogLevels[level]\n const canClearScreen =\n allowClearScreen && process.stdout.isTTY && !process.env.CI\n const clear = canClearScreen ? clearScreen : () => {}\n\n function format(type: LogType, msg: string, options: LogOptions = {}): string {\n if (options.timestamp) {\n const tag =\n type === 'info'\n ? pc.cyan(pc.bold(prefix))\n : type === 'warn'\n ? pc.yellow(pc.bold(prefix))\n : pc.red(pc.bold(prefix))\n return `${pc.dim(timeFormatter.format(new Date()))} ${tag} ${msg}`\n }\n return msg\n }\n\n function output(type: LogType, msg: string, options: LogOptions = {}): void {\n if (thresh < LogLevels[type]) return\n const method = type === 'info' ? 'log' : type\n\n if (options.error) {\n loggedErrors.add(options.error)\n }\n if (canClearScreen) {\n // 同消息折叠为 (xN)\n if (type === lastType && msg === lastMsg) {\n sameCount++\n clear()\n console_[method](format(type, msg, options), pc.yellow(`(x${sameCount + 1})`))\n } else {\n sameCount = 0\n lastMsg = msg\n lastType = type\n if (options.clear) clear()\n console_[method](format(type, msg, options))\n }\n } else {\n console_[method](format(type, msg, options))\n }\n }\n\n const warnedMessages = new Set<string>()\n\n const logger: Logger = {\n hasWarned: false,\n info(msg, opts) {\n output('info', msg, opts)\n },\n warn(msg, opts) {\n logger.hasWarned = true\n output('warn', msg, opts)\n },\n warnOnce(msg, opts) {\n if (warnedMessages.has(msg)) return\n logger.hasWarned = true\n output('warn', msg, opts)\n warnedMessages.add(msg)\n },\n error(msg, opts) {\n output('error', msg, opts)\n },\n clearScreen(type) {\n if (thresh >= LogLevels[type]) clear()\n },\n hasErrorLogged(error) {\n return loggedErrors.has(error)\n },\n }\n\n return logger\n}\n\nfunction clearScreen(): void {\n const repeatCount = process.stdout.rows - 2\n const blank = repeatCount > 0 ? '\\n'.repeat(repeatCount) : ''\n console.log(blank)\n readline.cursorTo(process.stdout, 0, 0)\n readline.clearScreenDown(process.stdout)\n}\n\nexport interface ServerUrls {\n local: string[]\n network: string[]\n}\n\n/** 打印 dev server 地址:➜ Local / Network,端口加粗 */\nexport function printServerUrls(\n urls: ServerUrls,\n info: Logger['info'],\n): void {\n const colorUrl = (url: string) =>\n pc.cyan(url.replace(/:(\\d+)\\//, (_, port) => `:${pc.bold(port)}/`))\n for (const url of urls.local) {\n info(` ${pc.green('➜')} ${pc.bold('Local')}: ${colorUrl(url)}`)\n }\n for (const url of urls.network) {\n info(` ${pc.green('➜')} ${pc.bold('Network')}: ${colorUrl(url)}`)\n }\n if (urls.network.length === 0) {\n info(\n pc.dim(` ${pc.green('➜')} ${pc.bold('Network')}: use `) +\n pc.bold('--host') +\n pc.dim(' to expose'),\n )\n }\n}\n","import { pathToFileURL } from 'node:url'\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport type {\n NastiConfig,\n ResolvedConfig,\n NastiPlugin,\n EnvironmentOptions,\n} from '../types.js'\nimport { defaults } from './defaults.js'\nimport { createLogger } from '../core/logger.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 // mode:merged.mode 优先,否则按 command 取默认。env(传给 plugin.config)\n // 与最终 resolved.mode 共用此值,避免二者分叉(否则 loadEnv 会按错误的\n // mode 加载 .env.<mode>,且插件看到的 env.mode 与 resolved.mode 不一致)\n const mode = (merged.mode ??\n (command === 'build' ? 'production' : 'development')) as ResolvedConfig['mode']\n\n // 执行插件 config 钩子\n const env = { 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 logLevel = merged.logLevel ?? defaults.logLevel\n const clearScreen = merged.clearScreen ?? defaults.clearScreen\n const logger = createLogger(logLevel, {\n allowClearScreen: clearScreen,\n customLogger: merged.customLogger,\n })\n const mergedBuild = { ...defaults.build, ...merged.build } as ResolvedConfig['build']\n // cssMinify 未显式配置时跟随 minify\n if (merged.build?.cssMinify === undefined) {\n mergedBuild.cssMinify = !!mergedBuild.minify\n }\n const resolved: ResolvedConfig = {\n root,\n base: merged.base ?? defaults.base,\n 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: mergedBuild,\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,\n clearScreen,\n logger,\n environments: {},\n experimental: {\n bundledDev: merged.experimental?.bundledDev ?? defaults.experimental.bundledDev,\n },\n }\n\n // ── Environment API:解析 environments map(默认 client + ssr)──────────\n // client 与 top-level resolve/build 精确镜像(同引用);其余环境按 consumer\n // 取 per-consumer resolve 默认值。configEnvironment 钩子在最终化前调用。\n const userEnvironments: Record<string, EnvironmentOptions> = {\n client: {},\n ssr: {},\n ...(merged.environments ?? {}),\n }\n for (const [name, envOptions] of Object.entries(userEnvironments)) {\n for (const plugin of rawPlugins) {\n if (plugin.configEnvironment) {\n const result = await plugin.configEnvironment(name, envOptions, env)\n if (result) Object.assign(envOptions, deepMerge(envOptions, result))\n }\n }\n }\n for (const [name, envOptions] of Object.entries(userEnvironments)) {\n const consumer: 'client' | 'server' =\n envOptions.consumer ?? (name === 'client' ? 'client' : 'server')\n\n if (name === 'client') {\n // 用户对 environments.client 的覆盖写回 top-level(镜像语义:二者是同一份)\n if (envOptions.resolve) {\n Object.assign(resolved.resolve, {\n ...envOptions.resolve,\n alias: { ...resolved.resolve.alias, ...envOptions.resolve.alias },\n })\n }\n if (envOptions.build) Object.assign(resolved.build, envOptions.build)\n resolved.environments.client = {\n consumer,\n entry: [],\n // 同引用 —— 精确镜像(assertClientEnvironmentMirror 校验)\n resolve: resolved.resolve,\n build: resolved.build,\n }\n continue\n }\n\n resolved.environments[name] = {\n consumer,\n entry: (Array.isArray(envOptions.entry)\n ? envOptions.entry\n : envOptions.entry\n ? [envOptions.entry]\n : []\n ).map((e) => path.resolve(root, e)),\n resolve: {\n alias: { ...resolved.resolve.alias, ...envOptions.resolve?.alias },\n extensions: envOptions.resolve?.extensions ?? [...resolved.resolve.extensions],\n // server consumer:node conditions(去 'browser');client 非默认环境沿用 top-level\n conditions:\n envOptions.resolve?.conditions ??\n (consumer === 'server'\n ? ['node', ...resolved.resolve.conditions.filter((c) => c !== 'browser')]\n : [...resolved.resolve.conditions]),\n mainFields:\n envOptions.resolve?.mainFields ??\n (consumer === 'server' ? ['module', 'main'] : [...resolved.resolve.mainFields]),\n },\n build: {\n ...resolved.build,\n ...envOptions.build,\n // 非 client 环境默认产出到 <outDir>/<envName>(如 dist/ssr),可显式覆盖\n outDir: envOptions.build?.outDir ?? path.join(resolved.build.outDir, name),\n // server 产物默认不压缩(可调试性优先,与 Vite SSR 默认一致),可显式覆盖\n minify: envOptions.build?.minify ?? (consumer === 'server' ? false : resolved.build.minify),\n },\n }\n }\n\n assertClientEnvironmentMirror(resolved)\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\n/**\n * 运行时镜像断言(Phase 1 检查,NASTI_2.0_PLAN.md §1.2):\n * top-level `resolve`/`build` 与 `environments.client` 必须**精确镜像**,\n * 否则读 flat config 的既有插件与 Environment API 会看到两份配置。\n *\n * 比较规则(文档化):\n * - 快路径:引用相等(resolveConfig 保证同引用,正常永远走这里)\n * - 慢路径:JSON 序列化逐字节比较 resolve{alias,extensions,conditions,\n * mainFields} 与 build 全字段(含 sourcemap);函数值(如\n * rolldownOptions.output.advancedChunks 的 test 回调)会被 JSON 丢弃,\n * 不参与比较 —— 不要在 per-env build 覆盖里只改函数字段\n * - 设 NASTI_DISABLE_MIRROR_ASSERT=1 可关闭(不建议)\n */\nexport function assertClientEnvironmentMirror(config: ResolvedConfig): void {\n if (process.env.NASTI_DISABLE_MIRROR_ASSERT) return\n const client = config.environments.client\n if (!client) {\n throw new Error('[nasti] internal: environments.client missing after resolveConfig')\n }\n if (client.resolve === config.resolve && client.build === config.build) return\n const pairs: Array<[string, unknown, unknown]> = [\n ['resolve', config.resolve, client.resolve],\n ['build', config.build, client.build],\n ]\n for (const [field, top, env] of pairs) {\n const a = JSON.stringify(top)\n const b = JSON.stringify(env)\n if (a !== b) {\n throw new Error(\n `[nasti] config mirror violation: top-level \\`${field}\\` and ` +\n `\\`environments.client.${field}\\` diverged.\\n top-level: ${a}\\n client: ${b}\\n` +\n `top-level 与 client 环境必须精确镜像 —— 请通过 top-level 或 ` +\n `environments.client 之一配置,不要在解析后分别修改两者。`,\n )\n }\n }\n}\n\n/** 仅普通对象字面量返回 true —— 类实例 / 函数 / Date / Map 等不算,\n * 避免 deepMerge 递归剥掉它们的原型方法(如自定义 customLogger 实例)。 */\nfunction isPlainObject(val: unknown): val is Record<string, any> {\n if (val === null || typeof val !== 'object') return false\n const proto = Object.getPrototypeOf(val)\n return proto === Object.prototype || proto === null\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 // 只对普通对象递归合并;其余(类实例/函数/数组…)整体按引用赋值,保留原型\n if (isPlainObject(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","// 模块解析插件 - 处理 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 // 长 key 优先,避免 `@` 抢在 `@/utils` 之前\n const aliasEntries = Object.entries(alias).sort(\n ([a], [b]) => b.length - a.length,\n )\n\n // Vue:require.resolve('vue') 走 CJS 解析,命中 `main` 指向的「含编译器全量构建」。\n // 预编译 SFC 的应用只需 runtime,应指向 `module` 字段的 runtime-only esm-bundler 构建,\n // 否则整套模板编译器(~500kB)会被打进生产包。仅在 framework==='vue' 时启用,且只对\n // **精确** 的 `vue` specifier 生效(不影响 `vue/xxx` 子路径)。启动时解析一次并缓存。\n let vueRuntimeEntry: string | null = null\n if (config.framework === 'vue') {\n try {\n const vuePkgJson = require.resolve('vue/package.json', { paths: [config.root] })\n const vueDir = path.dirname(vuePkgJson)\n const mod = JSON.parse(fs.readFileSync(vuePkgJson, 'utf-8')).module as string | undefined\n const entry = path.join(vueDir, mod ?? 'dist/vue.runtime.esm-bundler.js')\n if (fs.existsSync(entry)) vueRuntimeEntry = entry\n } catch {\n /* vue 尚未安装(如 configResolved 阶段):忽略,回落到默认解析 */\n }\n }\n\n return {\n name: 'nasti:resolve',\n enforce: 'pre',\n\n resolveId(source, importer) {\n // 1. alias —— 优先:直接解析到磁盘上的目标文件\n for (const [key, value] of aliasEntries) {\n if (source === key || source.startsWith(key + '/')) {\n const aliasBase = resolveAliasTarget(value, config.root)\n const sub = source.slice(key.length).replace(/^\\//, '')\n const target = sub ? path.join(aliasBase, sub) : aliasBase\n const resolved = tryResolveFile(target, extensions)\n if (resolved) return resolved\n // alias 未命中实际文件:跳出循环走下游分支,避免把 `@/x` 误当作 bare import\n break\n }\n }\n\n // 2. 项目根相对路径(Vite 约定):`/src/...` 指向 <root>/src/...\n // chen-the-dawnstreak 的虚拟路由模块会生成这种 import。\n // 必须排在「真正绝对路径」分支前 —— Unix 下二者无法靠 path.isAbsolute 区分。\n if (source.startsWith('/') && !source.startsWith('//')) {\n const rootRelative = path.join(config.root, source.slice(1))\n const resolved = tryResolveFile(rootRelative, extensions)\n if (resolved) return resolved\n }\n\n // 3. 真正的文件系统绝对路径(Windows `C:\\…` 或已被其它插件解析过的 Unix 路径)\n if (path.isAbsolute(source) && fs.existsSync(source)) {\n const resolved = tryResolveFile(source, extensions)\n if (resolved) return resolved\n }\n\n // 4. 相对路径\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 // 5. bare import (node_modules)\n if (!source.startsWith('/') && !source.startsWith('.')) {\n // Vue runtime-only 重定向(见上方说明)\n if (vueRuntimeEntry && source === 'vue') return vueRuntimeEntry\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 // 虚拟模块(Vite 约定的 `\\0` 前缀)交给提供它的插件处理\n if (id.startsWith('\\0')) return null\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/**\n * 把 alias 值统一成磁盘绝对路径,匹配 dev server 的语义:\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 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","// Debug - DEBUG 环境变量驱动的命名空间调试输出(仿 Vite createDebugger)\n// 用法:DEBUG=nasti:* nasti dev;NASTI_DEBUG_FILTER=foo 进一步按内容过滤\nimport pc from 'picocolors'\n\nexport type NastiDebugScope = `nasti:${string}`\n\ninterface DebuggerOptions {\n /** 仅当 DEBUG 精确包含该命名空间(而非 nasti:* 通配)时才启用 */\n onlyWhenFocused?: boolean | string\n}\n\nconst DEBUG = process.env.DEBUG\n// 同时认 vite:* —— 方便移植 Vite 插件/工作流时直接复用已有的 DEBUG 习惯\nconst filter = process.env.NASTI_DEBUG_FILTER || process.env.VITE_DEBUG_FILTER\n\nexport function createDebugger(\n namespace: NastiDebugScope,\n options: DebuggerOptions = {},\n): ((...args: unknown[]) => void) | undefined {\n if (!DEBUG) return undefined\n\n const patterns = DEBUG.split(',').map((p) => p.trim())\n const enabled = patterns.some((p) => {\n if (p === '*' || p === 'nasti:*' || p === 'vite:*') return true\n // 把 vite:xxx 映射到 nasti:xxx,兼容移植的调试习惯\n const normalized = p.startsWith('vite:') ? `nasti:${p.slice(5)}` : p\n return normalized === namespace\n })\n if (!enabled) return undefined\n\n if (options.onlyWhenFocused) {\n const focus =\n typeof options.onlyWhenFocused === 'string'\n ? options.onlyWhenFocused\n : namespace\n if (!patterns.includes(focus)) return undefined\n }\n\n let lastTime = performance.now()\n return (...args: unknown[]) => {\n const now = performance.now()\n const elapsed = now - lastTime\n lastTime = now\n const msg = args\n .map((a) => {\n if (typeof a === 'string') return a\n // JSON.stringify 在循环引用 / BigInt 上会抛 —— 调试输出绝不能反过来\n // 中断主流程,故 try/catch 回退到 String()\n try {\n return JSON.stringify(a)\n } catch {\n return String(a)\n }\n })\n .join(' ')\n if (filter && !msg.includes(filter)) return\n console.debug(\n `${pc.magenta(namespace)} ${msg} ${pc.dim(`+${Math.round(elapsed)}ms`)}`,\n )\n }\n}\n","// Copyright 2017 Lovell Fuller and others.\n// SPDX-License-Identifier: Apache-2.0\n\n'use strict';\n\nconst isLinux = () => process.platform === 'linux';\n\nlet report = null;\nconst getReport = () => {\n if (!report) {\n /* istanbul ignore next */\n if (isLinux() && process.report) {\n const orig = process.report.excludeNetwork;\n process.report.excludeNetwork = true;\n report = process.report.getReport();\n process.report.excludeNetwork = orig;\n } else {\n report = {};\n }\n }\n return report;\n};\n\nmodule.exports = { isLinux, getReport };\n","// Copyright 2017 Lovell Fuller and others.\n// SPDX-License-Identifier: Apache-2.0\n\n'use strict';\n\nconst fs = require('fs');\n\nconst LDD_PATH = '/usr/bin/ldd';\nconst SELF_PATH = '/proc/self/exe';\nconst MAX_LENGTH = 2048;\n\n/**\n * Read the content of a file synchronous\n *\n * @param {string} path\n * @returns {Buffer}\n */\nconst readFileSync = (path) => {\n const fd = fs.openSync(path, 'r');\n const buffer = Buffer.alloc(MAX_LENGTH);\n const bytesRead = fs.readSync(fd, buffer, 0, MAX_LENGTH, 0);\n fs.close(fd, () => {});\n return buffer.subarray(0, bytesRead);\n};\n\n/**\n * Read the content of a file\n *\n * @param {string} path\n * @returns {Promise<Buffer>}\n */\nconst readFile = (path) => new Promise((resolve, reject) => {\n fs.open(path, 'r', (err, fd) => {\n if (err) {\n reject(err);\n } else {\n const buffer = Buffer.alloc(MAX_LENGTH);\n fs.read(fd, buffer, 0, MAX_LENGTH, 0, (_, bytesRead) => {\n resolve(buffer.subarray(0, bytesRead));\n fs.close(fd, () => {});\n });\n }\n });\n});\n\nmodule.exports = {\n LDD_PATH,\n SELF_PATH,\n readFileSync,\n readFile\n};\n","// Copyright 2017 Lovell Fuller and others.\n// SPDX-License-Identifier: Apache-2.0\n\n'use strict';\n\nconst interpreterPath = (elf) => {\n if (elf.length < 64) {\n return null;\n }\n if (elf.readUInt32BE(0) !== 0x7F454C46) {\n // Unexpected magic bytes\n return null;\n }\n if (elf.readUInt8(4) !== 2) {\n // Not a 64-bit ELF\n return null;\n }\n if (elf.readUInt8(5) !== 1) {\n // Not little-endian\n return null;\n }\n const offset = elf.readUInt32LE(32);\n const size = elf.readUInt16LE(54);\n const count = elf.readUInt16LE(56);\n for (let i = 0; i < count; i++) {\n const headerOffset = offset + (i * size);\n const type = elf.readUInt32LE(headerOffset);\n if (type === 3) {\n const fileOffset = elf.readUInt32LE(headerOffset + 8);\n const fileSize = elf.readUInt32LE(headerOffset + 32);\n return elf.subarray(fileOffset, fileOffset + fileSize).toString().replace(/\\0.*$/g, '');\n }\n }\n return null;\n};\n\nmodule.exports = {\n interpreterPath\n};\n","// Copyright 2017 Lovell Fuller and others.\n// SPDX-License-Identifier: Apache-2.0\n\n'use strict';\n\nconst childProcess = require('child_process');\nconst { isLinux, getReport } = require('./process');\nconst { LDD_PATH, SELF_PATH, readFile, readFileSync } = require('./filesystem');\nconst { interpreterPath } = require('./elf');\n\nlet cachedFamilyInterpreter;\nlet cachedFamilyFilesystem;\nlet cachedVersionFilesystem;\n\nconst command = 'getconf GNU_LIBC_VERSION 2>&1 || true; ldd --version 2>&1 || true';\nlet commandOut = '';\n\nconst safeCommand = () => {\n if (!commandOut) {\n return new Promise((resolve) => {\n childProcess.exec(command, (err, out) => {\n commandOut = err ? ' ' : out;\n resolve(commandOut);\n });\n });\n }\n return commandOut;\n};\n\nconst safeCommandSync = () => {\n if (!commandOut) {\n try {\n commandOut = childProcess.execSync(command, { encoding: 'utf8' });\n } catch (_err) {\n commandOut = ' ';\n }\n }\n return commandOut;\n};\n\n/**\n * A String constant containing the value `glibc`.\n * @type {string}\n * @public\n */\nconst GLIBC = 'glibc';\n\n/**\n * A Regexp constant to get the GLIBC Version.\n * @type {string}\n */\nconst RE_GLIBC_VERSION = /LIBC[a-z0-9 \\-).]*?(\\d+\\.\\d+)/i;\n\n/**\n * A String constant containing the value `musl`.\n * @type {string}\n * @public\n */\nconst MUSL = 'musl';\n\nconst isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-');\n\nconst familyFromReport = () => {\n const report = getReport();\n if (report.header && report.header.glibcVersionRuntime) {\n return GLIBC;\n }\n if (Array.isArray(report.sharedObjects)) {\n if (report.sharedObjects.some(isFileMusl)) {\n return MUSL;\n }\n }\n return null;\n};\n\nconst familyFromCommand = (out) => {\n const [getconf, ldd1] = out.split(/[\\r\\n]+/);\n if (getconf && getconf.includes(GLIBC)) {\n return GLIBC;\n }\n if (ldd1 && ldd1.includes(MUSL)) {\n return MUSL;\n }\n return null;\n};\n\nconst familyFromInterpreterPath = (path) => {\n if (path) {\n if (path.includes('/ld-musl-')) {\n return MUSL;\n } else if (path.includes('/ld-linux-')) {\n return GLIBC;\n }\n }\n return null;\n};\n\nconst getFamilyFromLddContent = (content) => {\n content = content.toString();\n if (content.includes('musl')) {\n return MUSL;\n }\n if (content.includes('GNU C Library')) {\n return GLIBC;\n }\n return null;\n};\n\nconst familyFromFilesystem = async () => {\n if (cachedFamilyFilesystem !== undefined) {\n return cachedFamilyFilesystem;\n }\n cachedFamilyFilesystem = null;\n try {\n const lddContent = await readFile(LDD_PATH);\n cachedFamilyFilesystem = getFamilyFromLddContent(lddContent);\n } catch (e) {}\n return cachedFamilyFilesystem;\n};\n\nconst familyFromFilesystemSync = () => {\n if (cachedFamilyFilesystem !== undefined) {\n return cachedFamilyFilesystem;\n }\n cachedFamilyFilesystem = null;\n try {\n const lddContent = readFileSync(LDD_PATH);\n cachedFamilyFilesystem = getFamilyFromLddContent(lddContent);\n } catch (e) {}\n return cachedFamilyFilesystem;\n};\n\nconst familyFromInterpreter = async () => {\n if (cachedFamilyInterpreter !== undefined) {\n return cachedFamilyInterpreter;\n }\n cachedFamilyInterpreter = null;\n try {\n const selfContent = await readFile(SELF_PATH);\n const path = interpreterPath(selfContent);\n cachedFamilyInterpreter = familyFromInterpreterPath(path);\n } catch (e) {}\n return cachedFamilyInterpreter;\n};\n\nconst familyFromInterpreterSync = () => {\n if (cachedFamilyInterpreter !== undefined) {\n return cachedFamilyInterpreter;\n }\n cachedFamilyInterpreter = null;\n try {\n const selfContent = readFileSync(SELF_PATH);\n const path = interpreterPath(selfContent);\n cachedFamilyInterpreter = familyFromInterpreterPath(path);\n } catch (e) {}\n return cachedFamilyInterpreter;\n};\n\n/**\n * Resolves with the libc family when it can be determined, `null` otherwise.\n * @returns {Promise<?string>}\n */\nconst family = async () => {\n let family = null;\n if (isLinux()) {\n family = await familyFromInterpreter();\n if (!family) {\n family = await familyFromFilesystem();\n if (!family) {\n family = familyFromReport();\n }\n if (!family) {\n const out = await safeCommand();\n family = familyFromCommand(out);\n }\n }\n }\n return family;\n};\n\n/**\n * Returns the libc family when it can be determined, `null` otherwise.\n * @returns {?string}\n */\nconst familySync = () => {\n let family = null;\n if (isLinux()) {\n family = familyFromInterpreterSync();\n if (!family) {\n family = familyFromFilesystemSync();\n if (!family) {\n family = familyFromReport();\n }\n if (!family) {\n const out = safeCommandSync();\n family = familyFromCommand(out);\n }\n }\n }\n return family;\n};\n\n/**\n * Resolves `true` only when the platform is Linux and the libc family is not `glibc`.\n * @returns {Promise<boolean>}\n */\nconst isNonGlibcLinux = async () => isLinux() && await family() !== GLIBC;\n\n/**\n * Returns `true` only when the platform is Linux and the libc family is not `glibc`.\n * @returns {boolean}\n */\nconst isNonGlibcLinuxSync = () => isLinux() && familySync() !== GLIBC;\n\nconst versionFromFilesystem = async () => {\n if (cachedVersionFilesystem !== undefined) {\n return cachedVersionFilesystem;\n }\n cachedVersionFilesystem = null;\n try {\n const lddContent = await readFile(LDD_PATH);\n const versionMatch = lddContent.match(RE_GLIBC_VERSION);\n if (versionMatch) {\n cachedVersionFilesystem = versionMatch[1];\n }\n } catch (e) {}\n return cachedVersionFilesystem;\n};\n\nconst versionFromFilesystemSync = () => {\n if (cachedVersionFilesystem !== undefined) {\n return cachedVersionFilesystem;\n }\n cachedVersionFilesystem = null;\n try {\n const lddContent = readFileSync(LDD_PATH);\n const versionMatch = lddContent.match(RE_GLIBC_VERSION);\n if (versionMatch) {\n cachedVersionFilesystem = versionMatch[1];\n }\n } catch (e) {}\n return cachedVersionFilesystem;\n};\n\nconst versionFromReport = () => {\n const report = getReport();\n if (report.header && report.header.glibcVersionRuntime) {\n return report.header.glibcVersionRuntime;\n }\n return null;\n};\n\nconst versionSuffix = (s) => s.trim().split(/\\s+/)[1];\n\nconst versionFromCommand = (out) => {\n const [getconf, ldd1, ldd2] = out.split(/[\\r\\n]+/);\n if (getconf && getconf.includes(GLIBC)) {\n return versionSuffix(getconf);\n }\n if (ldd1 && ldd2 && ldd1.includes(MUSL)) {\n return versionSuffix(ldd2);\n }\n return null;\n};\n\n/**\n * Resolves with the libc version when it can be determined, `null` otherwise.\n * @returns {Promise<?string>}\n */\nconst version = async () => {\n let version = null;\n if (isLinux()) {\n version = await versionFromFilesystem();\n if (!version) {\n version = versionFromReport();\n }\n if (!version) {\n const out = await safeCommand();\n version = versionFromCommand(out);\n }\n }\n return version;\n};\n\n/**\n * Returns the libc version when it can be determined, `null` otherwise.\n * @returns {?string}\n */\nconst versionSync = () => {\n let version = null;\n if (isLinux()) {\n version = versionFromFilesystemSync();\n if (!version) {\n version = versionFromReport();\n }\n if (!version) {\n const out = safeCommandSync();\n version = versionFromCommand(out);\n }\n }\n return version;\n};\n\nmodule.exports = {\n GLIBC,\n MUSL,\n family,\n familySync,\n isNonGlibcLinux,\n isNonGlibcLinuxSync,\n version,\n versionSync\n};\n","const BROWSER_MAPPING = {\n and_chr: 'chrome',\n and_ff: 'firefox',\n ie_mob: 'ie',\n op_mob: 'opera',\n and_qq: null,\n and_uc: null,\n baidu: null,\n bb: null,\n kaios: null,\n op_mini: null,\n};\n\nfunction browserslistToTargets(browserslist) {\n let targets = {};\n for (let browser of browserslist) {\n let [name, v] = browser.split(' ');\n if (BROWSER_MAPPING[name] === null) {\n continue;\n }\n\n let version = parseVersion(v);\n if (version == null) {\n continue;\n }\n\n if (targets[name] == null || version < targets[name]) {\n targets[name] = version;\n }\n }\n\n return targets;\n}\n\nfunction parseVersion(version) {\n let [major, minor = 0, patch = 0] = version\n .split('-')[0]\n .split('.')\n .map(v => parseInt(v, 10));\n\n if (isNaN(major) || isNaN(minor) || isNaN(patch)) {\n return null;\n }\n\n return (major << 16) | (minor << 8) | patch;\n}\n\nmodule.exports = browserslistToTargets;\n","// @ts-check\n/** @typedef {import('./index').Visitor} Visitor */\n/** @typedef {import('./index').VisitorFunction} VisitorFunction */\n\n/**\n * Composes multiple visitor objects into a single one.\n * @param {(Visitor | VisitorFunction)[]} visitors \n * @return {Visitor | VisitorFunction}\n */\nfunction composeVisitors(visitors) {\n if (visitors.length === 1) {\n return visitors[0];\n }\n \n if (visitors.some(v => typeof v === 'function')) {\n return (opts) => {\n let v = visitors.map(v => typeof v === 'function' ? v(opts) : v);\n return composeVisitors(v);\n };\n }\n\n /** @type Visitor */\n let res = {};\n composeSimpleVisitors(res, visitors, 'StyleSheet');\n composeSimpleVisitors(res, visitors, 'StyleSheetExit');\n composeObjectVisitors(res, visitors, 'Rule', ruleVisitor, wrapCustomAndUnknownAtRule);\n composeObjectVisitors(res, visitors, 'RuleExit', ruleVisitor, wrapCustomAndUnknownAtRule);\n composeObjectVisitors(res, visitors, 'Declaration', declarationVisitor, wrapCustomProperty);\n composeObjectVisitors(res, visitors, 'DeclarationExit', declarationVisitor, wrapCustomProperty);\n composeSimpleVisitors(res, visitors, 'Url');\n composeSimpleVisitors(res, visitors, 'Color');\n composeSimpleVisitors(res, visitors, 'Image');\n composeSimpleVisitors(res, visitors, 'ImageExit');\n composeSimpleVisitors(res, visitors, 'Length');\n composeSimpleVisitors(res, visitors, 'Angle');\n composeSimpleVisitors(res, visitors, 'Ratio');\n composeSimpleVisitors(res, visitors, 'Resolution');\n composeSimpleVisitors(res, visitors, 'Time');\n composeSimpleVisitors(res, visitors, 'CustomIdent');\n composeSimpleVisitors(res, visitors, 'DashedIdent');\n composeArrayFunctions(res, visitors, 'MediaQuery');\n composeArrayFunctions(res, visitors, 'MediaQueryExit');\n composeSimpleVisitors(res, visitors, 'SupportsCondition');\n composeSimpleVisitors(res, visitors, 'SupportsConditionExit');\n composeArrayFunctions(res, visitors, 'Selector');\n composeTokenVisitors(res, visitors, 'Token', 'token', false);\n composeTokenVisitors(res, visitors, 'Function', 'function', false);\n composeTokenVisitors(res, visitors, 'FunctionExit', 'function', true);\n composeTokenVisitors(res, visitors, 'Variable', 'var', false);\n composeTokenVisitors(res, visitors, 'VariableExit', 'var', true);\n composeTokenVisitors(res, visitors, 'EnvironmentVariable', 'env', false);\n composeTokenVisitors(res, visitors, 'EnvironmentVariableExit', 'env', true);\n return res;\n}\n\nmodule.exports = composeVisitors;\n\nfunction wrapCustomAndUnknownAtRule(k, f) {\n if (k === 'unknown') {\n return (value => f({ type: 'unknown', value }));\n }\n if (k === 'custom') {\n return (value => f({ type: 'custom', value }));\n }\n return f;\n}\n\nfunction wrapCustomProperty(k, f) {\n return k === 'custom' ? (value => f({ property: 'custom', value })) : f;\n}\n\n/**\n * @param {import('./index').Visitor['Rule']} f \n * @param {import('./ast').Rule} item \n */\nfunction ruleVisitor(f, item) {\n if (typeof f === 'object') {\n if (item.type === 'unknown') {\n let v = f.unknown;\n if (typeof v === 'object') {\n v = v[item.value.name];\n }\n return v?.(item.value);\n }\n if (item.type === 'custom') {\n let v = f.custom;\n if (typeof v === 'object') {\n v = v[item.value.name];\n }\n return v?.(item.value);\n }\n return f[item.type]?.(item);\n }\n return f?.(item);\n}\n\n/**\n * @param {import('./index').Visitor['Declaration']} f \n * @param {import('./ast').Declaration} item \n */\nfunction declarationVisitor(f, item) {\n if (typeof f === 'object') {\n /** @type {string} */\n let name = item.property;\n if (item.property === 'unparsed') {\n name = item.value.propertyId.property;\n } else if (item.property === 'custom') {\n let v = f.custom;\n if (typeof v === 'object') {\n v = v[item.value.name];\n }\n return v?.(item.value);\n }\n return f[name]?.(item);\n }\n return f?.(item);\n}\n\n/**\n * \n * @param {Visitor[]} visitors \n * @param {string} key \n * @returns {[any[], boolean, Set<string>]}\n */\nfunction extractObjectsOrFunctions(visitors, key) {\n let values = [];\n let hasFunction = false;\n let allKeys = new Set();\n for (let visitor of visitors) {\n let v = visitor[key];\n if (v) {\n if (typeof v === 'function') {\n hasFunction = true;\n } else {\n for (let key in v) {\n allKeys.add(key);\n }\n }\n values.push(v);\n }\n }\n return [values, hasFunction, allKeys];\n}\n\n/**\n * @template {keyof Visitor} K\n * @param {Visitor} res\n * @param {Visitor[]} visitors\n * @param {K} key\n * @param {(visitor: Visitor[K], item: any) => any | any[] | void} apply \n * @param {(k: string, f: any) => any} wrapKey \n */\nfunction composeObjectVisitors(res, visitors, key, apply, wrapKey) {\n let [values, hasFunction, allKeys] = extractObjectsOrFunctions(visitors, key);\n if (values.length === 0) {\n return;\n }\n\n if (values.length === 1) {\n res[key] = values[0];\n return;\n }\n\n let f = createArrayVisitor(visitors, (visitor, item) => apply(visitor[key], item));\n if (hasFunction) {\n res[key] = f;\n } else {\n /** @type {any} */\n let v = {};\n for (let k of allKeys) {\n v[k] = wrapKey(k, f);\n }\n res[key] = v;\n }\n}\n\n/**\n * @param {Visitor} res \n * @param {Visitor[]} visitors \n * @param {string} key \n * @param {import('./ast').TokenOrValue['type']} type \n * @param {boolean} isExit \n */\nfunction composeTokenVisitors(res, visitors, key, type, isExit) {\n let [values, hasFunction, allKeys] = extractObjectsOrFunctions(visitors, key);\n if (values.length === 0) {\n return;\n }\n\n if (values.length === 1) {\n res[key] = values[0];\n return;\n }\n\n let f = createTokenVisitor(visitors, type, isExit);\n if (hasFunction) {\n res[key] = f;\n } else {\n let v = {};\n for (let key of allKeys) {\n v[key] = f;\n }\n res[key] = v;\n }\n}\n\n/**\n * @param {Visitor[]} visitors \n * @param {import('./ast').TokenOrValue['type']} type \n */\nfunction createTokenVisitor(visitors, type, isExit) {\n let v = createArrayVisitor(visitors, (visitor, /** @type {import('./ast').TokenOrValue} */ item) => {\n let f;\n switch (item.type) {\n case 'token':\n f = visitor.Token;\n if (typeof f === 'object') {\n f = f[item.value.type];\n }\n break;\n case 'function':\n f = isExit ? visitor.FunctionExit : visitor.Function;\n if (typeof f === 'object') {\n f = f[item.value.name];\n }\n break;\n case 'var':\n f = isExit ? visitor.VariableExit : visitor.Variable;\n break;\n case 'env':\n f = isExit ? visitor.EnvironmentVariableExit : visitor.EnvironmentVariable;\n if (typeof f === 'object') {\n let name;\n switch (item.value.name.type) {\n case 'ua':\n case 'unknown':\n name = item.value.name.value;\n break;\n case 'custom':\n name = item.value.name.ident;\n break;\n }\n f = f[name];\n }\n break;\n case 'color':\n f = visitor.Color;\n break;\n case 'url':\n f = visitor.Url;\n break;\n case 'length':\n f = visitor.Length;\n break;\n case 'angle':\n f = visitor.Angle;\n break;\n case 'time':\n f = visitor.Time;\n break;\n case 'resolution':\n f = visitor.Resolution;\n break;\n case 'dashed-ident':\n f = visitor.DashedIdent;\n break;\n }\n\n if (!f) {\n return;\n }\n\n let res = f(item.value);\n switch (item.type) {\n case 'color':\n case 'url':\n case 'length':\n case 'angle':\n case 'time':\n case 'resolution':\n case 'dashed-ident':\n if (Array.isArray(res)) {\n res = res.map(value => ({ type: item.type, value }))\n } else if (res) {\n res = { type: item.type, value: res };\n }\n break;\n }\n\n return res;\n });\n\n return value => v({ type, value });\n}\n\n/**\n * @param {Visitor[]} visitors \n * @param {string} key \n */\nfunction extractFunctions(visitors, key) {\n let functions = [];\n for (let visitor of visitors) {\n let f = visitor[key];\n if (f) {\n functions.push(f);\n }\n }\n return functions;\n}\n\n/**\n * @param {Visitor} res \n * @param {Visitor[]} visitors \n * @param {string} key \n */\nfunction composeSimpleVisitors(res, visitors, key) {\n let functions = extractFunctions(visitors, key);\n if (functions.length === 0) {\n return;\n }\n\n if (functions.length === 1) {\n res[key] = functions[0];\n return;\n }\n\n res[key] = arg => {\n let mutated = false;\n for (let f of functions) {\n let res = f(arg);\n if (res) {\n arg = res;\n mutated = true;\n }\n }\n\n return mutated ? arg : undefined;\n };\n}\n\n/**\n * @param {Visitor} res \n * @param {Visitor[]} visitors \n * @param {string} key \n */\nfunction composeArrayFunctions(res, visitors, key) {\n let functions = extractFunctions(visitors, key);\n if (functions.length === 0) {\n return;\n }\n\n if (functions.length === 1) {\n res[key] = functions[0];\n return;\n }\n\n res[key] = createArrayVisitor(functions, (f, item) => f(item));\n}\n\n/**\n * @template T\n * @template V\n * @param {T[]} visitors \n * @param {(visitor: T, item: V) => V | V[] | void} apply \n * @returns {(item: V) => V | V[] | void}\n */\nfunction createArrayVisitor(visitors, apply) {\n let seen = new Bitset(visitors.length);\n return arg => {\n let arr = [arg];\n let mutated = false;\n seen.clear();\n for (let i = 0; i < arr.length; i++) {\n // For each value, call all visitors. If a visitor returns a new value,\n // we start over, but skip the visitor that generated the value or saw\n // it before (to avoid cycles). This way, visitors can be composed in any order. \n for (let v = 0; v < visitors.length && i < arr.length;) {\n if (seen.get(v)) {\n v++;\n continue;\n }\n\n let item = arr[i];\n let visitor = visitors[v];\n let res = apply(visitor, item);\n if (Array.isArray(res)) {\n if (res.length === 0) {\n arr.splice(i, 1);\n } else if (res.length === 1) {\n arr[i] = res[0];\n } else {\n arr.splice(i, 1, ...res);\n }\n mutated = true;\n seen.set(v);\n v = 0;\n } else if (res) {\n arr[i] = res;\n mutated = true;\n seen.set(v);\n v = 0;\n } else {\n v++;\n }\n }\n }\n\n if (!mutated) {\n return;\n }\n\n return arr.length === 1 ? arr[0] : arr;\n };\n}\n\nclass Bitset {\n constructor(maxBits = 32) {\n this.bits = 0;\n this.more = maxBits > 32 ? new Uint32Array(Math.ceil((maxBits - 32) / 32)) : null;\n }\n\n /** @param {number} bit */\n get(bit) {\n if (bit >= 32 && this.more) {\n let i = Math.floor((bit - 32) / 32);\n let b = bit % 32;\n return Boolean(this.more[i] & (1 << b));\n } else {\n return Boolean(this.bits & (1 << bit));\n }\n }\n\n /** @param {number} bit */\n set(bit) {\n if (bit >= 32 && this.more) {\n let i = Math.floor((bit - 32) / 32);\n let b = bit % 32;\n this.more[i] |= 1 << b;\n } else {\n this.bits |= 1 << bit;\n }\n }\n\n clear() {\n this.bits = 0;\n if (this.more) {\n this.more.fill(0);\n }\n }\n}\n","// This file is autogenerated by build-prefixes.js. DO NOT EDIT!\n\nexports.Features = {\n Nesting: 1,\n NotSelectorList: 2,\n DirSelector: 4,\n LangSelectorList: 8,\n IsSelector: 16,\n TextDecorationThicknessPercent: 32,\n MediaIntervalSyntax: 64,\n MediaRangeSyntax: 128,\n CustomMediaQueries: 256,\n ClampFunction: 512,\n ColorFunction: 1024,\n OklabColors: 2048,\n LabColors: 4096,\n P3Colors: 8192,\n HexAlphaColors: 16384,\n SpaceSeparatedColorNotation: 32768,\n FontFamilySystemUi: 65536,\n DoublePositionGradients: 131072,\n VendorPrefixes: 262144,\n LogicalProperties: 524288,\n LightDark: 1048576,\n Selectors: 31,\n MediaQueries: 448,\n Colors: 1113088,\n};\n","let parts = [process.platform, process.arch];\nif (process.platform === 'linux') {\n const { MUSL, familySync } = require('detect-libc');\n const family = familySync();\n if (family === MUSL) {\n parts.push('musl');\n } else if (process.arch === 'arm') {\n parts.push('gnueabihf');\n } else {\n parts.push('gnu');\n }\n} else if (process.platform === 'win32') {\n parts.push('msvc');\n}\n\nlet native;\ntry {\n native = require(`lightningcss-${parts.join('-')}`);\n} catch (err) {\n native = require(`../lightningcss.${parts.join('-')}.node`);\n}\n\nmodule.exports.transform = wrap(native.transform);\nmodule.exports.transformStyleAttribute = wrap(native.transformStyleAttribute);\nmodule.exports.bundle = wrap(native.bundle);\nmodule.exports.bundleAsync = wrap(native.bundleAsync);\nmodule.exports.browserslistToTargets = require('./browserslistToTargets');\nmodule.exports.composeVisitors = require('./composeVisitors');\nmodule.exports.Features = require('./flags').Features;\n\nfunction wrap(call) {\n return (options) => {\n if (typeof options.visitor === 'function') {\n let deps = [];\n options.visitor = options.visitor({\n addDependency(dep) {\n deps.push(dep);\n }\n });\n\n let result = call(options);\n if (result instanceof Promise) {\n result = result.then(res => {\n if (deps.length) {\n res.dependencies ??= [];\n res.dependencies.push(...deps);\n }\n return res;\n });\n } else if (deps.length) {\n result.dependencies ??= [];\n result.dependencies.push(...deps);\n }\n return result;\n } else {\n return call(options);\n }\n };\n}\n","import index from './index.js';\n\nconst { transform, transformStyleAttribute, bundle, bundleAsync, browserslistToTargets, composeVisitors, Features } = index;\nexport { transform, transformStyleAttribute, bundle, bundleAsync, browserslistToTargets, composeVisitors, Features };\n","// CSS 引擎 - build 期 per-chunk CSS 抽取的共享状态与工具\n//\n// 架构(NASTI_2.0_PLAN.md §2.2):\n// compile 阶段(plugins/css.ts) :Tailwind 编译 + url() 重写,把 CSS 字符串\n// 按规范化模块 id 注册进 styles Map,向\n// bundler 返回空 JS stub(moduleType:'js',\n// Rolldown 1.x 移除了原生 CSS 打包,见 #4271)\n// css-post 阶段(plugins/css-post.ts):renderChunk 按 chunk.moduleIds 聚合\n// CSS、压缩、emitFile 产出带 hash 的 .css\n//\n// 压缩器是 Lightning CSS(守卫导入,可选依赖)—— 这是相对 Vite 默认\n// (PostCSS 转换器 + Lightning 压缩器)的有意分歧:纯 Rust、依赖更小。\n// 不可用时回退到保守的正则压缩。\nimport type { ResolvedConfig } from '../types.js'\nimport { createDebugger } from './debug.js'\n\nconst debug = createDebugger('nasti:css')\n\nexport interface CssEngine {\n /** 规范化模块 id → 编译后的 CSS 字符串 */\n styles: Map<string, string>\n /** entry chunk 的 facadeModuleId → 抽出的 css 文件名(用于 HTML <link> 注入) */\n entryCss: Map<string, string[]>\n /** 全部已 emit 的 css 文件名(按 render 顺序) */\n allCss: string[]\n /** cssCodeSplit:false 时的跨 chunk 累积(按 renderChunk 顺序) */\n pendingSingle: string[]\n /** cssCodeSplit:false 时最终单文件名 */\n singleFileName: string | null\n}\n\nexport function createCssEngine(): CssEngine {\n return {\n styles: new Map(),\n entryCss: new Map(),\n allCss: [],\n pendingSingle: [],\n singleFileName: null,\n }\n}\n\n/**\n * 规范化模块 id:去掉 Rolldown 虚拟模块的 null-byte 前缀。\n * **保留 query** —— Vue style 子块(`App.vue?vue&type=style&...&lang.css`)与\n * 父模块 `App.vue` 是不同模块,剥 query 会让二者 key 撞车导致 CSS 重复输出。\n * chunk.moduleIds 里的 id 必须与 transform 期注册的 key 一致 —— 两侧都过这个函数。\n */\nexport function normalizeCssModuleId(id: string): string {\n return id.startsWith('\\0') ? id.slice(1) : id\n}\n\nlet lightningCss: typeof import('lightningcss') | null | undefined\n\n/**\n * 压缩 CSS:优先 Lightning CSS(守卫导入),不可用时回退正则压缩。\n * Tailwind v4 的输出已自行 flatten @import,这里不做 @import 解析。\n */\nexport async function minifyCss(css: string, config: ResolvedConfig): Promise<string> {\n if (lightningCss === undefined) {\n try {\n lightningCss = await import('lightningcss')\n } catch {\n lightningCss = null\n debug?.('lightningcss unavailable, falling back to regex minifier')\n }\n }\n if (lightningCss) {\n try {\n const result = lightningCss.transform({\n filename: 'bundle.css',\n code: Buffer.from(css),\n minify: true,\n // 不展开 @import(Tailwind 已 flatten;裸 @import 保留原样交给浏览器)\n errorRecovery: true,\n })\n for (const w of result.warnings ?? []) {\n config.logger.warnOnce(`[nasti:css] ${w.message}`)\n }\n return result.code.toString()\n } catch (err: any) {\n config.logger.warnOnce(\n `[nasti:css] Lightning CSS minify failed (${err.message}), emitting unminified CSS`,\n )\n return css\n }\n }\n return fallbackMinify(css)\n}\n\n/** 保守的正则压缩:去注释、压空白。不做任何结构性变换。 */\nfunction fallbackMinify(css: string): string {\n return css\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n // 仅折叠结构性标点周围的空白;不碰 + > ~ —— 它们在 calc()(`1 + 2`)\n // 与选择器组合符里语义敏感,去空格会产出非法 CSS\n .replace(/\\s*([{}:;,])\\s*/g, '$1')\n .replace(/;}/g, '}')\n .replace(/\\s+/g, ' ')\n .trim()\n}\n","// Tailwind v4 integration: when a stylesheet contains v4 directives\n// (`@import \"tailwindcss\"`, `@theme`, `@apply`, `@plugin`, `@source`,\n// `@utility`, `@variant`, `@custom-variant`, `@reference`, or `@tailwind`),\n// we hand the entire CSS to `@tailwindcss/node`'s `compile()` (which\n// internally resolves all `@import`s, including bare specifiers like\n// `@heroui/styles`) and then scan the project for candidate utilities via\n// `@tailwindcss/oxide`. Both packages are resolved from the project's own\n// `node_modules` — they are optional peer dependencies of Nasti.\nimport path from 'node:path'\nimport { createRequire } from 'node:module'\nimport { pathToFileURL } from 'node:url'\n\n// Matches the documented v4 at-rules. `@import \"tailwindcss...\"` is enough\n// to trigger the full pipeline; the other directives are recognized as a\n// safety net for stylesheets that bring their own preflight / utilities\n// scaffolding without going through the canonical entry.\nconst TAILWIND_DIRECTIVE_RE =\n /@(?:import\\s+[\"']tailwindcss(?:\\b|\\/)|tailwind\\b|theme\\b|apply\\b|plugin\\b|source\\b|utility\\b|variant\\b|custom-variant\\b|reference\\b)/\n\nexport function hasTailwindDirectives(css: string): boolean {\n // Strip comments to avoid false positives from commented-out directives\n const withoutBlockComments = css.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n const withoutLineComments = withoutBlockComments.replace(/\\/\\/.*$/gm, '')\n return TAILWIND_DIRECTIVE_RE.test(withoutLineComments)\n}\n\ntype SourceEntry = { base: string; pattern: string; negated: boolean }\n\ntype TailwindModules = {\n node: {\n compile(\n css: string,\n options: { base: string; from: string; onDependency: (p: string) => void },\n ): Promise<{ sources: SourceEntry[]; build(candidates: string[]): string }>\n }\n oxide: {\n Scanner: new (options: { sources?: SourceEntry[] }) => {\n scan(): string[]\n files: string[]\n }\n }\n}\n\nlet cached: TailwindModules | null = null\nlet cachedRoot: string | null = null\n\nasync function loadTailwind(projectRoot: string): Promise<TailwindModules> {\n if (cached && cachedRoot === projectRoot) return cached\n // createRequire anchored at a *file* under the project root, otherwise\n // Node interprets `projectRoot` as a parent directory and resolution\n // walks outside the project's node_modules.\n const req = createRequire(path.join(projectRoot, 'package.json'))\n let nodePath: string\n let oxidePath: string\n try {\n nodePath = req.resolve('@tailwindcss/node')\n oxidePath = req.resolve('@tailwindcss/oxide')\n } catch {\n throw new Error(\n '[nasti] CSS contains Tailwind v4 directives but `@tailwindcss/node` ' +\n 'and/or `@tailwindcss/oxide` are not installed in this project. ' +\n 'Install them with: npm i -D tailwindcss @tailwindcss/node @tailwindcss/oxide',\n )\n }\n const node = (await import(pathToFileURL(nodePath).href)) as TailwindModules['node']\n const oxide = (await import(pathToFileURL(oxidePath).href)) as TailwindModules['oxide']\n cached = { node, oxide }\n cachedRoot = projectRoot\n return cached\n}\n\nexport type TailwindCompileResult = {\n css: string\n dependencies: string[]\n}\n\nexport async function compileTailwind(\n css: string,\n fromFile: string,\n projectRoot: string,\n): Promise<TailwindCompileResult> {\n const { node, oxide } = await loadTailwind(projectRoot)\n\n const dependencies: string[] = []\n const compiler = await node.compile(css, {\n base: path.dirname(fromFile),\n from: fromFile,\n onDependency: (p: string) => dependencies.push(p),\n })\n\n // Tailwind reports the source roots it wants scanned for class candidates\n // (driven by the implicit project root for `@import \"tailwindcss\"` and by\n // any explicit `@source` directives). We forward them verbatim to the\n // oxide scanner.\n const scanner = new oxide.Scanner({ sources: compiler.sources })\n const candidates = scanner.scan()\n\n return {\n css: compiler.build(candidates),\n dependencies: [...dependencies, ...scanner.files],\n }\n}\n","// CSS 处理插件 - 处理 .css 导入\n//\n// dev:编译后注入可热更新的 <style>(行为与 1.x 完全一致)\n// build:compile 阶段 —— 编译 + url() 重写后把 CSS 注册进 CssEngine,\n// 向 Rolldown 返回空 JS stub(moduleType:'js',规避 rolldown#4271\n// 移除原生 CSS 打包后的报错;no-treeshake 保证模块留在 chunk.moduleIds\n// 里供 css-post 的 renderChunk 聚合)。真正的 .css 产物由\n// plugins/css-post.ts 在 renderChunk 期 per-chunk 抽取。\nimport path from 'node:path'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\nimport type { CssEngine } from '../core/css-engine.js'\nimport { normalizeCssModuleId } from '../core/css-engine.js'\nimport { compileTailwind, hasTailwindDirectives } from './tailwind.js'\n\nexport function cssPlugin(\n config: ResolvedConfig,\n engine?: CssEngine,\n consumer: 'client' | 'server' = 'client',\n): 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 async transform(code, id) {\n // 匹配 .css 文件与 .css 结尾的虚拟模块(如 Vue style 子块\n // `App.vue?vue&type=style&index=0&lang.css`);?raw / ?url 交给 assets 插件\n const [file, query = ''] = id.split('?', 2)\n const isCssRequest = file.endsWith('.css') || /\\.css$/.test(id)\n if (!isCssRequest) return null\n if (query === 'raw' || query === 'url') return null\n\n // Tailwind v4: when the stylesheet uses any v4 directive, hand the\n // entire source to Tailwind. Tailwind's own compiler resolves all\n // `@import`s (including bare specifiers like `@heroui/styles`), runs\n // the oxide scanner to discover utility candidates, and emits a\n // fully-flattened stylesheet — which is exactly what the browser\n // needs when we inline the result into a `<style>` tag below.\n let cssSource = code\n if (hasTailwindDirectives(code)) {\n const compiled = await compileTailwind(code, id, config.root)\n cssSource = compiled.css\n }\n\n // 将 CSS 中的相对 url() 路径重写为绝对路径,确保打包后资源路径正确\n const rewritten = rewriteCssUrls(cssSource, file, config.root)\n const escaped = JSON.stringify(rewritten)\n\n // ?inline:只要编译后的字符串,不注入、不抽取(dev/build 行为一致)\n if (query === 'inline') {\n return { code: `export default ${escaped};\\n`, moduleType: 'js' }\n }\n\n // server consumer(SSR dev/build、Electron main/preload):无 DOM 环境,\n // 返回 CSS 字符串导出(SSR 可收集),真实 .css 产物由 client 环境负责\n if (consumer === 'server') {\n return { code: `export default ${escaped};\\n`, moduleType: 'js' }\n }\n\n if (config.command === 'serve') {\n // Dev 模式: 注入可热更新的 <style> 标签\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(prune 在 bundled 模式的 rolldown hot context 上不存在,须守卫)\nif (import.meta.hot) {\n import.meta.hot.accept();\n if (import.meta.hot.prune) {\n import.meta.hot.prune(() => {\n style.remove();\n });\n }\n}\n\nexport default css;\n`,\n // bundled dev(DevEngine)下该模块会进 Rolldown:不标 js 会按 .css\n // 扩展名走 CSS 管线触发 #4271 报错;unbundled 中间件忽略此字段\n moduleType: 'js',\n }\n }\n\n // Build 模式:注册进 CssEngine,由 css-post 在 renderChunk 抽取为\n // 带 hash 的 .css 文件。返回空 stub —— CSS 文本不再进 JS bundle\n // (1.x 是运行时 <style>/<link> 注入 + export default css 字符串,\n // 体积双份;`import css from './x.css'` 现在得到 '',需要字符串请用\n // `?inline`,与 Vite 语义一致)。\n if (engine) {\n engine.styles.set(normalizeCssModuleId(id), rewritten)\n return {\n code: `export default '';\\n`,\n moduleType: 'js',\n // 防止空 stub 被 tree-shake 出 chunk.moduleIds(css-post 靠它定位)\n moduleSideEffects: 'no-treeshake',\n }\n }\n\n // 无 engine(理论上只有未迁移的调用方):保留 1.x 运行时注入兜底\n const cssConfig = config.build.css || {}\n const nonce = cssConfig.nonce\n const nonceAttr = nonce ? `style.setAttribute('nonce', ${JSON.stringify(nonce)});` : ''\n return {\n code: `\nconst css = ${escaped};\nconst style = document.createElement('style');\nstyle.setAttribute('data-nasti-css', ${JSON.stringify(id)});\n${nonceAttr}\nstyle.textContent = css;\ndocument.head.appendChild(style);\n\nexport default css;\n`,\n moduleType: 'js',\n }\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 // path.relative 在 Windows 上产出反斜杠 —— URL 必须用 POSIX 分隔符\n const relative = '/' + path.relative(root, resolved).replace(/\\\\/g, '/')\n return `url(${relative})`\n })\n}\n","// CSS post 插件 - build 期 per-chunk CSS 抽取(NASTI_2.0_PLAN.md §2.2)\n//\n// renderChunk 在 Rolldown 真实插件上下文中运行(经 build/index.ts 转发表),\n// this.emitFile({type:'asset'}) 经 output.assetFileNames 产出带 hash 的 .css,\n// this.getFileName(ref) 立即可解析最终文件名(asset hash 由内容决定,与 chunk\n// hash 无关,因此 renderChunk 期即可取得)。\n//\n// - entry chunk:css 文件名记入 engine.entryCss,由 build/index.ts 注入静态\n// <link rel=\"stylesheet\"> 到 index.html\n// - 动态 chunk:在 chunk 代码\"尾部\"追加幂等的运行时 <link> 注入片段\n// (追加而非前置 —— 保持原代码行号,sourcemap 仍然对齐;FOUC 窗口已知,\n// Phase 3 的打包模式会换 DevEngine 路径)\n// - augmentChunkHash 把 chunk 关联的 CSS 内容折进 JS chunk hash(缓存正确性)\nimport type { RenderedChunk } from 'rolldown'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\nimport { type CssEngine, normalizeCssModuleId, minifyCss } from '../core/css-engine.js'\n\n/** 按 chunk 模块执行顺序聚合该 chunk 的 CSS(id 两侧都已规范化) */\nfunction collectChunkCss(chunk: RenderedChunk, engine: CssEngine): string {\n const ids = chunk.moduleIds ?? Object.keys(chunk.modules)\n let css = ''\n for (const id of ids) {\n const styles = engine.styles.get(normalizeCssModuleId(id))\n if (styles) css += styles + '\\n'\n }\n return css\n}\n\nexport function cssPostPlugin(config: ResolvedConfig, engine: CssEngine): NastiPlugin {\n return {\n name: 'nasti:css-post',\n enforce: 'post',\n\n async renderChunk(code, chunk) {\n const css = collectChunkCss(chunk, engine)\n if (!css) return null\n\n // 单文件模式:跨 chunk 累积,generateBundle 一次性 emit\n if (!config.build.cssCodeSplit) {\n engine.pendingSingle.push(css)\n return null\n }\n\n const finalCss = config.build.cssMinify ? await minifyCss(css, config) : css\n const ref = this.emitFile({\n type: 'asset',\n name: `${chunk.name}.css`,\n source: finalCss,\n })\n const fileName = this.getFileName(ref)\n engine.allCss.push(fileName)\n\n if (chunk.isEntry) {\n const key = chunk.facadeModuleId ?? chunk.name\n const existing = engine.entryCss.get(key) ?? []\n existing.push(fileName)\n engine.entryCss.set(key, existing)\n return null\n }\n\n // 动态 chunk:运行时注入 <link>(幂等,data-nasti-css 标记去重)\n const href = JSON.stringify(config.base + fileName)\n const snippet =\n `\\n;(function(){try{var d=document,h=${href};` +\n `if(!d.querySelector('link[data-nasti-css=\"'+h+'\"]')){` +\n `var l=d.createElement('link');l.rel='stylesheet';l.href=h;` +\n `l.setAttribute('data-nasti-css',h);d.head.appendChild(l);}}catch(e){}})();`\n return { code: code + snippet, map: null }\n },\n\n augmentChunkHash(chunk) {\n // CSS 内容变 → JS chunk hash 变(动态 chunk 的注入 URL、缓存失效正确性)\n const css = collectChunkCss(chunk, engine)\n return css || undefined\n },\n\n async generateBundle() {\n if (config.build.cssCodeSplit || engine.pendingSingle.length === 0) return\n const merged = engine.pendingSingle.join('\\n')\n const finalCss = config.build.cssMinify ? await minifyCss(merged, config) : merged\n const ref = this.emitFile({ type: 'asset', name: 'style.css', source: finalCss })\n const fileName = this.getFileName(ref)\n engine.singleFileName = fileName\n engine.allCss.push(fileName)\n },\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","// 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","// 内置 Vue 插件 - SFC 编译 + Vue HMR\nimport crypto from 'node:crypto'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\nimport { transformCode } from '../core/transformer.js'\n\nconst VUE_FILE_RE = /\\.vue$/\n// 同时接受 2.0 的 `&lang.css`(Vite 约定,id 以 .css 结尾可被 css 插件接管)\n// 与 1.x 的 `&lang=css`(向后兼容已缓存的 URL)\nconst VUE_QUERY_RE = /\\.vue\\?vue&type=(script|template|style)(&index=\\d+)?(&lang[.=]\\w+)?/\n\ninterface VueCompilerSfc {\n parse: (source: string, options?: any) => any\n compileScript: (sfc: any, options: any) => any\n compileTemplate: (options: any) => any\n compileStyleAsync: (options: any) => Promise<any>\n}\n\nlet compiler: VueCompilerSfc | null = null\n\nasync function loadVueCompiler(): Promise<VueCompilerSfc | null> {\n if (compiler) return compiler\n try {\n compiler = await import('@vue/compiler-sfc')\n return compiler\n } catch {\n return null\n }\n}\n\nexport function vuePlugin(config: ResolvedConfig): NastiPlugin {\n const isDev = config.command === 'serve'\n const descriptorCache = new Map<string, any>()\n\n return {\n name: 'nasti:vue',\n enforce: 'pre',\n\n async resolveId(source) {\n // 处理 .vue 虚拟模块请求 (?vue&type=...)\n if (VUE_QUERY_RE.test(source)) {\n return source\n }\n return null\n },\n\n // 虚拟子模块必须有 load 钩子:build 下 Rolldown 否则会按字面路径读盘,\n // 抛 UNLOADABLE_DEPENDENCY(1.x Vue 生产构建因此直接失败)。\n // style 子块在这里编译成 CSS 字符串,交给 css 插件统一处理\n // (dev = <style> 注入 + HMR;build = CssEngine 抽取成 hashed .css)。\n async load(id) {\n const match = id.match(/(.+\\.vue)\\?vue&type=style(?:&index=(\\d+))?/)\n if (!match) return null\n\n const sfc = await loadVueCompiler()\n if (!sfc) return null\n\n const [, filePath, indexStr] = match\n let descriptor = descriptorCache.get(filePath)\n if (!descriptor) {\n // 直接请求子模块(如 dev 冷启动 / 缓存失效)时按需重新解析父 SFC\n try {\n const fs = await import('node:fs')\n const source = fs.readFileSync(filePath, 'utf-8')\n const parsed = sfc.parse(source, { filename: filePath })\n if (parsed.errors.length) return null\n descriptor = parsed.descriptor\n descriptorCache.set(filePath, descriptor)\n } catch {\n return null\n }\n }\n\n const index = parseInt(indexStr ?? '0', 10)\n const style = descriptor.styles[index]\n if (!style) return null\n\n const scopeId = hashId(filePath)\n const result = await sfc.compileStyleAsync({\n source: style.content,\n filename: filePath,\n id: `data-v-${scopeId}`,\n scoped: style.scoped ?? false,\n // <style lang=\"scss|less|stylus\"> 需经对应预处理器(缺省 undefined = 纯 CSS)\n preprocessLang: style.lang,\n })\n return result.code as string\n },\n\n async transform(code, id) {\n // 处理 .vue 文件\n if (!VUE_FILE_RE.test(id) && !VUE_QUERY_RE.test(id)) return null\n\n const sfc = await loadVueCompiler()\n if (!sfc) {\n console.warn('[nasti:vue] @vue/compiler-sfc not found. Install it: npm install @vue/compiler-sfc')\n return null\n }\n\n // 处理虚拟模块请求(子块)。style 子块的内容由上方 load 钩子产出 CSS,\n // 后续交给 css 插件(dev 注入 / build 抽取),这里不再拦截。\n if (VUE_QUERY_RE.test(id)) {\n return null\n }\n\n // 解析 SFC\n const { descriptor, errors } = sfc.parse(code, { filename: id })\n if (errors.length) {\n console.error(`[nasti:vue] Parse error in ${id}:`, errors[0].message)\n return null\n }\n\n descriptorCache.set(id, descriptor)\n const scopeId = hashId(id)\n\n // 编译 script\n let scriptCode = ''\n if (descriptor.script || descriptor.scriptSetup) {\n const compiled = sfc.compileScript(descriptor, {\n id: scopeId,\n isProd: !isDev,\n inlineTemplate: true,\n // 让 compileScript 产出 `const __sfc__ = ...`(而非默认的 `export default {...}`)。\n // 否则下方追加的 `__sfc__.render` / `__sfc__.__scopeId` / HMR 记录会引用一个\n // 不存在的 `__sfc__`,并与 compileScript 自带的 `export default` 形成双重默认导出。\n genDefaultAs: '__sfc__',\n })\n scriptCode = compiled.content\n }\n\n // 编译 template(如果没有 inline)\n let templateCode = ''\n if (descriptor.template && !descriptor.scriptSetup) {\n const compiled = sfc.compileTemplate({\n source: descriptor.template.content,\n filename: id,\n id: scopeId,\n compilerOptions: { scopeId: `data-v-${scopeId}` },\n })\n templateCode = compiled.code\n }\n\n // 组装输出。若 SFC 只有 <template> 而无任何 <script>,scriptCode 为空,\n // 兜底一个空组件对象,保证后续 `__sfc__.render` / `__scopeId` 赋值成立。\n let output = scriptCode || 'const __sfc__ = {}'\n\n if (templateCode) {\n output += `\\n${templateCode}\\n`\n output += `\\n__sfc__.render = render\\n`\n }\n\n // style 导入(&lang.css 结尾 —— css 插件按 .css 后缀接管该虚拟模块)\n if (descriptor.styles.length > 0) {\n for (let i = 0; i < descriptor.styles.length; i++) {\n output += `\\nimport \"${id}?vue&type=style&index=${i}&lang.css\"\\n`\n }\n }\n\n // scoped 标记\n output += `\\n__sfc__.__scopeId = \"data-v-${scopeId}\"\\n`\n\n // HMR\n if (isDev) {\n output += `\n__sfc__.__hmrId = ${JSON.stringify(scopeId)}\nif (typeof __VUE_HMR_RUNTIME__ !== 'undefined') {\n __VUE_HMR_RUNTIME__.createRecord(__sfc__.__hmrId, __sfc__)\n}\nif (import.meta.hot) {\n import.meta.hot.accept((mod) => {\n if (!mod) return\n const { default: updated } = mod\n if (typeof __VUE_HMR_RUNTIME__ !== 'undefined') {\n __VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render)\n }\n })\n}\n`\n }\n\n output += `\\nexport default __sfc__\\n`\n\n // compileScript 对 lang=\"ts\" 的 SFC 会在产物里保留 TS 注解 —— 不仅是用户脚本,\n // 连内联 render 也带(如 `(_ctx: any, _cache: any) =>`、`($event: any) => ...`)。\n // Nasti 的 oxc 转译按扩展名只处理 .ts/.tsx,不碰 .vue,所以这里显式把组装后的\n // 产物按 TS 走一遍 oxc 剥离类型,产出纯 JS —— dev(浏览器原生 ESM)与 build\n // (Rolldown 解析)都需要这一步,否则裸 TS 会直接触发解析错误。\n const lang = descriptor.scriptSetup?.lang ?? descriptor.script?.lang\n if (lang === 'ts') {\n const transpiled = transformCode(`${id}.ts`, output, { sourcemap: false })\n return { code: transpiled.code }\n }\n\n return { code: output }\n },\n\n handleHotUpdate(ctx) {\n const { file, modules } = ctx\n if (VUE_FILE_RE.test(file)) {\n // Vue 文件更新: 标记为自接受\n for (const mod of modules) {\n mod.isSelfAccepting = true\n }\n // 清除缓存\n descriptorCache.delete(file)\n }\n return modules\n },\n }\n}\n\n\nfunction hashId(filename: string): string {\n return crypto.createHash('sha256').update(filename).digest('hex').slice(0, 8)\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","// 内置插件拼装 - server 与 build 共用的 per-env 函数(NASTI_2.0_PLAN.md §1.2)\n//\n// 1.x 在 server/index.ts 与 build/index.ts 各拼一份,容易漂移;统一后\n// 环境插件列表 = pre 内置 + 用户插件 + post 内置,再经 applyToEnvironment\n// 过滤(core/environment.ts 的 resolveEnvironmentPlugins)。\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\nimport type { CssEngine } from '../core/css-engine.js'\nimport { resolvePlugin } from './resolve.js'\nimport { cssPlugin } from './css.js'\nimport { cssPostPlugin } from './css-post.js'\nimport { assetsPlugin } from './assets.js'\nimport { vuePlugin } from './vue.js'\nimport { htmlPlugin } from './html.js'\n\nexport interface BuiltinPluginOptions {\n /** build 期 CSS 抽取引擎(serve 不传,dev 走 <style> 注入路径) */\n cssEngine?: CssEngine\n /** 环境 consumer:server 时 css 插件返回无 DOM 的纯 stub(SSR/main/preload) */\n consumer?: 'client' | 'server'\n}\n\n/**\n * 拼装某一环境的完整插件列表(顺序与 1.x 完全一致):\n * [vue?] → resolve → css → assets → [html(serve)] → 用户插件 → [css-post(build)]\n */\nexport function resolvePluginList(\n config: ResolvedConfig,\n userPlugins: NastiPlugin[],\n opts: BuiltinPluginOptions = {},\n): NastiPlugin[] {\n const isServe = config.command === 'serve'\n return [\n // vuePlugin 排最前(enforce: 'pre' 语义):.vue 先编译成 JS 再走后续管道\n ...(config.framework === 'vue' ? [vuePlugin(config)] : []),\n resolvePlugin(config),\n cssPlugin(config, opts.cssEngine, opts.consumer),\n assetsPlugin(config),\n ...(isServe ? [htmlPlugin(config)] : []),\n ...userPlugins,\n // cssPostPlugin 最后(enforce: 'post' 语义):renderChunk 聚合抽取\n ...(!isServe && opts.cssEngine ? [cssPostPlugin(config, opts.cssEngine)] : []),\n ]\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 EnvironmentInstance,\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 /** Environment API:容器所属环境(未传时为 undefined,行为同 1.x client) */\n readonly environment?: EnvironmentInstance\n\n constructor(config: ResolvedConfig, environment?: EnvironmentInstance) {\n this.config = config\n this.environment = environment\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 environment: container.environment,\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 // ssr 标志由环境 consumer 派生(1.x 写死 false;client 环境行为不变)\n const ssr = this.environment?.consumer === 'server'\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 },\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 * Reindex a module under a plugin-provided canonical id (e.g. a `\\0virtual:foo`\n * id returned from `resolveId`). Plugins look up their own virtual modules via\n * `getModuleById(RESOLVED_ID)` to invalidate them on watcher events; without\n * this remap they'd never find the node because `ensureEntryFromUrl` keys by\n * the public URL only.\n */\n setModuleId(mod: ModuleNode, id: string): void {\n if (mod.id === id) return\n this.idToModuleMap.delete(mod.id)\n mod.id = id\n this.idToModuleMap.set(id, 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","// HotChannel - per-environment 热更通道(Environment API)\n//\n// 接口契约定义在 types.ts(含 invoke:fetchModule/getBuiltins/_skipFsCheck)。\n// Phase 1 实现面:client = 包装现有 ws 服务器;非 client = noop。\n// Phase 2 的 SSR module runner 经 setInvokeHandler 注册 RPC,不需要再改接口。\nimport type {\n HotChannel,\n HotChannelInvokeHandlers,\n HotChannelListener,\n HmrPayload,\n WebSocketServer,\n} from '../types.js'\n\n/** 非 client 环境的占位通道(SSR/edge 在 Phase 2 接上真实 transport) */\nexport function createNoopHotChannel(): HotChannel {\n return {\n send() {},\n on() {},\n off() {},\n listen() {},\n close() {},\n setInvokeHandler() {},\n }\n}\n\n/**\n * client 环境的 ws 通道:包装 server/ws.ts 的 WebSocketServer。\n * 事件监听与 invoke 在现有 ws 协议上预留(custom event 协议 Phase 2 扩展)。\n */\nexport function createWsHotChannel(ws: WebSocketServer): HotChannel {\n const listeners = new Map<string, Set<HotChannelListener>>()\n let invokeHandlers: HotChannelInvokeHandlers | undefined\n\n return {\n send(payload: HmrPayload) {\n ws.send(payload)\n },\n on(event, listener) {\n let set = listeners.get(event)\n if (!set) listeners.set(event, (set = new Set()))\n set.add(listener)\n },\n off(event, listener) {\n listeners.get(event)?.delete(listener)\n },\n listen() {},\n close() {\n ws.close()\n },\n setInvokeHandler(handlers) {\n invokeHandlers = handlers\n void invokeHandlers\n },\n }\n}\n","// NastiEnvironment - Environment API 主干(NASTI_2.0_PLAN.md §1.2)\n//\n// Vite 8 的分层是 PartialEnvironment→BaseEnvironment→Dev/BuildEnvironment;\n// Nasti 当前单图单容器,收敛为一个精简类即可:每个环境自带 name/consumer/\n// 过滤后的插件列表/PluginContainer/ModuleGraph/HotChannel。\n//\n// SSR、完整打包模式、多端/Electron 全部表达为 environment —— 这是其余\n// 2.0 特性共同依赖的主干。Phase 1 仅 client 环境有完整运行时,行为与\n// 1.x 逐字节一致(环境过滤默认全通过、容器构造仅多带 environment 引用)。\nimport type {\n EnvironmentInstance,\n HotChannel,\n NastiPlugin,\n ResolvedConfig,\n ResolvedEnvironmentOptions,\n} from '../types.js'\nimport { PluginContainer } from './plugin-container.js'\nimport { ModuleGraph } from './module-graph.js'\nimport { createNoopHotChannel } from './hot-channel.js'\nimport { createDebugger } from './debug.js'\n\nconst debug = createDebugger('nasti:environment')\n\nexport interface NastiEnvironmentInit {\n hot?: HotChannel\n mode?: 'dev' | 'build'\n /** 环境的候选插件(init 时经 applyToEnvironment 过滤) */\n plugins?: NastiPlugin[]\n}\n\nexport class NastiEnvironment implements EnvironmentInstance {\n readonly name: string\n readonly consumer: 'client' | 'server'\n readonly mode: 'dev' | 'build'\n readonly config: ResolvedConfig\n readonly options: ResolvedEnvironmentOptions\n readonly hot: HotChannel\n\n /** applyToEnvironment 过滤后的插件(init() 后可用) */\n plugins: NastiPlugin[] = []\n /** per-env 插件容器(init() 后可用;dev 管线使用) */\n pluginContainer: PluginContainer | null = null\n /** per-env 模块图(dev 管线使用) */\n moduleGraph: ModuleGraph\n\n private candidatePlugins: NastiPlugin[]\n private initialized = false\n\n constructor(name: string, config: ResolvedConfig, init: NastiEnvironmentInit = {}) {\n const options = config.environments[name]\n if (!options) {\n throw new Error(\n `[nasti] unknown environment \"${name}\" — declare it in config.environments`,\n )\n }\n this.name = name\n this.consumer = options.consumer\n this.mode = init.mode ?? (config.command === 'build' ? 'build' : 'dev')\n this.config = config\n this.options = options\n this.hot = init.hot ?? createNoopHotChannel()\n this.moduleGraph = new ModuleGraph()\n this.candidatePlugins = init.plugins ?? config.plugins\n }\n\n /** 过滤插件并建 per-env PluginContainer */\n async init(): Promise<void> {\n if (this.initialized) return\n this.initialized = true\n this.plugins = resolveEnvironmentPlugins(this, this.candidatePlugins)\n this.pluginContainer = new PluginContainer(\n { ...this.config, plugins: this.plugins },\n this,\n )\n debug?.(`env \"${this.name}\" initialized (${this.plugins.length} plugins)`)\n }\n\n async close(): Promise<void> {\n await this.hot.close?.()\n }\n}\n\n/** 按 applyToEnvironment 过滤环境插件(未声明 = 应用于所有环境) */\nexport function resolveEnvironmentPlugins(\n environment: EnvironmentInstance,\n plugins: NastiPlugin[],\n): NastiPlugin[] {\n return plugins.filter((p) => {\n if (!p.applyToEnvironment) return true\n try {\n return p.applyToEnvironment(environment)\n } catch (err: any) {\n environment.config.logger.error(\n `[nasti] plugin \"${p.name}\" applyToEnvironment threw: ${err.message}`,\n { error: err },\n )\n return false\n }\n })\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 / SSR\n *\n * per-env define 钩子(Phase1→Phase2 接口契约):`overrides` 允许调用方按\n * 环境覆盖任意 define —— server 环境传 `ssrDefineOverrides('server')` 注入\n * `import.meta.env.SSR='true'`,不再写死 'false'。\n */\nexport function buildEnvDefine(\n env: EnvRecord,\n mode: string,\n overrides: Record<string, string> = {},\n): 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, ...overrides }\n}\n\n/** 按环境 consumer 派生 import.meta.env.SSR 的 define 覆盖 */\nexport function ssrDefineOverrides(consumer: 'client' | 'server'): Record<string, string> {\n return { 'import.meta.env.SSR': consumer === 'server' ? 'true' : 'false' }\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","// 构建产物体积报告\n// 优先使用 rolldown/experimental 的原生 viteReporterPlugin(Vite 8 同款表格),\n// 实验 API 无 semver 保护 —— 守卫导入,失败时回退到 JS 实现。\n// 大 chunk 警告始终走 JS 路径(logger.warn),保证 logLevel=warn 时不被吞。\nimport path from 'node:path'\nimport { gzipSync } from 'node:zlib'\nimport pc from 'picocolors'\nimport type { ResolvedConfig } from '../types.js'\nimport type { Logger } from '../core/logger.js'\nimport { createDebugger } from '../core/debug.js'\n\nconst debug = createDebugger('nasti:reporter')\n\nexport interface OutputFileInfo {\n fileName: string\n type: string\n code?: string\n source?: Uint8Array | string\n}\n\n/**\n * 尝试创建原生体积报告插件(Rust 实现,gzip 并行计算)。\n * 返回 null 表示当前 rolldown 版本不提供该实验导出,调用方应改用\n * {@link reportBuildOutput} 的 JS 表格。\n */\nexport async function tryNativeReporterPlugin(\n config: ResolvedConfig,\n logger: Logger,\n): Promise<unknown | null> {\n try {\n const { viteReporterPlugin } = await import('rolldown/experimental')\n if (typeof viteReporterPlugin !== 'function') return null\n return viteReporterPlugin({\n root: config.root,\n isTty: process.stdout.isTTY ?? false,\n isLib: false,\n assetsDir: config.build.assetsDir,\n chunkLimit: config.build.chunkSizeWarningLimit,\n // 大 chunk 警告由 JS 侧 warnLargeChunks() 经 logger.warn 输出,\n // 原生侧只产 info 级表格,避免警告被 logLevel 过滤吞掉\n warnLargeChunks: false,\n reportCompressedSize: config.build.reportCompressedSize,\n logInfo: (msg: string) => logger.info(msg),\n })\n } catch (err) {\n debug?.(`native viteReporterPlugin unavailable, falling back to JS table: ${err}`)\n return null\n }\n}\n\nconst numberFormatter = new Intl.NumberFormat('en', {\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n})\n\nexport function displaySize(bytes: number): string {\n return `${numberFormatter.format(bytes / 1000)} kB`\n}\n\nfunction byteLength(content: string | Uint8Array | undefined): number {\n if (content == null) return 0\n return typeof content === 'string' ? Buffer.byteLength(content) : content.byteLength\n}\n\n/** JS fallback:打印 Vite 形态的产物体积表(gzip 可经 reportCompressedSize 关闭) */\nexport function reportBuildOutput(\n output: OutputFileInfo[],\n config: ResolvedConfig,\n logger: Logger,\n): void {\n type Entry = { name: string; size: number; gzip: number | null; group: 'assets' | 'css' | 'js' }\n const entries: Entry[] = []\n const compressed = config.build.reportCompressedSize\n\n for (const file of output) {\n const content = file.type === 'chunk' ? file.code : file.source\n const size = byteLength(content)\n let gzip: number | null = null\n if (compressed && content != null) {\n gzip = gzipSync(typeof content === 'string' ? Buffer.from(content) : content).byteLength\n }\n const ext = path.extname(file.fileName)\n const group: Entry['group'] =\n file.type === 'chunk' ? 'js' : ext === '.css' ? 'css' : 'assets'\n entries.push({ name: file.fileName, size, gzip, group })\n }\n\n // 同 Vite:assets → css → js,组内按体积升序\n const groupOrder = { assets: 0, css: 1, js: 2 } as const\n entries.sort((a, b) => groupOrder[a.group] - groupOrder[b.group] || a.size - b.size)\n\n const outDirPrefix = `${config.build.outDir.replace(/\\/$/, '')}/`\n const maxNameLen = Math.max(...entries.map((e) => (outDirPrefix + e.name).length), 0)\n const maxSizeLen = Math.max(...entries.map((e) => displaySize(e.size).length), 0)\n\n const groupColor = { assets: pc.green, css: pc.magenta, js: pc.cyan } as const\n for (const e of entries) {\n const color = groupColor[e.group]\n const namePart = pc.dim(outDirPrefix) + color(e.name.padEnd(maxNameLen - outDirPrefix.length))\n const sizePart = pc.dim(pc.bold(displaySize(e.size).padStart(maxSizeLen)))\n const gzipPart = e.gzip != null ? pc.dim(` │ gzip: ${displaySize(e.gzip)}`) : ''\n logger.info(`${namePart} ${sizePart}${gzipPart}`)\n }\n}\n\n/** 大 chunk 警告(独立于表格渲染路径,始终经 logger.warn 输出) */\nexport function warnLargeChunks(\n output: OutputFileInfo[],\n config: ResolvedConfig,\n logger: Logger,\n): void {\n const limit = config.build.chunkSizeWarningLimit\n const large = output.filter(\n (f) => f.type === 'chunk' && byteLength(f.code) / 1000 > limit,\n )\n if (large.length === 0) return\n logger.warn(\n pc.yellow(\n `\\n(!) Some chunks are larger than ${limit} kB after minification. Consider:\\n` +\n `- Using dynamic import() to code-split the application\\n` +\n `- Configuring build.rolldownOptions.output.advancedChunks to isolate large dependencies\\n` +\n `- Adjusting build.chunkSizeWarningLimit to silence this warning`,\n ),\n )\n}\n","// 生产构建 - 多环境 builder(NASTI_2.0_PLAN.md §2.4)\n//\n// `build()` 串行迭代 config.environments:client(入口从 index.html 提取,\n// 含 HTML 改写 / CSS 抽取 / 体积表)+ 所有显式声明 entry 的非 client 环境\n// (SSR / worker 等:node conditions、platform node、bare import 外部化、\n// `import.meta.env.SSR` 由 consumer 派生)。\n// `getRolldownOptions(environment)` 把 per-env 的 rolldown input/output\n// 参数化收敛到一处 —— Phase 3 的完整打包模式(DevEngine)复用同一函数。\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { builtinModules } from 'node:module'\nimport { rolldown } from 'rolldown'\nimport type { InputOptions, OutputOptions } from 'rolldown'\nimport type { NastiConfig, HtmlTagDescriptor, ResolvedConfig, NastiPlugin } from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { resolvePluginList } from '../plugins/builtins.js'\nimport { NastiEnvironment } from '../core/environment.js'\nimport { createCssEngine, type CssEngine } from '../core/css-engine.js'\nimport { htmlPlugin, readHtmlFile, processHtml } from '../plugins/html.js'\nimport { transformCode, shouldTransform } from '../core/transformer.js'\nimport { loadEnv, buildEnvDefine, ssrDefineOverrides } from '../core/env.js'\nimport { tryNativeReporterPlugin, reportBuildOutput, warnLargeChunks, displaySize } from './reporter.js'\nimport { createDebugger } from '../core/debug.js'\nimport pc from 'picocolors'\n\nconst debug = createDebugger('nasti:build')\n\nconst NODE_BUILTINS = new Set([...builtinModules, ...builtinModules.map((m) => `node:${m}`)])\n\nexport interface BuildResult {\n /** client 环境的产物(back-compat:1.x 的 BuildResult 形态) */\n output: Array<{ fileName: string; type: string; code?: string; source?: Uint8Array | string }>\n /** 全部已构建环境的产物(2.0 多环境 builder) */\n environments?: Record<string, BuildResult['output']>\n}\n\n/**\n * 把单个环境的 rolldown input/output 选项收敛到一处(Phase 3 DevEngine 复用)。\n * - input:user rolldownOptions 透传 + per-env platform/resolve/external/define\n * - output:默认命名 + user output 覆盖 + dir 由 Nasti 强制\n */\nexport function getRolldownOptions(\n environment: NastiEnvironment,\n entryPoints: string[],\n rolldownPlugins: unknown[],\n): { inputOptions: InputOptions; outputOptions: OutputOptions; outDir: string } {\n const config = environment.config\n const envOptions = environment.options\n const isServer = environment.consumer === 'server'\n const outDir = path.resolve(config.root, envOptions.build.outDir)\n // 产物子目录前缀跟随 build.assetsDir(默认 'assets')—— 与 assets 插件、\n // 体积报告器使用同一来源,避免 JS/资源散落到不同目录\n const assetsDir = envOptions.build.assetsDir\n\n // Rolldown 1.x 把 `define` 从顶层 InputOptions 移到了 `transform.define`,\n // 顶层传入会触发 \"Invalid key\" 警告并静默丢弃。\n const { output: userOutput, transform: userTransform, ...restInputOptions } =\n envOptions.build.rolldownOptions\n\n // Vue(esm-bundler 构建)的编译期常量:最低优先级,允许用户覆盖\n const vueDefine: Record<string, string> = config.framework === 'vue'\n ? {\n __VUE_OPTIONS_API__: 'true',\n __VUE_PROD_DEVTOOLS__: 'false',\n __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false',\n }\n : {}\n // per-env define 钩子:import.meta.env.SSR 由 consumer 派生\n const env = loadEnv(config.mode, config.root, config.envPrefix)\n const envDefine = buildEnvDefine(env, config.mode, ssrDefineOverrides(environment.consumer))\n const mergedDefine = { ...vueDefine, ...(userTransform?.define ?? {}), ...envDefine }\n\n const inputOptions: InputOptions = {\n ...restInputOptions,\n input: entryPoints,\n transform: { ...userTransform, define: mergedDefine },\n plugins: rolldownPlugins as InputOptions['plugins'],\n ...(isServer\n ? {\n platform: (restInputOptions as InputOptions).platform ?? 'node',\n resolve: {\n conditionNames: envOptions.resolve.conditions,\n mainFields: envOptions.resolve.mainFields,\n ...(restInputOptions as InputOptions).resolve,\n },\n // server 产物:node 内建恒外部化;bare specifier 默认外部化\n //(同 Vite ssr.external 默认 —— 依赖由 node_modules 运行时解析),\n // 相对/绝对/虚拟模块照常打包。需要内联依赖时经 rolldownOptions.external 覆盖。\n external:\n (restInputOptions as InputOptions).external ??\n ((id: string) => {\n if (NODE_BUILTINS.has(id)) return true\n return !id.startsWith('.') && !path.isAbsolute(id) && !id.startsWith('\\0')\n }),\n }\n : {}),\n }\n\n const outputOptions: OutputOptions = isServer\n ? {\n format: 'esm',\n sourcemap: !!envOptions.build.sourcemap,\n minify: !!envOptions.build.minify,\n entryFileNames: '[name].js',\n chunkFileNames: 'chunks/[name]-[hash].js',\n assetFileNames: `${assetsDir}/[name].[hash][extname]`,\n ...userOutput,\n dir: outDir,\n }\n : {\n format: 'esm',\n sourcemap: !!envOptions.build.sourcemap,\n minify: !!envOptions.build.minify,\n entryFileNames: `${assetsDir}/[name].[hash].js`,\n chunkFileNames: `${assetsDir}/[name].[hash].js`,\n assetFileNames: `${assetsDir}/[name].[hash][extname]`,\n // 用户可覆盖默认输出:代码拆分(advancedChunks / codeSplitting)、chunk 命名等\n ...userOutput,\n // dir 始终由 Nasti 掌管 —— HTML 改写依赖固定的产物目录,故放在最后强制生效\n dir: outDir,\n }\n\n return { inputOptions, outputOptions, outDir }\n}\n\n/** Nasti 插件 → Rolldown 插件的转发表(output 阶段钩子直接转发,\n * this.emitFile / this.getFileName 在 renderChunk 中是真实 Rollup 兼容上下文) */\nexport function toRolldownPlugins(plugins: NastiPlugin[]): unknown[] {\n return plugins.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 // closeBundle 在 bundle.close() 时触发 —— PWA manifest/SW 等终态产物依赖\n closeBundle: p.closeBundle as any,\n renderChunk: p.renderChunk as any,\n augmentChunkHash: p.augmentChunkHash as any,\n generateBundle: p.generateBundle as any,\n }))\n}\n\n/** 从 index.html 提取 client 入口(含常见路径回退) */\nexport function resolveClientEntries(config: ResolvedConfig, html: string | null): string[] {\n const entryPoints: string[] = []\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 if (entryPoints.length === 0) {\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 return entryPoints\n}\n\n/** 单个环境的 oxc 转译插件(TS/JSX,consumer 无关) */\nfunction createOxcTransformPlugin(config: ResolvedConfig, environment: NastiEnvironment) {\n return {\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: !!environment.options.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\nexport async function build(inlineConfig: NastiConfig = {}): Promise<BuildResult> {\n const config = await resolveConfig(inlineConfig, 'build')\n const logger = config.logger\n const startTime = performance.now()\n\n logger.info(\n pc.cyan(`\\nnasti v${__NASTI_VERSION__} `) + pc.green(`building for ${config.mode}...`),\n )\n debug?.(`root: ${config.root}`)\n\n // 待构建环境:client 恒在;非 client 仅当显式声明 entry(默认注入的裸 ssr 不构建)\n const buildableNames = Object.keys(config.environments).filter(\n (name) => name === 'client' || config.environments[name].entry.length > 0,\n )\n // client 先行(主产物 / HTML),其余按声明顺序串行(同 Vite buildApp 默认)\n buildableNames.sort((a, b) => (a === 'client' ? -1 : b === 'client' ? 1 : 0))\n\n const environments: Record<string, BuildResult['output']> = {}\n let clientOutput: BuildResult['output'] = []\n\n for (const name of buildableNames) {\n const output =\n name === 'client'\n ? await buildClientEnvironment(config)\n : await buildServerEnvironment(config, name)\n environments[name] = output\n if (name === 'client') clientOutput = output\n if (buildableNames.length > 1) {\n debug?.(`environment \"${name}\" built (${output.length} files)`)\n }\n }\n\n const elapsed = ((performance.now() - startTime) / 1000).toFixed(2)\n const totalSize = Object.values(environments)\n .flat()\n .reduce((sum, chunk) => {\n const content = chunk.type === 'chunk' ? chunk.code : (chunk as any).source\n if (content == null) return sum\n return sum + (typeof content === 'string' ? Buffer.byteLength(content) : content.byteLength)\n }, 0)\n const fileCount = Object.values(environments).flat().length\n const envSuffix =\n buildableNames.length > 1 ? ` (${buildableNames.join(' + ')})` : ''\n\n logger.info(pc.green(`✓ built in ${elapsed}s`) + pc.dim(envSuffix))\n logger.info(pc.dim(` ${fileCount} files, ${displaySize(totalSize)} total → ${config.build.outDir}/`))\n\n return { output: clientOutput, environments }\n}\n\n/** client 环境构建:HTML 入口 + CSS 抽取 + 体积表 + index.html 改写 */\nasync function buildClientEnvironment(config: ResolvedConfig): Promise<BuildResult['output']> {\n const logger = config.logger\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 const html = await readHtmlFile(config.root)\n const entryPoints = resolveClientEntries(config, html)\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 // per-env 插件列表 + applyToEnvironment 过滤\n const cssEngine = createCssEngine()\n const pluginList = resolvePluginList(config, config.plugins, { cssEngine })\n const clientEnv = new NastiEnvironment('client', { ...config, plugins: pluginList }, {\n mode: 'build',\n plugins: pluginList,\n })\n await clientEnv.init()\n const allPlugins = clientEnv.plugins\n\n // 原生体积报告插件(守卫导入;不可用时走 JS 表格 fallback)\n const nativeReporter = config.logLevel === 'silent'\n ? null\n : await tryNativeReporterPlugin(config, logger)\n\n const rolldownPlugins = [\n createOxcTransformPlugin(config, clientEnv),\n ...toRolldownPlugins(allPlugins),\n ...(nativeReporter ? [nativeReporter as any] : []),\n ]\n const { inputOptions, outputOptions } = getRolldownOptions(clientEnv, entryPoints, rolldownPlugins)\n\n const bundle = await rolldown(inputOptions)\n const { output } = await bundle.write(outputOptions)\n await bundle.close()\n\n // 处理 HTML\n if (html) {\n let processedHtml = html\n\n // 执行 transformIndexHtml 钩子:用户插件 + 内置 htmlPlugin\n const htmlPlugins = [...allPlugins.filter((p) => p.transformIndexHtml), htmlPlugin(config)]\n for (const p of htmlPlugins) {\n const result = await p.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 // 注入抽取出的 CSS:entry chunk 的 css → 静态 <link rel=\"stylesheet\">\n processedHtml = injectCssLinks(processedHtml, cssEngine, config)\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 // 体积表:原生 reporter 已在 write 阶段输出;否则走 JS fallback\n if (!nativeReporter && config.logLevel !== 'silent') {\n reportBuildOutput(output as any, config, logger)\n }\n // 大 chunk 警告始终走 logger.warn(原生 reporter 的 warnLargeChunks 已关闭)\n warnLargeChunks(output as any, config, logger)\n\n return output as any\n}\n\n/** 非 client 环境构建(SSR / worker / main / preload …):entry 显式声明 */\nasync function buildServerEnvironment(\n config: ResolvedConfig,\n name: string,\n): Promise<BuildResult['output']> {\n const envOptions = config.environments[name]\n const logger = config.logger\n\n for (const entry of envOptions.entry) {\n if (!fs.existsSync(entry)) {\n throw new Error(`[nasti] environment \"${name}\" entry not found: ${entry}`)\n }\n }\n\n const pluginList = resolvePluginList(config, config.plugins, { consumer: envOptions.consumer })\n const environment = new NastiEnvironment(name, { ...config, plugins: pluginList }, {\n mode: 'build',\n plugins: pluginList,\n })\n await environment.init()\n\n const rolldownPlugins = [\n createOxcTransformPlugin(config, environment),\n ...toRolldownPlugins(environment.plugins),\n ]\n const { inputOptions, outputOptions, outDir } = getRolldownOptions(\n environment,\n envOptions.entry,\n rolldownPlugins,\n )\n\n if (envOptions.build.emptyOutDir && fs.existsSync(outDir)) {\n fs.rmSync(outDir, { recursive: true, force: true })\n }\n fs.mkdirSync(outDir, { recursive: true })\n\n const bundle = await rolldown(inputOptions)\n const { output } = await bundle.write(outputOptions)\n await bundle.close()\n\n logger.info(\n pc.dim(` [${name}] `) +\n output.map((o) => path.join(envOptions.build.outDir, o.fileName)).join(pc.dim(', ')),\n )\n return output as any\n}\n\n/** 注入抽取出的 CSS link 标签(entry css 或单文件模式) */\nfunction injectCssLinks(html: string, cssEngine: CssEngine, config: ResolvedConfig): string {\n const cssLinkTags: HtmlTagDescriptor[] = []\n if (cssEngine.singleFileName) {\n cssLinkTags.push({\n tag: 'link',\n attrs: { rel: 'stylesheet', href: config.base + cssEngine.singleFileName },\n injectTo: 'head',\n })\n } else {\n for (const files of cssEngine.entryCss.values()) {\n for (const file of files) {\n cssLinkTags.push({\n tag: 'link',\n attrs: { rel: 'stylesheet', href: config.base + file },\n injectTo: 'head',\n })\n }\n }\n }\n return cssLinkTags.length > 0 ? processHtml(html, cssLinkTags) : html\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\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","// 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 pc from 'picocolors'\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\nexport function 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 ctx.config.logger.error(\n pc.red(`Transform error: ${url}\\n`) + (err.stack ?? err.message),\n { timestamp: true, error: err },\n )\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 // `/@modules/<spec>?id=<abs>`:打包阶段已(相对 importer 真实目录)解析好的依赖文件。\n // 直接按该绝对路径打成 ESM,跳过 `resolveNodeModule(root, ...)` —— pnpm 严格布局下\n // 传递依赖不在顶层 node_modules,从 root 解析必然 404。`id` 由 externalSpecToModuleUrl /\n // subpath shim 用 encodeURIComponent 写入,URLSearchParams.get 自动解码(含 pnpm 路径里的 `+`)。\n if (cleanReqUrl.startsWith('/@modules/') && url.includes('?')) {\n const idParam = new URLSearchParams(url.slice(url.indexOf('?') + 1)).get('id')\n // 安全校验:`?id=` 本应只由我们自己写入(externalSpecToModuleUrl / subpath shim\n // 解析到的 node_modules 真实文件),但浏览器或恶意页面可向 dev server 伪造任意绝对\n // 路径。解析真实路径后必须 (a) 是普通文件、(b) 落在某个 node_modules 内或项目根之下,\n // 否则拒绝 —— 防止借此把 /etc/passwd、~/.ssh/* 等任意磁盘文件打成 ESM 读出去。\n let realId: string | null = null\n let realIdValid = false\n try {\n if (idParam) {\n realId = fs.realpathSync(idParam)\n // statSync 可能在 realpathSync 之后、检查之前因文件被删 / 权限变更而抛错(TOCTOU)。\n // 与上面的 realpathSync 一样按「校验失败」处理:落到下面的解析分支,而非把\n // 文件系统竞态变成 500(HTTP 路径)或向 server.transformRequest 调用方抛异常。\n realIdValid =\n fs.statSync(realId).isFile() &&\n (realId.includes(`${path.sep}node_modules${path.sep}`) || isUnderRoot(realId, config.root))\n }\n } catch {\n realId = null\n realIdValid = false\n }\n if (realId && realIdValid) {\n const mod = await moduleGraph.ensureEntryFromUrl(url)\n moduleGraph.registerModule(mod, realId)\n const code = await bundlePackageAsEsm(realId, config.root)\n const transformResult = { code }\n mod.transformResult = transformResult\n return transformResult\n }\n }\n\n // 插件提供的虚拟模块。\n //\n // Vite 风格的插件(如 chen-the-dawnstreak 的 file-based routing、virtual SVG sprite 等)\n // 用 `resolveId` 声称某个 bare specifier(例如 `virtual:chen-routes`),再用 `load` 提供模块源码。\n // `rewriteImports` 已经把 bare specifier 改写成 `/@modules/<spec>`,所以这里是它们落到 dev server 上的入口。\n //\n // 之前 dev server 仅做 `resolveUrlToFile` 的磁盘查找 → 直接 404。这里在落盘查找之前先问插件,\n // 如果有人接管这个 spec **并且** 解析后的 id 不是真实文件(`\\0`-前缀或不存在),就走插件\n // 的 load → transform 管道;real file 路径则交给原来的 `bundlePackageAsEsm` 分支处理。\n //\n // 没有任何插件认领的 spec 仍然回落到 `resolveNodeModule`,npm 包加载行为不变。\n if (cleanReqUrl.startsWith('/@modules/')) {\n const spec = cleanReqUrl.slice('/@modules/'.length)\n const virtual = await loadVirtualModule(spec, ctx)\n if (virtual) {\n const mod = await moduleGraph.ensureEntryFromUrl(url)\n moduleGraph.setModuleId(mod, virtual.id)\n mod.transformResult = virtual.result\n return virtual.result\n }\n }\n\n // 带「语义 query」的模块请求(如 Vue style 子块\n // `/abs/App.vue?vue&type=style&index=0&lang.css`):先问插件的 load → transform\n // 管道,**不要求磁盘上存在对应文件**(虚拟子模块)。默认的\"读盘 + 剥 query\"\n // 路径会把子模块错当成父模块整体重新编译(1.x 的 Vue dev 样式因此从未生效)。\n // `?t=`(HMR 时间戳)除外。\n const rawQuery = url.includes('?') ? url.slice(url.indexOf('?') + 1) : ''\n if (rawQuery && !/^t=\\d+$/.test(rawQuery)) {\n const loaded = await pluginContainer.load(url)\n if (loaded != null) {\n let code = typeof loaded === 'string' ? loaded : loaded.code\n const transformed = await pluginContainer.transform(code, url)\n if (transformed != null) {\n code = typeof transformed === 'string' ? transformed : transformed.code\n }\n const mod = await moduleGraph.ensureEntryFromUrl(url)\n // file 关联磁盘上的父文件:父文件变更时子模块一并失效\n moduleGraph.registerModule(mod, cleanReqUrl)\n code = injectImportMetaHot(code, url)\n code = replaceEnvInCode(code, ctx.envDefine ?? buildEnvDefine(\n loadEnv(config.mode, config.root, config.envPrefix),\n config.mode,\n ))\n code = rewriteImports(code, config, cleanReqUrl)\n const transformResult = { code }\n mod.transformResult = transformResult\n return transformResult\n }\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, config.root)\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/**\n * Run the plugin `resolveId` → `load` → `transform` pipeline for a bare specifier\n * that arrived as `/@modules/<spec>`, and return the prepared JS module if (and\n * only if) the result is a virtual module — i.e. its resolved id either uses the\n * Vite-convention `\\0` null-byte prefix or does not exist on disk.\n *\n * Real-file resolutions (e.g. an alias plugin remapping a bare specifier onto a\n * source file under the project) are intentionally skipped here so they fall\n * through to the normal `resolveUrlToFile` / `bundlePackageAsEsm` paths; this\n * keeps the npm-package loader and the React Refresh wrapper in charge of those.\n */\nasync function loadVirtualModule(\n spec: string,\n ctx: TransformMiddlewareContext,\n): Promise<{ id: string; result: { code: string } } | null> {\n const { config, pluginContainer } = ctx\n const resolved = await pluginContainer.resolveId(spec)\n if (resolved == null) return null\n const resolvedId = typeof resolved === 'string' ? resolved : resolved.id\n const looksVirtual = resolvedId.startsWith('\\0') || !fs.existsSync(resolvedId)\n if (!looksVirtual) return null\n\n const loadResult = await pluginContainer.load(resolvedId)\n if (loadResult == null) return null\n let code = typeof loadResult === 'string' ? loadResult : loadResult.code\n\n // Let other plugins transform the virtual source (e.g. macros, define-replace).\n const transformed = await pluginContainer.transform(code, resolvedId)\n if (transformed != null) {\n code = typeof transformed === 'string' ? transformed : transformed.code\n }\n\n // Replace `import.meta.env.*` and rewrite the inner import specifiers so the\n // browser can fetch them. Anchor at a synthetic file under the project root\n // so `./x` style imports inside generated code resolve from root (the same\n // contract Vite offers virtual modules whose ids don't map to a real dir).\n code = replaceEnvInCode(code, ctx.envDefine ?? buildEnvDefine(\n loadEnv(config.mode, config.root, config.envPrefix),\n config.mode,\n ))\n const anchor = path.join(config.root, '__nasti_virtual__.ts')\n code = rewriteImports(code, config, anchor)\n\n return { id: resolvedId, result: { code } }\n}\n\n/** 用 rolldown 将 node_modules 包打包为浏览器可用的 ESM(含 CJS→ESM 转换) */\n// Promise 缓存:同一入口文件只打包一次,防止并发重复打包\nconst esmBundleCache = new Map<string, Promise<string>>()\n\nasync function bundlePackageAsEsm(entryFile: string, root: string): Promise<string> {\n if (!esmBundleCache.has(entryFile)) {\n esmBundleCache.set(entryFile, doBundlePackage(entryFile, root))\n }\n return esmBundleCache.get(entryFile)!\n}\n\nasync function doBundlePackage(entryFile: string, root: 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, root)\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 // 解析相对「本包自身的真实目录」进行(externalSpecToModuleUrl),以兼容 pnpm\n // 严格布局下未被提升到顶层 node_modules 的传递依赖。\n // ⚠️ 必须用 ^ + m 锚定行首,只匹配真正的 import/export 声明,\n // 避免误匹配字符串内出现的 from \"...\" 导致 SyntaxError\n const externalBaseDir = path.dirname(entryFile)\n code = code\n .replace(/^(import\\b[^;'\"]*?\\bfrom\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}${externalSpecToModuleUrl(spec, externalBaseDir)}${q}`)\n .replace(/^(export\\b[^;'\"]*?\\bfrom\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}${externalSpecToModuleUrl(spec, externalBaseDir)}${q}`)\n .replace(/^(import\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}${externalSpecToModuleUrl(spec, externalBaseDir)}${q}`)\n\n // CJS 外部 require 改写:\n // rolldown 将 CJS 的 require(\"pkg\") 转为 __require(\"pkg\"),在浏览器中抛异常。\n // 收集所有 __require(\"pkg\"),替换为顶层 ESM import 的变量引用。\n code = rewriteExternalRequires(code, externalBaseDir)\n\n // CJS 包的具名导出补全 + ESM-interop default 解包:\n // rolldown 将 CJS 包包装为 __commonJSMin,只输出 `export default require_xxx()`,\n // 该调用返回的是整个 CJS exports 对象。这会引发两类问题:\n // 1. 具名导入失败:`import { parse } from '/@modules/cookie'` 没有静态命名导出。\n // 2. default 错误:当 CJS 模块自标 `__esModule: true` 且有 `default`\n // (tsc/babel 编译 ESM→CJS 的典型产物,如 `@gravity-ui/icons/Sun`),\n // `import X from '...'` 会拿到整个 namespace 对象而不是真正的 default 值,\n // 在 React 中表现为 \"Element type is invalid... got: object\"。\n // 通过 createRequire 在 Node.js 侧加载 CJS 模块、读取 exports,在 bundle\n // 末尾补具名 export,并按 Node import() interop 语义解包 default。\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, root: 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 // 主入口 URL 必须与「其他模块对该包主入口的裸 import」命中同一个浏览器模块实例\n // —— 这正是 shim 去重 context(避免出现两份 `createContext`)的前提,见 PR #16。\n // rewriteImports 把用户源码里的裸 import 改写成裸 `/@modules/<pkgName>`,所以当该包\n // 主入口能从项目根解析、且解析到的就是当前这份包目录(同一版本实例)时,shim 也必须\n // 用裸 URL —— 浏览器按 URL 字符串去重,带 `?id=` 会被当成另一个模块而重复实例化。\n // 否则(pnpm 下未提升到顶层的传递依赖,或根部命中的是另一个版本)才回落到 `?id=`\n // 携带绝对路径,既避免 dev server 从 root 解析 404,也不会串到错误版本。\n const rootMain = resolveNodeModule(root, pkgName)\n const mainEntryUrl =\n rootMain && rootMain.startsWith(pkgDir + path.sep)\n ? `/@modules/${pkgName}`\n : `/@modules/${pkgName}?id=${encodeURIComponent(mainEntry)}`\n const lines: string[] = [\n `// Nasti subpath shim → ${pkgName} (avoid duplicate bundling)`,\n `import * as __pkg from \"${mainEntryUrl}\";`,\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, baseDir: 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 \"${externalSpecToModuleUrl(pkg, baseDir)}\";`)\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\n // ESM-interop unwrap: when the CJS module marks itself as `__esModule` and\n // exposes a `default` (typical for tsc/babel-compiled ESM emitted as CJS),\n // rolldown's `export default require_xxx()` would expose the entire CJS\n // namespace object instead of the inner `.default` — so `import X from \"pkg/sub\"`\n // hands the consumer `{ __esModule: true, default: X }` rather than `X`,\n // which breaks `<X />` in React with \"Element type is invalid ... got: object\".\n // Mirror Node's `import()` interop and unwrap to `__cjsMod.default`.\n const hasEsmInterop = cjsExports.__esModule === true && 'default' in cjsExports\n\n if (!hasEsmInterop && 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 hasEsmInterop ? `export default __cjsMod.default;` : `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 * 把 bundle 中被 external 化的 bare specifier 解析为浏览器可加载的 URL。\n *\n * 关键:相对「正在打包的包自身的真实目录」解析(而非项目根)。pnpm 严格布局下,\n * 传递依赖不会被提升到顶层 node_modules(只有直接依赖以 symlink 形式出现在那里),\n * 真实文件在 `.pnpm/<pkg>@<ver>/node_modules/` 内,其依赖是同目录下的兄弟包。\n * 从项目根向上走只能找到直接依赖 → 传递依赖(如 react-router 的 @tanstack/router-core)\n * 必然 404。改为从 importer 包的真实目录向上走即可命中。\n *\n * 解析成功时把解析到的绝对路径编码进 `?id=`,dev server 据此直接打包该文件,无需再次\n * 从 root 解析(见 transformRequest 中的 `/@modules/...?id=` 分支)。解析失败回落到\n * 裸 `/@modules/<spec>`(npm/yarn 扁平布局下 root 解析仍可命中,行为不变)。\n */\nfunction externalSpecToModuleUrl(spec: string, baseDir: string): string {\n const resolved = resolveNodeModule(baseDir, spec)\n return resolved\n ? `/@modules/${spec}?id=${encodeURIComponent(resolved)}`\n : `/@modules/${spec}`\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 *\n * **返回真实路径**(解析 symlink):pnpm 把直接依赖以 symlink 放在顶层 node_modules,\n * 真实文件在 `.pnpm/.../node_modules/` 下。后续打包阶段用 `dirname(entryFile)` 向上找\n * 传递依赖,只有从真实路径出发才能命中那些未被提升的兄弟包。\n */\nfunction resolveNodeModule(baseDir: string, moduleName: string): string | null {\n const resolved = resolveNodeModuleEntry(baseDir, moduleName)\n if (!resolved) return null\n try {\n return fs.realpathSync(resolved)\n } catch {\n return resolved\n }\n}\n\nfunction resolveNodeModuleEntry(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) {\n // 顶层条件对象(如 `{\"import\": \"./x.mjs\", \"require\": \"./x.cjs\"}`)是 \".\" 入口的\n // 语法糖:当对象没有任何以 \".\" 开头的子路径键时,整个对象就是 \".\" 的条件映射,\n // 交给 resolveExportValue 走 ESM_CONDITIONS 解析,而不是误判为「无此导出」返回 null\n // (否则只能回落到 module/main,exports-only 的双格式包会解析失败)。\n if (\n key === '.' &&\n typeof exports === 'object' &&\n !Object.keys(exports).some((k) => k.startsWith('.'))\n ) {\n return resolveExportValue(exports, pkgDir)\n }\n return null\n }\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 pc from 'picocolors'\nimport type { DevServer, ModuleNode, 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 logger = config.logger\n const relativePath = '/' + path.relative(config.root, file)\n const shortFile = 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 logger.info(pc.green('page reload ') + pc.dim(shortFile), { timestamp: true })\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 logger.info(\n updates\n .map((u) => pc.green('hmr update ') + pc.dim(u.path))\n .join('\\n'),\n { timestamp: true },\n )\n ws.send({ type: 'update', updates })\n }\n}\n","// RunnableEnvironment - SSR dev 执行(NASTI_2.0_PLAN.md §2.4)\n//\n// 模块经 rolldown/experimental 的 moduleRunnerTransform(✓核实导出)转成\n// runner 可执行形态(__vite_ssr_import__ / __vite_ssr_exports__ 约定,与\n// Vite module runner 同构),由 NastiModuleRunner 求值。\n//\n// RPC 桥走 HotChannel.invoke 契约:runner 回调 fetchModule →(环境管线\n// resolve→load→transform→runnerTransform)→ 求值;getBuiltins 提供外部化\n// 清单。Phase 2 是进程内直调(in-memory channel);网络 transport(edge/\n// worker)接入时带 _skipFsCheck —— 接口已一次定全,无需重构。\n//\n// `ssrLoadModule` 是 Vite back-compat shim:server.ssrLoadModule(url) →\n// runner.import(url)。\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { builtinModules, createRequire } from 'node:module'\nimport { pathToFileURL } from 'node:url'\nimport type { ResolvedConfig, HotChannelInvokeHandlers } from '../types.js'\nimport type { NastiEnvironment } from '../core/environment.js'\nimport { transformCode, shouldTransform } from '../core/transformer.js'\nimport { loadEnv, buildEnvDefine, ssrDefineOverrides, replaceEnvInCode } from '../core/env.js'\nimport { createDebugger } from '../core/debug.js'\n\nconst debug = createDebugger('nasti:ssr')\n\nconst NODE_BUILTINS = new Set([...builtinModules, ...builtinModules.map((m) => `node:${m}`)])\n\ninterface FetchedModule {\n id: string\n code: string\n}\n\ninterface ModuleCacheEntry {\n exports: Record<string, unknown>\n promise: Promise<Record<string, unknown>> | null\n}\n\nexport class NastiModuleRunner {\n private environment: NastiEnvironment\n private config: ResolvedConfig\n private cache = new Map<string, ModuleCacheEntry>()\n private envDefine: Record<string, string>\n private require: NodeJS.Require\n\n constructor(environment: NastiEnvironment) {\n this.environment = environment\n this.config = environment.config\n this.envDefine = buildEnvDefine(\n loadEnv(this.config.mode, this.config.root, this.config.envPrefix),\n this.config.mode,\n ssrDefineOverrides(environment.consumer),\n )\n this.require = createRequire(path.join(this.config.root, 'package.json'))\n\n // invoke 桥:fetchModule / getBuiltins 注册到该环境的 HotChannel\n const handlers: HotChannelInvokeHandlers = {\n fetchModule: async (id, importer) => this.fetchModule(id, importer),\n getBuiltins: () => [/^node:/, ...builtinModules],\n }\n environment.hot.setInvokeHandler?.(handlers)\n }\n\n /** 入口:加载并执行一个模块(url 为根相对或绝对路径) */\n async import(rawUrl: string): Promise<Record<string, unknown>> {\n const id = this.resolveToId(rawUrl)\n return this.instantiate(id)\n }\n\n /** 文件变更时按文件失效(含其所属的虚拟子模块) */\n invalidateFile(file: string): void {\n for (const key of [...this.cache.keys()]) {\n if (key === file || key.startsWith(file + '?')) {\n this.cache.delete(key)\n }\n }\n }\n\n invalidateAll(): void {\n this.cache.clear()\n }\n\n private resolveToId(rawUrl: string): string {\n if (path.isAbsolute(rawUrl) && fs.existsSync(rawUrl.split('?')[0])) return rawUrl\n const clean = rawUrl.replace(/^\\//, '')\n return path.resolve(this.config.root, clean)\n }\n\n /**\n * fetchModule(invoke 契约方法):环境管线产出 runner 可执行代码。\n * resolve(插件 resolveId → 文件系统)→ load/读盘 → 插件 transform →\n * oxc(TS/JSX)→ moduleRunnerTransform。\n */\n async fetchModule(id: string, importer?: string): Promise<FetchedModule | { externalize: string }> {\n // 外部化:node 内建与 bare specifier 由 node 原生解析\n if (NODE_BUILTINS.has(id)) return { externalize: id }\n if (!id.startsWith('.') && !path.isAbsolute(id) && !id.startsWith('\\0')) {\n return { externalize: id }\n }\n\n const container = this.environment.pluginContainer!\n let resolvedId = id\n if (id.startsWith('.') && importer) {\n const resolved = await container.resolveId(id, importer)\n resolvedId = resolved\n ? typeof resolved === 'string' ? resolved : resolved.id\n : path.resolve(path.dirname(importer.split('?')[0]), id)\n }\n // 扩展名补全(./App → ./App.tsx 等)\n resolvedId = this.completeExtension(resolvedId)\n\n const cleanId = resolvedId.split('?')[0]\n let code: string\n const loaded = await container.load(resolvedId)\n if (loaded != null) {\n code = typeof loaded === 'string' ? loaded : loaded.code\n } else if (fs.existsSync(cleanId)) {\n code = fs.readFileSync(cleanId, 'utf-8')\n } else {\n throw new Error(`[nasti:ssr] cannot load module: ${resolvedId}`)\n }\n\n const transformed = await container.transform(code, resolvedId)\n if (transformed != null) {\n code = typeof transformed === 'string' ? transformed : transformed.code\n }\n\n if (shouldTransform(cleanId)) {\n const result = transformCode(cleanId, code, {\n sourcemap: false,\n jsxRuntime: 'automatic',\n jsxImportSource: this.config.framework === 'vue' ? 'vue' : 'react',\n })\n code = result.code\n }\n\n code = replaceEnvInCode(code, this.envDefine)\n\n // 实验 API 守卫(rc.13 标注 @deprecated \"Only works for Vite\" —— 即\n // Vite 形态的 runner 约定,正是我们实现的形态;锁版本 + 守卫导入)\n let moduleRunnerTransform: typeof import('rolldown/experimental').moduleRunnerTransform\n try {\n ;({ moduleRunnerTransform } = await import('rolldown/experimental'))\n } catch (err: any) {\n throw new Error(\n `[nasti:ssr] rolldown/experimental moduleRunnerTransform unavailable ` +\n `(installed rolldown incompatible?): ${err.message}`,\n )\n }\n const runnerResult = await moduleRunnerTransform(resolvedId, code)\n debug?.(`fetchModule ${resolvedId} (${runnerResult.deps?.length ?? 0} deps)`)\n return { id: resolvedId, code: runnerResult.code }\n }\n\n private completeExtension(id: string): string {\n const clean = id.split('?')[0]\n const query = id.includes('?') ? id.slice(id.indexOf('?')) : ''\n if (fs.existsSync(clean) && fs.statSync(clean).isFile()) return id\n // TS ESM 约定:`./shared.js` 指向 shared.ts/.tsx 源文件\n const jsMatch = clean.match(/^(.*)\\.([mc]?)jsx?$/)\n if (jsMatch) {\n for (const tsExt of [`.${jsMatch[2]}ts`, `.${jsMatch[2]}tsx`]) {\n if (fs.existsSync(jsMatch[1] + tsExt)) return jsMatch[1] + tsExt + query\n }\n }\n for (const ext of this.config.resolve.extensions) {\n if (fs.existsSync(clean + ext)) return clean + ext + query\n }\n // /dir → /dir/index.*\n for (const ext of this.config.resolve.extensions) {\n const indexPath = path.join(clean, `index${ext}`)\n if (fs.existsSync(indexPath)) return indexPath\n }\n return id\n }\n\n private async instantiate(id: string): Promise<Record<string, unknown>> {\n const cached = this.cache.get(id)\n if (cached) return cached.promise ?? Promise.resolve(cached.exports)\n\n const entry: ModuleCacheEntry = { exports: {}, promise: null }\n this.cache.set(id, entry)\n entry.promise = this.evaluate(id, entry).then(() => {\n entry.promise = null\n return entry.exports\n }).catch((err) => {\n this.cache.delete(id)\n throw err\n })\n return entry.promise\n }\n\n private async evaluate(id: string, entry: ModuleCacheEntry): Promise<void> {\n // 经 invoke 桥取模块(与未来网络 transport 同一路径)\n const fetched = await this.fetchModule(id)\n\n if ('externalize' in fetched) {\n const spec = fetched.externalize\n const mod = await this.importExternal(spec)\n entry.exports = mod\n return\n }\n\n const ssrImport = async (dep: string) => {\n if (NODE_BUILTINS.has(dep) || (!dep.startsWith('.') && !path.isAbsolute(dep) && !dep.startsWith('\\0'))) {\n return this.importExternal(dep)\n }\n const depId = dep.startsWith('.')\n ? this.completeExtension(path.resolve(path.dirname(fetched.id.split('?')[0]), dep))\n : this.completeExtension(dep)\n return this.instantiate(depId)\n }\n\n const ssrExportAll = (sourceModule: Record<string, unknown>) => {\n for (const key of Object.keys(sourceModule)) {\n if (key !== 'default' && !(key in entry.exports)) {\n Object.defineProperty(entry.exports, key, {\n enumerable: true,\n configurable: true,\n get: () => sourceModule[key],\n })\n }\n }\n }\n\n const importMeta = {\n url: pathToFileURL(fetched.id.split('?')[0]).href,\n env: { SSR: true, MODE: this.config.mode, DEV: this.config.mode !== 'production', PROD: this.config.mode === 'production' },\n hot: undefined,\n }\n\n const fn = new AsyncFunction(\n '__vite_ssr_exports__',\n '__vite_ssr_import__',\n '__vite_ssr_dynamic_import__',\n '__vite_ssr_exportAll__',\n '__vite_ssr_import_meta__',\n `\"use strict\";${fetched.code}\\n//# sourceURL=${fetched.id}`,\n )\n await fn(entry.exports, ssrImport, ssrImport, ssrExportAll, importMeta)\n }\n\n private async importExternal(spec: string): Promise<Record<string, unknown>> {\n try {\n return await import(\n spec.startsWith('node:') || !path.isAbsolute(spec)\n ? this.resolveExternalSpecifier(spec)\n : pathToFileURL(spec).href\n )\n } catch (err: any) {\n throw new Error(`[nasti:ssr] failed to import external \"${spec}\": ${err.message}`)\n }\n }\n\n /** bare specifier → 项目 node_modules 的绝对 URL(避免相对 Nasti 自身解析) */\n private resolveExternalSpecifier(spec: string): string {\n if (spec.startsWith('node:')) return spec\n if (NODE_BUILTINS.has(spec)) return `node:${spec}`\n try {\n return pathToFileURL(this.require.resolve(spec)).href\n } catch {\n return spec\n }\n }\n}\n\nconst AsyncFunction = Object.getPrototypeOf(async function () {}).constructor as new (\n ...args: string[]\n) => (...fnArgs: unknown[]) => Promise<void>\n\n/** 为 server consumer 环境创建 module runner(Vite RunnableEnvironment 的精简版) */\nexport function createModuleRunner(environment: NastiEnvironment): NastiModuleRunner {\n if (environment.consumer !== 'server') {\n throw new Error(\n `[nasti] module runner requires a server-consumer environment (got \"${environment.name}\" / ${environment.consumer})`,\n )\n }\n return new NastiModuleRunner(environment)\n}\n","// 完整打包模式 / Full Bundle Mode(NASTI_2.0_PLAN.md §2.5,opt-in)\n//\n// `experimental.bundledDev`(CLI `--bundle`)把 unbundled 的 transform+sirv\n// 管线换成长驻 Rolldown DevEngine:整体打包 client 环境,产物存内存 Map\n//(**非 memfs** —— rc.13 native 构建下 memfs 运行时为 undefined),经\n// memory-files 中间件服务;HMR 由 onHmrUpdates 的 Patch/FullReload 驱动。\n//\n// 客户端运行时:**复用 rolldown 内置的 DefaultDevRuntime**(不传\n// devMode.implement —— rc.13 下 implement 会替换整个 runtime 模块,包括\n// __toESM 等 scope-hoist helper,自带成本远高于收益)。服务端讲它的协议:\n// server→client: {type:'connected'} / {type:'hmr:update', path, url} /\n// {type:'hmr:reload'}\n// client→server: {type:'hmr:module-registered', modules} /\n// {type:'hmr:invalidate', moduleId}\n// ws 连接带 ?clientId=<uuid>(runtime 生成,多 tab 各自独立)\n//\n// 懒编译端点:rc.13 的 lazy stub **硬编码** `/@vite/lazy?id=&clientId=`\n//(Vite 专属约定)—— 按已安装版本编码,同时也接受 /@nasti/lazy。\n//\n// React Fast Refresh:复用 rolldown 原生 `viteReactRefreshWrapperPlugin`\n//(计划 §2.5 ✓核实)。契约(经 rc.13 探针验证):\n// 1. wrapper 在插件 transform 阶段看到 **已含 `$RefreshReg$(` 的代码**才激活\n// → refresh 注册转换必须在它之前的 JS 插件里完成(input 级 transform.jsx\n// 在插件链之后才跑,wrapper 看不到)—— createBundledOxcRefreshPlugin。\n// 2. wrapper 产出 `import * as RefreshRuntime from \"/@react-refresh\"` 并调用\n// registerExportsForReactRefresh / validateRefreshBoundaryAndEnqueueUpdate\n// (plugin-react 扩展 API,react-refresh 本体没有)→ 由\n// createReactRefreshRuntimePlugin 在 **bundle 内**提供该虚拟模块。\n// 3. wrapper 校验 `window.$RefreshReg$` → preamble 以 bundle 内虚拟模块的\n// 形式注入为各入口的**第一个 import**(不能走 HTML 内联 script——那会经\n// unbundled 中间件加载出第二个 runtime 实例,refresh 注册表分裂失效)。\n//\n// 仅 client 环境(同 Vite FullBundleDevEnvironment);unbundled 保持默认。\nimport path from 'node:path'\nimport crypto from 'node:crypto'\nimport { WebSocketServer as WsServer, type WebSocket } from 'ws'\nimport pc from 'picocolors'\nimport type { IncomingMessage, ServerResponse, Server as HttpServer } from 'node:http'\nimport type { ResolvedConfig } from '../../types.js'\nimport type { NastiEnvironment } from '../../core/environment.js'\nimport { getRolldownOptions, toRolldownPlugins, resolveClientEntries } from '../../build/index.js'\nimport { readHtmlFile, processHtml } from '../../plugins/html.js'\nimport { transformCode } from '../../core/transformer.js'\nimport { getReactRefreshRuntimeEsm } from '../middleware.js'\nimport { createDebugger } from '../../core/debug.js'\n\nconst debug = createDebugger('nasti:bundled')\n\nconst MIME_TYPES: Record<string, string> = {\n '.js': 'application/javascript',\n '.mjs': 'application/javascript',\n '.css': 'text/css',\n '.html': 'text/html',\n '.json': 'application/json',\n '.map': 'application/json',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.wasm': 'application/wasm',\n}\n\n/** 内存产物存储(普通 Map —— rc.13 native 构建无 memfs,Vite MemoryFiles 同款做法) */\nclass MemoryFiles {\n private files = new Map<string, { content: string | Uint8Array; etag: string }>()\n\n set(fileName: string, content: string | Uint8Array): void {\n const etag = `\"${crypto.createHash('sha1').update(content).digest('base64').slice(0, 27)}\"`\n this.files.set(fileName, { content, etag })\n }\n\n get(fileName: string) {\n return this.files.get(fileName)\n }\n\n clear(): void {\n this.files.clear()\n }\n}\n\nexport interface BundledDevOptions {\n config: ResolvedConfig\n clientEnv: NastiEnvironment\n httpServer: HttpServer\n}\n\nexport interface BundledDevServer {\n /** connect 中间件:内存产物 + index.html + 懒编译端点 */\n middleware: (req: IncomingMessage, res: ServerResponse, next: (err?: unknown) => void) => void\n close: () => Promise<void>\n}\n\nexport async function createBundledDevServer(opts: BundledDevOptions): Promise<BundledDevServer> {\n const { config, clientEnv, httpServer } = opts\n const logger = config.logger\n\n // 实验 API 守卫:dev/DevEngine 无 semver 保护,导入失败给出明确指引\n let devFn: typeof import('rolldown/experimental').dev\n let refreshWrapperFn:\n | typeof import('rolldown/experimental').viteReactRefreshWrapperPlugin\n | null = null\n try {\n const experimental = await import('rolldown/experimental')\n devFn = experimental.dev\n if (typeof devFn !== 'function') throw new Error('dev() export missing')\n // wrapper 缺失只降级 Fast Refresh(HMR 退化为整页刷新),不阻塞 bundled dev\n if (typeof experimental.viteReactRefreshWrapperPlugin === 'function') {\n refreshWrapperFn = experimental.viteReactRefreshWrapperPlugin\n }\n } catch (err: any) {\n throw new Error(\n `[nasti] experimental.bundledDev requires rolldown's experimental dev() API ` +\n `(locked to the installed rc; got: ${err.message}). ` +\n `Remove --bundle / experimental.bundledDev to use the default unbundled dev server.`,\n )\n }\n\n const html = await readHtmlFile(config.root)\n const entryPoints = resolveClientEntries(config, html)\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 const memoryFiles = new MemoryFiles()\n const patches = new MemoryFiles()\n /** entry facadeModuleId(绝对路径)→ 内存产物 fileName(assets/main.js) */\n const entryFileNames = new Map<string, string>()\n const bundledClients = new Map<string, WebSocket>()\n\n // 复用多环境 builder 的 per-env 选项装配(含插件转发表 / define / resolve)\n // React Fast Refresh 三件套(条件与 unbundled 中间件一致:framework !== 'vue'):\n // refresh runtime 虚拟模块 + 入口 preamble → OXC refresh 注册转换 →\n // Nasti 插件 → 原生 wrapper(必须在 OXC 之后才能看到 $RefreshReg$ 调用)\n const useReactRefresh = config.framework !== 'vue' && refreshWrapperFn != null\n const rolldownPlugins = [\n ...(useReactRefresh\n ? [\n createReactRefreshRuntimePlugin(entryPoints),\n createBundledOxcRefreshPlugin(),\n ]\n : []),\n ...stripCatchAllLoad(toRolldownPlugins(clientEnv.plugins)),\n ...(useReactRefresh\n ? [\n refreshWrapperFn!({\n cwd: config.root,\n include: [/\\.[jt]sx(\\?.*)?$/],\n exclude: [/node_modules/],\n jsxImportSource: 'react',\n reactRefreshHost: '',\n }),\n ]\n : []),\n ]\n const { inputOptions, outputOptions } = getRolldownOptions(clientEnv, entryPoints, rolldownPlugins)\n\n let fullReloadTimer: ReturnType<typeof setTimeout> | null = null\n const scheduleFullReload = () => {\n if (fullReloadTimer) clearTimeout(fullReloadTimer)\n fullReloadTimer = setTimeout(() => {\n logger.info(pc.green('page reload ') + pc.dim('(bundled)'), { timestamp: true })\n broadcast({ type: 'hmr:reload' })\n }, 30)\n }\n const broadcast = (payload: unknown) => {\n const data = JSON.stringify(payload)\n for (const ws of bundledClients.values()) {\n if (ws.readyState === 1) ws.send(data)\n }\n }\n const sendTo = (clientId: string, payload: unknown) => {\n const ws = bundledClients.get(clientId)\n if (ws && ws.readyState === 1) ws.send(JSON.stringify(payload))\n }\n\n // HMR 由 DevEngine 内置 watcher 独占驱动(onHmrUpdates)。\n // ⚠️ 不要用 engine.invalidate(file) 显式失效:rc.13 下一旦有客户端\n // registerModules 过,invalidate 必定 panic(hmr_stage.rs:100\n // \"Not found modules for file\",任意路径格式、纯 rolldown 最小复现同样炸),\n // 且 panic 杀死 tokio worker 后内置 watcher 的更新处理也会被毒化 ——\n // 这正是早期版本误判\"内置 watcher 嵌入后不触发\"的原因。\n type ClientUpdates = Awaited<ReturnType<import('rolldown/experimental').DevEngine['invalidate']>>\n async function processUpdates(updates: ClientUpdates, changedFiles: string[]): Promise<void> {\n let needsLatestOutput = false\n for (const { clientId, update } of updates) {\n if (update.type === 'Noop') continue\n if (update.type === 'FullReload') {\n debug?.(`full reload for ${clientId}: ${update.reason ?? ''}`)\n needsLatestOutput = true\n continue\n }\n // Patch:存内存 + 通知该 client 拉取(XSSI 加固:尾部 export {})\n const patchPath = `__nasti_patch/${update.filename}`\n patches.set(patchPath, update.code + '\\n;export {}')\n if (update.sourcemap && update.sourcemapFilename) {\n patches.set(`__nasti_patch/${update.sourcemapFilename}`, update.sourcemap)\n }\n const url = `/${patchPath}`\n logger.info(\n pc.green('hmr update ') +\n pc.dim(changedFiles.map((f) => path.relative(config.root, f)).join(', ')),\n { timestamp: true },\n )\n sendTo(clientId, { type: 'hmr:update', path: url, url })\n }\n if (needsLatestOutput) {\n await engine.ensureLatestBuildOutput()\n scheduleFullReload()\n }\n }\n\n const engine = await devFn(\n {\n ...inputOptions,\n cwd: config.root,\n // Rolldown bug 规避:inlineConst 与 dev patch 机制冲突(vitejs/vite#21843)\n optimization: { ...(inputOptions as any).optimization, inlineConst: false },\n experimental: {\n ...(inputOptions as any).experimental,\n devMode: {\n lazy: true,\n // 默认 DevRuntime 把 ws 地址烤进 bundle:指向 Nasti dev server 本身\n //(端口被占自动 +1 时 HMR ws 会失联 —— 已知限制,产物仍可服务)\n host: config.server.host === true ? 'localhost' : (config.server.host as string) || 'localhost',\n port: config.server.port,\n },\n },\n } as any,\n {\n ...outputOptions,\n entryFileNames: 'assets/[name].js',\n chunkFileNames: 'assets/[name]-[hash].js',\n minify: false,\n sourcemap: true,\n },\n {\n watch: { skipWrite: true },\n rebuildStrategy: 'auto',\n onOutput(result) {\n if (result instanceof Error) {\n logger.error(pc.red(`[bundled] build error: ${result.message}`), { error: result })\n return\n }\n for (const file of result.output) {\n const content = file.type === 'chunk' ? file.code : (file as any).source\n if (content != null) memoryFiles.set(file.fileName, content)\n if (file.type === 'chunk' && (file as any).isEntry && (file as any).facadeModuleId) {\n entryFileNames.set((file as any).facadeModuleId, file.fileName)\n }\n // sourcemap 同步进内存\n if (file.type === 'chunk' && (file as any).map) {\n memoryFiles.set(`${file.fileName}.map`, JSON.stringify((file as any).map))\n }\n }\n debug?.(`bundle output refreshed (${result.output.length} files)`)\n },\n async onHmrUpdates(result) {\n if (result instanceof Error) {\n logger.error(pc.red(`[bundled] hmr error: ${result.message}`), { error: result })\n broadcast({ type: 'error', err: { message: result.message, stack: result.stack } })\n return\n }\n const { updates, changedFiles } = result\n debug?.(\n `onHmrUpdates(engine watcher): ${changedFiles.length} changed, ${updates.length} updates`,\n )\n if (changedFiles.length === 0) return\n await processUpdates(updates, changedFiles)\n },\n },\n )\n\n await engine.run()\n await engine.ensureCurrentBuildFinish()\n logger.info(pc.dim(` bundled dev engine ready (${entryPoints.length} entries, in-memory)`))\n\n // ── 打包模式专用 ws(默认 DevRuntime 不带子协议,带 ?clientId= 查询)────\n const wss = new WsServer({ noServer: true })\n httpServer.on('upgrade', (req, socket, head) => {\n if (req.headers['sec-websocket-protocol'] === 'nasti-hmr') return // unbundled 客户端\n const url = new URL(req.url ?? '/', 'http://localhost')\n const clientId = url.searchParams.get('clientId')\n if (!clientId) return\n wss.handleUpgrade(req, socket, head, (ws) => {\n bundledClients.set(clientId, ws)\n debug?.(`bundled client connected: ${clientId}`)\n ws.send(JSON.stringify({ type: 'connected' }))\n ws.on('message', async (raw) => {\n try {\n const msg = JSON.parse(String(raw))\n if (msg.type === 'hmr:module-registered' && Array.isArray(msg.modules)) {\n await engine.registerModules(clientId, msg.modules)\n debug?.(`registered ${msg.modules.length} modules for ${clientId}`)\n } else if (msg.type === 'hmr:invalidate') {\n // import.meta.hot.invalidate:保守处理为整页刷新\n scheduleFullReload()\n }\n } catch (err: any) {\n debug?.(`bundled ws message error: ${err.message}`)\n }\n })\n ws.on('close', () => {\n bundledClients.delete(clientId)\n engine\n .removeClient(clientId)\n .catch((err: any) => debug?.(`removeClient failed for ${clientId}: ${err?.message ?? err}`))\n })\n })\n })\n\n // ── 中间件:懒编译端点 + 内存产物 + index.html ─────────────────────────\n const middleware: BundledDevServer['middleware'] = (req, res, next) => {\n void (async () => {\n const rawUrl = req.url ?? '/'\n const url = new URL(rawUrl, 'http://localhost')\n const pathname = decodeURIComponent(url.pathname)\n\n // 懒编译(rc.13 stub 硬编码 /@vite/lazy;/@nasti/lazy 同义)\n if (pathname === '/@vite/lazy' || pathname === '/@nasti/lazy') {\n const id = url.searchParams.get('id')\n const clientId = url.searchParams.get('clientId')\n if (!id || !clientId) {\n res.statusCode = 400\n res.end('// [nasti] lazy endpoint requires id & clientId')\n return\n }\n const code = await engine.compileEntry(id, clientId)\n res.setHeader('Content-Type', 'application/javascript')\n res.setHeader('Cache-Control', 'no-store')\n res.end(code + '\\n;export {}')\n return\n }\n\n // HMR patch\n const patchHit = patches.get(pathname.replace(/^\\//, ''))\n if (patchHit) {\n res.setHeader('Content-Type', 'application/javascript')\n res.setHeader('Cache-Control', 'no-store')\n res.end(patchHit.content)\n return\n }\n\n // 内存产物(ETag/304)\n const fileName = pathname.replace(/^\\//, '')\n const hit = memoryFiles.get(fileName)\n if (hit) {\n if (req.headers['if-none-match'] === hit.etag) {\n res.statusCode = 304\n res.end()\n return\n }\n res.setHeader('ETag', hit.etag)\n res.setHeader('Content-Type', MIME_TYPES[path.extname(fileName)] ?? 'application/octet-stream')\n res.setHeader('Cache-Control', 'no-cache')\n res.end(hit.content)\n return\n }\n\n // index.html:注入 React preamble(unbundled 同款)+ 入口改写到内存产物\n if (pathname === '/' || pathname.endsWith('.html')) {\n const rawHtml = await readHtmlFile(config.root)\n if (rawHtml) {\n res.setHeader('Content-Type', 'text/html')\n res.setHeader('Cache-Control', 'no-store')\n res.end(await renderBundledIndexHtml(rawHtml, config, entryFileNames))\n return\n }\n }\n\n next()\n })().catch((err) => {\n config.logger.error(pc.red(`[bundled] ${err.message}`), { error: err })\n res.statusCode = 500\n res.end(`[nasti bundled] ${err.message}`)\n })\n }\n\n return {\n middleware,\n async close() {\n if (fullReloadTimer) clearTimeout(fullReloadTimer)\n wss.close()\n await engine.close()\n },\n }\n}\n\n// ── React Fast Refresh(bundled 模式三件套)────────────────────────────────\n\n/**\n * 剥掉 nasti:resolve 的兜底 load 钩子(仅 bundled 模式)。\n *\n * rc.13 DevEngine 的文件监听只注册**原生加载过**的模块路径 —— 模块一旦由\n * 插件 load 提供内容,就不进 watch 列表。nasti:resolve 的 load 是\n * \"存在即读盘\"的 catch-all(unbundled PluginContainer 必需 —— 那条管线\n * 没有原生加载器),进了 DevEngine 会接管**所有**文件模块,watch 列表\n * 清空、onHmrUpdates 永不触发(经 probe 二分定位:resolveId 无害,load 致死)。\n * Rolldown 原生加载本就覆盖读盘 + JSON,bundled 模式下直接剥掉。\n * 同理:用户插件的 catch-all load 也会让对应文件失去 HMR —— 文档已注记。\n */\nfunction stripCatchAllLoad(plugins: unknown[]): unknown[] {\n return plugins.map((p: any) =>\n p?.name === 'nasti:resolve' ? { ...p, load: undefined } : p,\n )\n}\n\n/** 入口 preamble 的虚拟模块 specifier(resolveId 映射到 \\0 前缀 id) */\nconst PREAMBLE_SPEC = 'nasti:react-preamble'\nconst RESOLVED_PREAMBLE_ID = '\\0nasti:react-preamble'\nconst REFRESH_RUNTIME_URL = '/@react-refresh'\n\n/**\n * 安装 Fast Refresh 全局钩子的 preamble —— 作为 bundle 内模块(而非 HTML 内联\n * script)注入为入口的第一个 import:与 wrapper 产出的 import 共享**同一个**\n * runtime 实例(HTML 路径会经 unbundled 中间件加载出第二个实例,注册表分裂),\n * 且 scope-hoist 后先于 react-dom 执行(renderer 必须注册到已安装的 hook 上)。\n */\nconst BUNDLED_PREAMBLE_CODE = `\nimport __rt from ${JSON.stringify(REFRESH_RUNTIME_URL)};\n__rt.injectIntoGlobalHook(window);\nwindow.$RefreshReg$ = () => {};\nwindow.$RefreshSig$ = () => (type) => type;\nwindow.__vite_plugin_react_preamble_installed__ = true;\n`\n\n/**\n * 原生 wrapper 的运行时契约扩展(plugin-react refresh-runtime 的同款辅助 API,\n * react-refresh 本体没有):registerExportsForReactRefresh /\n * validateRefreshBoundaryAndEnqueueUpdate / __hmr_import。\n * 实现基于 getReactRefreshRuntimeEsm 已 re-export 的公共 API。\n */\nconst WRAPPER_RUNTIME_HELPERS = `\n// ── viteReactRefreshWrapperPlugin 运行时契约(@vitejs/plugin-react 同款)──\nfunction __isPlainObject(obj) {\n return Object.prototype.toString.call(obj) === '[object Object]' &&\n (obj.constructor === Object || obj.constructor === undefined);\n}\nfunction __isCompoundComponent(type) {\n if (!__isPlainObject(type)) return false;\n for (const key in type) {\n if (!isLikelyComponentType(type[key])) return false;\n }\n return true;\n}\nexport function registerExportsForReactRefresh(filename, moduleExports) {\n for (const key in moduleExports) {\n if (key === '__esModule') continue;\n const exportValue = moduleExports[key];\n if (isLikelyComponentType(exportValue)) {\n register(exportValue, filename + ' export ' + key);\n } else if (__isCompoundComponent(exportValue)) {\n for (const subKey in exportValue) {\n register(exportValue[subKey], filename + ' export ' + key + '-' + subKey);\n }\n }\n }\n}\nlet __enqueueTimer;\nconst __hooks = [];\nwindow.__registerBeforePerformReactRefresh = (cb) => { __hooks.push(cb); };\nfunction __enqueueUpdate() {\n clearTimeout(__enqueueTimer);\n __enqueueTimer = setTimeout(async () => {\n if (__hooks.length) await Promise.all(__hooks.map((cb) => cb()));\n performReactRefresh();\n }, 16);\n}\nfunction __predicateOnExport(ignoredExports, moduleExports, predicate) {\n for (const key in moduleExports) {\n if (ignoredExports.includes(key)) continue;\n if (!predicate(key, moduleExports[key])) return key;\n }\n return true;\n}\nexport function validateRefreshBoundaryAndEnqueueUpdate(id, prevExports, nextExports) {\n const ignoredExports = window.__getReactRefreshIgnoredExports?.({ id }) ?? [];\n if (__predicateOnExport(ignoredExports, prevExports, (key) => key in nextExports) !== true) {\n return 'Could not Fast Refresh (export removed)';\n }\n if (__predicateOnExport(ignoredExports, nextExports, (key) => key in prevExports) !== true) {\n return 'Could not Fast Refresh (new export)';\n }\n let hasExports = false;\n const allExportsAreComponentsOrUnchanged = __predicateOnExport(\n ignoredExports,\n nextExports,\n (key, value) => {\n hasExports = true;\n if (isLikelyComponentType(value)) return true;\n if (__isCompoundComponent(value)) return true;\n return prevExports[key] === nextExports[key];\n },\n );\n if (hasExports && allExportsAreComponentsOrUnchanged === true) {\n __enqueueUpdate();\n } else {\n return 'Could not Fast Refresh (\"' + allExportsAreComponentsOrUnchanged + '\" export is incompatible)';\n }\n}\nexport const __hmr_import = (module) => import(/* @vite-ignore */ module);\n`\n\n/**\n * bundle 内的 refresh runtime 虚拟模块 + 入口 preamble 注入。\n * `/@react-refresh` 保留**字面 id**(不映射 \\0 前缀):原生 wrapper 插件自带\n * 该 id 的 resolveId(原样返回且先于一切 JS resolveId 执行,rc.13 探针验证),\n * 因此只能在 load 阶段按字面 id 提供内容 —— 与 @vitejs/plugin-react 的\n * `load: { filter: exactRegex('/@react-refresh') }` 同款做法。\n */\nfunction createReactRefreshRuntimePlugin(entryPoints: string[]) {\n const entryIds = new Set(entryPoints.map((p) => path.resolve(p)))\n return {\n name: 'nasti:bundled-react-refresh',\n resolveId(source: string) {\n // wrapper 不在场时(理论上不会,防御)也保证 preamble 的 import 可解析\n if (source === REFRESH_RUNTIME_URL) return REFRESH_RUNTIME_URL\n if (source === PREAMBLE_SPEC) return RESOLVED_PREAMBLE_ID\n return null\n },\n load(id: string) {\n if (id === REFRESH_RUNTIME_URL) {\n return { code: getReactRefreshRuntimeEsm() + WRAPPER_RUNTIME_HELPERS, moduleType: 'js' }\n }\n if (id === RESOLVED_PREAMBLE_ID) {\n return { code: BUNDLED_PREAMBLE_CODE, moduleType: 'js' }\n }\n return null\n },\n transform(code: string, id: string) {\n if (!entryIds.has(path.resolve(id.split('?')[0]))) return null\n return { code: `import ${JSON.stringify(PREAMBLE_SPEC)};\\n${code}`, map: null }\n },\n }\n}\n\n/**\n * .jsx/.tsx 的 OXC refresh 注册转换($RefreshReg$/$RefreshSig$ 插入)。\n * 必须以 JS 插件形式跑在 wrapper **之前** —— input 级 `transform.jsx` 在插件链\n * 之后才执行,wrapper 的内容过滤(`$RefreshReg$(`)会看不到而静默跳过\n *(rc.13 探针验证)。node_modules 交给 rolldown 原生转换。\n */\nfunction createBundledOxcRefreshPlugin() {\n return {\n name: 'nasti:bundled-oxc-refresh',\n transform(code: string, id: string) {\n const clean = id.split('?')[0]\n if (!/\\.[jt]sx$/.test(clean) || clean.includes('/node_modules/')) return null\n const result = transformCode(clean, code, {\n sourcemap: true,\n jsxRuntime: 'automatic',\n jsxImportSource: 'react',\n reactRefresh: true,\n })\n return { code: result.code, map: result.map ? JSON.parse(result.map) : undefined }\n },\n }\n}\n\n/** index.html:入口 script src 改写到内存产物 + 用户插件 transformIndexHtml。\n * 跳过内置 nasti:html(它注入的 /@nasti/client 与 HTML preamble 都是\n * unbundled 专属 —— bundled 的 HMR 客户端与 preamble 已在 bundle 内)。 */\nasync function renderBundledIndexHtml(\n html: string,\n config: ResolvedConfig,\n entryFileNames: Map<string, string>,\n): Promise<string> {\n let processed = html\n for (const plugin of config.plugins) {\n if (!plugin.transformIndexHtml || plugin.name === 'nasti:html') continue\n const result = await plugin.transformIndexHtml(processed)\n if (typeof result === 'string') {\n processed = result\n } else if (result && 'html' in result) {\n processed = processHtml(result.html, result.tags)\n } else if (Array.isArray(result)) {\n processed = processHtml(processed, result)\n }\n }\n // 入口 script src → 内存产物 URL\n for (const [facadeModuleId, fileName] of entryFileNames) {\n const originalEntry = path.relative(config.root, facadeModuleId)\n processed = processed.replace(\n new RegExp(`(src=[\"'])/?(${originalEntry.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})([\"'])`, 'g'),\n `$1/${fileName}$3`,\n )\n }\n return processed\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 { NastiEnvironment } from '../core/environment.js'\nimport { createWsHotChannel } from '../core/hot-channel.js'\nimport { printServerUrls } from '../core/logger.js'\nimport { createWebSocketServer } from './ws.js'\nimport { transformMiddleware } from './middleware.js'\nimport { handleFileChange } from './hmr.js'\nimport { resolvePluginList } from '../plugins/builtins.js'\n\nexport async function createServer(inlineConfig: NastiConfig = {}): Promise<DevServer> {\n const startTime = performance.now()\n const config = await resolveConfig(inlineConfig, 'serve')\n const logger = config.logger\n\n // 组装内置插件 + 用户插件(per-env 统一拼装函数)\n const allPlugins = resolvePluginList(config, config.plugins)\n const configWithPlugins: ResolvedConfig = { ...config, plugins: allPlugins }\n\n // HTTP 服务\n const app = connect()\n const httpServer = http.createServer(app)\n const ws = createWebSocketServer(httpServer)\n\n // ── Environment API:client 环境承载 dev 运行时(per-env 容器/图/热通道)──\n // ssr 等其余环境:server consumer 的插件列表带 consumer 标记(css 无 DOM stub),\n // 容器在首次使用(ssrLoadModule)时初始化 —— 生命周期钩子默认 client 单次触发。\n const clientEnv = new NastiEnvironment('client', configWithPlugins, {\n hot: createWsHotChannel(ws),\n mode: 'dev',\n plugins: allPlugins,\n })\n await clientEnv.init()\n const environments: Record<string, NastiEnvironment> = { client: clientEnv }\n for (const name of Object.keys(config.environments)) {\n if (name === 'client') continue\n const consumer = config.environments[name].consumer\n const envPlugins = resolvePluginList(config, config.plugins, { consumer })\n environments[name] = new NastiEnvironment(name, { ...config, plugins: envPlugins }, {\n mode: 'dev',\n plugins: envPlugins,\n })\n }\n\n // SSR module runner(懒初始化:仅在 ssrLoadModule 首次调用时建容器/runner)\n let ssrRunner: import('./runnable-environment.js').NastiModuleRunner | null = null\n async function getSsrRunner() {\n if (ssrRunner) return ssrRunner\n const ssrEnv = environments.ssr\n if (!ssrEnv) {\n throw new Error('[nasti] no \"ssr\" environment configured (config.environments.ssr)')\n }\n await ssrEnv.init()\n const { createModuleRunner } = await import('./runnable-environment.js')\n ssrRunner = createModuleRunner(ssrEnv)\n return ssrRunner\n }\n\n const moduleGraph = clientEnv.moduleGraph\n const pluginContainer = clientEnv.pluginContainer!\n\n // ── 完整打包模式(opt-in,experimental.bundledDev / --bundle)──────────\n // DevEngine 整体打包 client 环境,产物从内存服务;中间件注册在\n // transformMiddleware 之前(接管 '/'、/assets/*、懒编译端点)。\n // unbundled 管线保持默认 —— 不开启时下面这段完全不执行。\n let bundledServer: import('./bundled/dev-engine.js').BundledDevServer | null = null\n if (config.experimental.bundledDev) {\n const { createBundledDevServer } = await import('./bundled/dev-engine.js')\n bundledServer = await createBundledDevServer({\n config: configWithPlugins,\n clientEnv,\n httpServer,\n })\n app.use(bundledServer.middleware)\n }\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 // 文件监听\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 ssrRunner?.invalidateFile(file)\n handleFileChange(file, server)\n })\n\n watcher.on('add', (file: string) => {\n ssrRunner?.invalidateFile(file)\n handleFileChange(file, server)\n })\n\n server = {\n config: configWithPlugins,\n middlewares: app,\n moduleGraph: moduleGraph as any,\n watcher,\n ws,\n environments,\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 logger.clearScreen('info')\n const readyIn = Math.ceil(performance.now() - startTime)\n logger.info(\n `\\n ${pc.cyan(pc.bold('NASTI'))} ${pc.cyan(`v${__NASTI_VERSION__}`)} ${pc.dim('ready in')} ${pc.bold(readyIn)} ${pc.dim('ms')}\\n`,\n )\n printServerUrls(\n { local: [localUrl], network: networkUrl ? [networkUrl] : [] },\n logger.info,\n )\n logger.info('')\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 logger.info(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 ssrLoadModule(url: string) {\n const runner = await getSsrRunner()\n return runner.import(url)\n },\n\n async close() {\n await pluginContainer.buildEnd()\n await bundledServer?.close()\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","// Nasti - 基于 Rolldown/Oxc 的高性能 Web 打包器\n// 编程 API 入口\n\nexport { defineConfig, resolveConfig } from './config/index.js'\nexport { build } from './build/index.js'\nexport { buildElectron } from './build/electron.js'\nexport { createServer } from './server/index.js'\nexport { startElectronDev } from './server/electron-dev.js'\nexport { electronPlugin } from './plugins/electron.js'\nexport { monacoEditorPlugin } from './plugins/monaco-editor.js'\n\n// 2.0: Environment API + Logger\nexport { NastiEnvironment, resolveEnvironmentPlugins } from './core/environment.js'\nexport { createNoopHotChannel, createWsHotChannel } from './core/hot-channel.js'\nexport { createLogger, printServerUrls, LogLevels } from './core/logger.js'\nexport { createDebugger } from './core/debug.js'\nexport { loadEnv, buildEnvDefine, ssrDefineOverrides } from './core/env.js'\n\nexport type {\n NastiConfig,\n NastiPlugin,\n ResolvedConfig,\n ElectronConfig,\n BuildConfig,\n NastiRolldownOptions,\n DevServer,\n ModuleNode,\n HmrPayload,\n TransformResult,\n // 2.0: Environment API\n EnvironmentOptions,\n ResolvedEnvironmentOptions,\n EnvironmentInstance,\n HotChannel,\n HotChannelClient,\n HotChannelInvokeHandlers,\n PluginContext,\n RenderChunkContext,\n} from './types.js'\nexport type { Logger, LogLevel, LogOptions } from './core/logger.js'\nexport type {\n MonacoEditorPluginOptions,\n MonacoEditorLanguageWorker,\n MonacoCustomWorker,\n} from './plugins/monaco-editor.js'\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 // 从 build.rolldownOptions 拆出 output(合并进 bundle.write())与 transform\n // (需与 envDefine 合并),其余 input 选项(treeshake 等)随 restInputOptions 透传。\n // Nasti 自管的 input / platform / transform / plugins 放在 spread 之后确保覆盖。\n const { output: userOutput, transform: userTransform, ...restInputOptions } =\n config.build.rolldownOptions\n // 合并用户的 transform.define 和 envDefine,确保 envDefine 优先级更高\n const mergedDefine = { ...(userTransform?.define ?? {}), ...envDefine }\n const bundle = await rolldown({\n ...restInputOptions,\n input: entry,\n platform: 'node',\n transform: { ...userTransform, define: mergedDefine },\n plugins: [oxcTransformPlugin, electronPlugin(config), resolvePlugin(config)] as any,\n })\n\n fs.mkdirSync(path.dirname(opts.outFile), { recursive: true })\n\n await bundle.write({\n sourcemap: !!config.build.sourcemap,\n minify: !!config.build.minify,\n // 允许用户微调 output;但主进程 / preload 的单文件约束由下方键强制保证\n ...userOutput,\n file: opts.outFile,\n format: opts.format === 'cjs' ? 'cjs' : 'esm',\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// 负责:将 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","// 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","// Monaco Editor 支持插件 - 仿照 vite-plugin-monaco-editor\n//\n// 解决两个核心问题:\n// 1. Monaco Editor 的 Web Worker 是独立入口,必须单独打包,\n// 并通过 self.MonacoEnvironment.getWorkerUrl 告诉 Monaco 去哪里加载\n// 2. monaco-editor 包含 2000+ 文件,若按 ESM 逐文件交给 dev server 转译,\n// 并发 HTTP + fs 读取会在 macOS 等低 fd 限制环境下触发 EMFILE。\n// 本插件将 Worker 预先打包为单文件并从磁盘缓存直接流式返回,\n// 同时把 monaco-editor 目录显式从 watcher 排除,避免 HMR 链式打爆 fd。\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport crypto from 'node:crypto'\nimport { createRequire } from 'node:module'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport type { NastiPlugin, ResolvedConfig, DevServer, HtmlTagDescriptor } from '../types.js'\n\nexport type MonacoEditorLanguageWorker =\n | 'editorWorkerService'\n | 'css'\n | 'html'\n | 'json'\n | 'typescript'\n\nexport interface MonacoCustomWorker {\n label: string\n entry: string\n}\n\nexport interface MonacoEditorPluginOptions {\n /** 启用的 Monaco 语言 Worker,默认启用全部 */\n languageWorkers?: MonacoEditorLanguageWorker[]\n /** 额外自定义 Worker(如 monaco-graphql/esm/graphql.worker) */\n customWorkers?: MonacoCustomWorker[]\n /** Worker 在 URL 上的公共路径,默认 'monacoeditorwork'。可填 CDN 绝对 URL */\n publicPath?: string\n /** 是否将 Monaco API 暴露到 window.monaco(兼容 0.22 之前的 globalAPI 模式) */\n globalAPI?: boolean\n /** publicPath 是 CDN 时仍强制本地打包 Worker 产物 */\n forceBuildCDN?: boolean\n /** 自定义生产构建下 Worker 产物目录(绝对路径) */\n customDistPath?: (root: string, outDir: string, base: string) => string\n}\n\nconst DEFAULT_WORKERS: Record<MonacoEditorLanguageWorker, string> = {\n editorWorkerService: 'monaco-editor/esm/vs/editor/editor.worker',\n css: 'monaco-editor/esm/vs/language/css/css.worker',\n html: 'monaco-editor/esm/vs/language/html/html.worker',\n json: 'monaco-editor/esm/vs/language/json/json.worker',\n typescript: 'monaco-editor/esm/vs/language/typescript/ts.worker',\n}\n\nconst DEFAULT_PUBLIC_PATH = 'monacoeditorwork'\n\nfunction isCDN(p: string): boolean {\n return /^((https?:)?\\/\\/|file:)/.test(p)\n}\n\n/** 规范化 publicPath:CDN 原样保留,本地路径保证以 / 开头、不以 / 结尾 */\nfunction normalizePublicPath(p: string): string {\n if (isCDN(p)) return p.replace(/\\/+$/, '')\n const withLead = p.startsWith('/') ? p : '/' + p\n return withLead.replace(/\\/+$/, '') || '/'\n}\n\n/** 读取 monaco-editor 版本号作为缓存命名,版本变更自动失效旧产物 */\nfunction readMonacoVersion(root: string): string {\n try {\n const require = createRequire(path.resolve(root, 'package.json'))\n const pkgJsonPath = require.resolve('monaco-editor/package.json', { paths: [root] })\n const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'))\n return typeof pkg.version === 'string' ? pkg.version : 'unknown'\n } catch {\n return 'unknown'\n }\n}\n\nexport function monacoEditorPlugin(options: MonacoEditorPluginOptions = {}): NastiPlugin {\n const languageWorkers =\n options.languageWorkers ?? (Object.keys(DEFAULT_WORKERS) as MonacoEditorLanguageWorker[])\n const customWorkers = options.customWorkers ?? []\n const publicPath = normalizePublicPath(options.publicPath ?? DEFAULT_PUBLIC_PATH)\n const globalAPI = !!options.globalAPI\n const forceBuildCDN = !!options.forceBuildCDN\n\n const workers: MonacoCustomWorker[] = [\n ...languageWorkers.map((label) => ({ label, entry: DEFAULT_WORKERS[label] })),\n ...customWorkers,\n ]\n\n let resolvedConfig: ResolvedConfig\n let cacheDir = ''\n // label → 构建 Promise,做并发去重,防止启动瞬间多次请求同一 Worker 时重复打包\n const building = new Map<string, Promise<string>>()\n\n async function buildWorker(worker: MonacoCustomWorker): Promise<string> {\n const cacheFile = path.join(cacheDir, `${worker.label}.worker.js`)\n if (fs.existsSync(cacheFile)) return cacheFile\n const existing = building.get(worker.label)\n if (existing) return existing\n\n const task = (async () => {\n const { rolldown } = await import('rolldown')\n const require = createRequire(path.resolve(resolvedConfig.root, 'package.json'))\n let entry: string\n try {\n entry = require.resolve(worker.entry, { paths: [resolvedConfig.root] })\n } catch {\n // 某些 Worker 入口无扩展名,补 .js 再试(如 editor.worker)\n entry = require.resolve(worker.entry + '.js', { paths: [resolvedConfig.root] })\n }\n\n fs.mkdirSync(cacheDir, { recursive: true })\n\n const bundle = await rolldown({\n input: entry,\n platform: 'browser',\n } as any)\n\n await bundle.write({\n file: cacheFile,\n format: 'iife',\n sourcemap: false,\n minify: true,\n codeSplitting: false,\n } as any)\n await bundle.close()\n\n return cacheFile\n })()\n\n building.set(worker.label, task)\n try {\n return await task\n } finally {\n building.delete(worker.label)\n }\n }\n\n function runtimeInitScript(): string {\n // Normalize local worker URL prefix: join base + publicPath, avoid double slashes\n let normalizedPrefix = publicPath\n if (!isCDN(publicPath)) {\n const base = resolvedConfig.base.replace(/\\/+$/, '') || ''\n const pub = publicPath.replace(/^\\/+/, '')\n normalizedPrefix = base ? `${base}/${pub}` : `/${pub}`\n }\n\n const map: Record<string, string> = {}\n for (const w of workers) {\n map[w.label] = `${normalizedPrefix}/${w.label}.worker.js`\n }\n return `;(function () {\n var map = ${JSON.stringify(map)};\n function getWorkerUrl(_moduleId, label) {\n var url = map[label] || map['editorWorkerService'];\n if (/^(https?:)?\\\\/\\\\//.test(url)) {\n // 跨域 Worker 需用 Blob + importScripts 绕过同源限制\n var blob = new Blob(\n ['importScripts(' + JSON.stringify(url) + ');'],\n { type: 'application/javascript' }\n );\n return URL.createObjectURL(blob);\n }\n return url;\n }\n self.MonacoEnvironment = self.MonacoEnvironment || {};\n if (!self.MonacoEnvironment.getWorker && !self.MonacoEnvironment.getWorkerUrl) {\n self.MonacoEnvironment.getWorkerUrl = getWorkerUrl;\n }\n})();`\n }\n\n return {\n name: 'nasti:monaco-editor',\n enforce: 'pre',\n\n configResolved(config) {\n resolvedConfig = config\n // 用 monaco 版本号作为缓存桶,换版本自动重新打包,老缓存不污染\n const version = readMonacoVersion(config.root)\n const key = crypto.createHash('sha1').update(version + '|' + publicPath).digest('hex').slice(0, 8)\n cacheDir = path.resolve(config.root, 'node_modules/.nasti/monaco', key)\n },\n\n async configureServer(server: DevServer) {\n const shouldBuild = !isCDN(publicPath) || forceBuildCDN\n\n // 显式把 monaco-editor 从 chokidar watcher 中剔除。node_modules 虽已在默认\n // ignored 列表,但 HMR EMFILE 多次报告源于 Monaco 的深层符号链接/嵌套 node_modules\n // 绕过了默认规则,这里做 defense-in-depth。\n const watcher: any = (server as any).watcher\n const monacoDir = path.resolve(resolvedConfig.root, 'node_modules/monaco-editor')\n try {\n watcher?.unwatch?.(monacoDir)\n } catch {\n /* ignore */\n }\n\n if (!shouldBuild) return\n\n // 预热:后台异步打包全部 Worker,避免首次打开页面时阻塞第一次 fetch\n void Promise.all(\n workers.map((w) =>\n buildWorker(w).catch((e: Error) => {\n console.warn(\n `[nasti:monaco-editor] worker build failed for \"${w.label}\": ${e.message}`,\n )\n }),\n ),\n )\n\n // Normalize dev middleware prefix to match runtime injection\n const base = resolvedConfig.base.replace(/\\/+$/, '') || ''\n const pub = publicPath.replace(/^\\/+/, '')\n const prefix = (base ? `${base}/${pub}` : `/${pub}`) + '/'\n server.middlewares.use(\n async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n if (req.method !== 'GET') return next()\n const url = (req.url ?? '').split('?')[0]\n if (!url.startsWith(prefix)) return next()\n\n const name = url.slice(prefix.length).replace(/\\.worker\\.js$/, '')\n const worker = workers.find((w) => w.label === name)\n if (!worker) return next()\n\n try {\n const file = await buildWorker(worker)\n res.setHeader('Content-Type', 'application/javascript; charset=utf-8')\n // 产物由版本号 + 打包结果决定,dev 期间可安全长缓存\n res.setHeader('Cache-Control', 'public, max-age=604800, immutable')\n fs.createReadStream(file).pipe(res)\n } catch (e: any) {\n res.statusCode = 500\n res.end(`Monaco worker build failed: ${e.message}`)\n }\n },\n )\n },\n\n transformIndexHtml(html) {\n const tags: HtmlTagDescriptor[] = [\n {\n tag: 'script',\n children: runtimeInitScript(),\n injectTo: 'head-prepend',\n },\n ]\n if (globalAPI) {\n // 需要 window.monaco 全局 API 时,用 ESM 入口再挂一次\n tags.push({\n tag: 'script',\n attrs: { type: 'module' },\n children:\n `import * as monaco from 'monaco-editor';\\n` +\n `self.monaco = monaco;`,\n injectTo: 'head',\n })\n }\n return { html, tags }\n },\n\n // 生产构建:把所有 Worker 预打包并拷到 outDir/<publicPath>/ 下\n async buildStart() {\n if (resolvedConfig.command !== 'build') return\n if (isCDN(publicPath) && !forceBuildCDN) return\n\n const outDir = options.customDistPath\n ? options.customDistPath(\n resolvedConfig.root,\n resolvedConfig.build.outDir,\n resolvedConfig.base,\n )\n : isCDN(publicPath)\n ? path.resolve(resolvedConfig.root, resolvedConfig.build.outDir, 'monaco')\n : path.resolve(\n resolvedConfig.root,\n resolvedConfig.build.outDir,\n publicPath.replace(/^\\//, ''),\n )\n fs.mkdirSync(outDir, { recursive: true })\n\n for (const worker of workers) {\n try {\n const cacheFile = await buildWorker(worker)\n fs.copyFileSync(cacheFile, path.join(outDir, `${worker.label}.worker.js`))\n } catch (e: any) {\n throw new Error(\n `[nasti:monaco-editor] worker build failed for \"${worker.label}\": ${e.message}\\n${e.stack || ''}`,\n )\n }\n }\n },\n }\n}\n"],"mappings":"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","names":["options","transformSync","clearScreen","path","fs","require","pc","fs","path","path","family","version","browserslistToTargets","composeVisitors","v","key","res","index","path","createRequire","pathToFileURL","compiler","path","path","fs","crypto","fs","index","path","fs","debug","path","fs","path","pc","debug","path","fs","pc","debug","bundle","path","fs","createRequire","pathToFileURL","pc","__require","cached","mod","code","transformResult","rolldown","bundle","resolveAliasTarget","dir","path","fs","pc","path","fs","builtinModules","createRequire","pathToFileURL","debug","NODE_BUILTINS","cached","path","crypto","WsServer","pc","debug","path","pc","createModuleRunner","createBundledDevServer","transformRequest","path","fs","rolldown","pc","builtinModules","NODE_BUILTINS","pc","path","fs","build","bundle","rolldown","path","fs","createRequire","pc","rolldown","pc","createServer","path","fs","bundle","rolldown","require","createRequire","path","fs","crypto","createRequire","require","rolldown","bundle"]}