@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":"env-GY7K1zPK.js","names":[],"sources":["../src/config/defaults.ts","../src/core/minify.ts","../src/core/plugin-api.ts","../src/config/index.ts","../src/plugins/resolve.ts","../src/core/transformer.ts","../src/core/env.ts"],"sourcesContent":["import type {\n NastiConfig,\n BuildConfig,\n ServerConfig,\n ResolveConfig,\n ElectronConfig,\n ExperimentalOptions,\n ResolvedReactOptions,\n} from '../types.js'\n\nconst defaultResolve: Required<ResolveConfig> = {\n alias: {},\n extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.json', '.vue'],\n conditions: ['import', 'module', 'browser', 'default'],\n mainFields: ['module', 'jsnext:main', 'jsnext', 'main'],\n}\n\nconst defaultServer: Required<ServerConfig> = {\n port: 3000,\n host: 'localhost',\n https: false,\n open: false,\n proxy: {},\n cors: true,\n hmr: true,\n}\n\nconst defaultBuild: Required<BuildConfig> = {\n outDir: 'dist',\n assetsDir: 'assets',\n minify: true,\n sourcemap: false,\n target: 'es2022',\n rolldownOptions: {},\n emptyOutDir: true,\n css: {\n inject: true,\n emit: true,\n },\n reportCompressedSize: true,\n chunkSizeWarningLimit: 500,\n cssCodeSplit: true,\n // 默认跟随 build.minify(resolveConfig 中按 minify 取值填充)\n cssMinify: true,\n}\n\n// Electron 41+ 捆绑 Node 22.x / Chromium 138,故主进程目标默认 node22\nconst defaultElectron: Required<ElectronConfig> = {\n main: 'src/electron/main.ts',\n preload: 'src/electron/preload.ts',\n renderer: 'index.html',\n nodeTarget: 'node22',\n mainFormat: 'cjs',\n preloadFormat: 'cjs',\n electronPath: '',\n electronArgs: [],\n autoRestart: true,\n minVersion: 41,\n external: ['electron'],\n}\n\nconst defaultExperimental: Required<ExperimentalOptions> = {\n bundledDev: false,\n}\n\nexport const defaultReact: ResolvedReactOptions = {\n include: /\\.[tj]sx?$/,\n exclude: /node_modules/,\n jsxImportSource: 'react',\n jsxRuntime: 'automatic',\n compiler: false,\n}\n\nexport const defaults: Required<Omit<NastiConfig, 'plugins' | 'customLogger' | 'environments' | 'experimental'>> & {\n plugins: []\n experimental: Required<ExperimentalOptions>\n} = {\n root: '.',\n base: '/',\n mode: 'development',\n target: 'web',\n framework: 'auto',\n react: defaultReact,\n resolve: defaultResolve,\n server: defaultServer,\n build: defaultBuild,\n electron: defaultElectron,\n plugins: [],\n envPrefix: ['NASTI_', 'VITE_'],\n logLevel: 'info',\n clearScreen: true,\n experimental: defaultExperimental,\n}\n","// build.minify 的归一化:Nasti 对外暴露 `boolean | 'oxc' | NastiMinifyOptions`,\n// 而 Rolldown 的 OutputOptions.minify 只认 `boolean | 'dce-only' | MinifyOptions`。\n//\n// 历史上各调用点都写 `!!config.build.minify`,这会把细粒度对象压成 `true`,\n// 于是 mangle 选项(含类名最小化)根本传不下去。本模块把「布尔判定」与\n// 「透传给 Rolldown 的值」拆成两个函数,调用点按语义各取所需。\n\nimport type { MinifyOption, ResolvedMinifyOption } from '../types.js'\n\n/**\n * 压缩是否开启 —— 供 `cssMinify` 跟随、体积报告等只关心开关的场合使用。\n *\n * 注意不能简单用 `!!`:`'dce-only'` 与空对象 `{}` 都是真值,但前者只做\n * 死代码消除、后者是「按 OXC 默认项压缩」,二者都算开启;只有 `false`\n * 才是关闭。\n */\nexport function isMinifyEnabled(minify: MinifyOption | undefined): boolean {\n return minify !== false && minify !== undefined\n}\n\n/**\n * 归一化为 Rolldown `OutputOptions.minify` 接受的值。\n *\n * - `'oxc'`:2.x 之前的历史写法,语义等同 `true`(Rolldown 本来就只有\n * OXC 一个 minifier),归一为 `true` 保持向后兼容;\n * - 对象:原样透传,交给 OXC minifier(`compress` / `mangle` / `codegen`)。\n * 其中 `mangle.keepNames.class` 控制类名是否参与最小化,\n * `mangle.mangleProps` 是 Rolldown 1.2.6 / OXC 0.147 新增的属性名最小化。\n */\nexport function resolveMinifyOption(\n minify: MinifyOption | undefined,\n): ResolvedMinifyOption {\n if (minify === undefined) return false\n if (minify === 'oxc') return true\n return minify\n}\n","import type {\n NastiPlugin,\n PluginApi,\n PluginApiKey,\n ResolvedConfig,\n} from '../types.js'\n\nconst apiByConfig = new WeakMap<ResolvedConfig, PluginApi>()\n\n/**\n * 按 enforce 与显式插件依赖稳定排序。\n *\n * `pre` 表示列出的插件必须先于当前插件,`post` 表示列出的插件必须后于\n * 当前插件。未安装的可选依赖会被忽略;依赖环会在配置阶段直接报错。\n */\nexport function orderPlugins(plugins: NastiPlugin[]): NastiPlugin[] {\n const baseline = plugins\n .map((plugin, index) => ({ plugin, index }))\n .sort((a, b) => enforceRank(a.plugin) - enforceRank(b.plugin) || a.index - b.index)\n .map(({ plugin }) => plugin)\n\n const indexesByName = new Map<string, number[]>()\n baseline.forEach((plugin, index) => {\n const indexes = indexesByName.get(plugin.name) ?? []\n indexes.push(index)\n indexesByName.set(plugin.name, indexes)\n })\n\n const edges = baseline.map(() => new Set<number>())\n const indegree = baseline.map(() => 0)\n const addEdge = (from: number, to: number) => {\n if (from === to || edges[from].has(to)) return\n edges[from].add(to)\n indegree[to]++\n }\n\n baseline.forEach((plugin, current) => {\n for (const dependency of plugin.pre ?? []) {\n for (const before of indexesByName.get(dependency) ?? []) addEdge(before, current)\n }\n for (const dependency of plugin.post ?? []) {\n for (const after of indexesByName.get(dependency) ?? []) addEdge(current, after)\n }\n })\n\n const ready = indegree\n .map((degree, index) => ({ degree, index }))\n .filter(({ degree }) => degree === 0)\n .map(({ index }) => index)\n const ordered: NastiPlugin[] = []\n\n while (ready.length > 0) {\n ready.sort((a, b) => a - b)\n const current = ready.shift()!\n ordered.push(baseline[current])\n for (const next of edges[current]) {\n indegree[next]--\n if (indegree[next] === 0) ready.push(next)\n }\n }\n\n if (ordered.length !== baseline.length) {\n const cyclic = baseline\n .filter((_, index) => indegree[index] > 0)\n .map((plugin) => plugin.name)\n throw new Error(\n `[nasti] circular plugin setup dependency: ${[...new Set(cyclic)].join(', ')}`,\n )\n }\n\n return ordered\n}\n\n/** 创建并注册一次配置解析周期内共享的插件 API。 */\nexport async function setupPluginApi(\n config: ResolvedConfig,\n plugins: NastiPlugin[],\n): Promise<PluginApi> {\n const exposed = new Map<PluginApiKey, unknown>()\n const api: PluginApi = {\n config,\n logger: config.logger,\n expose<T>(key: PluginApiKey, value: T) {\n if (exposed.has(key) && exposed.get(key) !== value) {\n throw new Error(`[nasti] plugin API key already exposed: ${String(key)}`)\n }\n exposed.set(key, value)\n },\n useExposed<T>(key: PluginApiKey): T | undefined {\n return exposed.get(key) as T | undefined\n },\n }\n\n apiByConfig.set(config, api)\n for (const plugin of plugins) {\n await plugin.setup?.(api)\n }\n return api\n}\n\nexport function getPluginApi(config: ResolvedConfig): PluginApi {\n const api = apiByConfig.get(config)\n if (!api) {\n throw new Error(\n '[nasti] internal: plugin API requested before setup; getPluginApi requires ' +\n 'the original ResolvedConfig reference registered by setupPluginApi, not a shallow copy',\n )\n }\n return api\n}\n\nfunction enforceRank(plugin: NastiPlugin): number {\n if (plugin.enforce === 'pre') return 0\n if (plugin.enforce === 'post') return 2\n return 1\n}\n","import { pathToFileURL } from 'node:url'\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport type {\n NastiConfig,\n ResolvedConfig,\n NastiPlugin,\n EnvironmentOptions,\n} from '../types.js'\nimport { defaultReact, defaults } from './defaults.js'\nimport { createLogger } from '../core/logger.js'\nimport { isMinifyEnabled } from '../core/minify.js'\nimport { orderPlugins, setupPluginApi } from '../core/plugin-api.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\n/**\n * 将 framework:auto 收敛为具体框架。\n *\n * 优先使用源码中的 .vue 文件消除同时安装 React/Vue 时的歧义,其次读取\n * package.json dependencies,最后回退 React 以保持 1.x 默认行为。\n */\nexport function detectFramework(root: string): 'react' | 'vue' {\n const sourceRoot = path.resolve(root, 'src')\n if (containsVueFile(sourceRoot)) return 'vue'\n\n const packagePath = path.resolve(root, 'package.json')\n if (fs.existsSync(packagePath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(packagePath, 'utf-8'))\n const dependencies = {\n ...(pkg.dependencies ?? {}),\n ...(pkg.devDependencies ?? {}),\n ...(pkg.peerDependencies ?? {}),\n ...(pkg.optionalDependencies ?? {}),\n }\n const hasVue = 'vue' in dependencies || '@vue/runtime-dom' in dependencies\n const hasReact = 'react' in dependencies || 'react-dom' in dependencies\n if (hasVue && !hasReact) return 'vue'\n if (hasReact) return 'react'\n if (hasVue) return 'vue'\n } catch {\n // Invalid package.json is reported by package managers; framework detection\n // remains deterministic and falls back to the existing React behavior.\n }\n }\n\n return 'react'\n}\n\nfunction containsVueFile(dir: string, depth = 0): boolean {\n if (depth > 5 || !fs.existsSync(dir)) return false\n try {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (entry.isFile() && entry.name.endsWith('.vue')) return true\n if (\n entry.isDirectory() &&\n entry.name !== 'node_modules' &&\n entry.name !== 'dist' &&\n containsVueFile(path.join(dir, entry.name), depth + 1)\n ) {\n return true\n }\n }\n } catch {\n return false\n }\n return false\n}\n\nasync function loadTsConfig(filePath: string): Promise<NastiConfig> {\n // 使用 oxc-transform 转译 TS 配置文件\n const { transformSync } = await import('oxc-transform')\n const code = fs.readFileSync(filePath, 'utf-8')\n const result = transformSync(filePath, code, {\n typescript: {},\n })\n\n // 写入临时 .mjs 文件然后 import\n const tmpFile = filePath + '.timestamp-' + Date.now() + '.mjs'\n try {\n fs.writeFileSync(tmpFile, result.code)\n const mod = await import(pathToFileURL(tmpFile).href)\n return mod.default ?? mod\n } finally {\n fs.unlinkSync(tmpFile)\n }\n}\n\n/**\n * Resolve the final configuration by loading file-based config, merging with inline config, and applying plugin hooks.\n *\n * Loads configuration from the project root (derived from `inlineConfig.root` or defaults), deep-merges file config with `inlineConfig` (inline takes precedence), runs each plugin's `config` hook and incorporates any returned partial config, constructs the complete `ResolvedConfig` (filling defaults for missing values and resolving tsconfig paths), filters plugins according to their `apply` field, and then invokes each included plugin's `configResolved` hook.\n *\n * @param inlineConfig - User-provided configuration that overrides file config and defaults\n * @param command - The current command, either `\"build\"` or `\"serve\"`, which influences mode and plugin filtering\n * @returns The fully resolved configuration with defaults applied, plugins filtered, and plugin hooks executed\n */\nexport async function resolveConfig(\n inlineConfig: NastiConfig = {},\n command: 'build' | 'serve',\n): Promise<ResolvedConfig> {\n const root = path.resolve(inlineConfig.root ?? defaults.root)\n const fileConfig = await loadConfigFromFile(root)\n\n // 合并: fileConfig < inlineConfig\n const merged: NastiConfig = deepMerge(deepMerge({}, fileConfig), inlineConfig)\n\n // 收集插件\n const rawPlugins: NastiPlugin[] = [\n ...(fileConfig.plugins ?? []),\n ...(inlineConfig.plugins ?? []),\n ]\n\n // mode:merged.mode 优先,否则按 command 取默认。env(传给 plugin.config)\n // 与最终 resolved.mode 共用此值,避免二者分叉(否则 loadEnv 会按错误的\n // mode 加载 .env.<mode>,且插件看到的 env.mode 与 resolved.mode 不一致)\n const mode = (merged.mode ??\n (command === 'build' ? 'production' : 'development')) as ResolvedConfig['mode']\n\n // 执行插件 config 钩子\n const env = { mode, command }\n for (const plugin of rawPlugins) {\n if (plugin.config) {\n const result = await plugin.config(merged, env)\n if (result) Object.assign(merged, result)\n }\n }\n\n // 先构建 resolved,plugins 稍后填入(避免过滤时引用未初始化变量)\n const logLevel = merged.logLevel ?? defaults.logLevel\n const clearScreen = merged.clearScreen ?? defaults.clearScreen\n const logger = createLogger(logLevel, {\n allowClearScreen: clearScreen,\n customLogger: merged.customLogger,\n })\n const mergedBuild = {\n ...defaults.build,\n ...merged.build,\n css: { ...defaults.build.css, ...merged.build?.css },\n } as ResolvedConfig['build']\n // cssMinify 未显式配置时跟随 minify\n if (merged.build?.cssMinify === undefined) {\n mergedBuild.cssMinify = isMinifyEnabled(mergedBuild.minify)\n }\n const resolved: ResolvedConfig = {\n root,\n base: merged.base ?? defaults.base,\n mode,\n target: (merged.target ?? defaults.target) as ResolvedConfig['target'],\n framework:\n (merged.framework ?? defaults.framework) === 'auto'\n ? detectFramework(root)\n : (merged.framework as 'react' | 'vue'),\n react: {\n include: merged.react?.include ?? defaultReact.include,\n exclude: merged.react?.exclude ?? defaultReact.exclude,\n jsxImportSource: merged.react?.jsxImportSource ?? defaultReact.jsxImportSource,\n jsxRuntime: merged.react?.jsxRuntime ?? defaultReact.jsxRuntime,\n compiler:\n merged.react?.compiler === true\n ? {}\n : (merged.react?.compiler ?? defaultReact.compiler),\n },\n command,\n resolve: {\n // tsconfig paths 优先级最低:tsconfig < defaults < user config\n alias: { ...loadTsconfigPaths(root), ...defaults.resolve.alias, ...merged.resolve?.alias },\n extensions: (merged.resolve?.extensions ?? defaults.resolve.extensions) as string[],\n conditions: (merged.resolve?.conditions ?? defaults.resolve.conditions) as string[],\n mainFields: (merged.resolve?.mainFields ?? defaults.resolve.mainFields) as string[],\n },\n plugins: [],\n server: { ...defaults.server, ...merged.server } as ResolvedConfig['server'],\n build: mergedBuild,\n electron: { ...defaults.electron, ...merged.electron } as ResolvedConfig['electron'],\n envPrefix: (Array.isArray(merged.envPrefix)\n ? merged.envPrefix\n : merged.envPrefix\n ? [merged.envPrefix]\n : [...defaults.envPrefix]) as string[],\n logLevel,\n clearScreen,\n logger,\n environments: {},\n experimental: {\n bundledDev: merged.experimental?.bundledDev ?? defaults.experimental.bundledDev,\n },\n }\n\n // ── Environment API:解析 environments map(默认 client + ssr)──────────\n // client 与 top-level resolve/build 精确镜像(同引用);其余环境按 consumer\n // 取 per-consumer resolve 默认值。configEnvironment 钩子在最终化前调用。\n const rawUserEnvironments: Record<string, EnvironmentOptions> = {\n client: {},\n ssr: {},\n ...(merged.environments ?? {}),\n }\n const userEnvironments = Object.fromEntries(\n Object.entries(rawUserEnvironments).map(([name, options]) => [\n name,\n deepMerge({}, options),\n ]),\n ) as Record<string, EnvironmentOptions>\n for (const [name, envOptions] of Object.entries(userEnvironments)) {\n for (const plugin of rawPlugins) {\n if (plugin.configEnvironment) {\n const result = await plugin.configEnvironment(name, envOptions, env)\n if (result) Object.assign(envOptions, deepMerge(envOptions, result))\n }\n }\n }\n for (const [name, envOptions] of Object.entries(userEnvironments)) {\n const consumer: 'client' | 'server' =\n envOptions.consumer ?? (name === 'client' ? 'client' : 'server')\n const vueOptions = deepMerge({}, envOptions.vue ?? {})\n\n if (name === 'client') {\n // 用户对 environments.client 的覆盖写回 top-level(镜像语义:二者是同一份)\n if (envOptions.resolve) {\n Object.assign(resolved.resolve, {\n ...envOptions.resolve,\n alias: { ...resolved.resolve.alias, ...envOptions.resolve.alias },\n })\n }\n if (envOptions.build) {\n const { css, ...environmentBuild } = envOptions.build\n Object.assign(resolved.build, environmentBuild)\n if (css) resolved.build.css = { ...resolved.build.css, ...css }\n }\n resolved.environments.client = {\n consumer,\n buildEnabled: envOptions.buildEnabled ?? true,\n entry: normalizeEnvironmentEntries(envOptions.entry, root),\n html: path.resolve(\n root,\n envOptions.html ??\n (resolved.target === 'electron' ? resolved.electron.renderer : 'index.html'),\n ),\n driver: envOptions.driver,\n // 同引用 —— 精确镜像(assertClientEnvironmentMirror 校验)\n resolve: resolved.resolve,\n build: resolved.build,\n vue: vueOptions,\n }\n continue\n }\n\n resolved.environments[name] = {\n consumer,\n buildEnabled: envOptions.buildEnabled ?? true,\n entry: normalizeEnvironmentEntries(envOptions.entry, root),\n html:\n envOptions.consumer === 'client' && envOptions.html\n ? path.resolve(root, envOptions.html)\n : undefined,\n driver: envOptions.driver,\n vue: vueOptions,\n resolve: {\n alias: { ...resolved.resolve.alias, ...envOptions.resolve?.alias },\n extensions: envOptions.resolve?.extensions ?? [...resolved.resolve.extensions],\n // server consumer:node conditions(去 'browser');client 非默认环境沿用 top-level\n conditions:\n envOptions.resolve?.conditions ??\n (consumer === 'server'\n ? ['node', ...resolved.resolve.conditions.filter((c) => c !== 'browser')]\n : [...resolved.resolve.conditions]),\n mainFields:\n envOptions.resolve?.mainFields ??\n (consumer === 'server' ? ['module', 'main'] : [...resolved.resolve.mainFields]),\n },\n build: {\n ...resolved.build,\n ...envOptions.build,\n css: { ...resolved.build.css, ...envOptions.build?.css },\n // 非 client 环境默认产出到 <outDir>/<envName>(如 dist/ssr),可显式覆盖\n outDir: envOptions.build?.outDir ?? path.join(resolved.build.outDir, name),\n // server 产物默认不压缩(可调试性优先,与 Vite SSR 默认一致),可显式覆盖\n minify: envOptions.build?.minify ?? (consumer === 'server' ? false : resolved.build.minify),\n },\n }\n }\n\n assertClientEnvironmentMirror(resolved)\n\n // 过滤插件(apply 为函数时可安全访问已初始化的 resolved)\n const filteredPlugins = orderPlugins(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 // setup 是 configResolved 前的单次初始化阶段;环境驱动与后续生命周期\n // 通过同一 PluginApi 访问 expose/useExposed 注册表。\n await setupPluginApi(resolved, filteredPlugins)\n\n // Electron 目标:扫描 dependencies 自动外部化 native 模块\n // (带 binding.gyp、gypfile:true,或 node_modules 内存在 *.node 的包)。\n // rolldown 尝试把 .node 打进 main 会直接爆,提前标为 external 才能正常 require。\n if (resolved.target === 'electron') {\n const autoExternal = detectNativeDeps(root)\n if (autoExternal.length > 0) {\n const current = new Set(resolved.electron.external ?? [])\n for (const dep of autoExternal) current.add(dep)\n resolved.electron.external = [...current]\n }\n }\n\n // 执行插件 configResolved 钩子\n for (const plugin of resolved.plugins) {\n if (plugin.configResolved) {\n await plugin.configResolved(resolved)\n }\n }\n\n return resolved\n}\n\nfunction normalizeEnvironmentEntries(\n entry: string | string[] | undefined,\n root: string,\n): string[] {\n const entries = Array.isArray(entry) ? entry : entry ? [entry] : []\n return entries.map((item) => path.resolve(root, item))\n}\n\n/**\n * 扫描项目 dependencies,返回需要从 Electron 主进程 bundle 中外部化的 native 模块列表。\n *\n * 判定依据(任一满足即视为 native):\n * - 包根目录存在 binding.gyp\n * - package.json 有 gypfile: true\n * - 包内存在 *.node 预编译产物\n * - 常见已知 native 包白名单(对付有些包不走 node-gyp 但运行时仍需原生 addon 的场景)\n */\nexport function detectNativeDeps(root: string): string[] {\n const result = new Set<string>()\n const pkgJsonPath = path.resolve(root, 'package.json')\n if (!fs.existsSync(pkgJsonPath)) return []\n let pkg: Record<string, any>\n try {\n pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'))\n } catch {\n return []\n }\n const deps = {\n ...(pkg.dependencies ?? {}),\n ...(pkg.optionalDependencies ?? {}),\n }\n // 已知需要外部化的 Electron 生态 native 模块\n const KNOWN_NATIVE = new Set([\n 'node-pty',\n 'better-sqlite3',\n 'sharp',\n 'serialport',\n '@vscode/tree-sitter-wasm',\n 'keytar',\n 'nodegit',\n 'sqlite3',\n 'fsevents',\n ])\n for (const dep of Object.keys(deps)) {\n if (KNOWN_NATIVE.has(dep)) {\n result.add(dep)\n continue\n }\n const depDir = path.resolve(root, 'node_modules', dep)\n if (!fs.existsSync(depDir)) continue\n // binding.gyp\n if (fs.existsSync(path.join(depDir, 'binding.gyp'))) {\n result.add(dep)\n continue\n }\n // package.json: gypfile\n const subPkg = path.join(depDir, 'package.json')\n if (fs.existsSync(subPkg)) {\n try {\n const sub = JSON.parse(fs.readFileSync(subPkg, 'utf-8'))\n if (sub.gypfile === true || sub.binary?.module_name) {\n result.add(dep)\n continue\n }\n } catch {\n /* ignore */\n }\n }\n // 浅层扫 *.node 文件(build/Release 或 prebuilds 目录)\n if (hasDotNodeFile(depDir)) {\n result.add(dep)\n }\n }\n return [...result]\n}\n\nfunction hasDotNodeFile(dir: string, depth = 0): boolean {\n if (depth > 3) return false\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n for (const e of entries) {\n if (e.isFile() && e.name.endsWith('.node')) return true\n if (e.isDirectory() && (e.name === 'build' || e.name === 'prebuilds' || e.name === 'Release')) {\n if (hasDotNodeFile(path.join(dir, e.name), depth + 1)) return true\n }\n }\n } catch {\n /* ignore */\n }\n return false\n}\n\n/**\n * 运行时镜像断言(Phase 1 检查,NASTI_2.0_PLAN.md §1.2):\n * top-level `resolve`/`build` 与 `environments.client` 必须**精确镜像**,\n * 否则读 flat config 的既有插件与 Environment API 会看到两份配置。\n *\n * 比较规则(文档化):\n * - 快路径:引用相等(resolveConfig 保证同引用,正常永远走这里)\n * - 慢路径:JSON 序列化逐字节比较 resolve{alias,extensions,conditions,\n * mainFields} 与 build 全字段(含 sourcemap);函数值(如\n * rolldownOptions.output.advancedChunks 的 test 回调)会被 JSON 丢弃,\n * 不参与比较 —— 不要在 per-env build 覆盖里只改函数字段\n * - 设 NASTI_DISABLE_MIRROR_ASSERT=1 可关闭(不建议)\n */\nexport function assertClientEnvironmentMirror(config: ResolvedConfig): void {\n if (process.env.NASTI_DISABLE_MIRROR_ASSERT) return\n const client = config.environments.client\n if (!client) {\n throw new Error('[nasti] internal: environments.client missing after resolveConfig')\n }\n if (client.resolve === config.resolve && client.build === config.build) return\n const pairs: Array<[string, unknown, unknown]> = [\n ['resolve', config.resolve, client.resolve],\n ['build', config.build, client.build],\n ]\n for (const [field, top, env] of pairs) {\n const a = JSON.stringify(top)\n const b = JSON.stringify(env)\n if (a !== b) {\n throw new Error(\n `[nasti] config mirror violation: top-level \\`${field}\\` and ` +\n `\\`environments.client.${field}\\` diverged.\\n top-level: ${a}\\n client: ${b}\\n` +\n `top-level 与 client 环境必须精确镜像 —— 请通过 top-level 或 ` +\n `environments.client 之一配置,不要在解析后分别修改两者。`,\n )\n }\n }\n}\n\n/** 仅普通对象字面量返回 true —— 类实例 / 函数 / Date / Map 等不算,\n * 避免 deepMerge 递归剥掉它们的原型方法(如自定义 customLogger 实例)。 */\nfunction isPlainObject(val: unknown): val is Record<string, any> {\n if (val === null || typeof val !== 'object') return false\n const proto = Object.getPrototypeOf(val)\n return proto === Object.prototype || proto === null\n}\n\nfunction deepMerge<T extends Record<string, any>>(target: T, source: Record<string, any>): T {\n const result = { ...target }\n for (const key of Object.keys(source)) {\n const val = source[key]\n // 只对普通对象递归合并;其余(类实例/函数/数组…)整体按引用赋值,保留原型\n if (isPlainObject(val)) {\n result[key as keyof T] = deepMerge(\n (result[key as keyof T] as Record<string, any>) ?? {},\n val,\n ) as T[keyof T]\n } else if (val !== undefined) {\n result[key as keyof T] = val\n }\n }\n return result\n}\n","// 模块解析插件 - 处理 bare imports、路径 alias、文件扩展名\nimport path from 'node:path'\nimport fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport type { NastiPlugin, ResolvedConfig } from '../types.js'\n\nexport function resolvePlugin(config: ResolvedConfig): NastiPlugin {\n const { alias, extensions } = config.resolve\n const require = createRequire(path.resolve(config.root, 'package.json'))\n\n // 长 key 优先,避免 `@` 抢在 `@/utils` 之前\n const aliasEntries = Object.entries(alias).sort(\n ([a], [b]) => b.length - a.length,\n )\n\n // Vue:require.resolve('vue') 走 CJS 解析,命中 `main` 指向的「含编译器全量构建」。\n // 预编译 SFC 的应用只需 runtime,应指向 `module` 字段的 runtime-only esm-bundler 构建,\n // 否则整套模板编译器(~500kB)会被打进生产包。仅在 framework==='vue' 时启用,且只对\n // **精确** 的 `vue` specifier 生效(不影响 `vue/xxx` 子路径)。启动时解析一次并缓存。\n let vueRuntimeEntry: string | null = null\n if (config.framework === 'vue') {\n try {\n const vuePkgJson = require.resolve('vue/package.json', { paths: [config.root] })\n const vueDir = path.dirname(vuePkgJson)\n const mod = JSON.parse(fs.readFileSync(vuePkgJson, 'utf-8')).module as string | undefined\n const entry = path.join(vueDir, mod ?? 'dist/vue.runtime.esm-bundler.js')\n if (fs.existsSync(entry)) vueRuntimeEntry = entry\n } catch {\n /* vue 尚未安装(如 configResolved 阶段):忽略,回落到默认解析 */\n }\n }\n\n return {\n name: 'nasti:resolve',\n enforce: 'pre',\n\n resolveId(source, importer) {\n // 1. alias —— 优先:直接解析到磁盘上的目标文件\n for (const [key, value] of aliasEntries) {\n if (source === key || source.startsWith(key + '/')) {\n const aliasBase = resolveAliasTarget(value, config.root)\n const sub = source.slice(key.length).replace(/^\\//, '')\n const target = sub ? path.join(aliasBase, sub) : aliasBase\n const resolved = tryResolveFile(target, extensions)\n if (resolved) return resolved\n // alias 未命中实际文件:跳出循环走下游分支,避免把 `@/x` 误当作 bare import\n break\n }\n }\n\n // 2. 项目根相对路径(Vite 约定):`/src/...` 指向 <root>/src/...\n // chen-the-dawnstreak 的虚拟路由模块会生成这种 import。\n // 必须排在「真正绝对路径」分支前 —— Unix 下二者无法靠 path.isAbsolute 区分。\n if (source.startsWith('/') && !source.startsWith('//')) {\n const rootRelative = path.join(config.root, source.slice(1))\n const resolved = tryResolveFile(rootRelative, extensions)\n if (resolved) return resolved\n }\n\n // 3. 真正的文件系统绝对路径(Windows `C:\\…` 或已被其它插件解析过的 Unix 路径)\n if (path.isAbsolute(source) && fs.existsSync(source)) {\n const resolved = tryResolveFile(source, extensions)\n if (resolved) return resolved\n }\n\n // 4. 相对路径\n if (source.startsWith('.')) {\n const dir = importer ? path.dirname(importer) : config.root\n const absolute = path.resolve(dir, source)\n const resolved = tryResolveFile(absolute, extensions)\n if (resolved) return resolved\n }\n\n // 5. bare import (node_modules)\n if (!source.startsWith('/') && !source.startsWith('.')) {\n // Vue runtime-only 重定向(见上方说明)\n if (vueRuntimeEntry && source === 'vue') return vueRuntimeEntry\n\n // build 必须交给 Rolldown 原生 resolver:它会使用当前 environment 的\n // conditionNames/mainFields。若在这里用 require.resolve 抢先解析,Lynx\n // BG/MT 等双 client-consumer 环境会错误命中同一套 Node 条件导出。\n if (config.command === 'build') return null\n\n try {\n const resolved = require.resolve(source, {\n paths: [importer ? path.dirname(importer) : config.root],\n })\n return resolved\n } catch {\n return null\n }\n }\n\n return null\n },\n\n load(id) {\n // 虚拟模块(Vite 约定的 `\\0` 前缀)交给提供它的插件处理\n if (id.startsWith('\\0')) return null\n if (!fs.existsSync(id)) return null\n // JSON 文件包装为 ES 模块\n if (id.endsWith('.json')) {\n const content = fs.readFileSync(id, 'utf-8')\n return `export default ${content}`\n }\n // 其余真实文件留给后续专用 load 插件(assets / Vue virtual blocks);\n // 无插件接管时由 Rolldown 或 dev middleware 的文件系统 loader 读取。\n return null\n },\n }\n}\n\n/**\n * 把 alias 值统一成磁盘绝对路径,匹配 dev server 的语义:\n * - `/Users/.../src` 真正的绝对路径 → 直接用\n * - `/src` 用户写的项目根相对 → 按 `<root>/src` 处理\n * - 其余字符串相对 root 解析\n */\nfunction resolveAliasTarget(value: string, root: string): string {\n if (path.isAbsolute(value) && fs.existsSync(value)) return value\n if (value.startsWith('/')) return path.join(root, value.slice(1))\n return path.resolve(root, value)\n}\n\n/** 尝试解析文件,带扩展名补全和 index 文件查找 */\nfunction tryResolveFile(file: string, extensions: string[]): string | null {\n // 精确路径\n if (fs.existsSync(file) && fs.statSync(file).isFile()) {\n return file\n }\n\n // 尝试加扩展名\n for (const ext of extensions) {\n const withExt = file + ext\n if (fs.existsSync(withExt) && fs.statSync(withExt).isFile()) {\n return withExt\n }\n }\n\n // 尝试作为目录查找 index 文件\n if (fs.existsSync(file) && fs.statSync(file).isDirectory()) {\n for (const ext of extensions) {\n const indexFile = path.join(file, 'index' + ext)\n if (fs.existsSync(indexFile)) {\n return indexFile\n }\n }\n }\n\n return null\n}\n","// OXC Transform 封装 - 高性能 TS/JSX/TSX 转译\nimport { transformSync } from 'oxc-transform'\nimport type { ReactFileFilter, ResolvedReactOptions } from '../types.js'\n\nexport interface TransformOptions {\n jsx?: boolean\n jsxRuntime?: 'automatic' | 'classic'\n jsxImportSource?: string\n typescript?: boolean\n sourcemap?: boolean\n reactRefresh?: boolean\n target?: string | string[]\n}\n\nexport interface TransformOutput {\n code: string\n map: string | null\n}\n\nexport interface ReactTransformOptions {\n react: ResolvedReactOptions\n consumer: 'client' | 'server'\n development: boolean\n reactRefresh?: boolean\n sourcemap?: boolean\n target?: string | string[]\n onWarning?: (message: string) => void\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 target: options.target,\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/** 与 @vitejs/plugin-react 一致的线性预筛选,宁可误报也不漏掉组件或 Hook。 */\nexport const defaultReactCompilerCodeFilter = /forwardRef|memo|\\b(?:[A-Z]|use[A-Z0-9])/\n\nlet reactCompilerImplementation:\n | typeof import('oxc-transform-react')\n | undefined\n\n/**\n * React 专用转换入口。默认仍走既有同步 OXC 管线;仅在显式开启 Compiler 时\n * 加载可选的原生编译器,并且只对 client consumer 启用 memo 编译。\n */\nexport async function transformReactCode(\n filename: string,\n code: string,\n options: ReactTransformOptions,\n): Promise<TransformOutput | null> {\n if (!matchesReactFilter(filename, options.react.include, options.react.exclude)) {\n return null\n }\n\n if (!options.react.compiler) {\n if (!shouldTransform(filename)) return null\n return transformCode(filename, code, {\n sourcemap: options.sourcemap,\n jsxRuntime: options.react.jsxRuntime,\n jsxImportSource: options.react.jsxImportSource,\n reactRefresh: options.reactRefresh,\n target: options.target,\n })\n }\n\n if (!shouldTransform(filename)) return null\n const compiler = await loadReactCompiler()\n const compilerOptions = options.react.compiler\n const shouldCompile =\n options.consumer === 'client' &&\n (compilerOptions.compilationMode === 'annotation'\n ? /['\"]use memo['\"]/.test(code)\n : defaultReactCompilerCodeFilter.test(code))\n const result = await compiler.transform(cleanTransformId(filename), code, {\n jsx: {\n runtime: options.react.jsxRuntime,\n development: options.development,\n importSource: options.react.jsxImportSource,\n refresh: options.consumer === 'client' && !!options.reactRefresh,\n },\n reactCompiler: shouldCompile\n ? compilerOptions as import('oxc-transform-react').ReactCompilerOptions\n : false,\n sourcemap: options.sourcemap ?? true,\n })\n const diagnostics = result.errors.map(\n (error) => `${error.message}${error.codeframe ? `\\n${error.codeframe}` : ''}`,\n )\n if (result.fatal) {\n throw new Error(\n diagnostics.join('\\n\\n') || `React Compiler transform failed for ${filename}`,\n )\n }\n for (const diagnostic of diagnostics) options.onWarning?.(diagnostic)\n return {\n code: result.code,\n map: result.map ? JSON.stringify(result.map) : null,\n }\n}\n\nexport function matchesReactFilter(\n id: string,\n include: ReactFileFilter,\n exclude: ReactFileFilter,\n): boolean {\n const cleanId = cleanTransformId(id)\n return matchesFilter(cleanId, include) && !matchesFilter(cleanId, exclude)\n}\n\nfunction matchesFilter(id: string, filter: ReactFileFilter): boolean {\n const patterns = Array.isArray(filter) ? filter : [filter]\n return patterns.some((pattern) => {\n if (pattern instanceof RegExp) {\n pattern.lastIndex = 0\n return pattern.test(id)\n }\n if (!pattern.includes('*')) return id.includes(pattern)\n const expression = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*\\*/g, '\\0')\n .replace(/\\*/g, '[^/]*')\n .replace(/\\0/g, '.*')\n return new RegExp(`^${expression}$`).test(id)\n })\n}\n\nfunction cleanTransformId(id: string): string {\n return id.split(/[?#]/, 1)[0]\n}\n\nasync function loadReactCompiler(): Promise<typeof import('oxc-transform-react')> {\n if (reactCompilerImplementation) return reactCompilerImplementation\n try {\n reactCompilerImplementation = await import('oxc-transform-react')\n return reactCompilerImplementation\n } catch (error) {\n throw new Error(\n '[nasti] React Compiler requires the optional \"oxc-transform-react\" package. ' +\n 'Install it before setting react.compiler.' +\n (error instanceof Error ? `\\n${error.message}` : ''),\n )\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","// 环境变量加载 - 读取 .env 文件并生成 import.meta.env 定义\nimport path from 'node:path'\nimport fs from 'node:fs'\n\nexport interface EnvRecord {\n [key: string]: string\n}\n\n/**\n * 从 .env 文件加载环境变量,按优先级合并:\n * .env < .env.[mode] < .env.local < .env.[mode].local\n */\nexport function loadEnv(mode: string, root: string, prefixes: string[]): EnvRecord {\n const envFiles = [\n '.env',\n `.env.${mode}`,\n '.env.local',\n `.env.${mode}.local`,\n ]\n\n const raw: EnvRecord = {}\n\n for (const file of envFiles) {\n const filePath = path.resolve(root, file)\n if (!fs.existsSync(filePath)) continue\n const content = fs.readFileSync(filePath, 'utf-8')\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eqIdx = trimmed.indexOf('=')\n if (eqIdx === -1) continue\n const key = trimmed.slice(0, eqIdx).trim()\n let value = trimmed.slice(eqIdx + 1).trim()\n // 去除引号\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1)\n }\n raw[key] = value\n }\n }\n\n // 只保留符合 prefix 的变量\n const filtered: EnvRecord = {}\n for (const [key, value] of Object.entries(raw)) {\n if (prefixes.some((prefix) => key.startsWith(prefix))) {\n filtered[key] = value\n }\n }\n\n return filtered\n}\n\n/**\n * 将过滤后的 env 转为 Rolldown define 对象\n * 例: { VITE_FOO: 'bar' } → { 'import.meta.env.VITE_FOO': '\"bar\"' }\n * 同时注入 import.meta.env.MODE / DEV / PROD / SSR\n *\n * per-env define 钩子(Phase1→Phase2 接口契约):`overrides` 允许调用方按\n * 环境覆盖任意 define —— server 环境传 `ssrDefineOverrides('server')` 注入\n * `import.meta.env.SSR='true'`,不再写死 'false'。\n */\nexport function buildEnvDefine(\n env: EnvRecord,\n mode: string,\n overrides: Record<string, string> = {},\n): Record<string, string> {\n const define: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(env)) {\n define[`import.meta.env.${key}`] = JSON.stringify(value)\n }\n\n define['import.meta.env.MODE'] = JSON.stringify(mode)\n define['import.meta.env.DEV'] = mode !== 'production' ? 'true' : 'false'\n define['import.meta.env.PROD'] = mode === 'production' ? 'true' : 'false'\n define['import.meta.env.SSR'] = 'false'\n\n return { ...define, ...overrides }\n}\n\n/** 按环境 consumer 派生 import.meta.env.SSR 的 define 覆盖 */\nexport function ssrDefineOverrides(consumer: 'client' | 'server'): Record<string, string> {\n return { 'import.meta.env.SSR': consumer === 'server' ? 'true' : 'false' }\n}\n\n/**\n * 在代码字符串中替换 import.meta.env.KEY(用于 dev 服务器按需转换)\n */\nexport function replaceEnvInCode(code: string, define: Record<string, string>): string {\n let result = code\n for (const [key, value] of Object.entries(define)) {\n // 转义正则特殊字符\n const escaped = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n result = result.replace(new RegExp(escaped, 'g'), value)\n }\n return result\n}\n"],"mappings":"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"}