@nasti-toolchain/nasti 1.3.5 → 1.3.6

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/README.md CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  ```bash
32
32
  # 安装
33
- npm install -D nasti-build
33
+ npm install -D @nasti-toolchain/nasti
34
34
 
35
35
  # 启动开发服务器
36
36
  npx nasti dev
package/dist/cli.cjs CHANGED
@@ -786,11 +786,30 @@ async function doBundlePackage(entryFile) {
786
786
  /^(import\s+)(['"])([^'"./][^'"]*)(\2)/gm,
787
787
  (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`
788
788
  );
789
+ code = rewriteExternalRequires(code);
789
790
  if (code.includes("__commonJSMin")) {
790
791
  code = await injectCjsNamedExports(code, entryFile);
791
792
  }
792
793
  return code;
793
794
  }
795
+ function rewriteExternalRequires(code) {
796
+ const pkgs = /* @__PURE__ */ new Set();
797
+ const re = /__require\(["']([^"']+)["']\)/g;
798
+ let m;
799
+ while ((m = re.exec(code)) !== null) {
800
+ pkgs.add(m[1]);
801
+ }
802
+ if (pkgs.size === 0) return code;
803
+ let result = code;
804
+ const imports = [];
805
+ for (const pkg of pkgs) {
806
+ const safe = pkg.replace(/[^a-zA-Z0-9_$]/g, "_");
807
+ imports.push(`import __req_${safe} from "/@modules/${pkg}";`);
808
+ result = result.replaceAll(`__require("${pkg}")`, `__req_${safe}`);
809
+ result = result.replaceAll(`__require('${pkg}')`, `__req_${safe}`);
810
+ }
811
+ return imports.join("\n") + "\n" + result;
812
+ }
794
813
  async function injectCjsNamedExports(code, entryFile) {
795
814
  try {
796
815
  const { createRequire: createRequire2 } = await import("module");
@@ -1388,7 +1407,7 @@ async function createServer(inlineConfig = {}) {
1388
1407
  const localUrl = `http://localhost:${actualPort}`;
1389
1408
  const networkUrl = host === "0.0.0.0" ? `http://${getNetworkAddress()}:${actualPort}` : null;
1390
1409
  console.log();
1391
- console.log(import_picocolors.default.cyan(" nasti dev server") + import_picocolors.default.dim(` v${"1.3.5"}`));
1410
+ console.log(import_picocolors.default.cyan(" nasti dev server") + import_picocolors.default.dim(` v${"1.3.6"}`));
1392
1411
  console.log();
1393
1412
  console.log(` ${import_picocolors.default.green(">")} Local: ${import_picocolors.default.cyan(localUrl)}`);
1394
1413
  if (networkUrl) {
@@ -1466,7 +1485,7 @@ __export(build_exports, {
1466
1485
  async function build(inlineConfig = {}) {
1467
1486
  const config = await resolveConfig(inlineConfig, "build");
1468
1487
  const startTime = performance.now();
1469
- console.log(import_picocolors2.default.cyan("\n\u{1F528} nasti build") + import_picocolors2.default.dim(` v${"1.3.5"}`));
1488
+ console.log(import_picocolors2.default.cyan("\n\u{1F528} nasti build") + import_picocolors2.default.dim(` v${"1.3.6"}`));
1470
1489
  console.log(import_picocolors2.default.dim(` root: ${config.root}`));
1471
1490
  console.log(import_picocolors2.default.dim(` mode: ${config.mode}`));
1472
1491
  const outDir = import_node_path10.default.resolve(config.root, config.build.outDir);
@@ -1691,6 +1710,6 @@ cli.command("preview [root]", "Preview production build").option("--port <port>"
1691
1710
  }
1692
1711
  });
1693
1712
  cli.help();
1694
- cli.version("1.3.5");
1713
+ cli.version("1.3.6");
1695
1714
  cli.parse();
1696
1715
  //# sourceMappingURL=cli.cjs.map
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/defaults.ts","../src/config/index.ts","../src/core/plugin-container.ts","../src/core/module-graph.ts","../src/server/ws.ts","../src/core/transformer.ts","../src/plugins/html.ts","../src/core/env.ts","../src/server/middleware.ts","../src/server/hmr.ts","../src/plugins/resolve.ts","../src/plugins/css.ts","../src/plugins/assets.ts","../src/server/index.ts","../src/build/index.ts","../src/cli.ts"],"sourcesContent":["import type { NastiConfig, ResolvedConfig, BuildConfig, ServerConfig, ResolveConfig } from '../types.js'\n\nconst defaultResolve: Required<ResolveConfig> = {\n alias: {},\n extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.json', '.vue'],\n conditions: ['import', 'module', 'browser', 'default'],\n mainFields: ['module', 'jsnext:main', 'jsnext', 'main'],\n}\n\nconst defaultServer: Required<ServerConfig> = {\n port: 3000,\n host: 'localhost',\n https: false,\n open: false,\n proxy: {},\n cors: true,\n hmr: true,\n}\n\nconst defaultBuild: Required<BuildConfig> = {\n outDir: 'dist',\n assetsDir: 'assets',\n minify: true,\n sourcemap: false,\n target: 'es2022',\n rolldownOptions: {},\n emptyOutDir: true,\n}\n\nexport const defaults: Required<Omit<NastiConfig, 'plugins'>> & { plugins: [] } = {\n root: '.',\n base: '/',\n mode: 'development',\n framework: 'auto',\n resolve: defaultResolve,\n server: defaultServer,\n build: defaultBuild,\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\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 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 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 // 执行插件 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\nfunction deepMerge<T extends Record<string, any>>(target: T, source: Record<string, any>): T {\n const result = { ...target }\n for (const key of Object.keys(source)) {\n const val = source[key]\n if (val && typeof val === 'object' && !Array.isArray(val)) {\n result[key as keyof T] = deepMerge(\n (result[key as keyof T] as Record<string, any>) ?? {},\n val,\n ) as T[keyof T]\n } else if (val !== undefined) {\n result[key as keyof T] = val\n }\n }\n return result\n}\n","// Vite 兼容插件容器\n// 管理插件生命周期,实现 resolveId → load → transform 管道\n\nimport type {\n NastiPlugin,\n ResolvedConfig,\n PluginContext,\n ResolveIdResult,\n LoadResult,\n TransformResult,\n ModuleInfo,\n} from '../types.js'\n\nexport class PluginContainer {\n private plugins: NastiPlugin[]\n private config: ResolvedConfig\n private ctx: PluginContext\n private emittedFiles: Map<string, { fileName: string; source: string | Uint8Array }> = new Map()\n\n constructor(config: ResolvedConfig) {\n this.config = config\n // 按 enforce 排序: pre → normal → post\n this.plugins = sortPlugins(config.plugins)\n this.ctx = this.createContext()\n }\n\n private createContext(): PluginContext {\n const container = this\n return {\n async resolve(source: string, importer?: string) {\n return container.resolveId(source, importer)\n },\n emitFile(file) {\n const fileName = file.fileName ?? file.name ?? `asset-${container.emittedFiles.size}`\n const id = `emitted:${fileName}`\n container.emittedFiles.set(id, {\n fileName,\n source: file.source ?? '',\n })\n return id\n },\n getModuleInfo(_id): ModuleInfo | null {\n return null\n },\n }\n }\n\n /** 返回所有通过 emitFile() 输出的文件 */\n getEmittedFiles(): Array<{ fileName: string; source: string | Uint8Array }> {\n return Array.from(this.emittedFiles.values())\n }\n\n async buildStart(): Promise<void> {\n for (const plugin of this.plugins) {\n if (plugin.buildStart) {\n await plugin.buildStart.call(this.ctx)\n }\n }\n }\n\n async buildEnd(error?: Error): Promise<void> {\n for (const plugin of this.plugins) {\n if (plugin.buildEnd) {\n await plugin.buildEnd.call(this.ctx, error)\n }\n }\n }\n\n async resolveId(\n source: string,\n importer?: string,\n options: { isEntry?: boolean } = {},\n ): Promise<ResolveIdResult> {\n for (const plugin of this.plugins) {\n if (!plugin.resolveId) continue\n const result = await plugin.resolveId.call(\n this.ctx,\n source,\n importer ?? undefined,\n { isEntry: options.isEntry ?? false, ssr: false },\n )\n if (result != null) return result\n }\n return null\n }\n\n async load(id: string): Promise<LoadResult> {\n for (const plugin of this.plugins) {\n if (!plugin.load) continue\n const result = await plugin.load.call(this.ctx, id)\n if (result != null) return result\n }\n return null\n }\n\n async transform(code: string, id: string): Promise<TransformResult> {\n let currentCode = code\n for (const plugin of this.plugins) {\n if (!plugin.transform) continue\n const result = await plugin.transform.call(this.ctx, currentCode, id)\n if (result == null) continue\n if (typeof result === 'string') {\n currentCode = result\n } else {\n currentCode = result.code\n }\n }\n return currentCode === code ? null : { code: currentCode }\n }\n\n /** 完整的模块处理管道: resolveId → load → transform */\n async processModule(\n source: string,\n importer?: string,\n ): Promise<{ id: string; code: string } | null> {\n // 1. resolveId\n const resolveResult = await this.resolveId(source, importer, {\n isEntry: !importer,\n })\n if (resolveResult == null) return null\n const id = typeof resolveResult === 'string' ? resolveResult : resolveResult.id\n\n // 2. load\n const loadResult = await this.load(id)\n if (loadResult == null) return null\n const loadedCode = typeof loadResult === 'string' ? loadResult : loadResult.code\n\n // 3. transform\n const transformResult = await this.transform(loadedCode, id)\n const finalCode = transformResult == null\n ? loadedCode\n : typeof transformResult === 'string'\n ? transformResult\n : transformResult.code\n\n return { id, code: finalCode }\n }\n\n getPlugins(): NastiPlugin[] {\n return this.plugins\n }\n}\n\nfunction sortPlugins(plugins: NastiPlugin[]): NastiPlugin[] {\n const pre: NastiPlugin[] = []\n const normal: NastiPlugin[] = []\n const post: NastiPlugin[] = []\n\n for (const plugin of plugins) {\n if (plugin.enforce === 'pre') pre.push(plugin)\n else if (plugin.enforce === 'post') post.push(plugin)\n else normal.push(plugin)\n }\n\n return [...pre, ...normal, ...post]\n}\n","// 模块依赖图 - 用于 HMR 追踪模块关系\n\nimport type { ModuleNode, TransformResult } from '../types.js'\n\nexport class ModuleGraph {\n private urlToModuleMap = new Map<string, ModuleNode>()\n private idToModuleMap = new Map<string, ModuleNode>()\n private fileToModulesMap = new Map<string, Set<ModuleNode>>()\n\n getModuleByUrl(url: string): ModuleNode | undefined {\n return this.urlToModuleMap.get(url)\n }\n\n getModuleById(id: string): ModuleNode | undefined {\n return this.idToModuleMap.get(id)\n }\n\n getModulesByFile(file: string): Set<ModuleNode> | undefined {\n return this.fileToModulesMap.get(file)\n }\n\n async ensureEntryFromUrl(url: string): Promise<ModuleNode> {\n let mod = this.urlToModuleMap.get(url)\n if (mod) return mod\n\n mod = this.createModule(url)\n this.urlToModuleMap.set(url, mod)\n return mod\n }\n\n createModule(url: string, id?: string): ModuleNode {\n const mod: ModuleNode = {\n id: id ?? url,\n file: null,\n url,\n type: url.endsWith('.css') ? 'css' : 'js',\n importers: new Set(),\n importedModules: new Set(),\n acceptedHmrDeps: new Set(),\n transformResult: null,\n lastHMRTimestamp: 0,\n isSelfAccepting: false,\n }\n this.idToModuleMap.set(mod.id, mod)\n return mod\n }\n\n /** 注册文件路径到模块的映射 */\n registerModule(mod: ModuleNode, file: string): void {\n mod.file = file\n let mods = this.fileToModulesMap.get(file)\n if (!mods) {\n mods = new Set()\n this.fileToModulesMap.set(file, mods)\n }\n mods.add(mod)\n }\n\n /** 更新模块依赖关系 */\n updateModuleImports(mod: ModuleNode, importedIds: Set<string>): void {\n // 清除旧的导入关系\n for (const imported of mod.importedModules) {\n imported.importers.delete(mod)\n }\n mod.importedModules.clear()\n\n // 建立新的导入关系\n for (const id of importedIds) {\n const importedMod = this.idToModuleMap.get(id)\n if (importedMod) {\n mod.importedModules.add(importedMod)\n importedMod.importers.add(mod)\n }\n }\n }\n\n /** 使模块的转换缓存失效 */\n invalidateModule(mod: ModuleNode): void {\n mod.transformResult = null\n mod.lastHMRTimestamp = Date.now()\n }\n\n /** 使所有模块缓存失效 */\n invalidateAll(): void {\n for (const mod of this.idToModuleMap.values()) {\n this.invalidateModule(mod)\n }\n }\n\n /** 获取 HMR 传播边界 - 从变更模块向上遍历找到接受更新的边界 */\n getHmrBoundaries(mod: ModuleNode): { boundary: ModuleNode; acceptedVia: ModuleNode }[] {\n const boundaries: { boundary: ModuleNode; acceptedVia: ModuleNode }[] = []\n const visited = new Set<ModuleNode>()\n\n const propagate = (node: ModuleNode, via: ModuleNode): boolean => {\n if (visited.has(node)) return true\n visited.add(node)\n\n // 如果模块自身接受热更新\n if (node.isSelfAccepting) {\n boundaries.push({ boundary: node, acceptedVia: via })\n return true\n }\n\n // 如果模块被其他模块作为 HMR 依赖接受\n if (node.acceptedHmrDeps.has(via)) {\n boundaries.push({ boundary: node, acceptedVia: via })\n return true\n }\n\n // 没有 importer 意味着到达了入口,需要 full reload\n if (node.importers.size === 0) return false\n\n // 向上传播\n for (const importer of node.importers) {\n if (!propagate(importer, node)) return false\n }\n return true\n }\n\n // 从自身开始,如果自身接受就直接返回\n if (mod.isSelfAccepting) {\n boundaries.push({ boundary: mod, acceptedVia: mod })\n return boundaries\n }\n\n // 否则向 importer 传播\n for (const importer of mod.importers) {\n if (!propagate(importer, mod)) {\n // 传播到了根模块,需要 full reload\n return []\n }\n }\n\n return boundaries\n }\n}\n","// WebSocket 服务封装 - HMR 通信\nimport { WebSocketServer as WsServer, type WebSocket } from 'ws'\nimport type { WebSocketServer as IWebSocketServer, HmrPayload } from '../types.js'\n\nexport function createWebSocketServer(server: any): IWebSocketServer {\n const wss = new WsServer({ noServer: true })\n const clients = new Set<WebSocket>()\n\n // 处理 HTTP server 的 upgrade 请求\n server.on('upgrade', (req: any, socket: any, head: any) => {\n if (req.headers['sec-websocket-protocol'] === 'nasti-hmr') {\n wss.handleUpgrade(req, socket, head, (ws) => {\n wss.emit('connection', ws, req)\n })\n }\n })\n\n wss.on('connection', (ws) => {\n clients.add(ws)\n ws.send(JSON.stringify({ type: 'connected' }))\n\n ws.on('close', () => {\n clients.delete(ws)\n })\n\n ws.on('error', (err) => {\n console.error('[nasti] WebSocket error:', err)\n clients.delete(ws)\n })\n })\n\n return {\n send(payload: HmrPayload) {\n const data = JSON.stringify(payload)\n for (const client of clients) {\n if (client.readyState === 1) { // WebSocket.OPEN\n client.send(data)\n }\n }\n },\n close() {\n clients.clear()\n wss.close()\n },\n }\n}\n","// OXC Transform 封装 - 高性能 TS/JSX/TSX 转译\nimport { transformSync } from 'oxc-transform'\n\nexport interface TransformOptions {\n jsx?: boolean\n jsxRuntime?: 'automatic' | 'classic'\n jsxImportSource?: string\n typescript?: boolean\n sourcemap?: boolean\n reactRefresh?: boolean\n}\n\nexport interface TransformOutput {\n code: string\n map: string | null\n}\n\nconst JS_EXTENSIONS = /\\.(js|mjs|cjs)$/\nconst TS_EXTENSIONS = /\\.(ts|mts|cts)$/\nconst JSX_EXTENSIONS = /\\.(jsx|tsx)$/\nconst VUE_EXTENSION = /\\.vue$/\n\nexport function shouldTransform(id: string): boolean {\n return (\n TS_EXTENSIONS.test(id) ||\n JSX_EXTENSIONS.test(id) ||\n (JS_EXTENSIONS.test(id) && false) // JS 文件默认不转译,除非包含 JSX\n )\n}\n\nexport function transformCode(\n filename: string,\n code: string,\n options: TransformOptions = {},\n): TransformOutput {\n const isTS = TS_EXTENSIONS.test(filename) || /\\.tsx$/.test(filename)\n const isJSX = JSX_EXTENSIONS.test(filename)\n\n const result = transformSync(filename, code, {\n typescript: isTS ? {} : undefined,\n jsx: isJSX || /\\.tsx$/.test(filename)\n ? {\n runtime: options.jsxRuntime ?? 'automatic',\n importSource: options.jsxImportSource ?? 'react',\n refresh: options.reactRefresh ?? false,\n }\n : undefined,\n sourcemap: options.sourcemap ?? true,\n })\n\n if (result.errors && result.errors.length > 0) {\n const msg = result.errors.map((e: any) => e.message ?? String(e)).join('\\n')\n throw new Error(`OXC transform failed for ${filename}:\\n${msg}`)\n }\n\n return {\n code: result.code,\n map: result.map ? JSON.stringify(result.map) : null,\n }\n}\n\n/** 获取文件的模块类型 */\nexport function getModuleType(id: string): 'ts' | 'tsx' | 'js' | 'jsx' | 'css' | 'json' | 'vue' | 'asset' {\n if (/\\.tsx$/.test(id)) return 'tsx'\n if (/\\.ts$/.test(id) || /\\.mts$/.test(id)) return 'ts'\n if (/\\.jsx$/.test(id)) return 'jsx'\n if (/\\.css$/.test(id)) return 'css'\n if (/\\.json$/.test(id)) return 'json'\n if (VUE_EXTENSION.test(id)) return 'vue'\n if (JS_EXTENSIONS.test(id)) return 'js'\n return 'asset'\n}\n","// HTML 入口处理插件 - index.html 处理与脚本注入\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport type { NastiPlugin, ResolvedConfig, HtmlTagDescriptor } from '../types.js'\n\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 // Dev 模式: 注入 HMR 客户端\n tags.push({\n tag: 'script',\n attrs: { type: 'module', src: '/@nasti/client' },\n injectTo: 'head-prepend',\n })\n }\n\n return { html, tags }\n },\n }\n}\n\n/** 处理 HTML,注入标签并重写 script src */\nexport function processHtml(\n html: string,\n tags: HtmlTagDescriptor[],\n): string {\n const headPrepend = tags.filter((t) => t.injectTo === 'head-prepend')\n const head = tags.filter((t) => t.injectTo === 'head' || !t.injectTo)\n const bodyPrepend = tags.filter((t) => t.injectTo === 'body-prepend')\n const body = tags.filter((t) => t.injectTo === 'body')\n\n if (headPrepend.length) {\n html = html.replace(/<head([^>]*)>/i, `<head$1>\\n${serializeTags(headPrepend)}`)\n }\n if (head.length) {\n html = html.replace(/<\\/head>/i, `${serializeTags(head)}\\n</head>`)\n }\n if (bodyPrepend.length) {\n html = html.replace(/<body([^>]*)>/i, `<body$1>\\n${serializeTags(bodyPrepend)}`)\n }\n if (body.length) {\n html = html.replace(/<\\/body>/i, `${serializeTags(body)}\\n</body>`)\n }\n\n return html\n}\n\nfunction serializeTags(tags: HtmlTagDescriptor[]): string {\n return tags.map(serializeTag).join('\\n')\n}\n\nfunction serializeTag(tag: HtmlTagDescriptor): string {\n const attrs = tag.attrs\n ? ' ' +\n Object.entries(tag.attrs)\n .map(([k, v]) => (v === true ? k : `${k}=\"${v}\"`))\n .join(' ')\n : ''\n const children =\n typeof tag.children === 'string'\n ? tag.children\n : tag.children\n ? serializeTags(tag.children)\n : ''\n\n const selfClosing = ['link', 'meta', 'br', 'hr', 'img', 'input'].includes(tag.tag)\n if (selfClosing && !children) {\n return ` <${tag.tag}${attrs} />`\n }\n return ` <${tag.tag}${attrs}>${children}</${tag.tag}>`\n}\n\n/** 读取并处理 HTML 入口文件 */\nexport async function readHtmlFile(root: string): Promise<string | null> {\n const htmlPath = path.resolve(root, 'index.html')\n if (!fs.existsSync(htmlPath)) return null\n return fs.readFileSync(htmlPath, 'utf-8')\n}\n","// 环境变量加载 - 读取 .env 文件并生成 import.meta.env 定义\nimport path from 'node:path'\nimport fs from 'node:fs'\n\nexport interface EnvRecord {\n [key: string]: string\n}\n\n/**\n * 从 .env 文件加载环境变量,按优先级合并:\n * .env < .env.[mode] < .env.local < .env.[mode].local\n */\nexport function loadEnv(mode: string, root: string, prefixes: string[]): EnvRecord {\n const envFiles = [\n '.env',\n `.env.${mode}`,\n '.env.local',\n `.env.${mode}.local`,\n ]\n\n const raw: EnvRecord = {}\n\n for (const file of envFiles) {\n const filePath = path.resolve(root, file)\n if (!fs.existsSync(filePath)) continue\n const content = fs.readFileSync(filePath, 'utf-8')\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eqIdx = trimmed.indexOf('=')\n if (eqIdx === -1) continue\n const key = trimmed.slice(0, eqIdx).trim()\n let value = trimmed.slice(eqIdx + 1).trim()\n // 去除引号\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1)\n }\n raw[key] = value\n }\n }\n\n // 只保留符合 prefix 的变量\n const filtered: EnvRecord = {}\n for (const [key, value] of Object.entries(raw)) {\n if (prefixes.some((prefix) => key.startsWith(prefix))) {\n filtered[key] = value\n }\n }\n\n return filtered\n}\n\n/**\n * 将过滤后的 env 转为 Rolldown define 对象\n * 例: { VITE_FOO: 'bar' } → { 'import.meta.env.VITE_FOO': '\"bar\"' }\n * 同时注入 import.meta.env.MODE / DEV / PROD\n */\nexport function buildEnvDefine(env: EnvRecord, mode: string): Record<string, string> {\n const define: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(env)) {\n define[`import.meta.env.${key}`] = JSON.stringify(value)\n }\n\n define['import.meta.env.MODE'] = JSON.stringify(mode)\n define['import.meta.env.DEV'] = mode !== 'production' ? 'true' : 'false'\n define['import.meta.env.PROD'] = mode === 'production' ? 'true' : 'false'\n define['import.meta.env.SSR'] = 'false'\n\n return define\n}\n\n/**\n * 在代码字符串中替换 import.meta.env.KEY(用于 dev 服务器按需转换)\n */\nexport function replaceEnvInCode(code: string, define: Record<string, string>): string {\n let result = code\n for (const [key, value] of Object.entries(define)) {\n // 转义正则特殊字符\n const escaped = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n result = result.replace(new RegExp(escaped, 'g'), value)\n }\n return result\n}\n","// HTTP 中间件 - 请求拦截与按需转译\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport 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\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 // 检查缓存\n const cached = moduleGraph.getModuleByUrl(url)\n if (cached?.transformResult) {\n return cached.transformResult as { code: string; map?: unknown }\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 const cleanReqUrl = url.split('?')[0]\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 // OXC 转译 (TS/JSX/TSX)\n if (shouldTransform(filePath)) {\n const result = transformCode(filePath, code, {\n sourcemap: true,\n jsxRuntime: 'automatic',\n jsxImportSource: config.framework === 'vue' ? 'vue' : 'react',\n reactRefresh: config.framework !== 'vue',\n })\n code = result.code\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 // 重写 bare imports 为浏览器可用路径\n code = rewriteImports(code, config)\n\n const transformResult = { code }\n mod.transformResult = transformResult\n return transformResult\n}\n\n/** 用 rolldown 将 node_modules 包打包为浏览器可用的 ESM(含 CJS→ESM 转换) */\n// Promise 缓存:同一入口文件只打包一次,防止并发重复打包\nconst esmBundleCache = new Map<string, Promise<string>>()\n\nasync function bundlePackageAsEsm(entryFile: string): Promise<string> {\n if (!esmBundleCache.has(entryFile)) {\n esmBundleCache.set(entryFile, doBundlePackage(entryFile))\n }\n return esmBundleCache.get(entryFile)!\n}\n\nasync function doBundlePackage(entryFile: string): Promise<string> {\n const { rolldown } = await import('rolldown')\n\n const bundle = await rolldown({\n input: entryFile,\n // 仅将其他 npm 包外部化;相对路径(包内部文件)全部内联打包\n external: (id: string) => {\n if (id.startsWith('.') || id.startsWith('/') || /^[A-Za-z]:\\\\/.test(id)) return false\n return true\n },\n })\n\n const result = await bundle.generate({ format: 'esm', exports: 'named' })\n await bundle.close()\n\n let code = result.output[0].code\n\n // 替换 process.env.NODE_ENV(rolldown 的 define 选项在此版本无效)\n code = code.replace(/process\\.env\\.NODE_ENV/g, '\"development\"')\n\n // 将外部化的 bare specifier 改写为 /@modules/ 路径供浏览器加载\n // ⚠️ 必须用 ^ + m 锚定行首,只匹配真正的 import/export 声明,\n // 避免误匹配字符串内出现的 from \"...\" 导致 SyntaxError\n code = code\n .replace(/^(import\\b[^;'\"]*?\\bfrom\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`)\n .replace(/^(export\\b[^;'\"]*?\\bfrom\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`)\n .replace(/^(import\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`)\n\n // CJS 包的具名导出补全:\n // rolldown 将 CJS 包包装为 __commonJSMin,只输出 export default,\n // 导致 import { parse } from '/@modules/cookie' 等具名导入失败。\n // 通过 createRequire 在 Node.js 侧加载 CJS 模块,取出 exports 的 key,\n // 在 ESM bundle 末尾补上静态具名 export。\n if (code.includes('__commonJSMin')) {\n code = await injectCjsNamedExports(code, entryFile)\n }\n\n return code\n}\n\nconst VALID_IDENT = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/\n\nasync function injectCjsNamedExports(code: string, entryFile: string): Promise<string> {\n try {\n const { createRequire } = await import('module')\n const req = createRequire(entryFile)\n const cjsExports = req(entryFile)\n if (!cjsExports || (typeof cjsExports !== 'object' && typeof cjsExports !== 'function') || Array.isArray(cjsExports)) return code\n\n const namedKeys = Object.keys(cjsExports).filter(\n (k) => k !== '__esModule' && k !== 'default' && VALID_IDENT.test(k),\n )\n if (namedKeys.length === 0) return code\n\n // 把末尾的 \"export default require_xxx();\" 改写为带具名 export 的形式\n return code.replace(\n /^export default (\\w+\\(\\));?\\s*$/m,\n (_, call) => [\n `const __cjsMod = ${call};`,\n `export default __cjsMod;`,\n ...namedKeys.map((k) => `export const ${k} = __cjsMod[${JSON.stringify(k)}];`),\n ].join('\\n'),\n )\n } catch {\n return code\n }\n}\n\n/** 重写 import/export 语句中的 bare specifier */\nfunction rewriteImports(code: string, _config: ResolvedConfig): string {\n // 处理所有 from '...' 形式(import ... from、export ... from、export * from)\n return code.replace(\n /\\bfrom\\s+(['\"])([^'\"./][^'\"]*)\\1/g,\n (match, quote: string, specifier: string) => {\n return `from ${quote}/@modules/${specifier}${quote}`\n },\n ).replace(\n // 处理纯副作用导入: import 'bare-specifier'\n /\\bimport\\s+(['\"])([^'\"./][^'\"]*)\\1/g,\n (match, quote: string, specifier: string) => {\n return `import ${quote}/@modules/${specifier}${quote}`\n },\n ).replace(\n // 处理动态导入: import('bare-specifier')\n /\\bimport\\s*\\(\\s*(['\"])([^'\"./][^'\"]*)\\1\\s*\\)/g,\n (match, quote: string, specifier: string) => {\n return `import(${quote}/@modules/${specifier}${quote})`\n },\n )\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 const direct = path.join(pkgDir, 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 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 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();\n\nsocket.addEventListener('message', ({ data }) => {\n const payload = JSON.parse(data);\n switch (payload.type) {\n case 'connected':\n console.log('[nasti] connected.');\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 break;\n case 'full-reload':\n console.log('[nasti] full reload');\n location.reload();\n break;\n case 'error':\n console.error('[nasti] error:', payload.err.message);\n showErrorOverlay(payload.err);\n break;\n }\n});\n\nasync function fetchUpdate(update) {\n const mod = hotModulesMap.get(update.path);\n if (mod) {\n const newMod = await import(update.acceptedPath + '?t=' + update.timestamp);\n mod.callbacks.forEach((cb) => cb(newMod));\n } else {\n // 没有注册 hot 回调,尝试重新 import\n await import(update.path + '?t=' + update.timestamp);\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 showErrorOverlay(err) {\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// import.meta.hot API\nconst createHotContext = (ownerPath) => ({\n accept(deps, callback) {\n if (typeof deps === 'function' || !deps) {\n // self-accepting\n const callbacks = hotModulesMap.get(ownerPath)?.callbacks || [];\n callbacks.push(deps || (() => {}));\n hotModulesMap.set(ownerPath, { callbacks });\n }\n },\n prune(callback) {\n // 模块被移除时执行\n },\n dispose(callback) {\n // 模块更新前执行清理\n },\n invalidate() {\n location.reload();\n },\n data: {},\n});\n\n// 暴露给模块使用\nif (!window.__nasti_hot_map) window.__nasti_hot_map = new Map();\nwindow.__NASTI_HMR__ = { createHotContext };\n`\n}\n","// HMR 逻辑 - 文件变更 → 模块失效 → 通知客户端\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport type { DevServer, ModuleNode, HmrPayload, HmrUpdate, HmrContext } from '../types.js'\nimport { ModuleGraph } from '../core/module-graph.js'\n\nexport async function handleFileChange(\n file: string,\n server: DevServer,\n): Promise<void> {\n const { moduleGraph, ws, config } = server\n const relativePath = '/' + path.relative(config.root, file)\n\n // 找到受影响的模块\n const mods = moduleGraph.getModulesByFile(file)\n if (!mods || mods.size === 0) {\n // 未跟踪的文件变更,可能需要 full reload\n return\n }\n\n const updates: HmrUpdate[] = []\n const timestamp = Date.now()\n\n for (const mod of mods) {\n // 使缓存失效\n moduleGraph.invalidateModule(mod)\n\n // 执行插件的 handleHotUpdate 钩子\n const ctx: HmrContext = {\n file,\n timestamp,\n modules: [mod],\n read: () => fs.readFileSync(file, 'utf-8'),\n server,\n }\n\n let affectedModules: ModuleNode[] = [mod]\n for (const plugin of config.plugins) {\n if (plugin.handleHotUpdate) {\n const result = await plugin.handleHotUpdate(ctx)\n if (result) {\n affectedModules = result\n }\n }\n }\n\n // 检查 HMR 边界\n for (const affected of affectedModules) {\n const boundaries = (moduleGraph as ModuleGraph).getHmrBoundaries(affected)\n if (boundaries.length === 0) {\n // 无法热更新,full reload\n ws.send({ type: 'full-reload', path: relativePath })\n return\n }\n\n for (const { boundary } of boundaries) {\n updates.push({\n type: boundary.type === 'css' ? 'css-update' : 'js-update',\n path: boundary.url,\n acceptedPath: affected.url,\n timestamp,\n })\n }\n }\n }\n\n if (updates.length > 0) {\n ws.send({ type: 'update', updates })\n }\n}\n","// 模块解析插件 - 处理 bare imports、路径 alias、文件扩展名\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nexport function resolvePlugin(config: ResolvedConfig): NastiPlugin {\n const { alias, extensions } = config.resolve\n const require = createRequire(path.resolve(config.root, 'package.json'))\n\n return {\n name: 'nasti:resolve',\n enforce: 'pre',\n\n resolveId(source, importer) {\n // 1. 处理 alias\n for (const [key, value] of Object.entries(alias)) {\n if (source === key || source.startsWith(key + '/')) {\n source = source.replace(key, value)\n // 如果 alias 值是绝对路径就直接用,否则相对于 root 解析\n if (!path.isAbsolute(source)) {\n source = path.resolve(config.root, source)\n }\n break\n }\n }\n\n // 2. 绝对路径\n if (path.isAbsolute(source)) {\n const resolved = tryResolveFile(source, extensions)\n if (resolved) return resolved\n }\n\n // 3. 相对路径\n if (source.startsWith('.')) {\n const dir = importer ? path.dirname(importer) : config.root\n const absolute = path.resolve(dir, source)\n const resolved = tryResolveFile(absolute, extensions)\n if (resolved) return resolved\n }\n\n // 4. bare import (node_modules)\n if (!source.startsWith('/') && !source.startsWith('.')) {\n try {\n const resolved = require.resolve(source, {\n paths: [importer ? path.dirname(importer) : config.root],\n })\n return resolved\n } catch {\n return null\n }\n }\n\n return null\n },\n\n load(id) {\n if (!fs.existsSync(id)) return null\n // JSON 文件包装为 ES 模块\n if (id.endsWith('.json')) {\n const content = fs.readFileSync(id, 'utf-8')\n return `export default ${content}`\n }\n return fs.readFileSync(id, 'utf-8')\n },\n }\n}\n\n/** 尝试解析文件,带扩展名补全和 index 文件查找 */\nfunction tryResolveFile(file: string, extensions: string[]): string | null {\n // 精确路径\n if (fs.existsSync(file) && fs.statSync(file).isFile()) {\n return file\n }\n\n // 尝试加扩展名\n for (const ext of extensions) {\n const withExt = file + ext\n if (fs.existsSync(withExt) && fs.statSync(withExt).isFile()) {\n return withExt\n }\n }\n\n // 尝试作为目录查找 index 文件\n if (fs.existsSync(file) && fs.statSync(file).isDirectory()) {\n for (const ext of extensions) {\n const indexFile = path.join(file, 'index' + ext)\n if (fs.existsSync(indexFile)) {\n return indexFile\n }\n }\n }\n\n return null\n}\n","// CSS 处理插件 - 处理 .css 导入\nimport path from 'node:path'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nexport function cssPlugin(config: ResolvedConfig): NastiPlugin {\n return {\n name: 'nasti:css',\n\n resolveId(source) {\n if (source.endsWith('.css')) return null // 交给 resolve 插件处理\n return null\n },\n\n transform(code, id) {\n if (!id.endsWith('.css')) return null\n\n // 将 CSS 中的相对 url() 路径重写为绝对路径,确保打包后资源路径正确\n const rewritten = rewriteCssUrls(code, id, config.root)\n\n if (config.command === 'serve') {\n // Dev 模式: 将 CSS 转为 JS 模块,通过 style 标签注入\n const escaped = JSON.stringify(rewritten)\n return {\n code: `\nconst css = ${escaped};\nconst __nasti_css_id__ = ${JSON.stringify(id)};\nconst __nasti_existing__ = document.querySelector('style[data-nasti-css=' + JSON.stringify(__nasti_css_id__) + ']');\nif (__nasti_existing__) __nasti_existing__.remove();\nconst style = document.createElement('style');\nstyle.setAttribute('data-nasti-css', __nasti_css_id__);\nstyle.textContent = css;\ndocument.head.appendChild(style);\n\n// HMR\nif (import.meta.hot) {\n import.meta.hot.accept();\n import.meta.hot.prune(() => {\n style.remove();\n });\n}\n\nexport default css;\n`,\n }\n }\n\n // Build 模式: 返回重写后的 CSS,由 rolldown 处理提取\n return rewritten !== code ? { code: rewritten } : null\n },\n }\n}\n\n/** CSS URL 重写(将相对路径转为绝对路径) */\nexport function rewriteCssUrls(css: string, from: string, root: string): string {\n return css.replace(/url\\(\\s*['\"]?([^'\")\\s]+)['\"]?\\s*\\)/g, (match, url: string) => {\n // 跳过绝对路径、data URI、http(s) URL\n if (url.startsWith('/') || url.startsWith('data:') || url.startsWith('http')) {\n return match\n }\n const resolved = path.resolve(path.dirname(from), url)\n const relative = '/' + path.relative(root, resolved)\n return `url(${relative})`\n })\n}\n","// 静态资源处理插件 - 图片、字体等\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport crypto from 'node:crypto'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nconst ASSET_EXTENSIONS = new Set([\n '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.webp', '.avif',\n '.mp4', '.webm', '.ogg', '.mp3', '.wav', '.flac', '.aac',\n '.woff', '.woff2', '.eot', '.ttf', '.otf',\n '.pdf', '.txt',\n])\n\nexport function assetsPlugin(config: ResolvedConfig): NastiPlugin {\n return {\n name: 'nasti:assets',\n\n resolveId(source) {\n // 处理 ?url 和 ?raw 后缀\n if (source.endsWith('?url') || source.endsWith('?raw')) {\n return source\n }\n return null\n },\n\n load(id) {\n const ext = path.extname(id.replace(/\\?.*$/, ''))\n\n // ?raw 查询: 返回文件原始内容\n if (id.endsWith('?raw')) {\n const file = id.slice(0, -4)\n if (fs.existsSync(file)) {\n const content = fs.readFileSync(file, 'utf-8')\n return `export default ${JSON.stringify(content)}`\n }\n }\n\n // ?url 查询或静态资源扩展名: 返回 URL\n if (id.endsWith('?url') || ASSET_EXTENSIONS.has(ext)) {\n const file = id.replace(/\\?.*$/, '')\n if (!fs.existsSync(file)) return null\n\n if (config.command === 'serve') {\n // Dev 模式: 返回相对于 root 的路径\n const url = '/' + path.relative(config.root, file)\n return `export default ${JSON.stringify(url)}`\n }\n\n // Build 模式: 计算内容哈希用于文件名\n const content = fs.readFileSync(file)\n const hash = crypto.createHash('sha256').update(content).digest('hex').slice(0, 8)\n const basename = path.basename(file, ext)\n const hashedName = `${config.build.assetsDir}/${basename}.${hash}${ext}`\n return `export default ${JSON.stringify(config.base + hashedName)}`\n }\n\n return null\n },\n }\n}\n\nexport function isAssetFile(id: string): boolean {\n const ext = path.extname(id.replace(/\\?.*$/, ''))\n return ASSET_EXTENSIONS.has(ext)\n}\n","// Dev Server 主逻辑\nimport http from 'node:http'\nimport path from 'node:path'\nimport os from 'node:os'\nimport connect from 'connect'\nimport sirv from 'sirv'\nimport { watch } from 'chokidar'\nimport pc from 'picocolors'\nimport type { NastiConfig, ResolvedConfig, DevServer } from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { PluginContainer } from '../core/plugin-container.js'\nimport { ModuleGraph } from '../core/module-graph.js'\nimport { createWebSocketServer } from './ws.js'\nimport { transformMiddleware } from './middleware.js'\nimport { handleFileChange } from './hmr.js'\nimport { resolvePlugin } from '../plugins/resolve.js'\nimport { cssPlugin } from '../plugins/css.js'\nimport { assetsPlugin } from '../plugins/assets.js'\nimport { htmlPlugin } from '../plugins/html.js'\n\nexport async function createServer(inlineConfig: NastiConfig = {}): Promise<DevServer> {\n const config = await resolveConfig(inlineConfig, 'serve')\n\n // 组装内置插件 + 用户插件\n const allPlugins = [\n resolvePlugin(config),\n cssPlugin(config),\n assetsPlugin(config),\n htmlPlugin(config),\n ...config.plugins,\n ]\n const configWithPlugins: ResolvedConfig = { ...config, plugins: allPlugins }\n\n const moduleGraph = new ModuleGraph()\n const pluginContainer = new PluginContainer(configWithPlugins)\n\n // HTTP 服务\n const app = connect()\n\n // 转译中间件(处理 .ts, .tsx, .jsx, .css, .vue 等)\n app.use(transformMiddleware({\n config: configWithPlugins,\n pluginContainer,\n moduleGraph,\n }))\n\n // 静态文件服务(public 目录 + 项目根目录)\n const publicDir = path.resolve(config.root, 'public')\n app.use(sirv(publicDir, { dev: true, etag: true }))\n app.use(sirv(config.root, { dev: true, etag: true }))\n\n const httpServer = http.createServer(app)\n const ws = createWebSocketServer(httpServer)\n\n // 文件监听\n const watcher = watch(config.root, {\n ignored: [\n '**/node_modules/**',\n '**/.git/**',\n `**/${config.build.outDir}/**`,\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 // 执行插件的 configureServer 钩子\n const postMiddlewares: Array<() => void> = []\n for (const plugin of allPlugins) {\n if (plugin.configureServer) {\n const result = await plugin.configureServer(server! as any)\n if (typeof result === 'function') {\n postMiddlewares.push(result)\n }\n }\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 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 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","// 生产构建 - 调用 Rolldown API 打包\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { rolldown } from 'rolldown'\nimport type { NastiConfig, ResolvedConfig } from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { resolvePlugin } from '../plugins/resolve.js'\nimport { cssPlugin } from '../plugins/css.js'\nimport { assetsPlugin } from '../plugins/assets.js'\nimport { htmlPlugin, readHtmlFile, processHtml } from '../plugins/html.js'\nimport { transformCode, shouldTransform } from '../core/transformer.js'\nimport { loadEnv, buildEnvDefine } from '../core/env.js'\nimport { PluginContainer } from '../core/plugin-container.js'\nimport pc from 'picocolors'\n\nexport interface BuildResult {\n output: Array<{ fileName: string; type: string; code?: string; source?: Uint8Array | string }>\n}\n\nexport async function build(inlineConfig: NastiConfig = {}): Promise<BuildResult> {\n const config = await resolveConfig(inlineConfig, 'build')\n const startTime = performance.now()\n\n console.log(pc.cyan('\\n🔨 nasti build') + pc.dim(` v${__NASTI_VERSION__}`))\n console.log(pc.dim(` root: ${config.root}`))\n console.log(pc.dim(` mode: ${config.mode}`))\n\n const outDir = path.resolve(config.root, config.build.outDir)\n\n // 清空输出目录\n if (config.build.emptyOutDir && fs.existsSync(outDir)) {\n fs.rmSync(outDir, { recursive: true, force: true })\n }\n fs.mkdirSync(outDir, { recursive: true })\n\n // 查找 HTML 入口中的 script 标签作为 entry\n const html = await readHtmlFile(config.root)\n let entryPoints: string[] = []\n\n if (html) {\n const scriptMatches = html.matchAll(/<script[^>]+src=[\"']([^\"']+)[\"'][^>]*>/gi)\n for (const match of scriptMatches) {\n const src = match[1]\n if (src && !src.startsWith('http')) {\n entryPoints.push(path.resolve(config.root, src.replace(/^\\//, '')))\n }\n }\n }\n\n if (entryPoints.length === 0) {\n // 回退: 尝试常见入口\n const fallbackEntries = ['src/main.ts', 'src/main.tsx', 'src/main.js', 'src/index.ts', 'src/index.tsx', 'src/index.js']\n for (const entry of fallbackEntries) {\n const fullPath = path.resolve(config.root, entry)\n if (fs.existsSync(fullPath)) {\n entryPoints.push(fullPath)\n break\n }\n }\n }\n\n if (entryPoints.length === 0) {\n throw new Error('No entry point found. Add a <script> tag to index.html or create src/main.ts')\n }\n\n // 构建内置插件 + 用户插件作为 Rolldown 插件\n const builtinPlugins = [\n resolvePlugin(config),\n cssPlugin(config),\n assetsPlugin(config),\n ]\n const allPlugins = [...builtinPlugins, ...config.plugins]\n\n // 运行插件的 buildStart 钩子,并收集 emitFile 输出文件\n const pluginContainer = new PluginContainer(config)\n await pluginContainer.buildStart()\n\n // oxc-transform 插件(作为 Rolldown 插件)\n const oxcTransformPlugin = {\n name: 'nasti:oxc-transform',\n transform(code: string, id: string) {\n if (!shouldTransform(id)) return null\n const result = transformCode(id, code, {\n sourcemap: !!config.build.sourcemap,\n jsxRuntime: 'automatic',\n jsxImportSource: config.framework === 'vue' ? 'vue' : 'react',\n })\n return { code: result.code, map: result.map ? JSON.parse(result.map) : undefined }\n },\n }\n\n // 加载环境变量并生成 define 替换表\n const env = loadEnv(config.mode, config.root, config.envPrefix)\n const envDefine = buildEnvDefine(env, config.mode)\n\n // 调用 Rolldown\n const bundle = await rolldown({\n input: entryPoints,\n define: envDefine,\n plugins: [\n oxcTransformPlugin,\n // 转换 Nasti 插件为 Rolldown 插件格式\n ...allPlugins.map((p) => ({\n name: p.name,\n resolveId: p.resolveId as any,\n load: p.load as any,\n transform: p.transform as any,\n buildStart: p.buildStart as any,\n buildEnd: p.buildEnd as any,\n })),\n ],\n ...(config.build.rolldownOptions as any),\n })\n\n const { output } = await bundle.write({\n dir: outDir,\n format: 'esm',\n sourcemap: !!config.build.sourcemap,\n minify: !!config.build.minify,\n entryFileNames: 'assets/[name].[hash].js',\n chunkFileNames: 'assets/[name].[hash].js',\n assetFileNames: 'assets/[name].[hash][extname]',\n })\n\n await bundle.close()\n await pluginContainer.buildEnd()\n\n // 将 emitFile 产出的文件写入输出目录\n for (const ef of pluginContainer.getEmittedFiles()) {\n const dest = path.resolve(outDir, ef.fileName)\n fs.mkdirSync(path.dirname(dest), { recursive: true })\n fs.writeFileSync(dest, ef.source)\n }\n\n // 处理 HTML\n if (html) {\n let processedHtml = html\n\n // 执行插件的 transformIndexHtml 钩子\n const htmlPlugin_ = htmlPlugin(config)\n if (htmlPlugin_.transformIndexHtml) {\n const result = await htmlPlugin_.transformIndexHtml(processedHtml)\n if (typeof result === 'string') {\n processedHtml = result\n } else if (result && 'html' in result) {\n processedHtml = processHtml(result.html, result.tags)\n } else if (Array.isArray(result)) {\n processedHtml = processHtml(processedHtml, result)\n }\n }\n\n // 替换 script src 为打包后的路径(支持多入口)\n for (const chunk of output) {\n if (chunk.type === 'chunk' && chunk.isEntry && chunk.facadeModuleId) {\n const originalEntry = path.relative(config.root, chunk.facadeModuleId)\n processedHtml = processedHtml.replace(\n new RegExp(`(src=[\"'])/?(${escapeRegExp(originalEntry)})([\"'])`, 'g'),\n `$1${config.base}${chunk.fileName}$3`,\n )\n }\n }\n\n fs.writeFileSync(path.resolve(outDir, 'index.html'), processedHtml)\n }\n\n const elapsed = ((performance.now() - startTime) / 1000).toFixed(2)\n const totalSize = output.reduce((sum, chunk) => {\n if (chunk.type === 'chunk' && chunk.code) return sum + chunk.code.length\n return sum\n }, 0)\n\n console.log(pc.green(`\\n✓ Built in ${elapsed}s`))\n console.log(pc.dim(` ${output.length} files, ${formatSize(totalSize)} total`))\n console.log(pc.dim(` output: ${config.build.outDir}/\\n`))\n\n return { output: output as any }\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} kB`\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n","// Nasti CLI - 命令行入口\nimport { cac } from 'cac'\nimport pc from 'picocolors'\n\nconst cli = cac('nasti')\n\n// nasti dev\ncli\n .command('[root]', 'Start dev server')\n .alias('dev')\n .option('--port <port>', 'Port number', { default: 3000 })\n .option('--host [host]', 'Hostname')\n .option('--open [path]', 'Open browser on startup')\n .option('--mode <mode>', 'Set env mode')\n .action(async (root: string | undefined, options: any) => {\n try {\n const { createServer } = await import('./server/index.js')\n const server = await createServer({\n root: root ?? '.',\n mode: options.mode ?? 'development',\n server: {\n port: options.port,\n host: options.host,\n open: options.open,\n },\n })\n await server.listen()\n } catch (err: any) {\n console.error(pc.red(`\\n Error starting dev server:\\n ${err.message}\\n`))\n if (err.stack) console.error(pc.dim(err.stack))\n process.exit(1)\n }\n })\n\n// nasti build\ncli\n .command('build [root]', 'Build for production')\n .option('--outDir <dir>', 'Output directory', { default: 'dist' })\n .option('--sourcemap', 'Generate source map')\n .option('--minify', 'Minify output', { default: true })\n .option('--mode <mode>', 'Set env mode')\n .action(async (root: string | undefined, options: any) => {\n try {\n const { build } = await import('./build/index.js')\n await build({\n root: root ?? '.',\n mode: options.mode ?? 'production',\n build: {\n outDir: options.outDir,\n sourcemap: options.sourcemap,\n minify: options.minify,\n },\n })\n } catch (err: any) {\n console.error(pc.red(`\\n Build failed:\\n ${err.message}\\n`))\n if (err.stack) console.error(pc.dim(err.stack))\n process.exit(1)\n }\n })\n\n// nasti preview\ncli\n .command('preview [root]', 'Preview production build')\n .option('--port <port>', 'Port number', { default: 4173 })\n .option('--host [host]', 'Hostname')\n .option('--outDir <dir>', 'Output directory to serve', { default: 'dist' })\n .action(async (root: string | undefined, options: any) => {\n try {\n const http = await import('node:http')\n const path = await import('node:path')\n const sirv = (await import('sirv')).default\n const connect = (await import('connect')).default\n\n const resolvedRoot = path.resolve(root ?? '.')\n const outDir = path.resolve(resolvedRoot, options.outDir)\n\n const app = connect()\n app.use(sirv(outDir, { single: true, etag: true, gzip: true, brotli: true }))\n\n const port = options.port\n const host = options.host === true ? '0.0.0.0' : (options.host ?? 'localhost')\n\n http.createServer(app).listen(port, host, () => {\n console.log()\n console.log(pc.cyan(' 🔍 nasti preview'))\n console.log()\n console.log(` ${pc.green('➜')} Local: ${pc.cyan(`http://localhost:${port}`)}`)\n console.log()\n })\n } catch (err: any) {\n console.error(pc.red(`\\n Preview failed:\\n ${err.message}\\n`))\n process.exit(1)\n }\n })\n\ncli.help()\ncli.version(__NASTI_VERSION__)\n\ncli.parse()\n"],"mappings":"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","names":["path","fs","transformSync","WsServer","path","fs","import_node_path","import_node_fs","path","fs","import_node_path","import_node_fs","fs","code","transformResult","rolldown","createRequire","path","exports","import_node_path","import_node_fs","path","fs","import_node_path","import_node_fs","require","path","fs","import_node_path","import_node_fs","path","import_node_path","path","fs","crypto","import_node_path","import_node_fs","connect","path","sirv","http","pc","transformRequest","os","import_node_path","pc","path","fs","import_node_path","import_node_fs","import_picocolors","import_picocolors","createServer","pc","build","http","path","sirv","connect"]}
1
+ {"version":3,"sources":["../src/config/defaults.ts","../src/config/index.ts","../src/core/plugin-container.ts","../src/core/module-graph.ts","../src/server/ws.ts","../src/core/transformer.ts","../src/plugins/html.ts","../src/core/env.ts","../src/server/middleware.ts","../src/server/hmr.ts","../src/plugins/resolve.ts","../src/plugins/css.ts","../src/plugins/assets.ts","../src/server/index.ts","../src/build/index.ts","../src/cli.ts"],"sourcesContent":["import type { NastiConfig, ResolvedConfig, BuildConfig, ServerConfig, ResolveConfig } from '../types.js'\n\nconst defaultResolve: Required<ResolveConfig> = {\n alias: {},\n extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.json', '.vue'],\n conditions: ['import', 'module', 'browser', 'default'],\n mainFields: ['module', 'jsnext:main', 'jsnext', 'main'],\n}\n\nconst defaultServer: Required<ServerConfig> = {\n port: 3000,\n host: 'localhost',\n https: false,\n open: false,\n proxy: {},\n cors: true,\n hmr: true,\n}\n\nconst defaultBuild: Required<BuildConfig> = {\n outDir: 'dist',\n assetsDir: 'assets',\n minify: true,\n sourcemap: false,\n target: 'es2022',\n rolldownOptions: {},\n emptyOutDir: true,\n}\n\nexport const defaults: Required<Omit<NastiConfig, 'plugins'>> & { plugins: [] } = {\n root: '.',\n base: '/',\n mode: 'development',\n framework: 'auto',\n resolve: defaultResolve,\n server: defaultServer,\n build: defaultBuild,\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\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 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 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 // 执行插件 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\nfunction deepMerge<T extends Record<string, any>>(target: T, source: Record<string, any>): T {\n const result = { ...target }\n for (const key of Object.keys(source)) {\n const val = source[key]\n if (val && typeof val === 'object' && !Array.isArray(val)) {\n result[key as keyof T] = deepMerge(\n (result[key as keyof T] as Record<string, any>) ?? {},\n val,\n ) as T[keyof T]\n } else if (val !== undefined) {\n result[key as keyof T] = val\n }\n }\n return result\n}\n","// Vite 兼容插件容器\n// 管理插件生命周期,实现 resolveId → load → transform 管道\n\nimport type {\n NastiPlugin,\n ResolvedConfig,\n PluginContext,\n ResolveIdResult,\n LoadResult,\n TransformResult,\n ModuleInfo,\n} from '../types.js'\n\nexport class PluginContainer {\n private plugins: NastiPlugin[]\n private config: ResolvedConfig\n private ctx: PluginContext\n private emittedFiles: Map<string, { fileName: string; source: string | Uint8Array }> = new Map()\n\n constructor(config: ResolvedConfig) {\n this.config = config\n // 按 enforce 排序: pre → normal → post\n this.plugins = sortPlugins(config.plugins)\n this.ctx = this.createContext()\n }\n\n private createContext(): PluginContext {\n const container = this\n return {\n async resolve(source: string, importer?: string) {\n return container.resolveId(source, importer)\n },\n emitFile(file) {\n const fileName = file.fileName ?? file.name ?? `asset-${container.emittedFiles.size}`\n const id = `emitted:${fileName}`\n container.emittedFiles.set(id, {\n fileName,\n source: file.source ?? '',\n })\n return id\n },\n getModuleInfo(_id): ModuleInfo | null {\n return null\n },\n }\n }\n\n /** 返回所有通过 emitFile() 输出的文件 */\n getEmittedFiles(): Array<{ fileName: string; source: string | Uint8Array }> {\n return Array.from(this.emittedFiles.values())\n }\n\n async buildStart(): Promise<void> {\n for (const plugin of this.plugins) {\n if (plugin.buildStart) {\n await plugin.buildStart.call(this.ctx)\n }\n }\n }\n\n async buildEnd(error?: Error): Promise<void> {\n for (const plugin of this.plugins) {\n if (plugin.buildEnd) {\n await plugin.buildEnd.call(this.ctx, error)\n }\n }\n }\n\n async resolveId(\n source: string,\n importer?: string,\n options: { isEntry?: boolean } = {},\n ): Promise<ResolveIdResult> {\n for (const plugin of this.plugins) {\n if (!plugin.resolveId) continue\n const result = await plugin.resolveId.call(\n this.ctx,\n source,\n importer ?? undefined,\n { isEntry: options.isEntry ?? false, ssr: false },\n )\n if (result != null) return result\n }\n return null\n }\n\n async load(id: string): Promise<LoadResult> {\n for (const plugin of this.plugins) {\n if (!plugin.load) continue\n const result = await plugin.load.call(this.ctx, id)\n if (result != null) return result\n }\n return null\n }\n\n async transform(code: string, id: string): Promise<TransformResult> {\n let currentCode = code\n for (const plugin of this.plugins) {\n if (!plugin.transform) continue\n const result = await plugin.transform.call(this.ctx, currentCode, id)\n if (result == null) continue\n if (typeof result === 'string') {\n currentCode = result\n } else {\n currentCode = result.code\n }\n }\n return currentCode === code ? null : { code: currentCode }\n }\n\n /** 完整的模块处理管道: resolveId → load → transform */\n async processModule(\n source: string,\n importer?: string,\n ): Promise<{ id: string; code: string } | null> {\n // 1. resolveId\n const resolveResult = await this.resolveId(source, importer, {\n isEntry: !importer,\n })\n if (resolveResult == null) return null\n const id = typeof resolveResult === 'string' ? resolveResult : resolveResult.id\n\n // 2. load\n const loadResult = await this.load(id)\n if (loadResult == null) return null\n const loadedCode = typeof loadResult === 'string' ? loadResult : loadResult.code\n\n // 3. transform\n const transformResult = await this.transform(loadedCode, id)\n const finalCode = transformResult == null\n ? loadedCode\n : typeof transformResult === 'string'\n ? transformResult\n : transformResult.code\n\n return { id, code: finalCode }\n }\n\n getPlugins(): NastiPlugin[] {\n return this.plugins\n }\n}\n\nfunction sortPlugins(plugins: NastiPlugin[]): NastiPlugin[] {\n const pre: NastiPlugin[] = []\n const normal: NastiPlugin[] = []\n const post: NastiPlugin[] = []\n\n for (const plugin of plugins) {\n if (plugin.enforce === 'pre') pre.push(plugin)\n else if (plugin.enforce === 'post') post.push(plugin)\n else normal.push(plugin)\n }\n\n return [...pre, ...normal, ...post]\n}\n","// 模块依赖图 - 用于 HMR 追踪模块关系\n\nimport type { ModuleNode, TransformResult } from '../types.js'\n\nexport class ModuleGraph {\n private urlToModuleMap = new Map<string, ModuleNode>()\n private idToModuleMap = new Map<string, ModuleNode>()\n private fileToModulesMap = new Map<string, Set<ModuleNode>>()\n\n getModuleByUrl(url: string): ModuleNode | undefined {\n return this.urlToModuleMap.get(url)\n }\n\n getModuleById(id: string): ModuleNode | undefined {\n return this.idToModuleMap.get(id)\n }\n\n getModulesByFile(file: string): Set<ModuleNode> | undefined {\n return this.fileToModulesMap.get(file)\n }\n\n async ensureEntryFromUrl(url: string): Promise<ModuleNode> {\n let mod = this.urlToModuleMap.get(url)\n if (mod) return mod\n\n mod = this.createModule(url)\n this.urlToModuleMap.set(url, mod)\n return mod\n }\n\n createModule(url: string, id?: string): ModuleNode {\n const mod: ModuleNode = {\n id: id ?? url,\n file: null,\n url,\n type: url.endsWith('.css') ? 'css' : 'js',\n importers: new Set(),\n importedModules: new Set(),\n acceptedHmrDeps: new Set(),\n transformResult: null,\n lastHMRTimestamp: 0,\n isSelfAccepting: false,\n }\n this.idToModuleMap.set(mod.id, mod)\n return mod\n }\n\n /** 注册文件路径到模块的映射 */\n registerModule(mod: ModuleNode, file: string): void {\n mod.file = file\n let mods = this.fileToModulesMap.get(file)\n if (!mods) {\n mods = new Set()\n this.fileToModulesMap.set(file, mods)\n }\n mods.add(mod)\n }\n\n /** 更新模块依赖关系 */\n updateModuleImports(mod: ModuleNode, importedIds: Set<string>): void {\n // 清除旧的导入关系\n for (const imported of mod.importedModules) {\n imported.importers.delete(mod)\n }\n mod.importedModules.clear()\n\n // 建立新的导入关系\n for (const id of importedIds) {\n const importedMod = this.idToModuleMap.get(id)\n if (importedMod) {\n mod.importedModules.add(importedMod)\n importedMod.importers.add(mod)\n }\n }\n }\n\n /** 使模块的转换缓存失效 */\n invalidateModule(mod: ModuleNode): void {\n mod.transformResult = null\n mod.lastHMRTimestamp = Date.now()\n }\n\n /** 使所有模块缓存失效 */\n invalidateAll(): void {\n for (const mod of this.idToModuleMap.values()) {\n this.invalidateModule(mod)\n }\n }\n\n /** 获取 HMR 传播边界 - 从变更模块向上遍历找到接受更新的边界 */\n getHmrBoundaries(mod: ModuleNode): { boundary: ModuleNode; acceptedVia: ModuleNode }[] {\n const boundaries: { boundary: ModuleNode; acceptedVia: ModuleNode }[] = []\n const visited = new Set<ModuleNode>()\n\n const propagate = (node: ModuleNode, via: ModuleNode): boolean => {\n if (visited.has(node)) return true\n visited.add(node)\n\n // 如果模块自身接受热更新\n if (node.isSelfAccepting) {\n boundaries.push({ boundary: node, acceptedVia: via })\n return true\n }\n\n // 如果模块被其他模块作为 HMR 依赖接受\n if (node.acceptedHmrDeps.has(via)) {\n boundaries.push({ boundary: node, acceptedVia: via })\n return true\n }\n\n // 没有 importer 意味着到达了入口,需要 full reload\n if (node.importers.size === 0) return false\n\n // 向上传播\n for (const importer of node.importers) {\n if (!propagate(importer, node)) return false\n }\n return true\n }\n\n // 从自身开始,如果自身接受就直接返回\n if (mod.isSelfAccepting) {\n boundaries.push({ boundary: mod, acceptedVia: mod })\n return boundaries\n }\n\n // 否则向 importer 传播\n for (const importer of mod.importers) {\n if (!propagate(importer, mod)) {\n // 传播到了根模块,需要 full reload\n return []\n }\n }\n\n return boundaries\n }\n}\n","// WebSocket 服务封装 - HMR 通信\nimport { WebSocketServer as WsServer, type WebSocket } from 'ws'\nimport type { WebSocketServer as IWebSocketServer, HmrPayload } from '../types.js'\n\nexport function createWebSocketServer(server: any): IWebSocketServer {\n const wss = new WsServer({ noServer: true })\n const clients = new Set<WebSocket>()\n\n // 处理 HTTP server 的 upgrade 请求\n server.on('upgrade', (req: any, socket: any, head: any) => {\n if (req.headers['sec-websocket-protocol'] === 'nasti-hmr') {\n wss.handleUpgrade(req, socket, head, (ws) => {\n wss.emit('connection', ws, req)\n })\n }\n })\n\n wss.on('connection', (ws) => {\n clients.add(ws)\n ws.send(JSON.stringify({ type: 'connected' }))\n\n ws.on('close', () => {\n clients.delete(ws)\n })\n\n ws.on('error', (err) => {\n console.error('[nasti] WebSocket error:', err)\n clients.delete(ws)\n })\n })\n\n return {\n send(payload: HmrPayload) {\n const data = JSON.stringify(payload)\n for (const client of clients) {\n if (client.readyState === 1) { // WebSocket.OPEN\n client.send(data)\n }\n }\n },\n close() {\n clients.clear()\n wss.close()\n },\n }\n}\n","// OXC Transform 封装 - 高性能 TS/JSX/TSX 转译\nimport { transformSync } from 'oxc-transform'\n\nexport interface TransformOptions {\n jsx?: boolean\n jsxRuntime?: 'automatic' | 'classic'\n jsxImportSource?: string\n typescript?: boolean\n sourcemap?: boolean\n reactRefresh?: boolean\n}\n\nexport interface TransformOutput {\n code: string\n map: string | null\n}\n\nconst JS_EXTENSIONS = /\\.(js|mjs|cjs)$/\nconst TS_EXTENSIONS = /\\.(ts|mts|cts)$/\nconst JSX_EXTENSIONS = /\\.(jsx|tsx)$/\nconst VUE_EXTENSION = /\\.vue$/\n\nexport function shouldTransform(id: string): boolean {\n return (\n TS_EXTENSIONS.test(id) ||\n JSX_EXTENSIONS.test(id) ||\n (JS_EXTENSIONS.test(id) && false) // JS 文件默认不转译,除非包含 JSX\n )\n}\n\nexport function transformCode(\n filename: string,\n code: string,\n options: TransformOptions = {},\n): TransformOutput {\n const isTS = TS_EXTENSIONS.test(filename) || /\\.tsx$/.test(filename)\n const isJSX = JSX_EXTENSIONS.test(filename)\n\n const result = transformSync(filename, code, {\n typescript: isTS ? {} : undefined,\n jsx: isJSX || /\\.tsx$/.test(filename)\n ? {\n runtime: options.jsxRuntime ?? 'automatic',\n importSource: options.jsxImportSource ?? 'react',\n refresh: options.reactRefresh ?? false,\n }\n : undefined,\n sourcemap: options.sourcemap ?? true,\n })\n\n if (result.errors && result.errors.length > 0) {\n const msg = result.errors.map((e: any) => e.message ?? String(e)).join('\\n')\n throw new Error(`OXC transform failed for ${filename}:\\n${msg}`)\n }\n\n return {\n code: result.code,\n map: result.map ? JSON.stringify(result.map) : null,\n }\n}\n\n/** 获取文件的模块类型 */\nexport function getModuleType(id: string): 'ts' | 'tsx' | 'js' | 'jsx' | 'css' | 'json' | 'vue' | 'asset' {\n if (/\\.tsx$/.test(id)) return 'tsx'\n if (/\\.ts$/.test(id) || /\\.mts$/.test(id)) return 'ts'\n if (/\\.jsx$/.test(id)) return 'jsx'\n if (/\\.css$/.test(id)) return 'css'\n if (/\\.json$/.test(id)) return 'json'\n if (VUE_EXTENSION.test(id)) return 'vue'\n if (JS_EXTENSIONS.test(id)) return 'js'\n return 'asset'\n}\n","// HTML 入口处理插件 - index.html 处理与脚本注入\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport type { NastiPlugin, ResolvedConfig, HtmlTagDescriptor } from '../types.js'\n\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 // Dev 模式: 注入 HMR 客户端\n tags.push({\n tag: 'script',\n attrs: { type: 'module', src: '/@nasti/client' },\n injectTo: 'head-prepend',\n })\n }\n\n return { html, tags }\n },\n }\n}\n\n/** 处理 HTML,注入标签并重写 script src */\nexport function processHtml(\n html: string,\n tags: HtmlTagDescriptor[],\n): string {\n const headPrepend = tags.filter((t) => t.injectTo === 'head-prepend')\n const head = tags.filter((t) => t.injectTo === 'head' || !t.injectTo)\n const bodyPrepend = tags.filter((t) => t.injectTo === 'body-prepend')\n const body = tags.filter((t) => t.injectTo === 'body')\n\n if (headPrepend.length) {\n html = html.replace(/<head([^>]*)>/i, `<head$1>\\n${serializeTags(headPrepend)}`)\n }\n if (head.length) {\n html = html.replace(/<\\/head>/i, `${serializeTags(head)}\\n</head>`)\n }\n if (bodyPrepend.length) {\n html = html.replace(/<body([^>]*)>/i, `<body$1>\\n${serializeTags(bodyPrepend)}`)\n }\n if (body.length) {\n html = html.replace(/<\\/body>/i, `${serializeTags(body)}\\n</body>`)\n }\n\n return html\n}\n\nfunction serializeTags(tags: HtmlTagDescriptor[]): string {\n return tags.map(serializeTag).join('\\n')\n}\n\nfunction serializeTag(tag: HtmlTagDescriptor): string {\n const attrs = tag.attrs\n ? ' ' +\n Object.entries(tag.attrs)\n .map(([k, v]) => (v === true ? k : `${k}=\"${v}\"`))\n .join(' ')\n : ''\n const children =\n typeof tag.children === 'string'\n ? tag.children\n : tag.children\n ? serializeTags(tag.children)\n : ''\n\n const selfClosing = ['link', 'meta', 'br', 'hr', 'img', 'input'].includes(tag.tag)\n if (selfClosing && !children) {\n return ` <${tag.tag}${attrs} />`\n }\n return ` <${tag.tag}${attrs}>${children}</${tag.tag}>`\n}\n\n/** 读取并处理 HTML 入口文件 */\nexport async function readHtmlFile(root: string): Promise<string | null> {\n const htmlPath = path.resolve(root, 'index.html')\n if (!fs.existsSync(htmlPath)) return null\n return fs.readFileSync(htmlPath, 'utf-8')\n}\n","// 环境变量加载 - 读取 .env 文件并生成 import.meta.env 定义\nimport path from 'node:path'\nimport fs from 'node:fs'\n\nexport interface EnvRecord {\n [key: string]: string\n}\n\n/**\n * 从 .env 文件加载环境变量,按优先级合并:\n * .env < .env.[mode] < .env.local < .env.[mode].local\n */\nexport function loadEnv(mode: string, root: string, prefixes: string[]): EnvRecord {\n const envFiles = [\n '.env',\n `.env.${mode}`,\n '.env.local',\n `.env.${mode}.local`,\n ]\n\n const raw: EnvRecord = {}\n\n for (const file of envFiles) {\n const filePath = path.resolve(root, file)\n if (!fs.existsSync(filePath)) continue\n const content = fs.readFileSync(filePath, 'utf-8')\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eqIdx = trimmed.indexOf('=')\n if (eqIdx === -1) continue\n const key = trimmed.slice(0, eqIdx).trim()\n let value = trimmed.slice(eqIdx + 1).trim()\n // 去除引号\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1)\n }\n raw[key] = value\n }\n }\n\n // 只保留符合 prefix 的变量\n const filtered: EnvRecord = {}\n for (const [key, value] of Object.entries(raw)) {\n if (prefixes.some((prefix) => key.startsWith(prefix))) {\n filtered[key] = value\n }\n }\n\n return filtered\n}\n\n/**\n * 将过滤后的 env 转为 Rolldown define 对象\n * 例: { VITE_FOO: 'bar' } → { 'import.meta.env.VITE_FOO': '\"bar\"' }\n * 同时注入 import.meta.env.MODE / DEV / PROD\n */\nexport function buildEnvDefine(env: EnvRecord, mode: string): Record<string, string> {\n const define: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(env)) {\n define[`import.meta.env.${key}`] = JSON.stringify(value)\n }\n\n define['import.meta.env.MODE'] = JSON.stringify(mode)\n define['import.meta.env.DEV'] = mode !== 'production' ? 'true' : 'false'\n define['import.meta.env.PROD'] = mode === 'production' ? 'true' : 'false'\n define['import.meta.env.SSR'] = 'false'\n\n return define\n}\n\n/**\n * 在代码字符串中替换 import.meta.env.KEY(用于 dev 服务器按需转换)\n */\nexport function replaceEnvInCode(code: string, define: Record<string, string>): string {\n let result = code\n for (const [key, value] of Object.entries(define)) {\n // 转义正则特殊字符\n const escaped = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n result = result.replace(new RegExp(escaped, 'g'), value)\n }\n return result\n}\n","// HTTP 中间件 - 请求拦截与按需转译\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport 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\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 // 检查缓存\n const cached = moduleGraph.getModuleByUrl(url)\n if (cached?.transformResult) {\n return cached.transformResult as { code: string; map?: unknown }\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 const cleanReqUrl = url.split('?')[0]\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 // OXC 转译 (TS/JSX/TSX)\n if (shouldTransform(filePath)) {\n const result = transformCode(filePath, code, {\n sourcemap: true,\n jsxRuntime: 'automatic',\n jsxImportSource: config.framework === 'vue' ? 'vue' : 'react',\n reactRefresh: config.framework !== 'vue',\n })\n code = result.code\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 // 重写 bare imports 为浏览器可用路径\n code = rewriteImports(code, config)\n\n const transformResult = { code }\n mod.transformResult = transformResult\n return transformResult\n}\n\n/** 用 rolldown 将 node_modules 包打包为浏览器可用的 ESM(含 CJS→ESM 转换) */\n// Promise 缓存:同一入口文件只打包一次,防止并发重复打包\nconst esmBundleCache = new Map<string, Promise<string>>()\n\nasync function bundlePackageAsEsm(entryFile: string): Promise<string> {\n if (!esmBundleCache.has(entryFile)) {\n esmBundleCache.set(entryFile, doBundlePackage(entryFile))\n }\n return esmBundleCache.get(entryFile)!\n}\n\nasync function doBundlePackage(entryFile: string): Promise<string> {\n const { rolldown } = await import('rolldown')\n\n const bundle = await rolldown({\n input: entryFile,\n // 仅将其他 npm 包外部化;相对路径(包内部文件)全部内联打包\n external: (id: string) => {\n if (id.startsWith('.') || id.startsWith('/') || /^[A-Za-z]:\\\\/.test(id)) return false\n return true\n },\n })\n\n const result = await bundle.generate({ format: 'esm', exports: 'named' })\n await bundle.close()\n\n let code = result.output[0].code\n\n // 替换 process.env.NODE_ENV(rolldown 的 define 选项在此版本无效)\n code = code.replace(/process\\.env\\.NODE_ENV/g, '\"development\"')\n\n // 将外部化的 bare specifier 改写为 /@modules/ 路径供浏览器加载\n // ⚠️ 必须用 ^ + m 锚定行首,只匹配真正的 import/export 声明,\n // 避免误匹配字符串内出现的 from \"...\" 导致 SyntaxError\n code = code\n .replace(/^(import\\b[^;'\"]*?\\bfrom\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`)\n .replace(/^(export\\b[^;'\"]*?\\bfrom\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`)\n .replace(/^(import\\s+)(['\"])([^'\"./][^'\"]*)(\\2)/gm,\n (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`)\n\n // CJS 外部 require 改写:\n // rolldown 将 CJS 的 require(\"pkg\") 转为 __require(\"pkg\"),在浏览器中抛异常。\n // 收集所有 __require(\"pkg\"),替换为顶层 ESM import 的变量引用。\n code = rewriteExternalRequires(code)\n\n // CJS 包的具名导出补全:\n // rolldown 将 CJS 包包装为 __commonJSMin,只输出 export default,\n // 导致 import { parse } from '/@modules/cookie' 等具名导入失败。\n // 通过 createRequire 在 Node.js 侧加载 CJS 模块,取出 exports 的 key,\n // 在 ESM bundle 末尾补上静态具名 export。\n if (code.includes('__commonJSMin')) {\n code = await injectCjsNamedExports(code, entryFile)\n }\n\n return code\n}\n\n/** 将 rolldown 生成的 __require(\"pkg\") 调用转换为顶层 ESM import */\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 __req_${safe} from \"/@modules/${pkg}\";`)\n result = result.replaceAll(`__require(\"${pkg}\")`, `__req_${safe}`)\n result = result.replaceAll(`__require('${pkg}')`, `__req_${safe}`)\n }\n\n return imports.join('\\n') + '\\n' + result\n}\n\nconst VALID_IDENT = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/\n\nasync function injectCjsNamedExports(code: string, entryFile: string): Promise<string> {\n try {\n const { createRequire } = await import('module')\n const req = createRequire(entryFile)\n const cjsExports = req(entryFile)\n if (!cjsExports || (typeof cjsExports !== 'object' && typeof cjsExports !== 'function') || Array.isArray(cjsExports)) return code\n\n const namedKeys = Object.keys(cjsExports).filter(\n (k) => k !== '__esModule' && k !== 'default' && VALID_IDENT.test(k),\n )\n if (namedKeys.length === 0) return code\n\n // 把末尾的 \"export default require_xxx();\" 改写为带具名 export 的形式\n return code.replace(\n /^export default (\\w+\\(\\));?\\s*$/m,\n (_, call) => [\n `const __cjsMod = ${call};`,\n `export default __cjsMod;`,\n ...namedKeys.map((k) => `export const ${k} = __cjsMod[${JSON.stringify(k)}];`),\n ].join('\\n'),\n )\n } catch {\n return code\n }\n}\n\n/** 重写 import/export 语句中的 bare specifier */\nfunction rewriteImports(code: string, _config: ResolvedConfig): string {\n // 处理所有 from '...' 形式(import ... from、export ... from、export * from)\n return code.replace(\n /\\bfrom\\s+(['\"])([^'\"./][^'\"]*)\\1/g,\n (match, quote: string, specifier: string) => {\n return `from ${quote}/@modules/${specifier}${quote}`\n },\n ).replace(\n // 处理纯副作用导入: import 'bare-specifier'\n /\\bimport\\s+(['\"])([^'\"./][^'\"]*)\\1/g,\n (match, quote: string, specifier: string) => {\n return `import ${quote}/@modules/${specifier}${quote}`\n },\n ).replace(\n // 处理动态导入: import('bare-specifier')\n /\\bimport\\s*\\(\\s*(['\"])([^'\"./][^'\"]*)\\1\\s*\\)/g,\n (match, quote: string, specifier: string) => {\n return `import(${quote}/@modules/${specifier}${quote})`\n },\n )\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 const direct = path.join(pkgDir, 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 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 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();\n\nsocket.addEventListener('message', ({ data }) => {\n const payload = JSON.parse(data);\n switch (payload.type) {\n case 'connected':\n console.log('[nasti] connected.');\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 break;\n case 'full-reload':\n console.log('[nasti] full reload');\n location.reload();\n break;\n case 'error':\n console.error('[nasti] error:', payload.err.message);\n showErrorOverlay(payload.err);\n break;\n }\n});\n\nasync function fetchUpdate(update) {\n const mod = hotModulesMap.get(update.path);\n if (mod) {\n const newMod = await import(update.acceptedPath + '?t=' + update.timestamp);\n mod.callbacks.forEach((cb) => cb(newMod));\n } else {\n // 没有注册 hot 回调,尝试重新 import\n await import(update.path + '?t=' + update.timestamp);\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 showErrorOverlay(err) {\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// import.meta.hot API\nconst createHotContext = (ownerPath) => ({\n accept(deps, callback) {\n if (typeof deps === 'function' || !deps) {\n // self-accepting\n const callbacks = hotModulesMap.get(ownerPath)?.callbacks || [];\n callbacks.push(deps || (() => {}));\n hotModulesMap.set(ownerPath, { callbacks });\n }\n },\n prune(callback) {\n // 模块被移除时执行\n },\n dispose(callback) {\n // 模块更新前执行清理\n },\n invalidate() {\n location.reload();\n },\n data: {},\n});\n\n// 暴露给模块使用\nif (!window.__nasti_hot_map) window.__nasti_hot_map = new Map();\nwindow.__NASTI_HMR__ = { createHotContext };\n`\n}\n","// HMR 逻辑 - 文件变更 → 模块失效 → 通知客户端\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport type { DevServer, ModuleNode, HmrPayload, HmrUpdate, HmrContext } from '../types.js'\nimport { ModuleGraph } from '../core/module-graph.js'\n\nexport async function handleFileChange(\n file: string,\n server: DevServer,\n): Promise<void> {\n const { moduleGraph, ws, config } = server\n const relativePath = '/' + path.relative(config.root, file)\n\n // 找到受影响的模块\n const mods = moduleGraph.getModulesByFile(file)\n if (!mods || mods.size === 0) {\n // 未跟踪的文件变更,可能需要 full reload\n return\n }\n\n const updates: HmrUpdate[] = []\n const timestamp = Date.now()\n\n for (const mod of mods) {\n // 使缓存失效\n moduleGraph.invalidateModule(mod)\n\n // 执行插件的 handleHotUpdate 钩子\n const ctx: HmrContext = {\n file,\n timestamp,\n modules: [mod],\n read: () => fs.readFileSync(file, 'utf-8'),\n server,\n }\n\n let affectedModules: ModuleNode[] = [mod]\n for (const plugin of config.plugins) {\n if (plugin.handleHotUpdate) {\n const result = await plugin.handleHotUpdate(ctx)\n if (result) {\n affectedModules = result\n }\n }\n }\n\n // 检查 HMR 边界\n for (const affected of affectedModules) {\n const boundaries = (moduleGraph as ModuleGraph).getHmrBoundaries(affected)\n if (boundaries.length === 0) {\n // 无法热更新,full reload\n ws.send({ type: 'full-reload', path: relativePath })\n return\n }\n\n for (const { boundary } of boundaries) {\n updates.push({\n type: boundary.type === 'css' ? 'css-update' : 'js-update',\n path: boundary.url,\n acceptedPath: affected.url,\n timestamp,\n })\n }\n }\n }\n\n if (updates.length > 0) {\n ws.send({ type: 'update', updates })\n }\n}\n","// 模块解析插件 - 处理 bare imports、路径 alias、文件扩展名\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nexport function resolvePlugin(config: ResolvedConfig): NastiPlugin {\n const { alias, extensions } = config.resolve\n const require = createRequire(path.resolve(config.root, 'package.json'))\n\n return {\n name: 'nasti:resolve',\n enforce: 'pre',\n\n resolveId(source, importer) {\n // 1. 处理 alias\n for (const [key, value] of Object.entries(alias)) {\n if (source === key || source.startsWith(key + '/')) {\n source = source.replace(key, value)\n // 如果 alias 值是绝对路径就直接用,否则相对于 root 解析\n if (!path.isAbsolute(source)) {\n source = path.resolve(config.root, source)\n }\n break\n }\n }\n\n // 2. 绝对路径\n if (path.isAbsolute(source)) {\n const resolved = tryResolveFile(source, extensions)\n if (resolved) return resolved\n }\n\n // 3. 相对路径\n if (source.startsWith('.')) {\n const dir = importer ? path.dirname(importer) : config.root\n const absolute = path.resolve(dir, source)\n const resolved = tryResolveFile(absolute, extensions)\n if (resolved) return resolved\n }\n\n // 4. bare import (node_modules)\n if (!source.startsWith('/') && !source.startsWith('.')) {\n try {\n const resolved = require.resolve(source, {\n paths: [importer ? path.dirname(importer) : config.root],\n })\n return resolved\n } catch {\n return null\n }\n }\n\n return null\n },\n\n load(id) {\n if (!fs.existsSync(id)) return null\n // JSON 文件包装为 ES 模块\n if (id.endsWith('.json')) {\n const content = fs.readFileSync(id, 'utf-8')\n return `export default ${content}`\n }\n return fs.readFileSync(id, 'utf-8')\n },\n }\n}\n\n/** 尝试解析文件,带扩展名补全和 index 文件查找 */\nfunction tryResolveFile(file: string, extensions: string[]): string | null {\n // 精确路径\n if (fs.existsSync(file) && fs.statSync(file).isFile()) {\n return file\n }\n\n // 尝试加扩展名\n for (const ext of extensions) {\n const withExt = file + ext\n if (fs.existsSync(withExt) && fs.statSync(withExt).isFile()) {\n return withExt\n }\n }\n\n // 尝试作为目录查找 index 文件\n if (fs.existsSync(file) && fs.statSync(file).isDirectory()) {\n for (const ext of extensions) {\n const indexFile = path.join(file, 'index' + ext)\n if (fs.existsSync(indexFile)) {\n return indexFile\n }\n }\n }\n\n return null\n}\n","// CSS 处理插件 - 处理 .css 导入\nimport path from 'node:path'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nexport function cssPlugin(config: ResolvedConfig): NastiPlugin {\n return {\n name: 'nasti:css',\n\n resolveId(source) {\n if (source.endsWith('.css')) return null // 交给 resolve 插件处理\n return null\n },\n\n transform(code, id) {\n if (!id.endsWith('.css')) return null\n\n // 将 CSS 中的相对 url() 路径重写为绝对路径,确保打包后资源路径正确\n const rewritten = rewriteCssUrls(code, id, config.root)\n\n if (config.command === 'serve') {\n // Dev 模式: 将 CSS 转为 JS 模块,通过 style 标签注入\n const escaped = JSON.stringify(rewritten)\n return {\n code: `\nconst css = ${escaped};\nconst __nasti_css_id__ = ${JSON.stringify(id)};\nconst __nasti_existing__ = document.querySelector('style[data-nasti-css=' + JSON.stringify(__nasti_css_id__) + ']');\nif (__nasti_existing__) __nasti_existing__.remove();\nconst style = document.createElement('style');\nstyle.setAttribute('data-nasti-css', __nasti_css_id__);\nstyle.textContent = css;\ndocument.head.appendChild(style);\n\n// HMR\nif (import.meta.hot) {\n import.meta.hot.accept();\n import.meta.hot.prune(() => {\n style.remove();\n });\n}\n\nexport default css;\n`,\n }\n }\n\n // Build 模式: 返回重写后的 CSS,由 rolldown 处理提取\n return rewritten !== code ? { code: rewritten } : null\n },\n }\n}\n\n/** CSS URL 重写(将相对路径转为绝对路径) */\nexport function rewriteCssUrls(css: string, from: string, root: string): string {\n return css.replace(/url\\(\\s*['\"]?([^'\")\\s]+)['\"]?\\s*\\)/g, (match, url: string) => {\n // 跳过绝对路径、data URI、http(s) URL\n if (url.startsWith('/') || url.startsWith('data:') || url.startsWith('http')) {\n return match\n }\n const resolved = path.resolve(path.dirname(from), url)\n const relative = '/' + path.relative(root, resolved)\n return `url(${relative})`\n })\n}\n","// 静态资源处理插件 - 图片、字体等\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport crypto from 'node:crypto'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nconst ASSET_EXTENSIONS = new Set([\n '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.webp', '.avif',\n '.mp4', '.webm', '.ogg', '.mp3', '.wav', '.flac', '.aac',\n '.woff', '.woff2', '.eot', '.ttf', '.otf',\n '.pdf', '.txt',\n])\n\nexport function assetsPlugin(config: ResolvedConfig): NastiPlugin {\n return {\n name: 'nasti:assets',\n\n resolveId(source) {\n // 处理 ?url 和 ?raw 后缀\n if (source.endsWith('?url') || source.endsWith('?raw')) {\n return source\n }\n return null\n },\n\n load(id) {\n const ext = path.extname(id.replace(/\\?.*$/, ''))\n\n // ?raw 查询: 返回文件原始内容\n if (id.endsWith('?raw')) {\n const file = id.slice(0, -4)\n if (fs.existsSync(file)) {\n const content = fs.readFileSync(file, 'utf-8')\n return `export default ${JSON.stringify(content)}`\n }\n }\n\n // ?url 查询或静态资源扩展名: 返回 URL\n if (id.endsWith('?url') || ASSET_EXTENSIONS.has(ext)) {\n const file = id.replace(/\\?.*$/, '')\n if (!fs.existsSync(file)) return null\n\n if (config.command === 'serve') {\n // Dev 模式: 返回相对于 root 的路径\n const url = '/' + path.relative(config.root, file)\n return `export default ${JSON.stringify(url)}`\n }\n\n // Build 模式: 计算内容哈希用于文件名\n const content = fs.readFileSync(file)\n const hash = crypto.createHash('sha256').update(content).digest('hex').slice(0, 8)\n const basename = path.basename(file, ext)\n const hashedName = `${config.build.assetsDir}/${basename}.${hash}${ext}`\n return `export default ${JSON.stringify(config.base + hashedName)}`\n }\n\n return null\n },\n }\n}\n\nexport function isAssetFile(id: string): boolean {\n const ext = path.extname(id.replace(/\\?.*$/, ''))\n return ASSET_EXTENSIONS.has(ext)\n}\n","// Dev Server 主逻辑\nimport http from 'node:http'\nimport path from 'node:path'\nimport os from 'node:os'\nimport connect from 'connect'\nimport sirv from 'sirv'\nimport { watch } from 'chokidar'\nimport pc from 'picocolors'\nimport type { NastiConfig, ResolvedConfig, DevServer } from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { PluginContainer } from '../core/plugin-container.js'\nimport { ModuleGraph } from '../core/module-graph.js'\nimport { createWebSocketServer } from './ws.js'\nimport { transformMiddleware } from './middleware.js'\nimport { handleFileChange } from './hmr.js'\nimport { resolvePlugin } from '../plugins/resolve.js'\nimport { cssPlugin } from '../plugins/css.js'\nimport { assetsPlugin } from '../plugins/assets.js'\nimport { htmlPlugin } from '../plugins/html.js'\n\nexport async function createServer(inlineConfig: NastiConfig = {}): Promise<DevServer> {\n const config = await resolveConfig(inlineConfig, 'serve')\n\n // 组装内置插件 + 用户插件\n const allPlugins = [\n resolvePlugin(config),\n cssPlugin(config),\n assetsPlugin(config),\n htmlPlugin(config),\n ...config.plugins,\n ]\n const configWithPlugins: ResolvedConfig = { ...config, plugins: allPlugins }\n\n const moduleGraph = new ModuleGraph()\n const pluginContainer = new PluginContainer(configWithPlugins)\n\n // HTTP 服务\n const app = connect()\n\n // 转译中间件(处理 .ts, .tsx, .jsx, .css, .vue 等)\n app.use(transformMiddleware({\n config: configWithPlugins,\n pluginContainer,\n moduleGraph,\n }))\n\n // 静态文件服务(public 目录 + 项目根目录)\n const publicDir = path.resolve(config.root, 'public')\n app.use(sirv(publicDir, { dev: true, etag: true }))\n app.use(sirv(config.root, { dev: true, etag: true }))\n\n const httpServer = http.createServer(app)\n const ws = createWebSocketServer(httpServer)\n\n // 文件监听\n const watcher = watch(config.root, {\n ignored: [\n '**/node_modules/**',\n '**/.git/**',\n `**/${config.build.outDir}/**`,\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 // 执行插件的 configureServer 钩子\n const postMiddlewares: Array<() => void> = []\n for (const plugin of allPlugins) {\n if (plugin.configureServer) {\n const result = await plugin.configureServer(server! as any)\n if (typeof result === 'function') {\n postMiddlewares.push(result)\n }\n }\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 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 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","// 生产构建 - 调用 Rolldown API 打包\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { rolldown } from 'rolldown'\nimport type { NastiConfig, ResolvedConfig } from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { resolvePlugin } from '../plugins/resolve.js'\nimport { cssPlugin } from '../plugins/css.js'\nimport { assetsPlugin } from '../plugins/assets.js'\nimport { htmlPlugin, readHtmlFile, processHtml } from '../plugins/html.js'\nimport { transformCode, shouldTransform } from '../core/transformer.js'\nimport { loadEnv, buildEnvDefine } from '../core/env.js'\nimport { PluginContainer } from '../core/plugin-container.js'\nimport pc from 'picocolors'\n\nexport interface BuildResult {\n output: Array<{ fileName: string; type: string; code?: string; source?: Uint8Array | string }>\n}\n\nexport async function build(inlineConfig: NastiConfig = {}): Promise<BuildResult> {\n const config = await resolveConfig(inlineConfig, 'build')\n const startTime = performance.now()\n\n console.log(pc.cyan('\\n🔨 nasti build') + pc.dim(` v${__NASTI_VERSION__}`))\n console.log(pc.dim(` root: ${config.root}`))\n console.log(pc.dim(` mode: ${config.mode}`))\n\n const outDir = path.resolve(config.root, config.build.outDir)\n\n // 清空输出目录\n if (config.build.emptyOutDir && fs.existsSync(outDir)) {\n fs.rmSync(outDir, { recursive: true, force: true })\n }\n fs.mkdirSync(outDir, { recursive: true })\n\n // 查找 HTML 入口中的 script 标签作为 entry\n const html = await readHtmlFile(config.root)\n let entryPoints: string[] = []\n\n if (html) {\n const scriptMatches = html.matchAll(/<script[^>]+src=[\"']([^\"']+)[\"'][^>]*>/gi)\n for (const match of scriptMatches) {\n const src = match[1]\n if (src && !src.startsWith('http')) {\n entryPoints.push(path.resolve(config.root, src.replace(/^\\//, '')))\n }\n }\n }\n\n if (entryPoints.length === 0) {\n // 回退: 尝试常见入口\n const fallbackEntries = ['src/main.ts', 'src/main.tsx', 'src/main.js', 'src/index.ts', 'src/index.tsx', 'src/index.js']\n for (const entry of fallbackEntries) {\n const fullPath = path.resolve(config.root, entry)\n if (fs.existsSync(fullPath)) {\n entryPoints.push(fullPath)\n break\n }\n }\n }\n\n if (entryPoints.length === 0) {\n throw new Error('No entry point found. Add a <script> tag to index.html or create src/main.ts')\n }\n\n // 构建内置插件 + 用户插件作为 Rolldown 插件\n const builtinPlugins = [\n resolvePlugin(config),\n cssPlugin(config),\n assetsPlugin(config),\n ]\n const allPlugins = [...builtinPlugins, ...config.plugins]\n\n // 运行插件的 buildStart 钩子,并收集 emitFile 输出文件\n const pluginContainer = new PluginContainer(config)\n await pluginContainer.buildStart()\n\n // oxc-transform 插件(作为 Rolldown 插件)\n const oxcTransformPlugin = {\n name: 'nasti:oxc-transform',\n transform(code: string, id: string) {\n if (!shouldTransform(id)) return null\n const result = transformCode(id, code, {\n sourcemap: !!config.build.sourcemap,\n jsxRuntime: 'automatic',\n jsxImportSource: config.framework === 'vue' ? 'vue' : 'react',\n })\n return { code: result.code, map: result.map ? JSON.parse(result.map) : undefined }\n },\n }\n\n // 加载环境变量并生成 define 替换表\n const env = loadEnv(config.mode, config.root, config.envPrefix)\n const envDefine = buildEnvDefine(env, config.mode)\n\n // 调用 Rolldown\n const bundle = await rolldown({\n input: entryPoints,\n define: envDefine,\n plugins: [\n oxcTransformPlugin,\n // 转换 Nasti 插件为 Rolldown 插件格式\n ...allPlugins.map((p) => ({\n name: p.name,\n resolveId: p.resolveId as any,\n load: p.load as any,\n transform: p.transform as any,\n buildStart: p.buildStart as any,\n buildEnd: p.buildEnd as any,\n })),\n ],\n ...(config.build.rolldownOptions as any),\n })\n\n const { output } = await bundle.write({\n dir: outDir,\n format: 'esm',\n sourcemap: !!config.build.sourcemap,\n minify: !!config.build.minify,\n entryFileNames: 'assets/[name].[hash].js',\n chunkFileNames: 'assets/[name].[hash].js',\n assetFileNames: 'assets/[name].[hash][extname]',\n })\n\n await bundle.close()\n await pluginContainer.buildEnd()\n\n // 将 emitFile 产出的文件写入输出目录\n for (const ef of pluginContainer.getEmittedFiles()) {\n const dest = path.resolve(outDir, ef.fileName)\n fs.mkdirSync(path.dirname(dest), { recursive: true })\n fs.writeFileSync(dest, ef.source)\n }\n\n // 处理 HTML\n if (html) {\n let processedHtml = html\n\n // 执行插件的 transformIndexHtml 钩子\n const htmlPlugin_ = htmlPlugin(config)\n if (htmlPlugin_.transformIndexHtml) {\n const result = await htmlPlugin_.transformIndexHtml(processedHtml)\n if (typeof result === 'string') {\n processedHtml = result\n } else if (result && 'html' in result) {\n processedHtml = processHtml(result.html, result.tags)\n } else if (Array.isArray(result)) {\n processedHtml = processHtml(processedHtml, result)\n }\n }\n\n // 替换 script src 为打包后的路径(支持多入口)\n for (const chunk of output) {\n if (chunk.type === 'chunk' && chunk.isEntry && chunk.facadeModuleId) {\n const originalEntry = path.relative(config.root, chunk.facadeModuleId)\n processedHtml = processedHtml.replace(\n new RegExp(`(src=[\"'])/?(${escapeRegExp(originalEntry)})([\"'])`, 'g'),\n `$1${config.base}${chunk.fileName}$3`,\n )\n }\n }\n\n fs.writeFileSync(path.resolve(outDir, 'index.html'), processedHtml)\n }\n\n const elapsed = ((performance.now() - startTime) / 1000).toFixed(2)\n const totalSize = output.reduce((sum, chunk) => {\n if (chunk.type === 'chunk' && chunk.code) return sum + chunk.code.length\n return sum\n }, 0)\n\n console.log(pc.green(`\\n✓ Built in ${elapsed}s`))\n console.log(pc.dim(` ${output.length} files, ${formatSize(totalSize)} total`))\n console.log(pc.dim(` output: ${config.build.outDir}/\\n`))\n\n return { output: output as any }\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} kB`\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n","// Nasti CLI - 命令行入口\nimport { cac } from 'cac'\nimport pc from 'picocolors'\n\nconst cli = cac('nasti')\n\n// nasti dev\ncli\n .command('[root]', 'Start dev server')\n .alias('dev')\n .option('--port <port>', 'Port number', { default: 3000 })\n .option('--host [host]', 'Hostname')\n .option('--open [path]', 'Open browser on startup')\n .option('--mode <mode>', 'Set env mode')\n .action(async (root: string | undefined, options: any) => {\n try {\n const { createServer } = await import('./server/index.js')\n const server = await createServer({\n root: root ?? '.',\n mode: options.mode ?? 'development',\n server: {\n port: options.port,\n host: options.host,\n open: options.open,\n },\n })\n await server.listen()\n } catch (err: any) {\n console.error(pc.red(`\\n Error starting dev server:\\n ${err.message}\\n`))\n if (err.stack) console.error(pc.dim(err.stack))\n process.exit(1)\n }\n })\n\n// nasti build\ncli\n .command('build [root]', 'Build for production')\n .option('--outDir <dir>', 'Output directory', { default: 'dist' })\n .option('--sourcemap', 'Generate source map')\n .option('--minify', 'Minify output', { default: true })\n .option('--mode <mode>', 'Set env mode')\n .action(async (root: string | undefined, options: any) => {\n try {\n const { build } = await import('./build/index.js')\n await build({\n root: root ?? '.',\n mode: options.mode ?? 'production',\n build: {\n outDir: options.outDir,\n sourcemap: options.sourcemap,\n minify: options.minify,\n },\n })\n } catch (err: any) {\n console.error(pc.red(`\\n Build failed:\\n ${err.message}\\n`))\n if (err.stack) console.error(pc.dim(err.stack))\n process.exit(1)\n }\n })\n\n// nasti preview\ncli\n .command('preview [root]', 'Preview production build')\n .option('--port <port>', 'Port number', { default: 4173 })\n .option('--host [host]', 'Hostname')\n .option('--outDir <dir>', 'Output directory to serve', { default: 'dist' })\n .action(async (root: string | undefined, options: any) => {\n try {\n const http = await import('node:http')\n const path = await import('node:path')\n const sirv = (await import('sirv')).default\n const connect = (await import('connect')).default\n\n const resolvedRoot = path.resolve(root ?? '.')\n const outDir = path.resolve(resolvedRoot, options.outDir)\n\n const app = connect()\n app.use(sirv(outDir, { single: true, etag: true, gzip: true, brotli: true }))\n\n const port = options.port\n const host = options.host === true ? '0.0.0.0' : (options.host ?? 'localhost')\n\n http.createServer(app).listen(port, host, () => {\n console.log()\n console.log(pc.cyan(' 🔍 nasti preview'))\n console.log()\n console.log(` ${pc.green('➜')} Local: ${pc.cyan(`http://localhost:${port}`)}`)\n console.log()\n })\n } catch (err: any) {\n console.error(pc.red(`\\n Preview failed:\\n ${err.message}\\n`))\n process.exit(1)\n }\n })\n\ncli.help()\ncli.version(__NASTI_VERSION__)\n\ncli.parse()\n"],"mappings":"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","names":["path","fs","transformSync","WsServer","path","fs","import_node_path","import_node_fs","path","fs","import_node_path","import_node_fs","fs","code","transformResult","rolldown","createRequire","path","exports","import_node_path","import_node_fs","path","fs","import_node_path","import_node_fs","require","path","fs","import_node_path","import_node_fs","path","import_node_path","path","fs","crypto","import_node_path","import_node_fs","connect","path","sirv","http","pc","transformRequest","os","import_node_path","pc","path","fs","import_node_path","import_node_fs","import_picocolors","import_picocolors","createServer","pc","build","http","path","sirv","connect"]}