@nasti-toolchain/nasti 2.5.0 → 2.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +34 -2
  2. package/dist/build-CENae4VM.js +748 -0
  3. package/dist/build-CENae4VM.js.map +1 -0
  4. package/dist/build-vjh6h7PB.cjs +786 -0
  5. package/dist/build-vjh6h7PB.cjs.map +1 -0
  6. package/dist/cli.cjs +166 -7608
  7. package/dist/cli.cjs.map +1 -1
  8. package/dist/cli.d.cts +1 -2
  9. package/dist/cli.d.ts +1 -2
  10. package/dist/cli.js +166 -7606
  11. package/dist/cli.js.map +1 -1
  12. package/dist/client/hmr.cjs +0 -19
  13. package/dist/client/hmr.d.cts +14 -12
  14. package/dist/client/hmr.d.cts.map +1 -0
  15. package/dist/client/hmr.d.ts +14 -12
  16. package/dist/client/hmr.d.ts.map +1 -0
  17. package/dist/client/hmr.js +1 -1
  18. package/dist/dev-engine-DJL9sfv5.cjs +473 -0
  19. package/dist/dev-engine-DJL9sfv5.cjs.map +1 -0
  20. package/dist/dev-engine-DapuTPIz.js +469 -0
  21. package/dist/dev-engine-DapuTPIz.js.map +1 -0
  22. package/dist/electron-Bj8H-BJ6.js +278 -0
  23. package/dist/electron-Bj8H-BJ6.js.map +1 -0
  24. package/dist/electron-D0PSXz-a.cjs +316 -0
  25. package/dist/electron-D0PSXz-a.cjs.map +1 -0
  26. package/dist/electron-dev-BzI2IFnR.cjs +272 -0
  27. package/dist/electron-dev-BzI2IFnR.cjs.map +1 -0
  28. package/dist/electron-dev-CM15gsFp.js +251 -0
  29. package/dist/electron-dev-CM15gsFp.js.map +1 -0
  30. package/dist/env-GY7K1zPK.js +833 -0
  31. package/dist/env-GY7K1zPK.js.map +1 -0
  32. package/dist/env-lOj3yw8v.cjs +924 -0
  33. package/dist/env-lOj3yw8v.cjs.map +1 -0
  34. package/dist/environment-B2jCrhY2.js +1361 -0
  35. package/dist/environment-B2jCrhY2.js.map +1 -0
  36. package/dist/environment-CjmvoHIG.cjs +1443 -0
  37. package/dist/environment-CjmvoHIG.cjs.map +1 -0
  38. package/dist/index.cjs +453 -7976
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.d.cts +872 -817
  41. package/dist/index.d.cts.map +1 -0
  42. package/dist/index.d.ts +872 -817
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +418 -7939
  45. package/dist/index.js.map +1 -1
  46. package/dist/logger-BVZwdqqT.js +116 -0
  47. package/dist/logger-BVZwdqqT.js.map +1 -0
  48. package/dist/logger-M7AuVVTV.cjs +171 -0
  49. package/dist/logger-M7AuVVTV.cjs.map +1 -0
  50. package/dist/runnable-environment-BjoOvdDa.js +1345 -0
  51. package/dist/runnable-environment-BjoOvdDa.js.map +1 -0
  52. package/dist/runnable-environment-ByA3DHQ6.cjs +1351 -0
  53. package/dist/runnable-environment-ByA3DHQ6.cjs.map +1 -0
  54. package/dist/server-Bqgl25z0.js +1871 -0
  55. package/dist/server-Bqgl25z0.js.map +1 -0
  56. package/dist/server-BynlMdFc.cjs +1895 -0
  57. package/dist/server-BynlMdFc.cjs.map +1 -0
  58. package/package.json +20 -10
  59. package/dist/client/hmr.cjs.map +0 -1
  60. package/dist/client/hmr.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-CENae4VM.js","names":["debug"],"sources":["../src/plugins/react.ts","../src/build/reporter.ts","../src/core/build-app-context.ts","../src/build/index.ts"],"sourcesContent":["// 内置 React 转换阶段。\n//\n// 保留 `nasti:oxc-transform` 插件名与生产构建中的原有位置,避免依赖旧顺序的\n// Nasti/Vite 兼容插件发生行为变化;真正的配置与可选 Compiler 选择集中在这里。\nimport type { EnvironmentInstance, NastiPlugin, ResolvedConfig } from '../types.js'\nimport { matchesReactFilter, transformReactCode } from '../core/transformer.js'\n\nconst REACT_FILE_RE = /\\.[jt]sx(?:[?#].*)?$/\n\nexport function reactPlugin(\n config: ResolvedConfig,\n environment: EnvironmentInstance,\n): NastiPlugin {\n return {\n name: 'nasti:oxc-transform',\n\n async transform(code, id) {\n const result = await transformReactCode(id, code, {\n react: config.react,\n consumer: environment.consumer,\n development: config.mode === 'development',\n sourcemap: !!environment.options.build.sourcemap,\n target: environment.options.build.target,\n onWarning: (message) => config.logger.warn(`[nasti:react] ${message}`),\n })\n if (!result) return null\n return {\n code: result.code,\n map: result.map ? JSON.parse(result.map) : undefined,\n }\n },\n\n handleHotUpdate(ctx) {\n for (const mod of ctx.modules) {\n if (\n REACT_FILE_RE.test(mod.url) &&\n matchesReactFilter(mod.url, config.react.include, config.react.exclude)\n ) {\n mod.isSelfAccepting = true\n }\n }\n return ctx.modules\n },\n }\n}\n","// 构建产物体积报告\n// 优先使用 rolldown/experimental 的原生 viteReporterPlugin(Vite 8 同款表格),\n// 实验 API 无 semver 保护 —— 守卫导入,失败时回退到 JS 实现。\n// 大 chunk 警告始终走 JS 路径(logger.warn),保证 logLevel=warn 时不被吞。\nimport path from 'node:path'\nimport { gzipSync } from 'node:zlib'\nimport pc from 'picocolors'\nimport type { ResolvedConfig } from '../types.js'\nimport type { Logger } from '../core/logger.js'\nimport { createDebugger } from '../core/debug.js'\n\nconst debug = createDebugger('nasti:reporter')\n\nexport interface OutputFileInfo {\n fileName: string\n type: string\n code?: string\n source?: Uint8Array | string\n}\n\n/**\n * 尝试创建原生体积报告插件(Rust 实现,gzip 并行计算)。\n * 返回 null 表示当前 rolldown 版本不提供该实验导出,调用方应改用\n * {@link reportBuildOutput} 的 JS 表格。\n */\nexport async function tryNativeReporterPlugin(\n config: ResolvedConfig,\n logger: Logger,\n): Promise<unknown | null> {\n try {\n const { viteReporterPlugin } = await import('rolldown/experimental')\n if (typeof viteReporterPlugin !== 'function') return null\n return viteReporterPlugin({\n root: config.root,\n isTty: process.stdout.isTTY ?? false,\n isLib: false,\n assetsDir: config.build.assetsDir,\n chunkLimit: config.build.chunkSizeWarningLimit,\n // 大 chunk 警告由 JS 侧 warnLargeChunks() 经 logger.warn 输出,\n // 原生侧只产 info 级表格,避免警告被 logLevel 过滤吞掉\n warnLargeChunks: false,\n reportCompressedSize: config.build.reportCompressedSize,\n logInfo: (msg: string) => logger.info(msg),\n })\n } catch (err) {\n debug?.(`native viteReporterPlugin unavailable, falling back to JS table: ${err}`)\n return null\n }\n}\n\nconst numberFormatter = new Intl.NumberFormat('en', {\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n})\n\nexport function displaySize(bytes: number): string {\n return `${numberFormatter.format(bytes / 1000)} kB`\n}\n\nfunction byteLength(content: string | Uint8Array | undefined): number {\n if (content == null) return 0\n return typeof content === 'string' ? Buffer.byteLength(content) : content.byteLength\n}\n\n/** JS fallback:打印 Vite 形态的产物体积表(gzip 可经 reportCompressedSize 关闭) */\nexport function reportBuildOutput(\n output: OutputFileInfo[],\n config: ResolvedConfig,\n logger: Logger,\n): void {\n type Entry = { name: string; size: number; gzip: number | null; group: 'assets' | 'css' | 'js' }\n const entries: Entry[] = []\n const compressed = config.build.reportCompressedSize\n\n for (const file of output) {\n const content = file.type === 'chunk' ? file.code : file.source\n const size = byteLength(content)\n let gzip: number | null = null\n if (compressed && content != null) {\n gzip = gzipSync(typeof content === 'string' ? Buffer.from(content) : content).byteLength\n }\n const ext = path.extname(file.fileName)\n const group: Entry['group'] =\n file.type === 'chunk' ? 'js' : ext === '.css' ? 'css' : 'assets'\n entries.push({ name: file.fileName, size, gzip, group })\n }\n\n // 同 Vite:assets → css → js,组内按体积升序\n const groupOrder = { assets: 0, css: 1, js: 2 } as const\n entries.sort((a, b) => groupOrder[a.group] - groupOrder[b.group] || a.size - b.size)\n\n const outDirPrefix = `${config.build.outDir.replace(/\\/$/, '')}/`\n const maxNameLen = Math.max(...entries.map((e) => (outDirPrefix + e.name).length), 0)\n const maxSizeLen = Math.max(...entries.map((e) => displaySize(e.size).length), 0)\n\n const groupColor = { assets: pc.green, css: pc.magenta, js: pc.cyan } as const\n for (const e of entries) {\n const color = groupColor[e.group]\n const namePart = pc.dim(outDirPrefix) + color(e.name.padEnd(maxNameLen - outDirPrefix.length))\n const sizePart = pc.dim(pc.bold(displaySize(e.size).padStart(maxSizeLen)))\n const gzipPart = e.gzip != null ? pc.dim(` │ gzip: ${displaySize(e.gzip)}`) : ''\n logger.info(`${namePart} ${sizePart}${gzipPart}`)\n }\n}\n\n/** 大 chunk 警告(独立于表格渲染路径,始终经 logger.warn 输出) */\nexport function warnLargeChunks(\n output: OutputFileInfo[],\n config: ResolvedConfig,\n logger: Logger,\n): void {\n const limit = config.build.chunkSizeWarningLimit\n const large = output.filter(\n (f) => f.type === 'chunk' && byteLength(f.code) / 1000 > limit,\n )\n if (large.length === 0) return\n logger.warn(\n pc.yellow(\n `\\n(!) Some chunks are larger than ${limit} kB after minification. Consider:\\n` +\n `- Using dynamic import() to code-split the application\\n` +\n `- Configuring build.rolldownOptions.output.advancedChunks to isolate large dependencies\\n` +\n `- Adjusting build.chunkSizeWarningLimit to silence this warning`,\n ),\n )\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type {\n AppBuildOutput,\n BuildAppContext,\n EnvironmentBuildOutput,\n EnvironmentBuildResult,\n ResolvedConfig,\n} from '../types.js'\n\nexport function createBuildAppContext(\n config: ResolvedConfig,\n results: Record<string, EnvironmentBuildResult>,\n): BuildAppContext {\n const output: AppBuildOutput[] = []\n const emitted = new Set<string>()\n const outDir = path.resolve(config.root, config.build.outDir)\n let environmentArtifacts: Set<string> | undefined\n\n return {\n config,\n results,\n get output() {\n return Object.freeze([...output])\n },\n\n getResult(environmentName) {\n return results[environmentName]\n },\n\n getArtifact(environmentName, fileName) {\n const normalized = normalizeEnvironmentFileName(fileName)\n return results[environmentName]?.output.find(\n (artifact) => normalizeEnvironmentFileName(artifact.fileName) === normalized,\n )\n },\n\n getEntry(environmentName, entryName) {\n const result = results[environmentName]\n const fileName = result?.entries?.[entryName]\n if (!fileName) return undefined\n return result.output.find(\n (artifact) =>\n normalizeEnvironmentFileName(artifact.fileName) ===\n normalizeEnvironmentFileName(fileName),\n )\n },\n\n getManifest<T = unknown>(environmentName: string): T | undefined {\n return results[environmentName]?.manifest as T | undefined\n },\n\n getChunk(environmentName, fileName) {\n const normalized = normalizeEnvironmentFileName(fileName)\n return results[environmentName]?.chunks?.[normalized]\n },\n\n getCss(environmentName) {\n return results[environmentName]?.css\n },\n\n getSourceMap(environmentName, fileName) {\n const normalized = normalizeEnvironmentFileName(fileName)\n return results[environmentName]?.sourceMaps?.[normalized]\n },\n\n resolvePublicPath(environmentName, fileName) {\n const result = results[environmentName]\n if (!result) return undefined\n const normalized = normalizeEnvironmentFileName(fileName)\n const base = result.publicPath ?? config.base\n return joinPublicPath(base, normalized)\n },\n\n emitFile(file) {\n const fileName = normalizeAppFileName(file.fileName)\n const collisionKey = artifactCollisionKey(fileName)\n if (emitted.has(collisionKey)) {\n throw new Error(`[nasti] app artifact already emitted: ${fileName}`)\n }\n environmentArtifacts ??= collectEnvironmentArtifacts(config, results, outDir)\n if (environmentArtifacts.has(collisionKey)) {\n throw new Error(`[nasti] app artifact conflicts with environment output: ${fileName}`)\n }\n\n const target = path.resolve(outDir, ...fileName.split('/'))\n const relative = path.relative(outDir, target)\n if (relative.startsWith('..') || path.isAbsolute(relative)) {\n throw new Error(`[nasti] app artifact must stay inside build.outDir: ${file.fileName}`)\n }\n assertNoSymlinkComponents(outDir, fileName)\n\n fs.mkdirSync(path.dirname(target), { recursive: true })\n fs.writeFileSync(target, file.source)\n\n const artifact: AppBuildOutput = {\n ...file,\n fileName,\n type: 'asset',\n }\n emitted.add(collisionKey)\n output.push(artifact)\n return fileName\n },\n }\n}\n\nexport function joinPublicPath(base: string, fileName: string): string {\n return `${base.endsWith('/') ? base : `${base}/`}${fileName.replace(/^\\//, '')}`\n}\n\nexport function normalizeEnvironmentFileName(fileName: string): string {\n return path.posix.normalize(fileName.replace(/\\\\/g, '/').replace(/^\\.\\//, ''))\n}\n\nexport function isInvalidEnvironmentFileName(fileName: string): boolean {\n return (\n !fileName ||\n fileName === '.' ||\n fileName === '..' ||\n fileName.startsWith('../') ||\n path.posix.isAbsolute(fileName) ||\n /^[A-Za-z]:\\//.test(fileName)\n )\n}\n\nfunction normalizeAppFileName(fileName: string): string {\n const normalized = normalizeEnvironmentFileName(fileName)\n if (isInvalidEnvironmentFileName(normalized)) {\n throw new Error(`[nasti] invalid app artifact fileName: ${fileName}`)\n }\n return normalized\n}\n\nfunction artifactCollisionKey(fileName: string): string {\n // 在大小写敏感文件系统上也采取保守策略,避免产物发布到 macOS/Windows 后冲突。\n return normalizeEnvironmentFileName(fileName).toLowerCase()\n}\n\nfunction collectEnvironmentArtifacts(\n config: ResolvedConfig,\n results: Record<string, EnvironmentBuildResult>,\n appOutDir: string,\n): Set<string> {\n const occupied = new Set<string>()\n for (const [environmentName, result] of Object.entries(results)) {\n const environment = config.environments[environmentName]\n if (!environment) continue\n const environmentOutDir = path.resolve(config.root, environment.build.outDir)\n for (const artifact of result.output) {\n const artifactPath = path.resolve(\n environmentOutDir,\n ...normalizeEnvironmentFileName(artifact.fileName).split('/'),\n )\n const relative = path.relative(appOutDir, artifactPath)\n if (!relative.startsWith('..') && !path.isAbsolute(relative)) {\n occupied.add(artifactCollisionKey(relative))\n }\n }\n }\n return occupied\n}\n\nfunction assertNoSymlinkComponents(outDir: string, fileName: string): void {\n let current = outDir\n for (const segment of fileName.split('/')) {\n current = path.join(current, segment)\n let stats: ReturnType<typeof fs.lstatSync>\n try {\n // lstat sees dangling symlinks while existsSync does not.\n stats = fs.lstatSync(current)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') continue\n throw error\n }\n if (stats.isSymbolicLink()) {\n throw new Error(`[nasti] app artifact path cannot traverse a symlink: ${fileName}`)\n }\n }\n}\n\nexport function inferEnvironmentEntries(\n output: EnvironmentBuildOutput[],\n): Record<string, string> | undefined {\n const entries: Record<string, string> = {}\n for (const artifact of output as Array<EnvironmentBuildOutput & { isEntry?: boolean; name?: string }>) {\n if (artifact.type !== 'chunk' || !artifact.isEntry || !artifact.name) continue\n entries[artifact.name] = normalizeEnvironmentFileName(artifact.fileName)\n }\n return Object.keys(entries).length > 0 ? entries : undefined\n}\n","// 生产构建 - 多环境 builder(NASTI_2.0_PLAN.md §2.4)\n//\n// `build()` 串行迭代 config.environments:client(入口从 index.html 提取,\n// 含 HTML 改写 / CSS 抽取 / 体积表)+ 所有显式声明 entry 的非 client 环境\n// (SSR / worker 等:node conditions、platform node、bare import 外部化、\n// `import.meta.env.SSR` 由 consumer 派生)。\n// `getRolldownOptions(environment)` 把 per-env 的 rolldown input/output\n// 参数化收敛到一处 —— Phase 3 的完整打包模式(DevEngine)复用同一函数。\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { builtinModules } from 'node:module'\nimport { rolldown } from 'rolldown'\nimport type { InputOptions, OutputOptions } from 'rolldown'\nimport type {\n AppBuildOutput,\n EnvironmentBuildOutput,\n EnvironmentBuildResult,\n NastiConfig,\n HtmlTagDescriptor,\n ResolvedConfig,\n NastiPlugin,\n} from '../types.js'\nimport { resolveConfig } from '../config/index.js'\nimport { resolveMinifyOption } from '../core/minify.js'\nimport { resolvePluginList } from '../plugins/builtins.js'\nimport { NastiEnvironment } from '../core/environment.js'\nimport {\n createCssEngine,\n getCssMetadata,\n type CssEngine,\n} from '../core/css-engine.js'\nimport { htmlPlugin, readHtmlFile, processHtml } from '../plugins/html.js'\nimport { reactPlugin } from '../plugins/react.js'\nimport { transformCode, shouldTransform } from '../core/transformer.js'\nimport { loadEnv, buildEnvDefine, ssrDefineOverrides } from '../core/env.js'\nimport { tryNativeReporterPlugin, reportBuildOutput, warnLargeChunks, displaySize } from './reporter.js'\nimport { createDebugger } from '../core/debug.js'\nimport { getPluginApi } from '../core/plugin-api.js'\nimport {\n createBuildAppContext,\n inferEnvironmentEntries,\n isInvalidEnvironmentFileName,\n joinPublicPath,\n normalizeEnvironmentFileName,\n} from '../core/build-app-context.js'\nimport pc from 'picocolors'\n\nconst debug = createDebugger('nasti:build')\n\nconst NODE_BUILTINS = new Set([...builtinModules, ...builtinModules.map((m) => `node:${m}`)])\n\nexport interface BuildResult {\n /** client 环境的产物(back-compat:1.x 的 BuildResult 形态) */\n output: EnvironmentBuildOutput[]\n /** 全部已构建环境的产物(2.0 多环境 builder) */\n environments?: Record<string, BuildResult['output']>\n /** 全部环境的完整结果(entries / manifest / stats 等) */\n environmentResults?: Record<string, EnvironmentBuildResult>\n /** app 级 finalizer 聚合写出的产物(如 `.lynx.bundle`) */\n appOutput?: AppBuildOutput[]\n}\n\ninterface BuiltEnvironment {\n environment: NastiEnvironment\n result: EnvironmentBuildResult\n}\n\n/**\n * 把单个环境的 rolldown input/output 选项收敛到一处(Phase 3 DevEngine 复用)。\n * - input:user rolldownOptions 透传 + per-env platform/resolve/external/define\n * - output:默认命名 + user output 覆盖 + dir 由 Nasti 强制\n */\nexport function getRolldownOptions(\n environment: NastiEnvironment,\n entryPoints: string[],\n rolldownPlugins: unknown[],\n): { inputOptions: InputOptions; outputOptions: OutputOptions; outDir: string } {\n const config = environment.config\n const envOptions = environment.options\n const isServer = environment.consumer === 'server'\n const outDir = path.resolve(config.root, envOptions.build.outDir)\n // 产物子目录前缀跟随 build.assetsDir(默认 'assets')—— 与 assets 插件、\n // 体积报告器使用同一来源,避免 JS/资源散落到不同目录\n const assetsDir = envOptions.build.assetsDir\n\n // Rolldown 1.x 把 `define` 从顶层 InputOptions 移到了 `transform.define`,\n // 顶层传入会触发 \"Invalid key\" 警告并静默丢弃。\n const {\n output: userOutput,\n transform: userTransform,\n resolve: userResolve,\n ...restInputOptions\n } = envOptions.build.rolldownOptions\n\n // Vue(esm-bundler 构建)的编译期常量:最低优先级,允许用户覆盖\n const vueDefine: Record<string, string> = config.framework === 'vue'\n ? {\n __VUE_OPTIONS_API__: 'true',\n __VUE_PROD_DEVTOOLS__: 'false',\n __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false',\n }\n : {}\n // per-env define 钩子:import.meta.env.SSR 由 consumer 派生\n const env = loadEnv(config.mode, config.root, config.envPrefix)\n const envDefine = buildEnvDefine(env, config.mode, ssrDefineOverrides(environment.consumer))\n const mergedDefine = { ...vueDefine, ...(userTransform?.define ?? {}), ...envDefine }\n\n const inputOptions: InputOptions = {\n ...restInputOptions,\n input: entryPoints,\n transform: {\n ...userTransform,\n target: userTransform?.target ?? envOptions.build.target,\n define: mergedDefine,\n },\n plugins: rolldownPlugins as InputOptions['plugins'],\n // client/server consumer 都必须使用当前环境的 conditions/mainFields;Lynx\n // BG/MT 通常同为 client consumer,但仍可能声明不同的运行时条件。\n resolve: {\n ...(userResolve ?? {}),\n // Environment API 是条件解析的唯一高层入口,优先于继承来的底层选项。\n conditionNames: envOptions.resolve.conditions,\n mainFields: envOptions.resolve.mainFields,\n },\n ...(isServer\n ? {\n platform: (restInputOptions as InputOptions).platform ?? 'node',\n // server 产物:node 内建恒外部化;bare specifier 默认外部化\n //(同 Vite ssr.external 默认 —— 依赖由 node_modules 运行时解析),\n // 相对/绝对/虚拟模块照常打包。需要内联依赖时经 rolldownOptions.external 覆盖。\n external:\n (restInputOptions as InputOptions).external ??\n ((id: string) => {\n if (NODE_BUILTINS.has(id)) return true\n return !id.startsWith('.') &&\n !path.isAbsolute(id) &&\n !id.startsWith('\\0') &&\n !id.startsWith('virtual:')\n }),\n }\n : {}),\n }\n\n const outputOptions: OutputOptions = isServer\n ? {\n format: 'esm',\n sourcemap: envOptions.build.sourcemap,\n minify: resolveMinifyOption(envOptions.build.minify),\n entryFileNames: '[name].js',\n chunkFileNames: 'chunks/[name]-[hash].js',\n assetFileNames: `${assetsDir}/[name].[hash][extname]`,\n ...userOutput,\n dir: outDir,\n }\n : {\n format: 'esm',\n sourcemap: envOptions.build.sourcemap,\n minify: resolveMinifyOption(envOptions.build.minify),\n entryFileNames: `${assetsDir}/[name].[hash].js`,\n chunkFileNames: `${assetsDir}/[name].[hash].js`,\n assetFileNames: `${assetsDir}/[name].[hash][extname]`,\n // 用户可覆盖默认输出:代码拆分(advancedChunks / codeSplitting)、chunk 命名等\n ...userOutput,\n // dir 始终由 Nasti 掌管 —— HTML 改写依赖固定的产物目录,故放在最后强制生效\n dir: outDir,\n }\n\n return { inputOptions, outputOptions, outDir }\n}\n\n/**\n * Nasti 插件 → Rolldown 插件转发表。包装器保留 Rolldown 的真实插件上下文,\n * 同时注入当前 Nasti environment,供同为 client consumer 的 BG/MT 管线区分彼此。\n */\nexport function toRolldownPlugins(\n plugins: NastiPlugin[],\n environment: NastiEnvironment,\n): unknown[] {\n const wrap = (hook: ((this: any, ...args: any[]) => any) | undefined) => {\n if (!hook) return hook\n return function (this: any, ...args: any[]) {\n return hook.apply(attachEnvironment(this, environment), args)\n }\n }\n\n return plugins.map((p) => ({\n name: p.name,\n resolveId: wrap(p.resolveId as any),\n load: wrap(p.load as any),\n transform: wrap(p.transform as any),\n buildStart: wrap(p.buildStart as any),\n buildEnd: wrap(p.buildEnd as any),\n // closeBundle 在 bundle.close() 时触发 —— PWA manifest/SW 等终态产物依赖\n closeBundle: wrap(p.closeBundle as any),\n renderChunk: wrap(p.renderChunk as any),\n augmentChunkHash: wrap(p.augmentChunkHash as any),\n generateBundle: wrap(p.generateBundle as any),\n }))\n}\n\nfunction attachEnvironment(context: any, environment: NastiEnvironment): any {\n if (context?.environment === environment) return context\n try {\n Object.defineProperty(context, 'environment', {\n configurable: true,\n enumerable: false,\n writable: false,\n value: environment,\n })\n return context\n } catch {\n // 极少数 host context 可能不可扩展;Proxy 保持方法 receiver 指向原上下文。\n return new Proxy(context, {\n get(target, property) {\n if (property === 'environment') return environment\n const value = Reflect.get(target, property, target)\n return typeof value === 'function' ? value.bind(target) : value\n },\n set(target, property, value) {\n return Reflect.set(target, property, value, target)\n },\n })\n }\n}\n\nfunction finalizeEnvironmentResult(\n environment: NastiEnvironment,\n result: EnvironmentBuildResult,\n): EnvironmentBuildResult {\n const metadata = environment.getBuildMetadata()\n const inferredEntries = inferEnvironmentEntries(result.output)\n const entries = {\n ...inferredEntries,\n ...metadata.entries,\n ...result.entries,\n }\n const normalizedEntries = Object.fromEntries(\n Object.entries(entries).map(([name, fileName]) => {\n const normalized = normalizeEnvironmentFileName(fileName)\n if (isInvalidEnvironmentFileName(normalized)) {\n throw new Error(\n `[nasti] environment \"${environment.name}\" returned invalid entry ` +\n `\"${name}\": ${fileName}`,\n )\n }\n return [name, normalized]\n }),\n )\n const inferredMetadata = inferOutputMetadata(environment, result.output)\n return {\n publicPath: environment.config.base,\n ...inferredMetadata,\n ...metadata,\n ...result,\n output: result.output,\n chunks: {\n ...inferredMetadata.chunks,\n ...metadata.chunks,\n ...result.chunks,\n },\n assets: {\n ...inferredMetadata.assets,\n ...metadata.assets,\n ...result.assets,\n },\n sourceMaps: {\n ...inferredMetadata.sourceMaps,\n ...metadata.sourceMaps,\n ...result.sourceMaps,\n },\n ...(Object.keys(normalizedEntries).length > 0 ? { entries: normalizedEntries } : {}),\n }\n}\n\nfunction inferOutputMetadata(\n environment: NastiEnvironment,\n output: EnvironmentBuildOutput[],\n): Pick<EnvironmentBuildResult, 'chunks' | 'assets' | 'sourceMaps'> {\n const chunks: NonNullable<EnvironmentBuildResult['chunks']> = {}\n const assets: NonNullable<EnvironmentBuildResult['assets']> = {}\n const sourceMaps: NonNullable<EnvironmentBuildResult['sourceMaps']> = {}\n const cssChunks = environment.getBuildMetadata().css?.chunks ?? {}\n const assetModules = environment.getAssetModules()\n const publicPath = environment.config.base\n\n for (const artifact of output) {\n const fileName = normalizeEnvironmentFileName(artifact.fileName)\n if (artifact.map != null) sourceMaps[fileName] = artifact.map\n if (artifact.type === 'chunk') {\n const moduleIds = [...(artifact.moduleIds ?? [])]\n chunks[fileName] = {\n fileName,\n name: artifact.name ?? fileName,\n isEntry: !!artifact.isEntry,\n isDynamicEntry: !!artifact.isDynamicEntry,\n imports: [...(artifact.imports ?? [])],\n dynamicImports: [...(artifact.dynamicImports ?? [])],\n moduleIds,\n css: [...(cssChunks[fileName]?.cssFileNames ?? [])],\n assets: [\n ...new Set(\n moduleIds\n .map((id) => assetModules[id])\n .filter((asset): asset is string => !!asset),\n ),\n ],\n }\n } else if (artifact.type === 'asset') {\n assets[fileName] = {\n fileName,\n names: [...(artifact.names ?? (artifact.name ? [artifact.name] : []))],\n publicPath: joinPublicPath(publicPath, fileName),\n }\n }\n }\n return { chunks, assets, sourceMaps }\n}\n\nfunction prepareBuildOutputDirectories(\n config: ResolvedConfig,\n buildableNames: string[],\n): void {\n const directories = new Set<string>()\n const protectedPaths = new Set<string>()\n const clientIsBuilt = buildableNames.includes('client')\n\n // 没有 Web client 时,app finalizer 仍写入 top-level outDir;必须清理旧聚合产物。\n if (!clientIsBuilt && config.build.emptyOutDir) {\n directories.add(path.resolve(config.root, config.build.outDir))\n }\n\n for (const name of buildableNames) {\n const environment = config.environments[name]\n const outDir = path.resolve(config.root, environment.build.outDir)\n if (!environment.build.emptyOutDir) {\n protectedPaths.add(outDir)\n continue\n }\n if (!environment.driver) directories.add(outDir)\n }\n\n const containsPath = (parent: string, child: string) => {\n const relative = path.relative(parent, child)\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative))\n }\n\n // 父目录清理一次即可覆盖其子环境目录,防止后构建环境删除前一环境产物。\n const roots = [...directories]\n // 显式 emptyOutDir:false 的环境目录及其内容必须避开祖先目录清理。\n .filter((directory) =>\n ![...protectedPaths].some((protectedPath) => containsPath(directory, protectedPath)),\n )\n .sort((a, b) => a.length - b.length)\n .filter((directory, index, all) =>\n !all.slice(0, index).some((parent) => containsPath(parent, directory)),\n )\n\n for (const directory of roots) {\n if (fs.existsSync(directory)) fs.rmSync(directory, { recursive: true, force: true })\n }\n}\n\nfunction assertDriverBuildResult(\n environment: NastiEnvironment,\n result: unknown,\n): asserts result is EnvironmentBuildResult {\n const output = result != null && typeof result === 'object'\n ? (result as { output?: unknown }).output\n : undefined\n const hasValidOutput =\n Array.isArray(output) &&\n output.every(\n (artifact) =>\n artifact != null &&\n typeof artifact === 'object' &&\n typeof artifact.fileName === 'string' &&\n typeof artifact.type === 'string',\n )\n if (!hasValidOutput) {\n throw new Error(\n `[nasti] environment \"${environment.name}\" driver \"${environment.driver?.name}\" ` +\n 'returned an invalid build result; expected { output: EnvironmentBuildOutput[] }',\n )\n }\n}\n\n/** 从 index.html 提取 client 入口(含常见路径回退) */\nexport function resolveClientEntries(config: ResolvedConfig, html: string | null): string[] {\n const configuredEntries = config.environments.client?.entry ?? []\n if (configuredEntries.length > 0) return configuredEntries\n\n const entryPoints: string[] = []\n const htmlFile = config.environments.client?.html\n const htmlDir = htmlFile ? path.dirname(htmlFile) : config.root\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 const cleanSrc = src.split(/[?#]/, 1)[0]\n entryPoints.push(\n cleanSrc.startsWith('/')\n ? path.resolve(config.root, cleanSrc.replace(/^\\//, ''))\n : path.resolve(htmlDir, cleanSrc),\n )\n }\n }\n }\n if (entryPoints.length === 0) {\n const fallbackEntries = ['src/main.ts', 'src/main.tsx', 'src/main.js', 'src/index.ts', 'src/index.tsx', 'src/index.js']\n for (const entry of fallbackEntries) {\n const fullPath = path.resolve(config.root, entry)\n if (fs.existsSync(fullPath)) {\n entryPoints.push(fullPath)\n break\n }\n }\n }\n return entryPoints\n}\n\n/** 单个环境的 oxc 转译插件(TS/JSX,consumer 无关) */\nfunction createOxcTransformPlugin(config: ResolvedConfig, environment: NastiEnvironment) {\n if (config.framework === 'react') return reactPlugin(config, environment)\n return {\n name: 'nasti:oxc-transform',\n transform(code: string, id: string) {\n if (!shouldTransform(id)) return null\n const result = transformCode(id, code, {\n sourcemap: !!environment.options.build.sourcemap,\n target: environment.options.build.target,\n jsxRuntime: 'automatic',\n jsxImportSource: config.framework === 'vue' ? 'vue' : 'react',\n })\n return { code: result.code, map: result.map ? JSON.parse(result.map) : undefined }\n },\n }\n}\n\nexport async function build(inlineConfig: NastiConfig = {}): Promise<BuildResult> {\n const config = await resolveConfig(inlineConfig, 'build')\n const logger = config.logger\n const startTime = performance.now()\n\n logger.info(\n pc.cyan(`\\nnasti v${__NASTI_VERSION__} `) + pc.green(`building for ${config.mode}...`),\n )\n debug?.(`root: ${config.root}`)\n\n // 待构建环境:显式禁用的环境跳过;client 默认构建,非 client 需声明 entry/driver。\n // `client.buildEnabled:false` 允许 Lynx 等纯多环境应用不提供 index.html。\n const buildableNames = Object.keys(config.environments).filter((name) => {\n const environment = config.environments[name]\n if (!environment.buildEnabled) return false\n return name === 'client' || environment.entry.length > 0 || !!environment.driver\n })\n // client 先行(主产物 / HTML),其余按声明顺序串行(同 Vite buildApp 默认)\n buildableNames.sort((a, b) => (a === 'client' ? -1 : b === 'client' ? 1 : 0))\n prepareBuildOutputDirectories(config, buildableNames)\n\n const environments: Record<string, BuildResult['output']> = {}\n const environmentResults: Record<string, EnvironmentBuildResult> = {}\n const initializedEnvironments: NastiEnvironment[] = []\n const buildAppContext = createBuildAppContext(config, environmentResults)\n let clientOutput: BuildResult['output'] = []\n let buildFailed = false\n\n try {\n for (const name of buildableNames) {\n const built =\n name === 'client'\n ? await buildClientEnvironment(config)\n : await buildServerEnvironment(config, name)\n initializedEnvironments.push(built.environment)\n environments[name] = built.result.output\n environmentResults[name] = built.result\n if (name === 'client') clientOutput = built.result.output\n if (buildableNames.length > 1) {\n debug?.(`environment \"${name}\" built (${built.result.output.length} files)`)\n }\n }\n\n const pluginApi = getPluginApi(config)\n for (const plugin of config.plugins) {\n await plugin.afterBuildApp?.(environmentResults, pluginApi, buildAppContext)\n }\n } catch (error) {\n buildFailed = true\n throw error\n } finally {\n let closeFailed = false\n let firstCloseError: unknown\n for (const environment of [...initializedEnvironments].reverse()) {\n try {\n await environment.close()\n } catch (error) {\n if (!closeFailed) {\n closeFailed = true\n firstCloseError = error\n }\n const closeError = error instanceof Error ? error : new Error(String(error))\n logger.error(`[nasti] failed to close environment \"${environment.name}\"`, {\n error: closeError,\n })\n }\n }\n if (closeFailed && !buildFailed) {\n throw firstCloseError\n }\n }\n\n const elapsed = ((performance.now() - startTime) / 1000).toFixed(2)\n const allOutput = [...Object.values(environments).flat(), ...buildAppContext.output]\n const totalSize = allOutput.reduce((sum, chunk) => {\n const content = chunk.type === 'chunk' ? chunk.code : (chunk as any).source\n if (content == null) return sum\n return sum + (typeof content === 'string' ? Buffer.byteLength(content) : content.byteLength)\n }, 0)\n const fileCount = allOutput.length\n const envSuffix =\n buildableNames.length > 1 ? ` (${buildableNames.join(' + ')})` : ''\n\n logger.info(pc.green(`✓ built in ${elapsed}s`) + pc.dim(envSuffix))\n logger.info(pc.dim(` ${fileCount} files, ${displaySize(totalSize)} total → ${config.build.outDir}/`))\n\n return {\n output: clientOutput,\n environments,\n environmentResults,\n appOutput: [...buildAppContext.output],\n }\n}\n\n/** client 环境构建:HTML 入口 + CSS 抽取 + 体积表 + index.html 改写 */\nasync function buildClientEnvironment(config: ResolvedConfig): Promise<BuiltEnvironment> {\n const logger = config.logger\n const outDir = path.resolve(config.root, config.build.outDir)\n\n // per-env 插件列表 + applyToEnvironment 过滤。外部 driver 在任何 Nasti\n // HTML/CSS/Rolldown 副作用前接管环境。\n const cssEngine = createCssEngine()\n const pluginList = resolvePluginList(config, config.plugins, {\n cssEngine,\n environmentName: 'client',\n })\n const clientEnv = new NastiEnvironment('client', config, {\n mode: 'build',\n plugins: pluginList,\n pluginApi: getPluginApi(config),\n })\n await clientEnv.init()\n\n try {\n if (clientEnv.driver) {\n if (!clientEnv.driver.build) {\n throw new Error(\n `[nasti] environment \"client\" driver \"${clientEnv.driver.name}\" does not implement build()`,\n )\n }\n const result = await clientEnv.driver.build(clientEnv.getDriverContext())\n assertDriverBuildResult(clientEnv, result)\n return { environment: clientEnv, result: finalizeEnvironmentResult(clientEnv, result) }\n }\n\n fs.mkdirSync(outDir, { recursive: true })\n\n const htmlFile = config.environments.client.html ?? path.resolve(config.root, 'index.html')\n const html = await readHtmlFile(config.root, htmlFile)\n const entryPoints = resolveClientEntries(config, html)\n if (entryPoints.length === 0) {\n throw new Error('No entry point found. Add a <script> tag to index.html or create src/main.ts')\n }\n\n const allPlugins = clientEnv.plugins\n\n // 原生体积报告插件(守卫导入;不可用时走 JS 表格 fallback)\n const nativeReporter = config.logLevel === 'silent'\n ? null\n : await tryNativeReporterPlugin(config, logger)\n\n const rolldownPlugins = [\n createOxcTransformPlugin(config, clientEnv),\n ...toRolldownPlugins(allPlugins, clientEnv),\n ...(nativeReporter ? [nativeReporter as any] : []),\n ]\n const { inputOptions, outputOptions } = getRolldownOptions(\n clientEnv,\n entryPoints,\n rolldownPlugins,\n )\n\n const bundle = await rolldown(inputOptions)\n const { output } = await bundle.write(outputOptions)\n await bundle.close()\n clientEnv.setBuildMetadata({ css: getCssMetadata(cssEngine) })\n\n // 处理 HTML\n if (html) {\n let processedHtml = html\n\n // 执行 transformIndexHtml 钩子:用户插件 + 内置 htmlPlugin\n const htmlPlugins = [...allPlugins.filter((p) => p.transformIndexHtml), htmlPlugin(config)]\n for (const p of htmlPlugins) {\n const result = await p.transformIndexHtml!(processedHtml)\n if (typeof result === 'string') {\n processedHtml = result\n } else if (result && 'html' in result) {\n processedHtml = processHtml(result.html, result.tags)\n } else if (Array.isArray(result)) {\n processedHtml = processHtml(processedHtml, result)\n }\n }\n\n // 注入抽取出的 CSS:entry chunk 的 css → 静态 <link rel=\"stylesheet\">\n if (clientEnv.options.build.css.inject !== false) {\n processedHtml = injectCssLinks(processedHtml, cssEngine, config)\n }\n\n // 替换 script src 为打包后的路径(支持多入口)\n for (const chunk of output) {\n if (chunk.type === 'chunk' && chunk.isEntry && chunk.facadeModuleId) {\n processedHtml = replaceEntryScript(\n processedHtml,\n chunk.facadeModuleId,\n chunk.fileName,\n config,\n htmlFile,\n config.base,\n )\n }\n }\n\n fs.writeFileSync(path.resolve(outDir, 'index.html'), processedHtml)\n }\n\n // 体积表:原生 reporter 已在 write 阶段输出;否则走 JS fallback\n if (!nativeReporter && config.logLevel !== 'silent') {\n reportBuildOutput(output as any, config, logger)\n }\n // 大 chunk 警告始终走 logger.warn(原生 reporter 的 warnLargeChunks 已关闭)\n warnLargeChunks(output as any, config, logger)\n\n return {\n environment: clientEnv,\n result: finalizeEnvironmentResult(clientEnv, { output: output as any }),\n }\n } catch (error) {\n try {\n await clientEnv.close()\n } catch (closeError) {\n const normalized = closeError instanceof Error\n ? closeError\n : new Error(String(closeError))\n logger.error('[nasti] failed to close client environment after build failure', {\n error: normalized,\n })\n }\n throw error\n }\n}\n\n/** 非 client 环境构建(SSR / worker / main / preload …):entry 显式声明 */\nasync function buildServerEnvironment(\n config: ResolvedConfig,\n name: string,\n): Promise<BuiltEnvironment> {\n const envOptions = config.environments[name]\n const logger = config.logger\n\n const cssEngine = envOptions.consumer === 'client' ? createCssEngine() : undefined\n const pluginList = resolvePluginList(config, config.plugins, {\n consumer: envOptions.consumer,\n environmentName: name,\n cssEngine,\n })\n const environment = new NastiEnvironment(name, config, {\n mode: 'build',\n plugins: pluginList,\n pluginApi: getPluginApi(config),\n })\n await environment.init()\n if (environment.driver) {\n if (!environment.driver.build) {\n await environment.close()\n throw new Error(\n `[nasti] environment \"${name}\" driver \"${environment.driver.name}\" does not implement build()`,\n )\n }\n try {\n const result = await environment.driver.build(environment.getDriverContext())\n assertDriverBuildResult(environment, result)\n return { environment, result: finalizeEnvironmentResult(environment, result) }\n } catch (error) {\n await environment.close()\n throw error\n }\n }\n\n for (const entry of envOptions.entry) {\n if (!fs.existsSync(entry)) {\n await environment.close()\n throw new Error(`[nasti] environment \"${name}\" entry not found: ${entry}`)\n }\n }\n\n const rolldownPlugins = [\n createOxcTransformPlugin(config, environment),\n ...toRolldownPlugins(environment.plugins, environment),\n ]\n const { inputOptions, outputOptions, outDir } = getRolldownOptions(\n environment,\n envOptions.entry,\n rolldownPlugins,\n )\n\n fs.mkdirSync(outDir, { recursive: true })\n\n const bundle = await rolldown(inputOptions)\n const { output } = await bundle.write(outputOptions)\n await bundle.close()\n if (cssEngine) environment.setBuildMetadata({ css: getCssMetadata(cssEngine) })\n\n logger.info(\n pc.dim(` [${name}] `) +\n output.map((o) => path.join(envOptions.build.outDir, o.fileName)).join(pc.dim(', ')),\n )\n return {\n environment,\n result: finalizeEnvironmentResult(environment, { output: output as any }),\n }\n}\n\n/** 注入抽取出的 CSS link 标签(entry css 或单文件模式) */\nfunction injectCssLinks(html: string, cssEngine: CssEngine, config: ResolvedConfig): string {\n const cssLinkTags: HtmlTagDescriptor[] = []\n if (cssEngine.singleFileName) {\n cssLinkTags.push({\n tag: 'link',\n attrs: { rel: 'stylesheet', href: config.base + cssEngine.singleFileName },\n injectTo: 'head',\n })\n } else {\n for (const files of cssEngine.entryCss.values()) {\n for (const file of files) {\n cssLinkTags.push({\n tag: 'link',\n attrs: { rel: 'stylesheet', href: config.base + file },\n injectTo: 'head',\n })\n }\n }\n }\n return cssLinkTags.length > 0 ? processHtml(html, cssLinkTags) : html\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nexport function replaceEntryScript(\n html: string,\n facadeModuleId: string,\n fileName: string,\n config: ResolvedConfig,\n htmlFile: string,\n urlPrefix: string,\n): string {\n const rootRelative = path.relative(config.root, facadeModuleId).split(path.sep).join('/')\n const resolvedHtmlFile = path.resolve(config.root, htmlFile)\n const htmlRelative = path\n .relative(path.dirname(resolvedHtmlFile), facadeModuleId)\n .split(path.sep)\n .join('/')\n const candidates = new Set([\n rootRelative,\n `/${rootRelative}`,\n htmlRelative,\n `./${htmlRelative}`,\n ])\n let processed = html\n for (const candidate of candidates) {\n processed = processed.replace(\n new RegExp(`(src=[\"'])${escapeRegExp(candidate)}([?#][^\"']*)?([\"'])`, 'g'),\n `$1${urlPrefix}${fileName}$3`,\n )\n }\n return processed\n}\n"],"mappings":"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"}