@nasti-toolchain/nasti 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +22 -6
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +22 -5
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +21 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +21 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -780,11 +780,26 @@ function resolveUrlToFile(url, root) {
|
|
|
780
780
|
return null;
|
|
781
781
|
}
|
|
782
782
|
}
|
|
783
|
-
|
|
783
|
+
const filePath = import_node_path4.default.resolve(root, cleanUrl.replace(/^\//, ""));
|
|
784
|
+
if (import_node_fs4.default.existsSync(filePath) && import_node_fs4.default.statSync(filePath).isFile()) {
|
|
785
|
+
return filePath;
|
|
786
|
+
}
|
|
787
|
+
for (const ext of RESOLVE_EXTENSIONS) {
|
|
788
|
+
const withExt = filePath + ext;
|
|
789
|
+
if (import_node_fs4.default.existsSync(withExt)) return withExt;
|
|
790
|
+
}
|
|
791
|
+
for (const ext of RESOLVE_EXTENSIONS) {
|
|
792
|
+
const indexFile = import_node_path4.default.join(filePath, "index" + ext);
|
|
793
|
+
if (import_node_fs4.default.existsSync(indexFile)) return indexFile;
|
|
794
|
+
}
|
|
795
|
+
return null;
|
|
784
796
|
}
|
|
785
797
|
function isModuleRequest(url) {
|
|
786
798
|
const cleanUrl = url.split("?")[0];
|
|
787
|
-
|
|
799
|
+
if (/\.(ts|tsx|jsx|js|mjs|vue|css|json)$/.test(cleanUrl)) return true;
|
|
800
|
+
if (cleanUrl.startsWith("/@modules/")) return true;
|
|
801
|
+
if (!import_node_path4.default.extname(cleanUrl)) return true;
|
|
802
|
+
return false;
|
|
788
803
|
}
|
|
789
804
|
function getHmrClientCode() {
|
|
790
805
|
return `
|
|
@@ -884,7 +899,7 @@ if (!window.__nasti_hot_map) window.__nasti_hot_map = new Map();
|
|
|
884
899
|
window.__NASTI_HMR__ = { createHotContext };
|
|
885
900
|
`;
|
|
886
901
|
}
|
|
887
|
-
var import_node_path4, import_node_fs4, import_node_module;
|
|
902
|
+
var import_node_path4, import_node_fs4, import_node_module, RESOLVE_EXTENSIONS;
|
|
888
903
|
var init_middleware = __esm({
|
|
889
904
|
"src/server/middleware.ts"() {
|
|
890
905
|
"use strict";
|
|
@@ -894,6 +909,7 @@ var init_middleware = __esm({
|
|
|
894
909
|
init_transformer();
|
|
895
910
|
init_html();
|
|
896
911
|
init_env();
|
|
912
|
+
RESOLVE_EXTENSIONS = [".tsx", ".ts", ".jsx", ".js", ".mjs", ".json", ".vue"];
|
|
897
913
|
}
|
|
898
914
|
});
|
|
899
915
|
|
|
@@ -1230,7 +1246,7 @@ async function createServer(inlineConfig = {}) {
|
|
|
1230
1246
|
const localUrl = `http://localhost:${actualPort}`;
|
|
1231
1247
|
const networkUrl = host === "0.0.0.0" ? `http://${getNetworkAddress()}:${actualPort}` : null;
|
|
1232
1248
|
console.log();
|
|
1233
|
-
console.log(import_picocolors.default.cyan(" nasti dev server") + import_picocolors.default.dim(` v${"1.3.
|
|
1249
|
+
console.log(import_picocolors.default.cyan(" nasti dev server") + import_picocolors.default.dim(` v${"1.3.1"}`));
|
|
1234
1250
|
console.log();
|
|
1235
1251
|
console.log(` ${import_picocolors.default.green(">")} Local: ${import_picocolors.default.cyan(localUrl)}`);
|
|
1236
1252
|
if (networkUrl) {
|
|
@@ -1308,7 +1324,7 @@ __export(build_exports, {
|
|
|
1308
1324
|
async function build(inlineConfig = {}) {
|
|
1309
1325
|
const config = await resolveConfig(inlineConfig, "build");
|
|
1310
1326
|
const startTime = performance.now();
|
|
1311
|
-
console.log(import_picocolors2.default.cyan("\n\u{1F528} nasti build") + import_picocolors2.default.dim(` v${"1.3.
|
|
1327
|
+
console.log(import_picocolors2.default.cyan("\n\u{1F528} nasti build") + import_picocolors2.default.dim(` v${"1.3.1"}`));
|
|
1312
1328
|
console.log(import_picocolors2.default.dim(` root: ${config.root}`));
|
|
1313
1329
|
console.log(import_picocolors2.default.dim(` mode: ${config.mode}`));
|
|
1314
1330
|
const outDir = import_node_path10.default.resolve(config.root, config.build.outDir);
|
|
@@ -1533,6 +1549,6 @@ cli.command("preview [root]", "Preview production build").option("--port <port>"
|
|
|
1533
1549
|
}
|
|
1534
1550
|
});
|
|
1535
1551
|
cli.help();
|
|
1536
|
-
cli.version("1.3.
|
|
1552
|
+
cli.version("1.3.1");
|
|
1537
1553
|
cli.parse();
|
|
1538
1554
|
//# 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 { createRequire } from 'node:module'\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 // 读取源码\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/** 重写 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\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 try {\n const req = createRequire(path.resolve(root, 'package.json'))\n return req.resolve(moduleName)\n } catch {\n return null\n }\n }\n\n // 普通路径\n return path.resolve(root, cleanUrl.replace(/^\\//, ''))\n}\n\nfunction isModuleRequest(url: string): boolean {\n const cleanUrl = url.split('?')[0]\n return /\\.(ts|tsx|jsx|js|mjs|vue|css|json)$/.test(cleanUrl) ||\n cleanUrl.startsWith('/@modules/')\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAEM,gBAOA,eAUA,cAUO;AA7Bb;AAAA;AAAA;AAEA,IAAM,iBAA0C;AAAA,MAC9C,OAAO,CAAC;AAAA,MACR,YAAY,CAAC,OAAO,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,SAAS,MAAM;AAAA,MAC1E,YAAY,CAAC,UAAU,UAAU,WAAW,SAAS;AAAA,MACrD,YAAY,CAAC,UAAU,eAAe,UAAU,MAAM;AAAA,IACxD;AAEA,IAAM,gBAAwC;AAAA,MAC5C,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,CAAC;AAAA,MACR,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AAEA,IAAM,eAAsC;AAAA,MAC1C,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,iBAAiB,CAAC;AAAA,MAClB,aAAa;AAAA,IACf;AAEO,IAAM,WAAqE;AAAA,MAChF,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS,CAAC;AAAA,MACV,WAAW,CAAC,UAAU,OAAO;AAAA,MAC7B,UAAU;AAAA,IACZ;AAAA;AAAA;;;ACjCA,SAAS,kBAAkB,MAAsC;AAC/D,QAAM,eAAe,iBAAAA,QAAK,QAAQ,MAAM,eAAe;AACvD,MAAI,CAAC,eAAAC,QAAG,WAAW,YAAY,EAAG,QAAO,CAAC;AAE1C,MAAI;AACF,UAAM,UAAU,eAAAA,QAAG,aAAa,cAAc,OAAO;AAErD,UAAM,WAAW,QAAQ,QAAQ,eAAe,EAAE,EAAE,QAAQ,qBAAqB,EAAE;AACnF,UAAM,WAAW,KAAK,MAAM,QAAQ;AACpC,UAAM,QAAkC,UAAU,iBAAiB,SAAS,CAAC;AAC7E,UAAM,UAAkB,UAAU,iBAAiB,WAAW;AAE9D,UAAM,QAAgC,CAAC;AACvC,eAAW,CAAC,SAAS,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,UAAI,CAAC,QAAQ,OAAQ;AAErB,YAAM,WAAW,QAAQ,QAAQ,SAAS,EAAE;AAC5C,YAAM,cAAc,QAAQ,CAAC,EAAE,QAAQ,SAAS,EAAE;AAClD,YAAM,QAAQ,IAAI,iBAAAD,QAAK,QAAQ,MAAM,SAAS,WAAW;AAAA,IAC3D;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAaA,eAAsB,mBAAmB,MAAoC;AAC3E,aAAW,QAAQ,cAAc;AAC/B,UAAM,WAAW,iBAAAA,QAAK,QAAQ,MAAM,IAAI;AACxC,QAAI,CAAC,eAAAC,QAAG,WAAW,QAAQ,EAAG;AAE9B,QAAI,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,MAAM,GAAG;AACjD,aAAO,MAAM,aAAa,QAAQ;AAAA,IACpC;AACA,UAAM,MAAM,MAAM,WAAO,+BAAc,QAAQ,EAAE;AACjD,WAAO,IAAI,WAAW;AAAA,EACxB;AACA,SAAO,CAAC;AACV;AAEA,eAAe,aAAa,UAAwC;AAElE,QAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,eAAe;AACtD,QAAM,OAAO,eAAAD,QAAG,aAAa,UAAU,OAAO;AAC9C,QAAM,SAASC,eAAc,UAAU,MAAM;AAAA,IAC3C,YAAY,CAAC;AAAA,EACf,CAAC;AAGD,QAAM,UAAU,WAAW,gBAAgB,KAAK,IAAI,IAAI;AACxD,MAAI;AACF,mBAAAD,QAAG,cAAc,SAAS,OAAO,IAAI;AACrC,UAAM,MAAM,MAAM,WAAO,+BAAc,OAAO,EAAE;AAChD,WAAO,IAAI,WAAW;AAAA,EACxB,UAAE;AACA,mBAAAA,QAAG,WAAW,OAAO;AAAA,EACvB;AACF;AAEA,eAAsB,cACpB,eAA4B,CAAC,GAC7B,SACyB;AACzB,QAAM,OAAO,iBAAAD,QAAK,QAAQ,aAAa,QAAQ,SAAS,IAAI;AAC5D,QAAM,aAAa,MAAM,mBAAmB,IAAI;AAGhD,QAAM,SAAsB,UAAU,UAAU,CAAC,GAAG,UAAU,GAAG,YAAY;AAG7E,QAAM,aAA4B;AAAA,IAChC,GAAI,WAAW,WAAW,CAAC;AAAA,IAC3B,GAAI,aAAa,WAAW,CAAC;AAAA,EAC/B;AAGA,QAAM,MAAM,EAAE,MAAM,OAAO,QAAQ,SAAS,MAAM,QAAQ;AAC1D,aAAW,UAAU,YAAY;AAC/B,QAAI,OAAO,QAAQ;AACjB,YAAM,SAAS,MAAM,OAAO,OAAO,QAAQ,GAAG;AAC9C,UAAI,OAAQ,QAAO,OAAO,QAAQ,MAAM;AAAA,IAC1C;AAAA,EACF;AAGA,QAAM,WAA2B;AAAA,IAC/B;AAAA,IACA,MAAM,OAAO,QAAQ,SAAS;AAAA,IAC9B,MAAO,YAAY,UAAU,eAAe;AAAA,IAC5C,WAAW,OAAO,aAAa,SAAS;AAAA,IACxC;AAAA,IACA,SAAS;AAAA;AAAA,MAEP,OAAO,EAAE,GAAG,kBAAkB,IAAI,GAAG,GAAG,SAAS,QAAQ,OAAO,GAAG,OAAO,SAAS,MAAM;AAAA,MACzF,YAAa,OAAO,SAAS,cAAc,SAAS,QAAQ;AAAA,MAC5D,YAAa,OAAO,SAAS,cAAc,SAAS,QAAQ;AAAA,MAC5D,YAAa,OAAO,SAAS,cAAc,SAAS,QAAQ;AAAA,IAC9D;AAAA,IACA,SAAS,CAAC;AAAA,IACV,QAAQ,EAAE,GAAG,SAAS,QAAQ,GAAG,OAAO,OAAO;AAAA,IAC/C,OAAO,EAAE,GAAG,SAAS,OAAO,GAAG,OAAO,MAAM;AAAA,IAC5C,WAAY,MAAM,QAAQ,OAAO,SAAS,IACtC,OAAO,YACP,OAAO,YACL,CAAC,OAAO,SAAS,IACjB,CAAC,GAAG,SAAS,SAAS;AAAA,IAC5B,UAAU,OAAO,YAAY,SAAS;AAAA,EACxC;AAGA,QAAM,kBAAkB,WAAW,OAAO,CAAC,MAAM;AAC/C,QAAI,CAAC,EAAE,MAAO,QAAO;AACrB,QAAI,OAAO,EAAE,UAAU,WAAY,QAAO,EAAE,MAAM,UAAU,GAAG;AAC/D,WAAO,EAAE,UAAU;AAAA,EACrB,CAAC;AACD,WAAS,UAAU;AAGnB,aAAW,UAAU,SAAS,SAAS;AACrC,QAAI,OAAO,gBAAgB;AACzB,YAAM,OAAO,eAAe,QAAQ;AAAA,IACtC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,UAAyC,QAAW,QAAgC;AAC3F,QAAM,SAAS,EAAE,GAAG,OAAO;AAC3B,aAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,UAAM,MAAM,OAAO,GAAG;AACtB,QAAI,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,GAAG;AACzD,aAAO,GAAc,IAAI;AAAA,QACtB,OAAO,GAAc,KAA6B,CAAC;AAAA,QACpD;AAAA,MACF;AAAA,IACF,WAAW,QAAQ,QAAW;AAC5B,aAAO,GAAc,IAAI;AAAA,IAC3B;AAAA,EACF;AACA,SAAO;AACT;AA/JA,qBACA,kBACA,gBAmCM;AArCN;AAAA;AAAA;AAAA,sBAA8B;AAC9B,uBAAiB;AACjB,qBAAe;AAEf;AAiCA,IAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACqGA,SAAS,YAAY,SAAuC;AAC1D,QAAM,MAAqB,CAAC;AAC5B,QAAM,SAAwB,CAAC;AAC/B,QAAM,OAAsB,CAAC;AAE7B,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,YAAY,MAAO,KAAI,KAAK,MAAM;AAAA,aACpC,OAAO,YAAY,OAAQ,MAAK,KAAK,MAAM;AAAA,QAC/C,QAAO,KAAK,MAAM;AAAA,EACzB;AAEA,SAAO,CAAC,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI;AACpC;AA3JA,IAaa;AAbb;AAAA;AAAA;AAaO,IAAM,kBAAN,MAAsB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAA+E,oBAAI,IAAI;AAAA,MAE/F,YAAY,QAAwB;AAClC,aAAK,SAAS;AAEd,aAAK,UAAU,YAAY,OAAO,OAAO;AACzC,aAAK,MAAM,KAAK,cAAc;AAAA,MAChC;AAAA,MAEQ,gBAA+B;AACrC,cAAM,YAAY;AAClB,eAAO;AAAA,UACL,MAAM,QAAQ,QAAgB,UAAmB;AAC/C,mBAAO,UAAU,UAAU,QAAQ,QAAQ;AAAA,UAC7C;AAAA,UACA,SAAS,MAAM;AACb,kBAAM,WAAW,KAAK,YAAY,KAAK,QAAQ,SAAS,UAAU,aAAa,IAAI;AACnF,kBAAM,KAAK,WAAW,QAAQ;AAC9B,sBAAU,aAAa,IAAI,IAAI;AAAA,cAC7B;AAAA,cACA,QAAQ,KAAK,UAAU;AAAA,YACzB,CAAC;AACD,mBAAO;AAAA,UACT;AAAA,UACA,cAAc,KAAwB;AACpC,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,kBAA4E;AAC1E,eAAO,MAAM,KAAK,KAAK,aAAa,OAAO,CAAC;AAAA,MAC9C;AAAA,MAEA,MAAM,aAA4B;AAChC,mBAAW,UAAU,KAAK,SAAS;AACjC,cAAI,OAAO,YAAY;AACrB,kBAAM,OAAO,WAAW,KAAK,KAAK,GAAG;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,SAAS,OAA8B;AAC3C,mBAAW,UAAU,KAAK,SAAS;AACjC,cAAI,OAAO,UAAU;AACnB,kBAAM,OAAO,SAAS,KAAK,KAAK,KAAK,KAAK;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,UACJ,QACA,UACA,UAAiC,CAAC,GACR;AAC1B,mBAAW,UAAU,KAAK,SAAS;AACjC,cAAI,CAAC,OAAO,UAAW;AACvB,gBAAM,SAAS,MAAM,OAAO,UAAU;AAAA,YACpC,KAAK;AAAA,YACL;AAAA,YACA,YAAY;AAAA,YACZ,EAAE,SAAS,QAAQ,WAAW,OAAO,KAAK,MAAM;AAAA,UAClD;AACA,cAAI,UAAU,KAAM,QAAO;AAAA,QAC7B;AACA,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,KAAK,IAAiC;AAC1C,mBAAW,UAAU,KAAK,SAAS;AACjC,cAAI,CAAC,OAAO,KAAM;AAClB,gBAAM,SAAS,MAAM,OAAO,KAAK,KAAK,KAAK,KAAK,EAAE;AAClD,cAAI,UAAU,KAAM,QAAO;AAAA,QAC7B;AACA,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,UAAU,MAAc,IAAsC;AAClE,YAAI,cAAc;AAClB,mBAAW,UAAU,KAAK,SAAS;AACjC,cAAI,CAAC,OAAO,UAAW;AACvB,gBAAM,SAAS,MAAM,OAAO,UAAU,KAAK,KAAK,KAAK,aAAa,EAAE;AACpE,cAAI,UAAU,KAAM;AACpB,cAAI,OAAO,WAAW,UAAU;AAC9B,0BAAc;AAAA,UAChB,OAAO;AACL,0BAAc,OAAO;AAAA,UACvB;AAAA,QACF;AACA,eAAO,gBAAgB,OAAO,OAAO,EAAE,MAAM,YAAY;AAAA,MAC3D;AAAA;AAAA,MAGA,MAAM,cACJ,QACA,UAC8C;AAE9C,cAAM,gBAAgB,MAAM,KAAK,UAAU,QAAQ,UAAU;AAAA,UAC3D,SAAS,CAAC;AAAA,QACZ,CAAC;AACD,YAAI,iBAAiB,KAAM,QAAO;AAClC,cAAM,KAAK,OAAO,kBAAkB,WAAW,gBAAgB,cAAc;AAG7E,cAAM,aAAa,MAAM,KAAK,KAAK,EAAE;AACrC,YAAI,cAAc,KAAM,QAAO;AAC/B,cAAM,aAAa,OAAO,eAAe,WAAW,aAAa,WAAW;AAG5E,cAAM,kBAAkB,MAAM,KAAK,UAAU,YAAY,EAAE;AAC3D,cAAM,YAAY,mBAAmB,OACjC,aACA,OAAO,oBAAoB,WACzB,kBACA,gBAAgB;AAEtB,eAAO,EAAE,IAAI,MAAM,UAAU;AAAA,MAC/B;AAAA,MAEA,aAA4B;AAC1B,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAAA;AAAA;;;AC7IA,IAIa;AAJb;AAAA;AAAA;AAIO,IAAM,cAAN,MAAkB;AAAA,MACf,iBAAiB,oBAAI,IAAwB;AAAA,MAC7C,gBAAgB,oBAAI,IAAwB;AAAA,MAC5C,mBAAmB,oBAAI,IAA6B;AAAA,MAE5D,eAAe,KAAqC;AAClD,eAAO,KAAK,eAAe,IAAI,GAAG;AAAA,MACpC;AAAA,MAEA,cAAc,IAAoC;AAChD,eAAO,KAAK,cAAc,IAAI,EAAE;AAAA,MAClC;AAAA,MAEA,iBAAiB,MAA2C;AAC1D,eAAO,KAAK,iBAAiB,IAAI,IAAI;AAAA,MACvC;AAAA,MAEA,MAAM,mBAAmB,KAAkC;AACzD,YAAI,MAAM,KAAK,eAAe,IAAI,GAAG;AACrC,YAAI,IAAK,QAAO;AAEhB,cAAM,KAAK,aAAa,GAAG;AAC3B,aAAK,eAAe,IAAI,KAAK,GAAG;AAChC,eAAO;AAAA,MACT;AAAA,MAEA,aAAa,KAAa,IAAyB;AACjD,cAAM,MAAkB;AAAA,UACtB,IAAI,MAAM;AAAA,UACV,MAAM;AAAA,UACN;AAAA,UACA,MAAM,IAAI,SAAS,MAAM,IAAI,QAAQ;AAAA,UACrC,WAAW,oBAAI,IAAI;AAAA,UACnB,iBAAiB,oBAAI,IAAI;AAAA,UACzB,iBAAiB,oBAAI,IAAI;AAAA,UACzB,iBAAiB;AAAA,UACjB,kBAAkB;AAAA,UAClB,iBAAiB;AAAA,QACnB;AACA,aAAK,cAAc,IAAI,IAAI,IAAI,GAAG;AAClC,eAAO;AAAA,MACT;AAAA;AAAA,MAGA,eAAe,KAAiB,MAAoB;AAClD,YAAI,OAAO;AACX,YAAI,OAAO,KAAK,iBAAiB,IAAI,IAAI;AACzC,YAAI,CAAC,MAAM;AACT,iBAAO,oBAAI,IAAI;AACf,eAAK,iBAAiB,IAAI,MAAM,IAAI;AAAA,QACtC;AACA,aAAK,IAAI,GAAG;AAAA,MACd;AAAA;AAAA,MAGA,oBAAoB,KAAiB,aAAgC;AAEnE,mBAAW,YAAY,IAAI,iBAAiB;AAC1C,mBAAS,UAAU,OAAO,GAAG;AAAA,QAC/B;AACA,YAAI,gBAAgB,MAAM;AAG1B,mBAAW,MAAM,aAAa;AAC5B,gBAAM,cAAc,KAAK,cAAc,IAAI,EAAE;AAC7C,cAAI,aAAa;AACf,gBAAI,gBAAgB,IAAI,WAAW;AACnC,wBAAY,UAAU,IAAI,GAAG;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA;AAAA,MAGA,iBAAiB,KAAuB;AACtC,YAAI,kBAAkB;AACtB,YAAI,mBAAmB,KAAK,IAAI;AAAA,MAClC;AAAA;AAAA,MAGA,gBAAsB;AACpB,mBAAW,OAAO,KAAK,cAAc,OAAO,GAAG;AAC7C,eAAK,iBAAiB,GAAG;AAAA,QAC3B;AAAA,MACF;AAAA;AAAA,MAGA,iBAAiB,KAAsE;AACrF,cAAM,aAAkE,CAAC;AACzE,cAAM,UAAU,oBAAI,IAAgB;AAEpC,cAAM,YAAY,CAAC,MAAkB,QAA6B;AAChE,cAAI,QAAQ,IAAI,IAAI,EAAG,QAAO;AAC9B,kBAAQ,IAAI,IAAI;AAGhB,cAAI,KAAK,iBAAiB;AACxB,uBAAW,KAAK,EAAE,UAAU,MAAM,aAAa,IAAI,CAAC;AACpD,mBAAO;AAAA,UACT;AAGA,cAAI,KAAK,gBAAgB,IAAI,GAAG,GAAG;AACjC,uBAAW,KAAK,EAAE,UAAU,MAAM,aAAa,IAAI,CAAC;AACpD,mBAAO;AAAA,UACT;AAGA,cAAI,KAAK,UAAU,SAAS,EAAG,QAAO;AAGtC,qBAAW,YAAY,KAAK,WAAW;AACrC,gBAAI,CAAC,UAAU,UAAU,IAAI,EAAG,QAAO;AAAA,UACzC;AACA,iBAAO;AAAA,QACT;AAGA,YAAI,IAAI,iBAAiB;AACvB,qBAAW,KAAK,EAAE,UAAU,KAAK,aAAa,IAAI,CAAC;AACnD,iBAAO;AAAA,QACT;AAGA,mBAAW,YAAY,IAAI,WAAW;AACpC,cAAI,CAAC,UAAU,UAAU,GAAG,GAAG;AAE7B,mBAAO,CAAC;AAAA,UACV;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACpIO,SAAS,sBAAsB,QAA+B;AACnE,QAAM,MAAM,IAAI,UAAAG,gBAAS,EAAE,UAAU,KAAK,CAAC;AAC3C,QAAM,UAAU,oBAAI,IAAe;AAGnC,SAAO,GAAG,WAAW,CAAC,KAAU,QAAa,SAAc;AACzD,QAAI,IAAI,QAAQ,wBAAwB,MAAM,aAAa;AACzD,UAAI,cAAc,KAAK,QAAQ,MAAM,CAAC,OAAO;AAC3C,YAAI,KAAK,cAAc,IAAI,GAAG;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,MAAI,GAAG,cAAc,CAAC,OAAO;AAC3B,YAAQ,IAAI,EAAE;AACd,OAAG,KAAK,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC,CAAC;AAE7C,OAAG,GAAG,SAAS,MAAM;AACnB,cAAQ,OAAO,EAAE;AAAA,IACnB,CAAC;AAED,OAAG,GAAG,SAAS,CAAC,QAAQ;AACtB,cAAQ,MAAM,4BAA4B,GAAG;AAC7C,cAAQ,OAAO,EAAE;AAAA,IACnB,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL,KAAK,SAAqB;AACxB,YAAM,OAAO,KAAK,UAAU,OAAO;AACnC,iBAAW,UAAU,SAAS;AAC5B,YAAI,OAAO,eAAe,GAAG;AAC3B,iBAAO,KAAK,IAAI;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ;AACN,cAAQ,MAAM;AACd,UAAI,MAAM;AAAA,IACZ;AAAA,EACF;AACF;AA7CA,IACA;AADA;AAAA;AAAA;AACA,gBAA4D;AAAA;AAAA;;;ACqBrD,SAAS,gBAAgB,IAAqB;AACnD,SACE,cAAc,KAAK,EAAE,KACrB,eAAe,KAAK,EAAE,KACrB,cAAc,KAAK,EAAE,KAAK;AAE/B;AAEO,SAAS,cACd,UACA,MACA,UAA4B,CAAC,GACZ;AACjB,QAAM,OAAO,cAAc,KAAK,QAAQ,KAAK,SAAS,KAAK,QAAQ;AACnE,QAAM,QAAQ,eAAe,KAAK,QAAQ;AAE1C,QAAM,aAAS,oCAAc,UAAU,MAAM;AAAA,IAC3C,YAAY,OAAO,CAAC,IAAI;AAAA,IACxB,KAAK,SAAS,SAAS,KAAK,QAAQ,IAChC;AAAA,MACE,SAAS,QAAQ,cAAc;AAAA,MAC/B,cAAc,QAAQ,mBAAmB;AAAA,MACzC,SAAS,QAAQ,gBAAgB;AAAA,IACnC,IACA;AAAA,IACJ,WAAW,QAAQ,aAAa;AAAA,EAClC,CAAC;AAED,MAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAAG;AAC7C,UAAM,MAAM,OAAO,OAAO,IAAI,CAAC,MAAW,EAAE,WAAW,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI;AAC3E,UAAM,IAAI,MAAM,4BAA4B,QAAQ;AAAA,EAAM,GAAG,EAAE;AAAA,EACjE;AAEA,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,KAAK,OAAO,MAAM,KAAK,UAAU,OAAO,GAAG,IAAI;AAAA,EACjD;AACF;AA3DA,IACA,sBAgBM,eACA,eACA;AAnBN;AAAA;AAAA;AACA,2BAA8B;AAgB9B,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AACtB,IAAM,iBAAiB;AAAA;AAAA;;;ACdhB,SAAS,WAAW,QAAqC;AAC9D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IAET,mBAAmB,MAAM;AACvB,YAAM,OAA4B,CAAC;AAEnC,UAAI,OAAO,YAAY,SAAS;AAE9B,aAAK,KAAK;AAAA,UACR,KAAK;AAAA,UACL,OAAO,EAAE,MAAM,UAAU,KAAK,iBAAiB;AAAA,UAC/C,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAEA,aAAO,EAAE,MAAM,KAAK;AAAA,IACtB;AAAA,EACF;AACF;AAGO,SAAS,YACd,MACA,MACQ;AACR,QAAM,cAAc,KAAK,OAAO,CAAC,MAAM,EAAE,aAAa,cAAc;AACpE,QAAM,OAAO,KAAK,OAAO,CAAC,MAAM,EAAE,aAAa,UAAU,CAAC,EAAE,QAAQ;AACpE,QAAM,cAAc,KAAK,OAAO,CAAC,MAAM,EAAE,aAAa,cAAc;AACpE,QAAM,OAAO,KAAK,OAAO,CAAC,MAAM,EAAE,aAAa,MAAM;AAErD,MAAI,YAAY,QAAQ;AACtB,WAAO,KAAK,QAAQ,kBAAkB;AAAA,EAAa,cAAc,WAAW,CAAC,EAAE;AAAA,EACjF;AACA,MAAI,KAAK,QAAQ;AACf,WAAO,KAAK,QAAQ,aAAa,GAAG,cAAc,IAAI,CAAC;AAAA,QAAW;AAAA,EACpE;AACA,MAAI,YAAY,QAAQ;AACtB,WAAO,KAAK,QAAQ,kBAAkB;AAAA,EAAa,cAAc,WAAW,CAAC,EAAE;AAAA,EACjF;AACA,MAAI,KAAK,QAAQ;AACf,WAAO,KAAK,QAAQ,aAAa,GAAG,cAAc,IAAI,CAAC;AAAA,QAAW;AAAA,EACpE;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,MAAmC;AACxD,SAAO,KAAK,IAAI,YAAY,EAAE,KAAK,IAAI;AACzC;AAEA,SAAS,aAAa,KAAgC;AACpD,QAAM,QAAQ,IAAI,QACd,MACA,OAAO,QAAQ,IAAI,KAAK,EACrB,IAAI,CAAC,CAAC,GAAG,CAAC,MAAO,MAAM,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAI,EAChD,KAAK,GAAG,IACX;AACJ,QAAM,WACJ,OAAO,IAAI,aAAa,WACpB,IAAI,WACJ,IAAI,WACF,cAAc,IAAI,QAAQ,IAC1B;AAER,QAAM,cAAc,CAAC,QAAQ,QAAQ,MAAM,MAAM,OAAO,OAAO,EAAE,SAAS,IAAI,GAAG;AACjF,MAAI,eAAe,CAAC,UAAU;AAC5B,WAAO,MAAM,IAAI,GAAG,GAAG,KAAK;AAAA,EAC9B;AACA,SAAO,MAAM,IAAI,GAAG,GAAG,KAAK,IAAI,QAAQ,KAAK,IAAI,GAAG;AACtD;AAGA,eAAsB,aAAa,MAAsC;AACvE,QAAM,WAAW,kBAAAC,QAAK,QAAQ,MAAM,YAAY;AAChD,MAAI,CAAC,gBAAAC,QAAG,WAAW,QAAQ,EAAG,QAAO;AACrC,SAAO,gBAAAA,QAAG,aAAa,UAAU,OAAO;AAC1C;AAnFA,IACAC,mBACAC;AAFA;AAAA;AAAA;AACA,IAAAD,oBAAiB;AACjB,IAAAC,kBAAe;AAAA;AAAA;;;ACUR,SAAS,QAAQ,MAAc,MAAc,UAA+B;AACjF,QAAM,WAAW;AAAA,IACf;AAAA,IACA,QAAQ,IAAI;AAAA,IACZ;AAAA,IACA,QAAQ,IAAI;AAAA,EACd;AAEA,QAAM,MAAiB,CAAC;AAExB,aAAW,QAAQ,UAAU;AAC3B,UAAM,WAAW,kBAAAC,QAAK,QAAQ,MAAM,IAAI;AACxC,QAAI,CAAC,gBAAAC,QAAG,WAAW,QAAQ,EAAG;AAC9B,UAAM,UAAU,gBAAAA,QAAG,aAAa,UAAU,OAAO;AACjD,eAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,YAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,UAAI,UAAU,GAAI;AAClB,YAAM,MAAM,QAAQ,MAAM,GAAG,KAAK,EAAE,KAAK;AACzC,UAAI,QAAQ,QAAQ,MAAM,QAAQ,CAAC,EAAE,KAAK;AAE1C,UAAK,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAI;AAClD,gBAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,MAC3B;AACA,UAAI,GAAG,IAAI;AAAA,IACb;AAAA,EACF;AAGA,QAAM,WAAsB,CAAC;AAC7B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,SAAS,KAAK,CAAC,WAAW,IAAI,WAAW,MAAM,CAAC,GAAG;AACrD,eAAS,GAAG,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AACT;AAOO,SAAS,eAAe,KAAgB,MAAsC;AACnF,QAAM,SAAiC,CAAC;AAExC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,WAAO,mBAAmB,GAAG,EAAE,IAAI,KAAK,UAAU,KAAK;AAAA,EACzD;AAEA,SAAO,sBAAsB,IAAI,KAAK,UAAU,IAAI;AACpD,SAAO,qBAAqB,IAAI,SAAS,eAAe,SAAS;AACjE,SAAO,sBAAsB,IAAI,SAAS,eAAe,SAAS;AAClE,SAAO,qBAAqB,IAAI;AAEhC,SAAO;AACT;AAKO,SAAS,iBAAiB,MAAc,QAAwC;AACrF,MAAI,SAAS;AACb,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAEjD,UAAM,UAAU,IAAI,QAAQ,uBAAuB,MAAM;AACzD,aAAS,OAAO,QAAQ,IAAI,OAAO,SAAS,GAAG,GAAG,KAAK;AAAA,EACzD;AACA,SAAO;AACT;AApFA,IACAC,mBACAC;AAFA;AAAA;AAAA;AACA,IAAAD,oBAAiB;AACjB,IAAAC,kBAAe;AAAA;AAAA;;;ACFf;AAAA;AAAA;AAAA;AAAA;AAoBO,SAAS,oBAAoB,KAAiC;AAEnE,MAAI,YAAY;AAAA,IACd,QAAQ,IAAI,OAAO,MAAM,IAAI,OAAO,MAAM,IAAI,OAAO,SAAS;AAAA,IAC9D,IAAI,OAAO;AAAA,EACb;AACA,SAAO,OAAO,KAAsB,KAAqB,SAAqB;AAC5E,UAAM,MAAM,IAAI,OAAO;AAGvB,QAAI,IAAI,OAAO,OAAO,MAAM;AAC1B,YAAM,SAAS,IAAI,QAAQ,UAAU;AACrC,UAAI,UAAU,+BAA+B,MAAM;AACnD,UAAI,UAAU,gCAAgC,oBAAoB;AAClE,UAAI,UAAU,gCAAgC,cAAc;AAC5D,UAAI,IAAI,WAAW,WAAW;AAC5B,YAAI,aAAa;AACjB,YAAI,IAAI;AACR;AAAA,MACF;AAAA,IACF;AAGA,QAAI,IAAI,WAAW,MAAO,QAAO,KAAK;AAGtC,QAAI,QAAQ,kBAAkB;AAC5B,UAAI,UAAU,gBAAgB,wBAAwB;AACtD,UAAI,IAAI,iBAAiB,CAAC;AAC1B;AAAA,IACF;AAGA,QAAI,QAAQ,OAAO,IAAI,SAAS,OAAO,GAAG;AACxC,YAAM,OAAO,MAAM,aAAa,IAAI,OAAO,IAAI;AAC/C,UAAI,MAAM;AACR,YAAI,gBAAgB;AAGpB,mBAAW,UAAU,IAAI,OAAO,SAAS;AACvC,cAAI,OAAO,oBAAoB;AAC7B,kBAAM,SAAS,MAAM,OAAO,mBAAmB,aAAa;AAC5D,gBAAI,OAAO,WAAW,UAAU;AAC9B,8BAAgB;AAAA,YAClB,WAAW,UAAU,UAAU,QAAQ;AACrC,8BAAgB,YAAY,OAAO,MAAM,OAAO,IAAI;AAAA,YACtD,WAAW,MAAM,QAAQ,MAAM,GAAG;AAChC,8BAAgB,YAAY,eAAe,MAAM;AAAA,YACnD;AAAA,UACF;AAAA,QACF;AAEA,YAAI,UAAU,gBAAgB,WAAW;AACzC,YAAI,IAAI,aAAa;AACrB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,gBAAgB,GAAG,GAAG;AACxB,UAAI;AACF,cAAM,SAAS,MAAM,iBAAiB,KAAK,GAAG;AAC9C,YAAI,QAAQ;AACV,gBAAM,cAAc,IAAI,SAAS,MAAM,IACnC,2BACA;AACJ,cAAI,UAAU,gBAAgB,WAAW;AACzC,cAAI,UAAU,iBAAiB,UAAU;AACzC,cAAI,IAAI,OAAO,WAAW,WAAW,SAAS,OAAO,IAAI;AACzD;AAAA,QACF;AAAA,MACF,SAAS,KAAU;AACjB,gBAAQ,MAAM,4BAA4B,GAAG,IAAI,IAAI,OAAO;AAC5D,YAAI,aAAa;AACjB,YAAI,IAAI,oBAAoB,IAAI,OAAO,EAAE;AACzC;AAAA,MACF;AAAA,IACF;AAEA,SAAK;AAAA,EACP;AACF;AAGA,eAAsB,iBACpB,KACA,KACiD;AACjD,QAAM,EAAE,QAAQ,iBAAiB,YAAY,IAAI;AAGjD,QAAM,SAAS,YAAY,eAAe,GAAG;AAC7C,MAAI,QAAQ,iBAAiB;AAC3B,WAAO,OAAO;AAAA,EAChB;AAGA,QAAM,WAAW,iBAAiB,KAAK,OAAO,IAAI;AAClD,MAAI,CAAC,YAAY,CAAC,gBAAAC,QAAG,WAAW,QAAQ,EAAG,QAAO;AAGlD,QAAM,MAAM,MAAM,YAAY,mBAAmB,GAAG;AACpD,cAAY,eAAe,KAAK,QAAQ;AAGxC,MAAI,OAAO,gBAAAA,QAAG,aAAa,UAAU,OAAO;AAG5C,QAAM,eAAe,MAAM,gBAAgB,UAAU,MAAM,QAAQ;AACnE,MAAI,cAAc;AAChB,WAAO,OAAO,iBAAiB,WAAW,eAAe,aAAa;AAAA,EACxE;AAGA,MAAI,gBAAgB,QAAQ,GAAG;AAC7B,UAAM,SAAS,cAAc,UAAU,MAAM;AAAA,MAC3C,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,iBAAiB,OAAO,cAAc,QAAQ,QAAQ;AAAA,MACtD,cAAc,OAAO,cAAc;AAAA,IACrC,CAAC;AACD,WAAO,OAAO;AAAA,EAChB;AAGA,QAAM,YAAY,IAAI,aAAa;AAAA,IACjC,QAAQ,OAAO,MAAM,OAAO,MAAM,OAAO,SAAS;AAAA,IAClD,OAAO;AAAA,EACT;AACA,SAAO,iBAAiB,MAAM,SAAS;AAGvC,SAAO,eAAe,MAAM,MAAM;AAElC,QAAM,kBAAkB,EAAE,KAAK;AAC/B,MAAI,kBAAkB;AACtB,SAAO;AACT;AAGA,SAAS,eAAe,MAAc,SAAiC;AAErE,SAAO,KAAK;AAAA,IACV;AAAA,IACA,CAAC,OAAO,OAAe,cAAsB;AAC3C,aAAO,QAAQ,KAAK,aAAa,SAAS,GAAG,KAAK;AAAA,IACpD;AAAA,EACF,EAAE;AAAA;AAAA,IAEA;AAAA,IACA,CAAC,OAAO,OAAe,cAAsB;AAC3C,aAAO,UAAU,KAAK,aAAa,SAAS,GAAG,KAAK;AAAA,IACtD;AAAA,EACF,EAAE;AAAA;AAAA,IAEA;AAAA,IACA,CAAC,OAAO,OAAe,cAAsB;AAC3C,aAAO,UAAU,KAAK,aAAa,SAAS,GAAG,KAAK;AAAA,IACtD;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,KAAa,MAA6B;AAElE,QAAM,WAAW,IAAI,MAAM,GAAG,EAAE,CAAC;AAGjC,MAAI,SAAS,WAAW,YAAY,GAAG;AACrC,UAAM,aAAa,SAAS,MAAM,aAAa,MAAM;AACrD,QAAI;AACF,YAAM,UAAM,kCAAc,kBAAAC,QAAK,QAAQ,MAAM,cAAc,CAAC;AAC5D,aAAO,IAAI,QAAQ,UAAU;AAAA,IAC/B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAGA,SAAO,kBAAAA,QAAK,QAAQ,MAAM,SAAS,QAAQ,OAAO,EAAE,CAAC;AACvD;AAEA,SAAS,gBAAgB,KAAsB;AAC7C,QAAM,WAAW,IAAI,MAAM,GAAG,EAAE,CAAC;AACjC,SAAO,sCAAsC,KAAK,QAAQ,KACxD,SAAS,WAAW,YAAY;AACpC;AAEA,SAAS,mBAA2B;AAClC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgGT;AAhTA,IACAC,mBACAC,iBACA;AAHA;AAAA;AAAA;AACA,IAAAD,oBAAiB;AACjB,IAAAC,kBAAe;AACf,yBAA8B;AAK9B;AACA;AACA;AAAA;AAAA;;;ACJA,eAAsB,iBACpB,MACA,QACe;AACf,QAAM,EAAE,aAAa,IAAI,OAAO,IAAI;AACpC,QAAM,eAAe,MAAM,kBAAAC,QAAK,SAAS,OAAO,MAAM,IAAI;AAG1D,QAAM,OAAO,YAAY,iBAAiB,IAAI;AAC9C,MAAI,CAAC,QAAQ,KAAK,SAAS,GAAG;AAE5B;AAAA,EACF;AAEA,QAAM,UAAuB,CAAC;AAC9B,QAAM,YAAY,KAAK,IAAI;AAE3B,aAAW,OAAO,MAAM;AAEtB,gBAAY,iBAAiB,GAAG;AAGhC,UAAM,MAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA,SAAS,CAAC,GAAG;AAAA,MACb,MAAM,MAAM,gBAAAC,QAAG,aAAa,MAAM,OAAO;AAAA,MACzC;AAAA,IACF;AAEA,QAAI,kBAAgC,CAAC,GAAG;AACxC,eAAW,UAAU,OAAO,SAAS;AACnC,UAAI,OAAO,iBAAiB;AAC1B,cAAM,SAAS,MAAM,OAAO,gBAAgB,GAAG;AAC/C,YAAI,QAAQ;AACV,4BAAkB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAGA,eAAW,YAAY,iBAAiB;AACtC,YAAM,aAAc,YAA4B,iBAAiB,QAAQ;AACzE,UAAI,WAAW,WAAW,GAAG;AAE3B,WAAG,KAAK,EAAE,MAAM,eAAe,MAAM,aAAa,CAAC;AACnD;AAAA,MACF;AAEA,iBAAW,EAAE,SAAS,KAAK,YAAY;AACrC,gBAAQ,KAAK;AAAA,UACX,MAAM,SAAS,SAAS,QAAQ,eAAe;AAAA,UAC/C,MAAM,SAAS;AAAA,UACf,cAAc,SAAS;AAAA,UACvB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,OAAG,KAAK,EAAE,MAAM,UAAU,QAAQ,CAAC;AAAA,EACrC;AACF;AArEA,IACAC,mBACAC;AAFA;AAAA;AAAA;AACA,IAAAD,oBAAiB;AACjB,IAAAC,kBAAe;AAAA;AAAA;;;ACIR,SAAS,cAAc,QAAqC;AACjE,QAAM,EAAE,OAAO,WAAW,IAAI,OAAO;AACrC,QAAMC,eAAU,mCAAc,kBAAAC,QAAK,QAAQ,OAAO,MAAM,cAAc,CAAC;AAEvE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IAET,UAAU,QAAQ,UAAU;AAE1B,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,YAAI,WAAW,OAAO,OAAO,WAAW,MAAM,GAAG,GAAG;AAClD,mBAAS,OAAO,QAAQ,KAAK,KAAK;AAElC,cAAI,CAAC,kBAAAA,QAAK,WAAW,MAAM,GAAG;AAC5B,qBAAS,kBAAAA,QAAK,QAAQ,OAAO,MAAM,MAAM;AAAA,UAC3C;AACA;AAAA,QACF;AAAA,MACF;AAGA,UAAI,kBAAAA,QAAK,WAAW,MAAM,GAAG;AAC3B,cAAM,WAAW,eAAe,QAAQ,UAAU;AAClD,YAAI,SAAU,QAAO;AAAA,MACvB;AAGA,UAAI,OAAO,WAAW,GAAG,GAAG;AAC1B,cAAM,MAAM,WAAW,kBAAAA,QAAK,QAAQ,QAAQ,IAAI,OAAO;AACvD,cAAM,WAAW,kBAAAA,QAAK,QAAQ,KAAK,MAAM;AACzC,cAAM,WAAW,eAAe,UAAU,UAAU;AACpD,YAAI,SAAU,QAAO;AAAA,MACvB;AAGA,UAAI,CAAC,OAAO,WAAW,GAAG,KAAK,CAAC,OAAO,WAAW,GAAG,GAAG;AACtD,YAAI;AACF,gBAAM,WAAWD,SAAQ,QAAQ,QAAQ;AAAA,YACvC,OAAO,CAAC,WAAW,kBAAAC,QAAK,QAAQ,QAAQ,IAAI,OAAO,IAAI;AAAA,UACzD,CAAC;AACD,iBAAO;AAAA,QACT,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,IAAI;AACP,UAAI,CAAC,gBAAAC,QAAG,WAAW,EAAE,EAAG,QAAO;AAE/B,UAAI,GAAG,SAAS,OAAO,GAAG;AACxB,cAAM,UAAU,gBAAAA,QAAG,aAAa,IAAI,OAAO;AAC3C,eAAO,kBAAkB,OAAO;AAAA,MAClC;AACA,aAAO,gBAAAA,QAAG,aAAa,IAAI,OAAO;AAAA,IACpC;AAAA,EACF;AACF;AAGA,SAAS,eAAe,MAAc,YAAqC;AAEzE,MAAI,gBAAAA,QAAG,WAAW,IAAI,KAAK,gBAAAA,QAAG,SAAS,IAAI,EAAE,OAAO,GAAG;AACrD,WAAO;AAAA,EACT;AAGA,aAAW,OAAO,YAAY;AAC5B,UAAM,UAAU,OAAO;AACvB,QAAI,gBAAAA,QAAG,WAAW,OAAO,KAAK,gBAAAA,QAAG,SAAS,OAAO,EAAE,OAAO,GAAG;AAC3D,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,gBAAAA,QAAG,WAAW,IAAI,KAAK,gBAAAA,QAAG,SAAS,IAAI,EAAE,YAAY,GAAG;AAC1D,eAAW,OAAO,YAAY;AAC5B,YAAM,YAAY,kBAAAD,QAAK,KAAK,MAAM,UAAU,GAAG;AAC/C,UAAI,gBAAAC,QAAG,WAAW,SAAS,GAAG;AAC5B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AA9FA,IACAC,mBACAC,iBACAC;AAHA;AAAA;AAAA;AACA,IAAAF,oBAAiB;AACjB,IAAAC,kBAAe;AACf,IAAAC,sBAA8B;AAAA;AAAA;;;ACCvB,SAAS,UAAU,QAAqC;AAC7D,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,UAAU,QAAQ;AAChB,UAAI,OAAO,SAAS,MAAM,EAAG,QAAO;AACpC,aAAO;AAAA,IACT;AAAA,IAEA,UAAU,MAAM,IAAI;AAClB,UAAI,CAAC,GAAG,SAAS,MAAM,EAAG,QAAO;AAGjC,YAAM,YAAY,eAAe,MAAM,IAAI,OAAO,IAAI;AAEtD,UAAI,OAAO,YAAY,SAAS;AAE9B,cAAM,UAAU,KAAK,UAAU,SAAS;AACxC,eAAO;AAAA,UACL,MAAM;AAAA,cACF,OAAO;AAAA,2BACM,KAAK,UAAU,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAkBrC;AAAA,MACF;AAGA,aAAO,cAAc,OAAO,EAAE,MAAM,UAAU,IAAI;AAAA,IACpD;AAAA,EACF;AACF;AAGO,SAAS,eAAe,KAAa,MAAc,MAAsB;AAC9E,SAAO,IAAI,QAAQ,uCAAuC,CAAC,OAAO,QAAgB;AAEhF,QAAI,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,MAAM,GAAG;AAC5E,aAAO;AAAA,IACT;AACA,UAAM,WAAW,kBAAAC,QAAK,QAAQ,kBAAAA,QAAK,QAAQ,IAAI,GAAG,GAAG;AACrD,UAAM,WAAW,MAAM,kBAAAA,QAAK,SAAS,MAAM,QAAQ;AACnD,WAAO,OAAO,QAAQ;AAAA,EACxB,CAAC;AACH;AA/DA,IACAC;AADA;AAAA;AAAA;AACA,IAAAA,oBAAiB;AAAA;AAAA;;;ACYV,SAAS,aAAa,QAAqC;AAChE,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,UAAU,QAAQ;AAEhB,UAAI,OAAO,SAAS,MAAM,KAAK,OAAO,SAAS,MAAM,GAAG;AACtD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,IAAI;AACP,YAAM,MAAM,kBAAAC,QAAK,QAAQ,GAAG,QAAQ,SAAS,EAAE,CAAC;AAGhD,UAAI,GAAG,SAAS,MAAM,GAAG;AACvB,cAAM,OAAO,GAAG,MAAM,GAAG,EAAE;AAC3B,YAAI,gBAAAC,QAAG,WAAW,IAAI,GAAG;AACvB,gBAAM,UAAU,gBAAAA,QAAG,aAAa,MAAM,OAAO;AAC7C,iBAAO,kBAAkB,KAAK,UAAU,OAAO,CAAC;AAAA,QAClD;AAAA,MACF;AAGA,UAAI,GAAG,SAAS,MAAM,KAAK,iBAAiB,IAAI,GAAG,GAAG;AACpD,cAAM,OAAO,GAAG,QAAQ,SAAS,EAAE;AACnC,YAAI,CAAC,gBAAAA,QAAG,WAAW,IAAI,EAAG,QAAO;AAEjC,YAAI,OAAO,YAAY,SAAS;AAE9B,gBAAM,MAAM,MAAM,kBAAAD,QAAK,SAAS,OAAO,MAAM,IAAI;AACjD,iBAAO,kBAAkB,KAAK,UAAU,GAAG,CAAC;AAAA,QAC9C;AAGA,cAAM,UAAU,gBAAAC,QAAG,aAAa,IAAI;AACpC,cAAM,OAAO,mBAAAC,QAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AACjF,cAAM,WAAW,kBAAAF,QAAK,SAAS,MAAM,GAAG;AACxC,cAAM,aAAa,GAAG,OAAO,MAAM,SAAS,IAAI,QAAQ,IAAI,IAAI,GAAG,GAAG;AACtE,eAAO,kBAAkB,KAAK,UAAU,OAAO,OAAO,UAAU,CAAC;AAAA,MACnE;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AA3DA,IACAG,mBACAC,iBACA,oBAGM;AANN;AAAA;AAAA;AACA,IAAAD,oBAAiB;AACjB,IAAAC,kBAAe;AACf,yBAAmB;AAGnB,IAAM,mBAAmB,oBAAI,IAAI;AAAA,MAC/B;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAS;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAS;AAAA,MAC1D;AAAA,MAAQ;AAAA,MAAS;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAS;AAAA,MAClD;AAAA,MAAS;AAAA,MAAU;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACnC;AAAA,MAAQ;AAAA,IACV,CAAC;AAAA;AAAA;;;ACXD;AAAA;AAAA;AAAA;AAoBA,eAAsB,aAAa,eAA4B,CAAC,GAAuB;AACrF,QAAM,SAAS,MAAM,cAAc,cAAc,OAAO;AAGxD,QAAM,aAAa;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,UAAU,MAAM;AAAA,IAChB,aAAa,MAAM;AAAA,IACnB,WAAW,MAAM;AAAA,IACjB,GAAG,OAAO;AAAA,EACZ;AACA,QAAM,oBAAoC,EAAE,GAAG,QAAQ,SAAS,WAAW;AAE3E,QAAM,cAAc,IAAI,YAAY;AACpC,QAAM,kBAAkB,IAAI,gBAAgB,iBAAiB;AAG7D,QAAM,UAAM,eAAAC,SAAQ;AAGpB,MAAI,IAAI,oBAAoB;AAAA,IAC1B,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF,CAAC,CAAC;AAGF,QAAM,YAAY,kBAAAC,QAAK,QAAQ,OAAO,MAAM,QAAQ;AACpD,MAAI,QAAI,YAAAC,SAAK,WAAW,EAAE,KAAK,MAAM,MAAM,KAAK,CAAC,CAAC;AAClD,MAAI,QAAI,YAAAA,SAAK,OAAO,MAAM,EAAE,KAAK,MAAM,MAAM,KAAK,CAAC,CAAC;AAEpD,QAAM,aAAa,iBAAAC,QAAK,aAAa,GAAG;AACxC,QAAM,KAAK,sBAAsB,UAAU;AAG3C,QAAM,cAAU,uBAAM,OAAO,MAAM;AAAA,IACjC,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA,MAAM,OAAO,MAAM,MAAM;AAAA,IAC3B;AAAA,IACA,eAAe;AAAA,EACjB,CAAC;AAGD,MAAI;AAEJ,UAAQ,GAAG,UAAU,CAAC,SAAiB;AACrC,qBAAiB,MAAM,MAAM;AAAA,EAC/B,CAAC;AAED,UAAQ,GAAG,OAAO,CAAC,SAAiB;AAClC,qBAAiB,MAAM,MAAM;AAAA,EAC/B,CAAC;AAGD,QAAM,kBAAqC,CAAC;AAC5C,aAAW,UAAU,YAAY;AAC/B,QAAI,OAAO,iBAAiB;AAC1B,YAAM,SAAS,MAAM,OAAO,gBAAgB,MAAc;AAC1D,UAAI,OAAO,WAAW,YAAY;AAChC,wBAAgB,KAAK,MAAM;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,WAAS;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IAEA,MAAM,OAAO,MAAe;AAC1B,YAAM,YAAY,QAAQ,OAAO,OAAO;AACxC,YAAM,OAAO,OAAO,OAAO,SAAS,OAAO,YAAa,OAAO,OAAO;AAEtE,YAAM,gBAAgB,WAAW;AAEjC,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAI,cAAc;AAElB,cAAM,cAAc,MAAM;AACxB,gBAAM,aAAc,WAAW,QAAQ,GAAW,QAAQ;AAC1D,gBAAM,WAAW,oBAAoB,UAAU;AAC/C,gBAAM,aAAa,SAAS,YAAY,UAAU,kBAAkB,CAAC,IAAI,UAAU,KAAK;AAExF,kBAAQ,IAAI;AACZ,kBAAQ,IAAI,kBAAAC,QAAG,KAAK,oBAAoB,IAAI,kBAAAA,QAAG,IAAI,KAAK,OAAiB,EAAE,CAAC;AAC5E,kBAAQ,IAAI;AACZ,kBAAQ,IAAI,KAAK,kBAAAA,QAAG,MAAM,GAAG,CAAC,aAAa,kBAAAA,QAAG,KAAK,QAAQ,CAAC,EAAE;AAC9D,cAAI,YAAY;AACd,oBAAQ,IAAI,KAAK,kBAAAA,QAAG,MAAM,GAAG,CAAC,aAAa,kBAAAA,QAAG,KAAK,UAAU,CAAC,EAAE;AAAA,UAClE;AACA,kBAAQ,IAAI;AAEZ,kBAAQ,MAAM;AAAA,QAChB;AAEA,mBAAW,GAAG,aAAa,WAAW;AACtC,mBAAW,GAAG,SAAS,CAAC,QAA+B;AACrD,cAAI,IAAI,SAAS,cAAc;AAC7B;AACA,oBAAQ,IAAI,kBAAAA,QAAG,OAAO,QAAQ,cAAc,CAAC,sBAAsB,WAAW,KAAK,CAAC;AACpF,uBAAW,OAAO,aAAa,IAAI;AAAA,UACrC,OAAO;AACL,mBAAO,GAAG;AAAA,UACZ;AAAA,QACF,CAAC;AAED,mBAAW,OAAO,aAAa,IAAI;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,iBAAiB,KAAa;AAClC,YAAM,EAAE,kBAAAC,kBAAiB,IAAI,MAAM;AACnC,aAAOA,kBAAiB,KAAK,EAAE,QAAQ,mBAAmB,iBAAiB,YAAY,CAAC;AAAA,IAC1F;AAAA,IAEA,MAAM,QAAQ;AACZ,YAAM,gBAAgB,SAAS;AAC/B,cAAQ,MAAM;AACd,SAAG,MAAM;AACT,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBAA4B;AACnC,QAAM,aAAa,eAAAC,QAAG,kBAAkB;AACxC,aAAW,QAAQ,OAAO,KAAK,UAAU,GAAG;AAC1C,eAAW,SAAS,WAAW,IAAI,KAAK,CAAC,GAAG;AAC1C,UAAI,MAAM,WAAW,UAAU,CAAC,MAAM,UAAU;AAC9C,eAAO,MAAM;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAhKA,IACA,kBACAC,mBACA,gBACA,gBACA,aACA,iBACA;AAPA;AAAA;AAAA;AACA,uBAAiB;AACjB,IAAAA,oBAAiB;AACjB,qBAAe;AACf,qBAAoB;AACpB,kBAAiB;AACjB,sBAAsB;AACtB,wBAAe;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;AClBA;AAAA;AAAA;AAAA;AAmBA,eAAsB,MAAM,eAA4B,CAAC,GAAyB;AAChF,QAAM,SAAS,MAAM,cAAc,cAAc,OAAO;AACxD,QAAM,YAAY,YAAY,IAAI;AAElC,UAAQ,IAAI,mBAAAC,QAAG,KAAK,yBAAkB,IAAI,mBAAAA,QAAG,IAAI,KAAK,OAAiB,EAAE,CAAC;AAC1E,UAAQ,IAAI,mBAAAA,QAAG,IAAI,WAAW,OAAO,IAAI,EAAE,CAAC;AAC5C,UAAQ,IAAI,mBAAAA,QAAG,IAAI,WAAW,OAAO,IAAI,EAAE,CAAC;AAE5C,QAAM,SAAS,mBAAAC,QAAK,QAAQ,OAAO,MAAM,OAAO,MAAM,MAAM;AAG5D,MAAI,OAAO,MAAM,eAAe,gBAAAC,QAAG,WAAW,MAAM,GAAG;AACrD,oBAAAA,QAAG,OAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACpD;AACA,kBAAAA,QAAG,UAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAGxC,QAAM,OAAO,MAAM,aAAa,OAAO,IAAI;AAC3C,MAAI,cAAwB,CAAC;AAE7B,MAAI,MAAM;AACR,UAAM,gBAAgB,KAAK,SAAS,0CAA0C;AAC9E,eAAW,SAAS,eAAe;AACjC,YAAM,MAAM,MAAM,CAAC;AACnB,UAAI,OAAO,CAAC,IAAI,WAAW,MAAM,GAAG;AAClC,oBAAY,KAAK,mBAAAD,QAAK,QAAQ,OAAO,MAAM,IAAI,QAAQ,OAAO,EAAE,CAAC,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY,WAAW,GAAG;AAE5B,UAAM,kBAAkB,CAAC,eAAe,gBAAgB,eAAe,gBAAgB,iBAAiB,cAAc;AACtH,eAAW,SAAS,iBAAiB;AACnC,YAAM,WAAW,mBAAAA,QAAK,QAAQ,OAAO,MAAM,KAAK;AAChD,UAAI,gBAAAC,QAAG,WAAW,QAAQ,GAAG;AAC3B,oBAAY,KAAK,QAAQ;AACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY,WAAW,GAAG;AAC5B,UAAM,IAAI,MAAM,8EAA8E;AAAA,EAChG;AAGA,QAAM,iBAAiB;AAAA,IACrB,cAAc,MAAM;AAAA,IACpB,UAAU,MAAM;AAAA,IAChB,aAAa,MAAM;AAAA,EACrB;AACA,QAAM,aAAa,CAAC,GAAG,gBAAgB,GAAG,OAAO,OAAO;AAGxD,QAAM,kBAAkB,IAAI,gBAAgB,MAAM;AAClD,QAAM,gBAAgB,WAAW;AAGjC,QAAM,qBAAqB;AAAA,IACzB,MAAM;AAAA,IACN,UAAU,MAAc,IAAY;AAClC,UAAI,CAAC,gBAAgB,EAAE,EAAG,QAAO;AACjC,YAAM,SAAS,cAAc,IAAI,MAAM;AAAA,QACrC,WAAW,CAAC,CAAC,OAAO,MAAM;AAAA,QAC1B,YAAY;AAAA,QACZ,iBAAiB,OAAO,cAAc,QAAQ,QAAQ;AAAA,MACxD,CAAC;AACD,aAAO,EAAE,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM,KAAK,MAAM,OAAO,GAAG,IAAI,OAAU;AAAA,IACnF;AAAA,EACF;AAGA,QAAM,MAAM,QAAQ,OAAO,MAAM,OAAO,MAAM,OAAO,SAAS;AAC9D,QAAM,YAAY,eAAe,KAAK,OAAO,IAAI;AAGjD,QAAM,SAAS,UAAM,0BAAS;AAAA,IAC5B,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,MACP;AAAA;AAAA,MAEA,GAAG,WAAW,IAAI,CAAC,OAAO;AAAA,QACxB,MAAM,EAAE;AAAA,QACR,WAAW,EAAE;AAAA,QACb,MAAM,EAAE;AAAA,QACR,WAAW,EAAE;AAAA,QACb,YAAY,EAAE;AAAA,QACd,UAAU,EAAE;AAAA,MACd,EAAE;AAAA,IACJ;AAAA,IACA,GAAI,OAAO,MAAM;AAAA,EACnB,CAAC;AAED,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,MAAM;AAAA,IACpC,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,WAAW,CAAC,CAAC,OAAO,MAAM;AAAA,IAC1B,QAAQ,CAAC,CAAC,OAAO,MAAM;AAAA,IACvB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB,CAAC;AAED,QAAM,OAAO,MAAM;AACnB,QAAM,gBAAgB,SAAS;AAG/B,aAAW,MAAM,gBAAgB,gBAAgB,GAAG;AAClD,UAAM,OAAO,mBAAAD,QAAK,QAAQ,QAAQ,GAAG,QAAQ;AAC7C,oBAAAC,QAAG,UAAU,mBAAAD,QAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,oBAAAC,QAAG,cAAc,MAAM,GAAG,MAAM;AAAA,EAClC;AAGA,MAAI,MAAM;AACR,QAAI,gBAAgB;AAGpB,UAAM,cAAc,WAAW,MAAM;AACrC,QAAI,YAAY,oBAAoB;AAClC,YAAM,SAAS,MAAM,YAAY,mBAAmB,aAAa;AACjE,UAAI,OAAO,WAAW,UAAU;AAC9B,wBAAgB;AAAA,MAClB,WAAW,UAAU,UAAU,QAAQ;AACrC,wBAAgB,YAAY,OAAO,MAAM,OAAO,IAAI;AAAA,MACtD,WAAW,MAAM,QAAQ,MAAM,GAAG;AAChC,wBAAgB,YAAY,eAAe,MAAM;AAAA,MACnD;AAAA,IACF;AAGA,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,SAAS,WAAW,MAAM,WAAW,MAAM,gBAAgB;AACnE,cAAM,gBAAgB,mBAAAD,QAAK,SAAS,OAAO,MAAM,MAAM,cAAc;AACrE,wBAAgB,cAAc;AAAA,UAC5B,IAAI,OAAO,gBAAgB,aAAa,aAAa,CAAC,WAAW,GAAG;AAAA,UACpE,KAAK,OAAO,IAAI,GAAG,MAAM,QAAQ;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAEA,oBAAAC,QAAG,cAAc,mBAAAD,QAAK,QAAQ,QAAQ,YAAY,GAAG,aAAa;AAAA,EACpE;AAEA,QAAM,YAAY,YAAY,IAAI,IAAI,aAAa,KAAM,QAAQ,CAAC;AAClE,QAAM,YAAY,OAAO,OAAO,CAAC,KAAK,UAAU;AAC9C,QAAI,MAAM,SAAS,WAAW,MAAM,KAAM,QAAO,MAAM,MAAM,KAAK;AAClE,WAAO;AAAA,EACT,GAAG,CAAC;AAEJ,UAAQ,IAAI,mBAAAD,QAAG,MAAM;AAAA,kBAAgB,OAAO,GAAG,CAAC;AAChD,UAAQ,IAAI,mBAAAA,QAAG,IAAI,KAAK,OAAO,MAAM,WAAW,WAAW,SAAS,CAAC,QAAQ,CAAC;AAC9E,UAAQ,IAAI,mBAAAA,QAAG,IAAI,aAAa,OAAO,MAAM,MAAM;AAAA,CAAK,CAAC;AAEzD,SAAO,EAAE,OAAsB;AACjC;AAEA,SAAS,WAAW,OAAuB;AACzC,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,SAAO,IAAI,QAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAC5C;AAEA,SAAS,aAAa,QAAwB;AAC5C,SAAO,OAAO,QAAQ,uBAAuB,MAAM;AACrD;AA1LA,IACAG,oBACAC,iBACA,iBAUAC;AAbA;AAAA;AAAA;AACA,IAAAF,qBAAiB;AACjB,IAAAC,kBAAe;AACf,sBAAyB;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC,qBAAe;AAAA;AAAA;;;ACZf,iBAAoB;AACpB,IAAAC,qBAAe;AAEf,IAAM,UAAM,gBAAI,OAAO;AAGvB,IACG,QAAQ,UAAU,kBAAkB,EACpC,MAAM,KAAK,EACX,OAAO,iBAAiB,eAAe,EAAE,SAAS,IAAK,CAAC,EACxD,OAAO,iBAAiB,UAAU,EAClC,OAAO,iBAAiB,yBAAyB,EACjD,OAAO,iBAAiB,cAAc,EACtC,OAAO,OAAO,MAA0B,YAAiB;AACxD,MAAI;AACF,UAAM,EAAE,cAAAC,cAAa,IAAI,MAAM;AAC/B,UAAM,SAAS,MAAMA,cAAa;AAAA,MAChC,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ,QAAQ;AAAA,MACtB,QAAQ;AAAA,QACN,MAAM,QAAQ;AAAA,QACd,MAAM,QAAQ;AAAA,QACd,MAAM,QAAQ;AAAA,MAChB;AAAA,IACF,CAAC;AACD,UAAM,OAAO,OAAO;AAAA,EACtB,SAAS,KAAU;AACjB,YAAQ,MAAM,mBAAAC,QAAG,IAAI;AAAA;AAAA,IAAqC,IAAI,OAAO;AAAA,CAAI,CAAC;AAC1E,QAAI,IAAI,MAAO,SAAQ,MAAM,mBAAAA,QAAG,IAAI,IAAI,KAAK,CAAC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IACG,QAAQ,gBAAgB,sBAAsB,EAC9C,OAAO,kBAAkB,oBAAoB,EAAE,SAAS,OAAO,CAAC,EAChE,OAAO,eAAe,qBAAqB,EAC3C,OAAO,YAAY,iBAAiB,EAAE,SAAS,KAAK,CAAC,EACrD,OAAO,iBAAiB,cAAc,EACtC,OAAO,OAAO,MAA0B,YAAiB;AACxD,MAAI;AACF,UAAM,EAAE,OAAAC,OAAM,IAAI,MAAM;AACxB,UAAMA,OAAM;AAAA,MACV,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ,QAAQ;AAAA,MACtB,OAAO;AAAA,QACL,QAAQ,QAAQ;AAAA,QAChB,WAAW,QAAQ;AAAA,QACnB,QAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,YAAQ,MAAM,mBAAAD,QAAG,IAAI;AAAA;AAAA,IAAwB,IAAI,OAAO;AAAA,CAAI,CAAC;AAC7D,QAAI,IAAI,MAAO,SAAQ,MAAM,mBAAAA,QAAG,IAAI,IAAI,KAAK,CAAC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IACG,QAAQ,kBAAkB,0BAA0B,EACpD,OAAO,iBAAiB,eAAe,EAAE,SAAS,KAAK,CAAC,EACxD,OAAO,iBAAiB,UAAU,EAClC,OAAO,kBAAkB,6BAA6B,EAAE,SAAS,OAAO,CAAC,EACzE,OAAO,OAAO,MAA0B,YAAiB;AACxD,MAAI;AACF,UAAME,QAAO,MAAM,OAAO,MAAW;AACrC,UAAMC,SAAO,MAAM,OAAO,MAAW;AACrC,UAAMC,SAAQ,MAAM,OAAO,MAAM,GAAG;AACpC,UAAMC,YAAW,MAAM,OAAO,SAAS,GAAG;AAE1C,UAAM,eAAeF,OAAK,QAAQ,QAAQ,GAAG;AAC7C,UAAM,SAASA,OAAK,QAAQ,cAAc,QAAQ,MAAM;AAExD,UAAM,MAAME,SAAQ;AACpB,QAAI,IAAID,MAAK,QAAQ,EAAE,QAAQ,MAAM,MAAM,MAAM,MAAM,MAAM,QAAQ,KAAK,CAAC,CAAC;AAE5E,UAAM,OAAO,QAAQ;AACrB,UAAM,OAAO,QAAQ,SAAS,OAAO,YAAa,QAAQ,QAAQ;AAElE,IAAAF,MAAK,aAAa,GAAG,EAAE,OAAO,MAAM,MAAM,MAAM;AAC9C,cAAQ,IAAI;AACZ,cAAQ,IAAI,mBAAAF,QAAG,KAAK,2BAAoB,CAAC;AACzC,cAAQ,IAAI;AACZ,cAAQ,IAAI,KAAK,mBAAAA,QAAG,MAAM,QAAG,CAAC,WAAW,mBAAAA,QAAG,KAAK,oBAAoB,IAAI,EAAE,CAAC,EAAE;AAC9E,cAAQ,IAAI;AAAA,IACd,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,YAAQ,MAAM,mBAAAA,QAAG,IAAI;AAAA;AAAA,IAA0B,IAAI,OAAO;AAAA,CAAI,CAAC;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,IAAI,KAAK;AACT,IAAI,QAAQ,OAAiB;AAE7B,IAAI,MAAM;","names":["path","fs","transformSync","WsServer","path","fs","import_node_path","import_node_fs","path","fs","import_node_path","import_node_fs","fs","path","import_node_path","import_node_fs","path","fs","import_node_path","import_node_fs","require","path","fs","import_node_path","import_node_fs","import_node_module","path","import_node_path","path","fs","crypto","import_node_path","import_node_fs","connect","path","sirv","http","pc","transformRequest","os","import_node_path","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 { createRequire } from 'node:module'\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 // 读取源码\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/** 重写 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']\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 try {\n const req = createRequire(path.resolve(root, 'package.json'))\n return req.resolve(moduleName)\n } catch {\n return null\n }\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","path","import_node_path","import_node_fs","path","fs","import_node_path","import_node_fs","require","path","fs","import_node_path","import_node_fs","import_node_module","path","import_node_path","path","fs","crypto","import_node_path","import_node_fs","connect","path","sirv","http","pc","transformRequest","os","import_node_path","pc","path","fs","import_node_path","import_node_fs","import_picocolors","import_picocolors","createServer","pc","build","http","path","sirv","connect"]}
|
package/dist/cli.js
CHANGED
|
@@ -759,11 +759,26 @@ function resolveUrlToFile(url, root) {
|
|
|
759
759
|
return null;
|
|
760
760
|
}
|
|
761
761
|
}
|
|
762
|
-
|
|
762
|
+
const filePath = path4.resolve(root, cleanUrl.replace(/^\//, ""));
|
|
763
|
+
if (fs4.existsSync(filePath) && fs4.statSync(filePath).isFile()) {
|
|
764
|
+
return filePath;
|
|
765
|
+
}
|
|
766
|
+
for (const ext of RESOLVE_EXTENSIONS) {
|
|
767
|
+
const withExt = filePath + ext;
|
|
768
|
+
if (fs4.existsSync(withExt)) return withExt;
|
|
769
|
+
}
|
|
770
|
+
for (const ext of RESOLVE_EXTENSIONS) {
|
|
771
|
+
const indexFile = path4.join(filePath, "index" + ext);
|
|
772
|
+
if (fs4.existsSync(indexFile)) return indexFile;
|
|
773
|
+
}
|
|
774
|
+
return null;
|
|
763
775
|
}
|
|
764
776
|
function isModuleRequest(url) {
|
|
765
777
|
const cleanUrl = url.split("?")[0];
|
|
766
|
-
|
|
778
|
+
if (/\.(ts|tsx|jsx|js|mjs|vue|css|json)$/.test(cleanUrl)) return true;
|
|
779
|
+
if (cleanUrl.startsWith("/@modules/")) return true;
|
|
780
|
+
if (!path4.extname(cleanUrl)) return true;
|
|
781
|
+
return false;
|
|
767
782
|
}
|
|
768
783
|
function getHmrClientCode() {
|
|
769
784
|
return `
|
|
@@ -863,12 +878,14 @@ if (!window.__nasti_hot_map) window.__nasti_hot_map = new Map();
|
|
|
863
878
|
window.__NASTI_HMR__ = { createHotContext };
|
|
864
879
|
`;
|
|
865
880
|
}
|
|
881
|
+
var RESOLVE_EXTENSIONS;
|
|
866
882
|
var init_middleware = __esm({
|
|
867
883
|
"src/server/middleware.ts"() {
|
|
868
884
|
"use strict";
|
|
869
885
|
init_transformer();
|
|
870
886
|
init_html();
|
|
871
887
|
init_env();
|
|
888
|
+
RESOLVE_EXTENSIONS = [".tsx", ".ts", ".jsx", ".js", ".mjs", ".json", ".vue"];
|
|
872
889
|
}
|
|
873
890
|
});
|
|
874
891
|
|
|
@@ -1209,7 +1226,7 @@ async function createServer(inlineConfig = {}) {
|
|
|
1209
1226
|
const localUrl = `http://localhost:${actualPort}`;
|
|
1210
1227
|
const networkUrl = host === "0.0.0.0" ? `http://${getNetworkAddress()}:${actualPort}` : null;
|
|
1211
1228
|
console.log();
|
|
1212
|
-
console.log(pc.cyan(" nasti dev server") + pc.dim(` v${"1.3.
|
|
1229
|
+
console.log(pc.cyan(" nasti dev server") + pc.dim(` v${"1.3.1"}`));
|
|
1213
1230
|
console.log();
|
|
1214
1231
|
console.log(` ${pc.green(">")} Local: ${pc.cyan(localUrl)}`);
|
|
1215
1232
|
if (networkUrl) {
|
|
@@ -1283,7 +1300,7 @@ import pc2 from "picocolors";
|
|
|
1283
1300
|
async function build(inlineConfig = {}) {
|
|
1284
1301
|
const config = await resolveConfig(inlineConfig, "build");
|
|
1285
1302
|
const startTime = performance.now();
|
|
1286
|
-
console.log(pc2.cyan("\n\u{1F528} nasti build") + pc2.dim(` v${"1.3.
|
|
1303
|
+
console.log(pc2.cyan("\n\u{1F528} nasti build") + pc2.dim(` v${"1.3.1"}`));
|
|
1287
1304
|
console.log(pc2.dim(` root: ${config.root}`));
|
|
1288
1305
|
console.log(pc2.dim(` mode: ${config.mode}`));
|
|
1289
1306
|
const outDir = path10.resolve(config.root, config.build.outDir);
|
|
@@ -1503,6 +1520,6 @@ cli.command("preview [root]", "Preview production build").option("--port <port>"
|
|
|
1503
1520
|
}
|
|
1504
1521
|
});
|
|
1505
1522
|
cli.help();
|
|
1506
|
-
cli.version("1.3.
|
|
1523
|
+
cli.version("1.3.1");
|
|
1507
1524
|
cli.parse();
|
|
1508
1525
|
//# sourceMappingURL=cli.js.map
|