@nasti-toolchain/nasti 1.1.0
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/LICENSE +21 -0
- package/README.md +169 -0
- package/bin/nasti.js +2 -0
- package/client/hmr.ts +19 -0
- package/dist/cli.cjs +1369 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1346 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/hmr.cjs +19 -0
- package/dist/client/hmr.cjs.map +1 -0
- package/dist/client/hmr.d.cts +15 -0
- package/dist/client/hmr.d.ts +15 -0
- package/dist/client/hmr.js +1 -0
- package/dist/client/hmr.js.map +1 -0
- package/dist/index.cjs +1233 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +216 -0
- package/dist/index.d.ts +216 -0
- package/dist/index.js +1204 -0
- package/dist/index.js.map +1 -0
- package/package.json +72 -0
package/dist/cli.cjs.map
ADDED
|
@@ -0,0 +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/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\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 // 过滤插件 (apply)\n const filteredPlugins = rawPlugins.filter((p) => {\n if (!p.apply) return true\n if (typeof p.apply === 'function') return p.apply(resolved as ResolvedConfig, env)\n return p.apply === command\n })\n\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 alias: { ...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: filteredPlugins,\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 // 执行插件 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\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 // TODO: 实现 emitFile\n return ''\n },\n getModuleInfo(_id): ModuleInfo | null {\n return null\n },\n }\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 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","// HTTP 中间件 - 请求拦截与按需转译\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport type { ResolvedConfig } from '../types.js'\nimport { PluginContainer } from '../core/plugin-container.js'\nimport { ModuleGraph } from '../core/module-graph.js'\nimport { transformCode, shouldTransform, getModuleType } from '../core/transformer.js'\nimport { readHtmlFile, processHtml } from '../plugins/html.js'\n\nexport interface TransformMiddlewareContext {\n config: ResolvedConfig\n pluginContainer: PluginContainer\n moduleGraph: ModuleGraph\n}\n\n/** 主转译中间件 - 处理模块请求 */\nexport function transformMiddleware(ctx: TransformMiddlewareContext) {\n return async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const url = req.url ?? '/'\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 // 注入 HMR 客户端\n processedHtml = processedHtml.replace(\n '<head>',\n '<head>\\n <script type=\"module\" src=\"/@nasti/client\"></script>',\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 // 重写 bare imports 为浏览器可用路径\n code = rewriteImports(code, config)\n\n const transformResult = { code }\n mod.transformResult = transformResult\n return transformResult\n}\n\n/** 重写 import 语句中的 bare specifier */\nfunction rewriteImports(code: string, config: ResolvedConfig): string {\n // 简单的 import 重写: bare imports → /node_modules/.nasti/...\n return code.replace(\n /from\\s+['\"]([^'\"./][^'\"]*)['\"]/g,\n (match, specifier: string) => {\n // 跳过已经是路径的\n if (specifier.startsWith('/') || specifier.startsWith('.')) return match\n return `from \"/@modules/${specifier}\"`\n },\n ).replace(\n /import\\s+['\"]([^'\"./][^'\"]*)['\"]/g,\n (match, specifier: string) => {\n if (specifier.startsWith('/') || specifier.startsWith('.')) return match\n return `import \"/@modules/${specifier}\"`\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 { createRequire } = require('node:module')\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 overlay.innerHTML = \\`<h2 style=\"color:#ff5555\">Build Error</h2><pre>\\${err.message}\\\\n\\${err.stack || ''}</pre><button onclick=\"this.parentElement.remove()\" style=\"margin-top:1rem;padding:0.5rem 1rem;cursor:pointer\">Close</button>\\`;\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 // 读取文件内容\n if (fs.existsSync(id)) {\n return fs.readFileSync(id, 'utf-8')\n }\n return null\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 if (config.command === 'serve') {\n // Dev 模式: 将 CSS 转为 JS 模块,通过 style 标签注入\n const escaped = JSON.stringify(code)\n return {\n code: `\nconst css = ${escaped};\nconst style = document.createElement('style');\nstyle.setAttribute('data-nasti-css', ${JSON.stringify(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 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 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 httpServer.listen(finalPort, host, () => {\n const localUrl = `http://localhost:${finalPort}`\n const networkUrl = host === '0.0.0.0' ? `http://${getNetworkAddress()}:${finalPort}` : null\n\n console.log()\n console.log(pc.cyan(' nasti dev server') + pc.dim(` v0.0.1`))\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 httpServer.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n console.log(pc.yellow(`Port ${finalPort} is in use, trying ${finalPort + 1}...`))\n httpServer.listen(finalPort + 1, host)\n } else {\n reject(err)\n }\n })\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 os = require('node:os')\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 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${process.env.npm_package_version ?? '0.0.1'}`))\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 // 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 // 调用 Rolldown\n const bundle = await rolldown({\n input: entryPoints,\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 entryFileNames: 'assets/[name].[hash].js',\n chunkFileNames: 'assets/[name].[hash].js',\n assetFileNames: 'assets/[name].[hash][extname]',\n })\n\n await bundle.close()\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) {\n const originalEntry = path.relative(config.root, entryPoints[0])\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('0.0.1')\n\ncli.parse()\n"],"mappings":"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","names":["path","fs","transformSync","WsServer","path","fs","import_node_path","import_node_fs","fs","createRequire","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_path","path","fs","crypto","import_node_path","import_node_fs","connect","path","sirv","http","pc","transformRequest","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.d.cts
ADDED
package/dist/cli.d.ts
ADDED