@hzab/vite-config 0.0.3-alpha.0 → 0.0.3-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +95 -85
- package/LICENSE +21 -21
- package/README.md +184 -173
- package/dist/create-app-vite-config.cjs +160 -27
- package/dist/create-app-vite-config.cjs.map +1 -1
- package/dist/create-app-vite-config.js +160 -27
- package/dist/create-app-vite-config.js.map +1 -1
- package/dist/create-library-vite-config.cjs +34 -3
- package/dist/create-library-vite-config.cjs.map +1 -1
- package/dist/create-library-vite-config.js +33 -2
- package/dist/create-library-vite-config.js.map +1 -1
- package/dist/create-package-vitest-config.cjs.map +1 -1
- package/dist/create-package-vitest-config.js.map +1 -1
- package/dist/create-vite-config.cjs +160 -27
- package/dist/create-vite-config.cjs.map +1 -1
- package/dist/create-vite-config.js +160 -27
- package/dist/create-vite-config.js.map +1 -1
- package/dist/index.cjs +193 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +194 -30
- package/dist/index.js.map +1 -1
- package/dist/plugins/copy.cjs.map +1 -1
- package/dist/plugins/copy.js.map +1 -1
- package/dist/plugins/hash-deploy.cjs +150 -25
- package/dist/plugins/hash-deploy.cjs.map +1 -1
- package/dist/plugins/hash-deploy.d.cts +16 -5
- package/dist/plugins/hash-deploy.d.ts +16 -5
- package/dist/plugins/hash-deploy.js +150 -25
- package/dist/plugins/hash-deploy.js.map +1 -1
- package/dist/plugins/less-tilde.cjs.map +1 -1
- package/dist/plugins/less-tilde.js.map +1 -1
- package/dist/plugins/lifecycle.cjs.map +1 -1
- package/dist/plugins/lifecycle.js.map +1 -1
- package/dist/plugins/public-assets.cjs.map +1 -1
- package/dist/plugins/public-assets.js.map +1 -1
- package/dist/plugins/public-config.cjs.map +1 -1
- package/dist/plugins/public-config.js.map +1 -1
- package/dist/plugins/react-compiler.cjs.map +1 -1
- package/dist/plugins/react-compiler.js.map +1 -1
- package/dist/plugins/relative-base.cjs.map +1 -1
- package/dist/plugins/relative-base.js.map +1 -1
- package/dist/plugins/stub-less.cjs.map +1 -1
- package/dist/plugins/stub-less.js.map +1 -1
- package/dist/plugins/svg-react.cjs.map +1 -1
- package/dist/plugins/svg-react.js.map +1 -1
- package/dist/types.d.cts +19 -8
- package/dist/types.d.ts +19 -8
- package/dist/vitest.cjs.map +1 -1
- package/dist/vitest.js.map +1 -1
- package/docs/README.md +15 -15
- package/docs/abt-management-ui/vite.config.mts +226 -226
- package/docs/api.md +404 -366
- package/docs/migration-from-webpack.md +723 -722
- package/docs/sync-public-path.md +52 -52
- package/docs/vite-config-integration.md +477 -476
- package/docs/vite-pnpm-integration.md +279 -279
- package/docs/vs-ccc-vite-config.md +26 -26
- package/docs/webpack-gap.md +108 -107
- package/package.json +1 -1
- package/src/client.d.ts +9 -9
- package/src/create-app-vite-config.ts +236 -218
- package/src/create-library-vite-config.ts +248 -205
- package/src/create-package-vitest-config.ts +54 -54
- package/src/create-vite-config.ts +22 -22
- package/src/index.ts +41 -42
- package/src/plugins/copy.ts +25 -25
- package/src/plugins/hash-deploy.ts +239 -199
- package/src/plugins/hash-dir-name.ts +212 -0
- package/src/plugins/less-tilde.ts +72 -72
- package/src/plugins/lifecycle.ts +40 -40
- package/src/plugins/public-assets.ts +28 -28
- package/src/plugins/public-config.ts +34 -34
- package/src/plugins/react-compiler.ts +32 -32
- package/src/plugins/relative-base.ts +20 -20
- package/src/plugins/stub-less.ts +26 -26
- package/src/plugins/svg-react.ts +90 -90
- package/src/svg-react-runtime.ts +4 -4
- package/src/svg-react.d.ts +6 -6
- package/src/types.ts +325 -314
- package/src/vitest-types.ts +20 -20
- package/src/vitest.ts +2 -2
- package/templates/src/vite-env.d.ts +2 -2
- package/templates/tsconfig.json +12 -12
- package/templates/vite.config.ts +26 -26
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/lifecycle.ts","../src/plugins/less-tilde.ts","../src/plugins/react-compiler.ts","../src/plugins/svg-react.ts","../src/create-library-vite-config.ts"],"names":["babel","reactCompilerPreset","fs","transformWithOxc","react","createHtmlPlugin","path","basicSsl","mergeConfig"],"mappings":"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","file":"create-library-vite-config.cjs","sourcesContent":["import type { PluginOption } from \"vite\";\r\n\r\n/** @public */\r\nexport interface LifecyclePluginOptions {\r\n /** 构建开始(Vite `buildStart`)。仅同步。 */\r\n onRun?: () => void;\r\n /**\r\n * 产物写盘成功之后(`writeBundle` sequential post)。\r\n * 工厂中排在 Hash 根入口写入之后;Hash 写入失败不会调用。\r\n */\r\n onDone?: () => void | Promise<void>;\r\n}\r\n\r\n/**\r\n * 构建起止回调。`onDone` 使用 sequential post `writeBundle`,\r\n * 以便排在 Hash 部署等其它 post 写入之后。\r\n * @public\r\n */\r\nexport function lifecyclePlugin(options: LifecyclePluginOptions = {}): PluginOption {\r\n const { onRun, onDone } = options;\r\n\r\n return {\r\n name: \"build-lifecycle\",\r\n enforce: \"post\",\r\n buildStart() {\r\n if (typeof onRun === \"function\") {\r\n onRun();\r\n }\r\n },\r\n writeBundle: {\r\n sequential: true,\r\n order: \"post\",\r\n async handler() {\r\n if (typeof onDone === \"function\") {\r\n await onDone();\r\n }\r\n },\r\n },\r\n };\r\n}\r\n","import type { LessOptions } from \"../types.ts\";\r\n\r\n/**\r\n * less 插件注入的 FileManager 实例表面类型。less@4 不自带 TS 类型,按实际使用的最小面声明。\r\n */\r\ninterface LessFileManagerInstance {\r\n supports(filename: string): boolean;\r\n loadFile(\r\n filename: string,\r\n currentDirectory: string,\r\n options: unknown,\r\n environment: unknown,\r\n ): unknown;\r\n}\r\n\r\n/** less.js 传给插件 `install` 的 less 环境实例表面。 */\r\ninterface LessPluginHost {\r\n FileManager: new (...args: unknown[]) => LessFileManagerInstance;\r\n}\r\n\r\n/** less.js 插件管理器表面。 */\r\ninterface LessPluginManager {\r\n addFileManager(manager: LessFileManagerInstance): void;\r\n}\r\n\r\n/**\r\n * Less 插件:把 webpack 遗留的 `~pkg/...` 导入解析到 node_modules。\r\n *\r\n * Less 自身不认识 `~`(那是 webpack `less-loader` 的约定:从 node_modules 解析);Vite 的\r\n * Less 预处理器也不处理 `~`,会回退到 Less 默认 FileManager 去查找 `node_modules/~pkg/...` 而失败。\r\n * 本插件注册一个 FileManager:仅当导入以 `~` 开头时拦截,去掉前缀后交给默认 FileManager 解析\r\n * (Vite 恒向 `less.render` 注入 `paths: [\"node_modules\"]`)。\r\n *\r\n * 第三方包(如 formily 系)自带 `@import \"~antd/...\"` 时尤其需要——消费方无法修改 node_modules。\r\n * @public\r\n */\r\nexport function lessTildeResolutionPlugin() {\r\n return {\r\n install(less: LessPluginHost, pluginManager: LessPluginManager) {\r\n class TildeFileManager extends less.FileManager {\r\n override supports(filename: string) {\r\n return filename.startsWith(\"~\");\r\n }\r\n override loadFile(\r\n filename: string,\r\n currentDirectory: string,\r\n options: unknown,\r\n environment: unknown,\r\n ) {\r\n // `~pkg/...` → `pkg/...`,让默认 FileManager 从 node_modules 解析\r\n return super.loadFile(filename.slice(1), currentDirectory, options, environment);\r\n }\r\n }\r\n pluginManager.addFileManager(new TildeFileManager());\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 组装 `css.preprocessorOptions.less`:映射 webpack `less-loader` 选项,\r\n * `less.resolveTilde: true` 时注入 `~` 解析插件(默认关闭)。\r\n * @public\r\n */\r\nexport function buildLessOptions(less?: LessOptions) {\r\n const resolveTilde = less?.resolveTilde === true;\r\n return {\r\n ...(less?.additionalData != null ? { additionalData: less.additionalData } : {}),\r\n ...(less?.modifyVars != null ? { modifyVars: less.modifyVars } : {}),\r\n ...(less?.javascriptEnabled != null ? { javascriptEnabled: less.javascriptEnabled } : {}),\r\n ...(resolveTilde ? { plugins: [lessTildeResolutionPlugin()] } : {}),\r\n };\r\n}\r\n","import babel from \"@rolldown/plugin-babel\";\r\nimport { reactCompilerPreset } from \"@vitejs/plugin-react\";\r\n\r\nimport type { ReactCompilerMode } from \"../types.ts\";\r\nimport type { PluginOption } from \"vite\";\r\n\r\n/** @public */\r\nexport interface ReactCompilerPluginOptions {\r\n command: string;\r\n /**\r\n * - `true`:始终启用\r\n * - `\"build-only\"`:仅 build,且 `REACT_COMPILER=false` 可关\r\n * - `false`:关闭\r\n */\r\n mode?: ReactCompilerMode;\r\n}\r\n\r\n/**\r\n * React Compiler(babel preset)。默认仅生产构建启用。\r\n * @public\r\n */\r\nexport function reactCompilerPlugin(options: ReactCompilerPluginOptions): PluginOption[] {\r\n const { command, mode = \"build-only\" } = options;\r\n if (mode === false) return [];\r\n\r\n const isBuild = command === \"build\";\r\n const enabled = mode === true ? true : isBuild && process.env.REACT_COMPILER !== \"false\";\r\n\r\n if (!enabled) return [];\r\n\r\n return [babel({ presets: [reactCompilerPreset()] })];\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport { transformWithOxc } from \"vite\";\r\n\r\nimport type { Config } from \"@svgr/core\";\r\nimport type { Plugin } from \"vite\";\r\n\r\n/**\r\n * @see https://react-svgr.com/docs/options/\r\n * @public\r\n */\r\nexport interface SvgReactOptions {\r\n /** @defaultValue true */\r\n svgo?: boolean;\r\n icon?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\nconst SVG_EXT_RE = /\\.svg$/i;\r\n\r\n/**\r\n * `*.svg?react`(及带其它 query 时的 `react` 段)。\r\n * 不匹配 `?reactive` / webpack 的 `?svgEle`。\r\n */\r\nexport function isSvgReactId(id: string): boolean {\r\n const queryStart = id.indexOf(\"?\");\r\n if (queryStart === -1) return false;\r\n const file = id.slice(0, queryStart);\r\n if (!SVG_EXT_RE.test(file)) return false;\r\n return /(?:^|&)react(?:&|$)/.test(id.slice(queryStart + 1));\r\n}\r\n\r\nfunction missingPeerError(pkg: string, cause: unknown): Error {\r\n const error = new Error(\r\n `[svg-react] \"${pkg}\" is required to transform *.svg?react. Install the optional peer or disable CreateAppViteConfigOptions.svgr.`,\r\n );\r\n error.cause = cause;\r\n return error;\r\n}\r\n\r\nasync function resolveSvgrConfig(options: SvgReactOptions): Promise<Config> {\r\n const merged: Config = { svgo: true, ...options };\r\n if (merged.plugins != null) return merged;\r\n\r\n const plugins: NonNullable<Config[\"plugins\"]> = [];\r\n if (merged.svgo !== false) {\r\n try {\r\n plugins.push((await import(\"@svgr/plugin-svgo\")).default);\r\n } catch (cause) {\r\n throw missingPeerError(\"@svgr/plugin-svgo\", cause);\r\n }\r\n }\r\n try {\r\n plugins.push((await import(\"@svgr/plugin-jsx\")).default);\r\n } catch (cause) {\r\n throw missingPeerError(\"@svgr/plugin-jsx\", cause);\r\n }\r\n return { ...merged, plugins };\r\n}\r\n\r\n/**\r\n * 将 `import Icon from \"./icon.svg?react\"` 编成 React 组件。\r\n * 普通 `*.svg` 仍走 Vite 默认资源 URL,本插件不处理。\r\n *\r\n * `@svgr/core` / `@svgr/plugin-jsx`(以及默认开启 SVGO 时的 `@svgr/plugin-svgo`)\r\n * 仅在真正命中 `?react` 时动态加载,根入口不会静态依赖它们。\r\n * @public\r\n */\r\nexport function svgReactPlugin(options: SvgReactOptions = {}): Plugin {\r\n return {\r\n name: \"ccc:svg-react\",\r\n enforce: \"pre\",\r\n async load(id) {\r\n if (!isSvgReactId(id)) return;\r\n\r\n const filePath = id.slice(0, id.indexOf(\"?\"));\r\n const svg = await fs.readFile(filePath, \"utf8\");\r\n let transform;\r\n try {\r\n ({ transform } = await import(\"@svgr/core\"));\r\n } catch (cause) {\r\n throw missingPeerError(\"@svgr/core\", cause);\r\n }\r\n const componentCode = await transform(svg, await resolveSvgrConfig(options), { filePath });\r\n const result = await transformWithOxc(componentCode, `${filePath}.jsx`, {\r\n lang: \"jsx\",\r\n });\r\n return { code: result.code, map: result.map };\r\n },\r\n };\r\n}\r\n","import path from \"node:path\";\r\nimport basicSsl from \"@vitejs/plugin-basic-ssl\";\r\nimport react from \"@vitejs/plugin-react\";\r\nimport { mergeConfig, type PluginOption, type UserConfig } from \"vite\";\r\nimport { createHtmlPlugin } from \"vite-plugin-html\";\r\n\r\nimport { lifecyclePlugin } from \"./plugins/lifecycle.ts\";\r\nimport { buildLessOptions } from \"./plugins/less-tilde.ts\";\r\nimport { reactCompilerPlugin } from \"./plugins/react-compiler.ts\";\r\nimport { svgReactPlugin } from \"./plugins/svg-react.ts\";\r\n\r\nimport type { CreateLibraryViteConfigOptions, LibraryFormats } from \"./types.ts\";\r\n\r\n/**\r\n * 组件库构建默认外置\r\n * 传入 `externals` 时整表替换;追加时展开本常量。\r\n * @public\r\n */\r\nexport const DEFAULT_LIBRARY_EXTERNALS = [\"react\", \"react-dom\"] as const;\r\n\r\n/**\r\n * UMD / IIFE 默认全局名。未出现在表里的字符串 external 用自身包名。\r\n * @public\r\n */\r\nexport const DEFAULT_LIBRARY_GLOBALS: Record<string, string> = {\r\n react: \"React\",\r\n \"react-dom\": \"ReactDOM\",\r\n};\r\n\r\nconst DEFAULT_LIBRARY_FORMATS: LibraryFormats[] = [\"umd\"];\r\n\r\nfunction needsLibraryName(formats: readonly LibraryFormats[]): boolean {\r\n return formats.includes(\"umd\") || formats.includes(\"iife\");\r\n}\r\n\r\nfunction resolveExternals(\r\n externals: CreateLibraryViteConfigOptions[\"externals\"],\r\n): (string | RegExp)[] {\r\n if (externals === false) return [];\r\n if (externals == null) return [...DEFAULT_LIBRARY_EXTERNALS];\r\n return externals;\r\n}\r\n\r\nfunction resolveLibraryFileName(\r\n fileName: CreateLibraryViteConfigOptions[\"fileName\"],\r\n formats: readonly LibraryFormats[],\r\n): string | ((format: string, entryName: string) => string) {\r\n if (fileName != null) return fileName;\r\n if (formats.length === 1) {\r\n return () => \"index.js\";\r\n }\r\n // cjs 产物用 `.cjs` 后缀:宿主包若声明 `\"type\": \"module\"`,`.js` 会被当作 ESM 解析,\r\n // 而 cjs 产物内容是 CommonJS(module.exports),require() 会因 ESM 误判而失败。\r\n return (format) => {\r\n if (format === \"es\") return \"index.js\";\r\n if (format === \"cjs\") return \"index.cjs\";\r\n return `index.${format}.js`;\r\n };\r\n}\r\n\r\nfunction resolveLibraryGlobals(\r\n externals: readonly (string | RegExp)[],\r\n globals?: Record<string, string>,\r\n): Record<string, string> {\r\n const inferred: Record<string, string> = {};\r\n for (const ext of externals) {\r\n if (typeof ext !== \"string\") continue;\r\n inferred[ext] = DEFAULT_LIBRARY_GLOBALS[ext] ?? ext;\r\n }\r\n return { ...inferred, ...globals };\r\n}\r\n\r\n/** 字符串 external 同时匹配子路径(如 `react` → `react/jsx-runtime`)。 */\r\nexport function matchLibraryExternal(id: string, externals: readonly (string | RegExp)[]): boolean {\r\n const source = id.split(\"?\")[0] ?? id;\r\n return externals.some((ext) => {\r\n if (typeof ext === \"string\") {\r\n return source === ext || source.startsWith(`${ext}/`);\r\n }\r\n return ext.test(source);\r\n });\r\n}\r\n\r\nfunction resolveLibraryGlobalName(id: string, globals: Record<string, string>): string {\r\n const source = id.split(\"?\")[0] ?? id;\r\n if (globals[source]) return globals[source];\r\n const matched = Object.keys(globals).find(\r\n (key) => source === key || source.startsWith(`${key}/`),\r\n );\r\n return matched ? (globals[matched] ?? source) : source;\r\n}\r\n\r\n/**\r\n * 组装组件库 Vite 配置:build 走 `build.lib`(默认 UMD → `lib/`),serve 为预览应用。\r\n *\r\n * 不启用 Hash 部署、public 复制、public-config。不默认 `example/` 预览目录或 antd / Formily externals。\r\n *\r\n * 合并顺序:`base(options) → mergeConfig(base, vite) → configure(final)`\r\n * @public\r\n */\r\nexport function createLibraryViteConfig(options: CreateLibraryViteConfigOptions): UserConfig {\r\n const {\r\n rootDir,\r\n command,\r\n alias,\r\n entry = \"src/index.ts\",\r\n name,\r\n outDir = \"lib\",\r\n fileName,\r\n cssFileName = \"index\",\r\n formats = DEFAULT_LIBRARY_FORMATS,\r\n externals: externalsOption,\r\n globals: globalsOption,\r\n useHttps = false,\r\n openBrowser = true,\r\n devProxy,\r\n reactCompiler = \"build-only\",\r\n react: enableReact = true,\r\n svgr: svgrOption = false,\r\n less,\r\n previewHtml,\r\n onRun,\r\n onDone,\r\n plugins: extraPlugins = [],\r\n vite: viteOverride,\r\n configure,\r\n } = options;\r\n\r\n const isDev = command === \"serve\";\r\n const isBuild = command === \"build\";\r\n\r\n if (isBuild && needsLibraryName(formats) && (name == null || name.trim() === \"\")) {\r\n throw new Error(\r\n '[vite-config] createLibraryViteConfig: `name` is required when formats include \"umd\" or \"iife\".',\r\n );\r\n }\r\n\r\n const plugins: PluginOption[] = [\r\n ...(svgrOption ? [svgReactPlugin(svgrOption === true ? {} : svgrOption)] : []),\r\n ...(enableReact ? [react()] : []),\r\n ...reactCompilerPlugin({ command, mode: reactCompiler }),\r\n ...(isDev && previewHtml\r\n ? [\r\n createHtmlPlugin({\r\n minify: false,\r\n template: path.resolve(rootDir, previewHtml),\r\n }),\r\n ]\r\n : []),\r\n ...(isDev && useHttps ? [basicSsl()] : []),\r\n ...extraPlugins,\r\n ...(isBuild && (onRun || onDone) ? [lifecyclePlugin({ onRun, onDone })] : []),\r\n ];\r\n\r\n const resolvedExternals = resolveExternals(externalsOption);\r\n const resolvedGlobals = resolveLibraryGlobals(resolvedExternals, globalsOption);\r\n\r\n const base: UserConfig = {\r\n root: rootDir,\r\n publicDir: false,\r\n plugins,\r\n resolve: {\r\n alias,\r\n },\r\n css: {\r\n preprocessorOptions: {\r\n less: buildLessOptions(less),\r\n },\r\n },\r\n ...(isDev\r\n ? {\r\n server: {\r\n https: useHttps ? {} : undefined,\r\n host: true,\r\n open: openBrowser,\r\n ...(devProxy ? { proxy: devProxy } : {}),\r\n },\r\n }\r\n : {\r\n build: {\r\n outDir,\r\n emptyOutDir: true,\r\n lib: {\r\n entry: path.resolve(rootDir, entry),\r\n ...(name != null && name.trim() !== \"\" ? { name } : {}),\r\n formats,\r\n fileName: resolveLibraryFileName(fileName, formats),\r\n cssFileName,\r\n },\r\n rolldownOptions: {\r\n external: (id: string) => matchLibraryExternal(id, resolvedExternals),\r\n output: {\r\n globals: (id: string) => resolveLibraryGlobalName(id, resolvedGlobals),\r\n },\r\n },\r\n },\r\n }),\r\n };\r\n\r\n let merged = viteOverride ? mergeConfig(base, viteOverride) : base;\r\n if (configure) {\r\n merged = configure(merged);\r\n }\r\n return merged;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/plugins/lifecycle.ts","../src/plugins/less-tilde.ts","../src/plugins/react-compiler.ts","../src/plugins/svg-react.ts","../src/create-library-vite-config.ts"],"names":["babel","reactCompilerPreset","fs","transformWithOxc","path","rm","readFile","writeFile","react","createHtmlPlugin","basicSsl","mergeConfig"],"mappings":"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","file":"create-library-vite-config.cjs","sourcesContent":["import type { PluginOption } from \"vite\";\n\n/** @public */\nexport interface LifecyclePluginOptions {\n /** 构建开始(Vite `buildStart`)。仅同步。 */\n onRun?: () => void;\n /**\n * 产物写盘成功之后(`writeBundle` sequential post)。\n * 工厂中排在 Hash 根入口写入之后;Hash 写入失败不会调用。\n */\n onDone?: () => void | Promise<void>;\n}\n\n/**\n * 构建起止回调。`onDone` 使用 sequential post `writeBundle`,\n * 以便排在 Hash 部署等其它 post 写入之后。\n * @public\n */\nexport function lifecyclePlugin(options: LifecyclePluginOptions = {}): PluginOption {\n const { onRun, onDone } = options;\n\n return {\n name: \"build-lifecycle\",\n enforce: \"post\",\n buildStart() {\n if (typeof onRun === \"function\") {\n onRun();\n }\n },\n writeBundle: {\n sequential: true,\n order: \"post\",\n async handler() {\n if (typeof onDone === \"function\") {\n await onDone();\n }\n },\n },\n };\n}\n","import type { LessOptions } from \"../types.ts\";\n\n/**\n * less 插件注入的 FileManager 实例表面类型。less@4 不自带 TS 类型,按实际使用的最小面声明。\n */\ninterface LessFileManagerInstance {\n supports(filename: string): boolean;\n loadFile(\n filename: string,\n currentDirectory: string,\n options: unknown,\n environment: unknown,\n ): unknown;\n}\n\n/** less.js 传给插件 `install` 的 less 环境实例表面。 */\ninterface LessPluginHost {\n FileManager: new (...args: unknown[]) => LessFileManagerInstance;\n}\n\n/** less.js 插件管理器表面。 */\ninterface LessPluginManager {\n addFileManager(manager: LessFileManagerInstance): void;\n}\n\n/**\n * Less 插件:把 webpack 遗留的 `~pkg/...` 导入解析到 node_modules。\n *\n * Less 自身不认识 `~`(那是 webpack `less-loader` 的约定:从 node_modules 解析);Vite 的\n * Less 预处理器也不处理 `~`,会回退到 Less 默认 FileManager 去查找 `node_modules/~pkg/...` 而失败。\n * 本插件注册一个 FileManager:仅当导入以 `~` 开头时拦截,去掉前缀后交给默认 FileManager 解析\n * (Vite 恒向 `less.render` 注入 `paths: [\"node_modules\"]`)。\n *\n * 第三方包(如 formily 系)自带 `@import \"~antd/...\"` 时尤其需要——消费方无法修改 node_modules。\n * @public\n */\nexport function lessTildeResolutionPlugin() {\n return {\n install(less: LessPluginHost, pluginManager: LessPluginManager) {\n class TildeFileManager extends less.FileManager {\n override supports(filename: string) {\n return filename.startsWith(\"~\");\n }\n override loadFile(\n filename: string,\n currentDirectory: string,\n options: unknown,\n environment: unknown,\n ) {\n // `~pkg/...` → `pkg/...`,让默认 FileManager 从 node_modules 解析\n return super.loadFile(filename.slice(1), currentDirectory, options, environment);\n }\n }\n pluginManager.addFileManager(new TildeFileManager());\n },\n };\n}\n\n/**\n * 组装 `css.preprocessorOptions.less`:映射 webpack `less-loader` 选项,\n * `less.resolveTilde: true` 时注入 `~` 解析插件(默认关闭)。\n * @public\n */\nexport function buildLessOptions(less?: LessOptions) {\n const resolveTilde = less?.resolveTilde === true;\n return {\n ...(less?.additionalData != null ? { additionalData: less.additionalData } : {}),\n ...(less?.modifyVars != null ? { modifyVars: less.modifyVars } : {}),\n ...(less?.javascriptEnabled != null ? { javascriptEnabled: less.javascriptEnabled } : {}),\n ...(resolveTilde ? { plugins: [lessTildeResolutionPlugin()] } : {}),\n };\n}\n","import babel from \"@rolldown/plugin-babel\";\nimport { reactCompilerPreset } from \"@vitejs/plugin-react\";\n\nimport type { ReactCompilerMode } from \"../types.ts\";\nimport type { PluginOption } from \"vite\";\n\n/** @public */\nexport interface ReactCompilerPluginOptions {\n command: string;\n /**\n * - `true`:始终启用\n * - `\"build-only\"`:仅 build,且 `REACT_COMPILER=false` 可关\n * - `false`:关闭\n */\n mode?: ReactCompilerMode;\n}\n\n/**\n * React Compiler(babel preset)。默认仅生产构建启用。\n * @public\n */\nexport function reactCompilerPlugin(options: ReactCompilerPluginOptions): PluginOption[] {\n const { command, mode = \"build-only\" } = options;\n if (mode === false) return [];\n\n const isBuild = command === \"build\";\n const enabled = mode === true ? true : isBuild && process.env.REACT_COMPILER !== \"false\";\n\n if (!enabled) return [];\n\n return [babel({ presets: [reactCompilerPreset()] })];\n}\n","import fs from \"node:fs/promises\";\nimport { transformWithOxc } from \"vite\";\n\nimport type { Config } from \"@svgr/core\";\nimport type { Plugin } from \"vite\";\n\n/**\n * @see https://react-svgr.com/docs/options/\n * @public\n */\nexport interface SvgReactOptions {\n /** @defaultValue true */\n svgo?: boolean;\n icon?: boolean;\n [key: string]: unknown;\n}\n\nconst SVG_EXT_RE = /\\.svg$/i;\n\n/**\n * `*.svg?react`(及带其它 query 时的 `react` 段)。\n * 不匹配 `?reactive` / webpack 的 `?svgEle`。\n */\nexport function isSvgReactId(id: string): boolean {\n const queryStart = id.indexOf(\"?\");\n if (queryStart === -1) return false;\n const file = id.slice(0, queryStart);\n if (!SVG_EXT_RE.test(file)) return false;\n return /(?:^|&)react(?:&|$)/.test(id.slice(queryStart + 1));\n}\n\nfunction missingPeerError(pkg: string, cause: unknown): Error {\n const error = new Error(\n `[svg-react] \"${pkg}\" is required to transform *.svg?react. Install the optional peer or disable CreateAppViteConfigOptions.svgr.`,\n );\n error.cause = cause;\n return error;\n}\n\nasync function resolveSvgrConfig(options: SvgReactOptions): Promise<Config> {\n const merged: Config = { svgo: true, ...options };\n if (merged.plugins != null) return merged;\n\n const plugins: NonNullable<Config[\"plugins\"]> = [];\n if (merged.svgo !== false) {\n try {\n plugins.push((await import(\"@svgr/plugin-svgo\")).default);\n } catch (cause) {\n throw missingPeerError(\"@svgr/plugin-svgo\", cause);\n }\n }\n try {\n plugins.push((await import(\"@svgr/plugin-jsx\")).default);\n } catch (cause) {\n throw missingPeerError(\"@svgr/plugin-jsx\", cause);\n }\n return { ...merged, plugins };\n}\n\n/**\n * 将 `import Icon from \"./icon.svg?react\"` 编成 React 组件。\n * 普通 `*.svg` 仍走 Vite 默认资源 URL,本插件不处理。\n *\n * `@svgr/core` / `@svgr/plugin-jsx`(以及默认开启 SVGO 时的 `@svgr/plugin-svgo`)\n * 仅在真正命中 `?react` 时动态加载,根入口不会静态依赖它们。\n * @public\n */\nexport function svgReactPlugin(options: SvgReactOptions = {}): Plugin {\n return {\n name: \"ccc:svg-react\",\n enforce: \"pre\",\n async load(id) {\n if (!isSvgReactId(id)) return;\n\n const filePath = id.slice(0, id.indexOf(\"?\"));\n const svg = await fs.readFile(filePath, \"utf8\");\n let transform;\n try {\n ({ transform } = await import(\"@svgr/core\"));\n } catch (cause) {\n throw missingPeerError(\"@svgr/core\", cause);\n }\n const componentCode = await transform(svg, await resolveSvgrConfig(options), { filePath });\n const result = await transformWithOxc(componentCode, `${filePath}.jsx`, {\n lang: \"jsx\",\n });\n return { code: result.code, map: result.map };\n },\n };\n}\n","import { readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport basicSsl from \"@vitejs/plugin-basic-ssl\";\nimport react from \"@vitejs/plugin-react\";\nimport { mergeConfig, type Plugin, type PluginOption, type UserConfig } from \"vite\";\nimport { createHtmlPlugin } from \"vite-plugin-html\";\n\nimport { lifecyclePlugin } from \"./plugins/lifecycle.ts\";\nimport { buildLessOptions } from \"./plugins/less-tilde.ts\";\nimport { reactCompilerPlugin } from \"./plugins/react-compiler.ts\";\nimport { svgReactPlugin } from \"./plugins/svg-react.ts\";\n\nimport type { CreateLibraryViteConfigOptions, LibraryFormats } from \"./types.ts\";\n\n/**\n * 组件库构建默认外置\n * 传入 `externals` 时整表替换;追加时展开本常量。\n * @public\n */\nexport const DEFAULT_LIBRARY_EXTERNALS = [\"react\", \"react-dom\"] as const;\n\n/**\n * UMD / IIFE 默认全局名。未出现在表里的字符串 external 用自身包名。\n * @public\n */\nexport const DEFAULT_LIBRARY_GLOBALS: Record<string, string> = {\n react: \"React\",\n \"react-dom\": \"ReactDOM\",\n};\n\nconst DEFAULT_LIBRARY_FORMATS: LibraryFormats[] = [\"umd\"];\n\n/**\n * 删除 CJS 产物的 sourcemap,并抹掉产物末尾的 `sourceMappingURL` 注释。\n *\n * 理由:webpack 5(`exports.import`)与 webpack 4(`mainFields: browser → module → main`)都命中\n * ESM 产物,CJS map 只对 Node SSR + `--enable-source-maps` 有意义,却让随包 map 体积翻倍\n * (实测 `form-render` 双份 701KB、`form-render-mobile` 622KB,超 check-package 的 512KB 守卫)。\n * 源码调试由 ESM map(含 `sourcesContent`)+ 随包发布的 `src` 覆盖。\n * 决策见 docs/src-direct-vs-dist-evaluation.md §11 第 6 项 (c)。\n */\nfunction stripCjsSourcemapPlugin(): Plugin {\n let outDir = \"\";\n return {\n name: \"hzab:strip-cjs-sourcemap\",\n apply: \"build\",\n configResolved(config) {\n outDir = config.build.outDir;\n },\n async writeBundle(_options, bundle) {\n for (const fileName of Object.keys(bundle)) {\n const file = path.resolve(outDir, fileName);\n if (fileName.endsWith(\".cjs.map\")) {\n await rm(file, { force: true });\n continue;\n }\n if (!fileName.endsWith(\".cjs\")) continue;\n // 注释必须一起删:留着会让 DevTools / webpack 去请求已不存在的 map。\n const code = await readFile(file, \"utf8\");\n const stripped = code.replace(/\\n?\\/\\/# sourceMappingURL=\\S+\\s*$/u, \"\\n\");\n if (stripped !== code) await writeFile(file, stripped, \"utf8\");\n }\n },\n };\n}\n\nfunction needsLibraryName(formats: readonly LibraryFormats[]): boolean {\n return formats.includes(\"umd\") || formats.includes(\"iife\");\n}\n\nfunction resolveExternals(\n externals: CreateLibraryViteConfigOptions[\"externals\"],\n): (string | RegExp)[] {\n if (externals === false) return [];\n if (externals == null) return [...DEFAULT_LIBRARY_EXTERNALS];\n return externals;\n}\n\nfunction resolveLibraryFileName(\n fileName: CreateLibraryViteConfigOptions[\"fileName\"],\n formats: readonly LibraryFormats[],\n): string | ((format: string, entryName: string) => string) {\n if (fileName != null) return fileName;\n if (formats.length === 1) {\n return () => \"index.js\";\n }\n // cjs 产物用 `.cjs` 后缀:宿主包若声明 `\"type\": \"module\"`,`.js` 会被当作 ESM 解析,\n // 而 cjs 产物内容是 CommonJS(module.exports),require() 会因 ESM 误判而失败。\n return (format) => {\n if (format === \"es\") return \"index.js\";\n if (format === \"cjs\") return \"index.cjs\";\n return `index.${format}.js`;\n };\n}\n\nfunction resolveLibraryGlobals(\n externals: readonly (string | RegExp)[],\n globals?: Record<string, string>,\n): Record<string, string> {\n const inferred: Record<string, string> = {};\n for (const ext of externals) {\n if (typeof ext !== \"string\") continue;\n inferred[ext] = DEFAULT_LIBRARY_GLOBALS[ext] ?? ext;\n }\n return { ...inferred, ...globals };\n}\n\n/** 字符串 external 同时匹配子路径(如 `react` → `react/jsx-runtime`)。 */\nexport function matchLibraryExternal(id: string, externals: readonly (string | RegExp)[]): boolean {\n const source = id.split(\"?\")[0] ?? id;\n return externals.some((ext) => {\n if (typeof ext === \"string\") {\n return source === ext || source.startsWith(`${ext}/`);\n }\n return ext.test(source);\n });\n}\n\nfunction resolveLibraryGlobalName(id: string, globals: Record<string, string>): string {\n const source = id.split(\"?\")[0] ?? id;\n if (globals[source]) return globals[source];\n const matched = Object.keys(globals).find(\n (key) => source === key || source.startsWith(`${key}/`),\n );\n return matched ? (globals[matched] ?? source) : source;\n}\n\n/**\n * 组装组件库 Vite 配置:build 走 `build.lib`(默认 UMD → `lib/`),serve 为预览应用。\n *\n * 不启用 Hash 部署、public 复制、public-config。不默认 `example/` 预览目录或 antd / Formily externals。\n *\n * 合并顺序:`base(options) → mergeConfig(base, vite) → configure(final)`\n * @public\n */\nexport function createLibraryViteConfig(options: CreateLibraryViteConfigOptions): UserConfig {\n const {\n rootDir,\n command,\n alias,\n entry = \"src/index.ts\",\n name,\n outDir = \"lib\",\n fileName,\n cssFileName = \"index\",\n formats = DEFAULT_LIBRARY_FORMATS,\n externals: externalsOption,\n globals: globalsOption,\n useHttps = false,\n openBrowser = true,\n devProxy,\n reactCompiler = \"build-only\",\n react: enableReact = true,\n svgr: svgrOption = false,\n less,\n previewHtml,\n onRun,\n onDone,\n plugins: extraPlugins = [],\n vite: viteOverride,\n configure,\n } = options;\n\n const isDev = command === \"serve\";\n const isBuild = command === \"build\";\n\n if (isBuild && needsLibraryName(formats) && (name == null || name.trim() === \"\")) {\n throw new Error(\n '[vite-config] createLibraryViteConfig: `name` is required when formats include \"umd\" or \"iife\".',\n );\n }\n\n const plugins: PluginOption[] = [\n ...(svgrOption ? [svgReactPlugin(svgrOption === true ? {} : svgrOption)] : []),\n ...(enableReact ? [react()] : []),\n ...reactCompilerPlugin({ command, mode: reactCompiler }),\n ...(isDev && previewHtml\n ? [\n createHtmlPlugin({\n minify: false,\n template: path.resolve(rootDir, previewHtml),\n }),\n ]\n : []),\n ...(isDev && useHttps ? [basicSsl()] : []),\n ...extraPlugins,\n ...(isBuild && (onRun || onDone) ? [lifecyclePlugin({ onRun, onDone })] : []),\n ...(isBuild ? [stripCjsSourcemapPlugin()] : []),\n ];\n\n const resolvedExternals = resolveExternals(externalsOption);\n const resolvedGlobals = resolveLibraryGlobals(resolvedExternals, globalsOption);\n\n const base: UserConfig = {\n root: rootDir,\n publicDir: false,\n plugins,\n resolve: {\n alias,\n },\n css: {\n preprocessorOptions: {\n less: buildLessOptions(less),\n },\n },\n ...(isDev\n ? {\n server: {\n https: useHttps ? {} : undefined,\n host: true,\n open: openBrowser,\n ...(devProxy ? { proxy: devProxy } : {}),\n },\n }\n : {\n build: {\n outDir,\n emptyOutDir: true,\n // 产物随包发布:消费方 webpack 的 devtool 会消费依赖自带的 map,缺失时\n // DevTools 只能看到缩短标识符后的编译产物(见 docs/src-direct-vs-dist-evaluation.md §7.1)。\n sourcemap: true,\n // 降到 ES2018:webpack 4(umi3 线 abt-app)内置 acorn 6 解析到 ES2019 为止,不认 ES2020 的\n // `?.` / `??`,产物保持默认 target 会让该线直接 Module parse failed。ES2018 是覆盖 acorn 6\n // 边界的最小目标(对象展开仍保留),见 docs/src-direct-vs-dist-evaluation.md §7.2。\n target: \"es2018\",\n lib: {\n entry: path.resolve(rootDir, entry),\n ...(name != null && name.trim() !== \"\" ? { name } : {}),\n formats,\n fileName: resolveLibraryFileName(fileName, formats),\n cssFileName,\n },\n rolldownOptions: {\n external: (id: string) => matchLibraryExternal(id, resolvedExternals),\n output: {\n globals: (id: string) => resolveLibraryGlobalName(id, resolvedGlobals),\n },\n },\n },\n }),\n };\n\n let merged = viteOverride ? mergeConfig(base, viteOverride) : base;\n if (configure) {\n merged = configure(merged);\n }\n return merged;\n}\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import fs, { rm, readFile, writeFile } from 'fs/promises';
|
|
1
2
|
import path from 'path';
|
|
2
3
|
import basicSsl from '@vitejs/plugin-basic-ssl';
|
|
3
4
|
import react, { reactCompilerPreset } from '@vitejs/plugin-react';
|
|
4
5
|
import { mergeConfig, transformWithOxc } from 'vite';
|
|
5
6
|
import { createHtmlPlugin } from 'vite-plugin-html';
|
|
6
7
|
import babel from '@rolldown/plugin-babel';
|
|
7
|
-
import fs from 'fs/promises';
|
|
8
8
|
|
|
9
9
|
// src/create-library-vite-config.ts
|
|
10
10
|
|
|
@@ -127,6 +127,29 @@ var DEFAULT_LIBRARY_GLOBALS = {
|
|
|
127
127
|
"react-dom": "ReactDOM"
|
|
128
128
|
};
|
|
129
129
|
var DEFAULT_LIBRARY_FORMATS = ["umd"];
|
|
130
|
+
function stripCjsSourcemapPlugin() {
|
|
131
|
+
let outDir = "";
|
|
132
|
+
return {
|
|
133
|
+
name: "hzab:strip-cjs-sourcemap",
|
|
134
|
+
apply: "build",
|
|
135
|
+
configResolved(config) {
|
|
136
|
+
outDir = config.build.outDir;
|
|
137
|
+
},
|
|
138
|
+
async writeBundle(_options, bundle) {
|
|
139
|
+
for (const fileName of Object.keys(bundle)) {
|
|
140
|
+
const file = path.resolve(outDir, fileName);
|
|
141
|
+
if (fileName.endsWith(".cjs.map")) {
|
|
142
|
+
await rm(file, { force: true });
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (!fileName.endsWith(".cjs")) continue;
|
|
146
|
+
const code = await readFile(file, "utf8");
|
|
147
|
+
const stripped = code.replace(/\n?\/\/# sourceMappingURL=\S+\s*$/u, "\n");
|
|
148
|
+
if (stripped !== code) await writeFile(file, stripped, "utf8");
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
}
|
|
130
153
|
function needsLibraryName(formats) {
|
|
131
154
|
return formats.includes("umd") || formats.includes("iife");
|
|
132
155
|
}
|
|
@@ -217,7 +240,8 @@ function createLibraryViteConfig(options) {
|
|
|
217
240
|
] : [],
|
|
218
241
|
...isDev && useHttps ? [basicSsl()] : [],
|
|
219
242
|
...extraPlugins,
|
|
220
|
-
...isBuild && (onRun || onDone) ? [lifecyclePlugin({ onRun, onDone })] : []
|
|
243
|
+
...isBuild && (onRun || onDone) ? [lifecyclePlugin({ onRun, onDone })] : [],
|
|
244
|
+
...isBuild ? [stripCjsSourcemapPlugin()] : []
|
|
221
245
|
];
|
|
222
246
|
const resolvedExternals = resolveExternals(externalsOption);
|
|
223
247
|
const resolvedGlobals = resolveLibraryGlobals(resolvedExternals, globalsOption);
|
|
@@ -244,6 +268,13 @@ function createLibraryViteConfig(options) {
|
|
|
244
268
|
build: {
|
|
245
269
|
outDir,
|
|
246
270
|
emptyOutDir: true,
|
|
271
|
+
// 产物随包发布:消费方 webpack 的 devtool 会消费依赖自带的 map,缺失时
|
|
272
|
+
// DevTools 只能看到缩短标识符后的编译产物(见 docs/src-direct-vs-dist-evaluation.md §7.1)。
|
|
273
|
+
sourcemap: true,
|
|
274
|
+
// 降到 ES2018:webpack 4(umi3 线 abt-app)内置 acorn 6 解析到 ES2019 为止,不认 ES2020 的
|
|
275
|
+
// `?.` / `??`,产物保持默认 target 会让该线直接 Module parse failed。ES2018 是覆盖 acorn 6
|
|
276
|
+
// 边界的最小目标(对象展开仍保留),见 docs/src-direct-vs-dist-evaluation.md §7.2。
|
|
277
|
+
target: "es2018",
|
|
247
278
|
lib: {
|
|
248
279
|
entry: path.resolve(rootDir, entry),
|
|
249
280
|
...name != null && name.trim() !== "" ? { name } : {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/lifecycle.ts","../src/plugins/less-tilde.ts","../src/plugins/react-compiler.ts","../src/plugins/svg-react.ts","../src/create-library-vite-config.ts"],"names":[],"mappings":";;;;;;;;;;;AAkBO,SAAS,eAAA,CAAgB,OAAA,GAAkC,EAAC,EAAiB;AAClF,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,OAAA;AAE1B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,iBAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,GAAa;AACX,MAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,QAAA,KAAA,EAAM;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,UAAA,EAAY,IAAA;AAAA,MACZ,KAAA,EAAO,MAAA;AAAA,MACP,MAAM,OAAA,GAAU;AACd,QAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,UAAA,MAAM,MAAA,EAAO;AAAA,QACf;AAAA,MACF;AAAA;AACF,GACF;AACF;;;ACHO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,OAAO;AAAA,IACL,OAAA,CAAQ,MAAsB,aAAA,EAAkC;AAAA,MAC9D,MAAM,gBAAA,SAAyB,IAAA,CAAK,WAAA,CAAY;AAAA,QACrC,SAAS,QAAA,EAAkB;AAClC,UAAA,OAAO,QAAA,CAAS,WAAW,GAAG,CAAA;AAAA,QAChC;AAAA,QACS,QAAA,CACP,QAAA,EACA,gBAAA,EACA,OAAA,EACA,WAAA,EACA;AAEA,UAAA,OAAO,KAAA,CAAM,SAAS,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAG,gBAAA,EAAkB,SAAS,WAAW,CAAA;AAAA,QACjF;AAAA;AAEF,MAAA,aAAA,CAAc,cAAA,CAAe,IAAI,gBAAA,EAAkB,CAAA;AAAA,IACrD;AAAA,GACF;AACF;AAOO,SAAS,iBAAiB,IAAA,EAAoB;AACnD,EAAA,MAAM,YAAA,GAAe,MAAM,YAAA,KAAiB,IAAA;AAC5C,EAAA,OAAO;AAAA,IACL,GAAI,MAAM,cAAA,IAAkB,IAAA,GAAO,EAAE,cAAA,EAAgB,IAAA,CAAK,cAAA,EAAe,GAAI,EAAC;AAAA,IAC9E,GAAI,MAAM,UAAA,IAAc,IAAA,GAAO,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW,GAAI,EAAC;AAAA,IAClE,GAAI,MAAM,iBAAA,IAAqB,IAAA,GAAO,EAAE,iBAAA,EAAmB,IAAA,CAAK,iBAAA,EAAkB,GAAI,EAAC;AAAA,IACvF,GAAI,eAAe,EAAE,OAAA,EAAS,CAAC,yBAAA,EAA2B,CAAA,EAAE,GAAI;AAAC,GACnE;AACF;AClDO,SAAS,oBAAoB,OAAA,EAAqD;AACvF,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,GAAO,YAAA,EAAa,GAAI,OAAA;AACzC,EAAA,IAAI,IAAA,KAAS,KAAA,EAAO,OAAO,EAAC;AAE5B,EAAA,MAAM,UAAU,OAAA,KAAY,OAAA;AAC5B,EAAA,MAAM,UAAU,IAAA,KAAS,IAAA,GAAO,OAAO,OAAA,IAAW,OAAA,CAAQ,IAAI,cAAA,KAAmB,OAAA;AAEjF,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AAEtB,EAAA,OAAO,CAAC,MAAM,EAAE,OAAA,EAAS,CAAC,mBAAA,EAAqB,CAAA,EAAG,CAAC,CAAA;AACrD;ACdA,IAAM,UAAA,GAAa,SAAA;AAMZ,SAAS,aAAa,EAAA,EAAqB;AAChD,EAAA,MAAM,UAAA,GAAa,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AACjC,EAAA,IAAI,UAAA,KAAe,IAAI,OAAO,KAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA;AACnC,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,IAAI,GAAG,OAAO,KAAA;AACnC,EAAA,OAAO,sBAAsB,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,UAAA,GAAa,CAAC,CAAC,CAAA;AAC5D;AAEA,SAAS,gBAAA,CAAiB,KAAa,KAAA,EAAuB;AAC5D,EAAA,MAAM,QAAQ,IAAI,KAAA;AAAA,IAChB,gBAAgB,GAAG,CAAA,6GAAA;AAAA,GACrB;AACA,EAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,kBAAkB,OAAA,EAA2C;AAC1E,EAAA,MAAM,MAAA,GAAiB,EAAE,IAAA,EAAM,IAAA,EAAM,GAAG,OAAA,EAAQ;AAChD,EAAA,IAAI,MAAA,CAAO,OAAA,IAAW,IAAA,EAAM,OAAO,MAAA;AAEnC,EAAA,MAAM,UAA0C,EAAC;AACjD,EAAA,IAAI,MAAA,CAAO,SAAS,KAAA,EAAO;AACzB,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAA,CAAA,CAAM,MAAM,OAAO,mBAAmB,GAAG,OAAO,CAAA;AAAA,IAC1D,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,gBAAA,CAAiB,qBAAqB,KAAK,CAAA;AAAA,IACnD;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAA,CAAA,CAAM,MAAM,OAAO,kBAAkB,GAAG,OAAO,CAAA;AAAA,EACzD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,gBAAA,CAAiB,oBAAoB,KAAK,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAQ;AAC9B;AAUO,SAAS,cAAA,CAAe,OAAA,GAA2B,EAAC,EAAW;AACpE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,OAAA,EAAS,KAAA;AAAA,IACT,MAAM,KAAK,EAAA,EAAI;AACb,MAAA,IAAI,CAAC,YAAA,CAAa,EAAE,CAAA,EAAG;AAEvB,MAAA,MAAM,WAAW,EAAA,CAAG,KAAA,CAAM,GAAG,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAC,CAAA;AAC5C,MAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,QAAA,CAAS,UAAU,MAAM,CAAA;AAC9C,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI;AACF,QAAA,CAAC,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,YAAY,CAAA;AAAA,MAC5C,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,gBAAA,CAAiB,cAAc,KAAK,CAAA;AAAA,MAC5C;AACA,MAAA,MAAM,aAAA,GAAgB,MAAM,SAAA,CAAU,GAAA,EAAK,MAAM,kBAAkB,OAAO,CAAA,EAAG,EAAE,QAAA,EAAU,CAAA;AACzF,MAAA,MAAM,SAAS,MAAM,gBAAA,CAAiB,aAAA,EAAe,CAAA,EAAG,QAAQ,CAAA,IAAA,CAAA,EAAQ;AAAA,QACtE,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,IAC9C;AAAA,GACF;AACF;;;ACvEO,IAAM,yBAAA,GAA4B,CAAC,OAAA,EAAS,WAAW;AAMvD,IAAM,uBAAA,GAAkD;AAAA,EAC7D,KAAA,EAAO,OAAA;AAAA,EACP,WAAA,EAAa;AACf;AAEA,IAAM,uBAAA,GAA4C,CAAC,KAAK,CAAA;AAExD,SAAS,iBAAiB,OAAA,EAA6C;AACrE,EAAA,OAAO,QAAQ,QAAA,CAAS,KAAK,CAAA,IAAK,OAAA,CAAQ,SAAS,MAAM,CAAA;AAC3D;AAEA,SAAS,iBACP,SAAA,EACqB;AACrB,EAAA,IAAI,SAAA,KAAc,KAAA,EAAO,OAAO,EAAC;AACjC,EAAA,IAAI,SAAA,IAAa,IAAA,EAAM,OAAO,CAAC,GAAG,yBAAyB,CAAA;AAC3D,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,sBAAA,CACP,UACA,OAAA,EAC0D;AAC1D,EAAA,IAAI,QAAA,IAAY,MAAM,OAAO,QAAA;AAC7B,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,UAAA;AAAA,EACf;AAGA,EAAA,OAAO,CAAC,MAAA,KAAW;AACjB,IAAA,IAAI,MAAA,KAAW,MAAM,OAAO,UAAA;AAC5B,IAAA,IAAI,MAAA,KAAW,OAAO,OAAO,WAAA;AAC7B,IAAA,OAAO,SAAS,MAAM,CAAA,GAAA,CAAA;AAAA,EACxB,CAAA;AACF;AAEA,SAAS,qBAAA,CACP,WACA,OAAA,EACwB;AACxB,EAAA,MAAM,WAAmC,EAAC;AAC1C,EAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC7B,IAAA,QAAA,CAAS,GAAG,CAAA,GAAI,uBAAA,CAAwB,GAAG,CAAA,IAAK,GAAA;AAAA,EAClD;AACA,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,GAAG,OAAA,EAAQ;AACnC;AAGO,SAAS,oBAAA,CAAqB,IAAY,SAAA,EAAkD;AACjG,EAAA,MAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACnC,EAAA,OAAO,SAAA,CAAU,IAAA,CAAK,CAAC,GAAA,KAAQ;AAC7B,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,OAAO,WAAW,GAAA,IAAO,MAAA,CAAO,UAAA,CAAW,CAAA,EAAG,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAEA,SAAS,wBAAA,CAAyB,IAAY,OAAA,EAAyC;AACrF,EAAA,MAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACnC,EAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAO,QAAQ,MAAM,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA;AAAA,IACnC,CAAC,QAAQ,MAAA,KAAW,GAAA,IAAO,OAAO,UAAA,CAAW,CAAA,EAAG,GAAG,CAAA,CAAA,CAAG;AAAA,GACxD;AACA,EAAA,OAAO,OAAA,GAAW,OAAA,CAAQ,OAAO,CAAA,IAAK,MAAA,GAAU,MAAA;AAClD;AAUO,SAAS,wBAAwB,OAAA,EAAqD;AAC3F,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,GAAQ,cAAA;AAAA,IACR,IAAA;AAAA,IACA,MAAA,GAAS,KAAA;AAAA,IACT,QAAA;AAAA,IACA,WAAA,GAAc,OAAA;AAAA,IACd,OAAA,GAAU,uBAAA;AAAA,IACV,SAAA,EAAW,eAAA;AAAA,IACX,OAAA,EAAS,aAAA;AAAA,IACT,QAAA,GAAW,KAAA;AAAA,IACX,WAAA,GAAc,IAAA;AAAA,IACd,QAAA;AAAA,IACA,aAAA,GAAgB,YAAA;AAAA,IAChB,OAAO,WAAA,GAAc,IAAA;AAAA,IACrB,MAAM,UAAA,GAAa,KAAA;AAAA,IACnB,IAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,eAAe,EAAC;AAAA,IACzB,IAAA,EAAM,YAAA;AAAA,IACN;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAQ,OAAA,KAAY,OAAA;AAC1B,EAAA,MAAM,UAAU,OAAA,KAAY,OAAA;AAE5B,EAAA,IAAI,OAAA,IAAW,iBAAiB,OAAO,CAAA,KAAM,QAAQ,IAAA,IAAQ,IAAA,CAAK,IAAA,EAAK,KAAM,EAAA,CAAA,EAAK;AAChF,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAA0B;AAAA,IAC9B,GAAI,UAAA,GAAa,CAAC,cAAA,CAAe,UAAA,KAAe,IAAA,GAAO,EAAC,GAAI,UAAU,CAAC,CAAA,GAAI,EAAC;AAAA,IAC5E,GAAI,WAAA,GAAc,CAAC,KAAA,EAAO,IAAI,EAAC;AAAA,IAC/B,GAAG,mBAAA,CAAoB,EAAE,OAAA,EAAS,IAAA,EAAM,eAAe,CAAA;AAAA,IACvD,GAAI,SAAS,WAAA,GACT;AAAA,MACE,gBAAA,CAAiB;AAAA,QACf,MAAA,EAAQ,KAAA;AAAA,QACR,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,WAAW;AAAA,OAC5C;AAAA,QAEH,EAAC;AAAA,IACL,GAAI,KAAA,IAAS,QAAA,GAAW,CAAC,QAAA,EAAU,IAAI,EAAC;AAAA,IACxC,GAAG,YAAA;AAAA,IACH,GAAI,OAAA,KAAY,KAAA,IAAS,MAAA,CAAA,GAAU,CAAC,eAAA,CAAgB,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAC,CAAA,GAAI;AAAC,GAC7E;AAEA,EAAA,MAAM,iBAAA,GAAoB,iBAAiB,eAAe,CAAA;AAC1D,EAAA,MAAM,eAAA,GAAkB,qBAAA,CAAsB,iBAAA,EAAmB,aAAa,CAAA;AAE9E,EAAA,MAAM,IAAA,GAAmB;AAAA,IACvB,IAAA,EAAM,OAAA;AAAA,IACN,SAAA,EAAW,KAAA;AAAA,IACX,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP;AAAA,KACF;AAAA,IACA,GAAA,EAAK;AAAA,MACH,mBAAA,EAAqB;AAAA,QACnB,IAAA,EAAM,iBAAiB,IAAI;AAAA;AAC7B,KACF;AAAA,IACA,GAAI,KAAA,GACA;AAAA,MACE,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,QAAA,GAAW,EAAC,GAAI,MAAA;AAAA,QACvB,IAAA,EAAM,IAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,GAAI,QAAA,GAAW,EAAE,KAAA,EAAO,QAAA,KAAa;AAAC;AACxC,KACF,GACA;AAAA,MACE,KAAA,EAAO;AAAA,QACL,MAAA;AAAA,QACA,WAAA,EAAa,IAAA;AAAA,QACb,GAAA,EAAK;AAAA,UACH,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAA;AAAA,UAClC,GAAI,IAAA,IAAQ,IAAA,IAAQ,IAAA,CAAK,IAAA,OAAW,EAAA,GAAK,EAAE,IAAA,EAAK,GAAI,EAAC;AAAA,UACrD,OAAA;AAAA,UACA,QAAA,EAAU,sBAAA,CAAuB,QAAA,EAAU,OAAO,CAAA;AAAA,UAClD;AAAA,SACF;AAAA,QACA,eAAA,EAAiB;AAAA,UACf,QAAA,EAAU,CAAC,EAAA,KAAe,oBAAA,CAAqB,IAAI,iBAAiB,CAAA;AAAA,UACpE,MAAA,EAAQ;AAAA,YACN,OAAA,EAAS,CAAC,EAAA,KAAe,wBAAA,CAAyB,IAAI,eAAe;AAAA;AACvE;AACF;AACF;AACF,GACN;AAEA,EAAA,IAAI,MAAA,GAAS,YAAA,GAAe,WAAA,CAAY,IAAA,EAAM,YAAY,CAAA,GAAI,IAAA;AAC9D,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,GAAS,UAAU,MAAM,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,MAAA;AACT","file":"create-library-vite-config.js","sourcesContent":["import type { PluginOption } from \"vite\";\r\n\r\n/** @public */\r\nexport interface LifecyclePluginOptions {\r\n /** 构建开始(Vite `buildStart`)。仅同步。 */\r\n onRun?: () => void;\r\n /**\r\n * 产物写盘成功之后(`writeBundle` sequential post)。\r\n * 工厂中排在 Hash 根入口写入之后;Hash 写入失败不会调用。\r\n */\r\n onDone?: () => void | Promise<void>;\r\n}\r\n\r\n/**\r\n * 构建起止回调。`onDone` 使用 sequential post `writeBundle`,\r\n * 以便排在 Hash 部署等其它 post 写入之后。\r\n * @public\r\n */\r\nexport function lifecyclePlugin(options: LifecyclePluginOptions = {}): PluginOption {\r\n const { onRun, onDone } = options;\r\n\r\n return {\r\n name: \"build-lifecycle\",\r\n enforce: \"post\",\r\n buildStart() {\r\n if (typeof onRun === \"function\") {\r\n onRun();\r\n }\r\n },\r\n writeBundle: {\r\n sequential: true,\r\n order: \"post\",\r\n async handler() {\r\n if (typeof onDone === \"function\") {\r\n await onDone();\r\n }\r\n },\r\n },\r\n };\r\n}\r\n","import type { LessOptions } from \"../types.ts\";\r\n\r\n/**\r\n * less 插件注入的 FileManager 实例表面类型。less@4 不自带 TS 类型,按实际使用的最小面声明。\r\n */\r\ninterface LessFileManagerInstance {\r\n supports(filename: string): boolean;\r\n loadFile(\r\n filename: string,\r\n currentDirectory: string,\r\n options: unknown,\r\n environment: unknown,\r\n ): unknown;\r\n}\r\n\r\n/** less.js 传给插件 `install` 的 less 环境实例表面。 */\r\ninterface LessPluginHost {\r\n FileManager: new (...args: unknown[]) => LessFileManagerInstance;\r\n}\r\n\r\n/** less.js 插件管理器表面。 */\r\ninterface LessPluginManager {\r\n addFileManager(manager: LessFileManagerInstance): void;\r\n}\r\n\r\n/**\r\n * Less 插件:把 webpack 遗留的 `~pkg/...` 导入解析到 node_modules。\r\n *\r\n * Less 自身不认识 `~`(那是 webpack `less-loader` 的约定:从 node_modules 解析);Vite 的\r\n * Less 预处理器也不处理 `~`,会回退到 Less 默认 FileManager 去查找 `node_modules/~pkg/...` 而失败。\r\n * 本插件注册一个 FileManager:仅当导入以 `~` 开头时拦截,去掉前缀后交给默认 FileManager 解析\r\n * (Vite 恒向 `less.render` 注入 `paths: [\"node_modules\"]`)。\r\n *\r\n * 第三方包(如 formily 系)自带 `@import \"~antd/...\"` 时尤其需要——消费方无法修改 node_modules。\r\n * @public\r\n */\r\nexport function lessTildeResolutionPlugin() {\r\n return {\r\n install(less: LessPluginHost, pluginManager: LessPluginManager) {\r\n class TildeFileManager extends less.FileManager {\r\n override supports(filename: string) {\r\n return filename.startsWith(\"~\");\r\n }\r\n override loadFile(\r\n filename: string,\r\n currentDirectory: string,\r\n options: unknown,\r\n environment: unknown,\r\n ) {\r\n // `~pkg/...` → `pkg/...`,让默认 FileManager 从 node_modules 解析\r\n return super.loadFile(filename.slice(1), currentDirectory, options, environment);\r\n }\r\n }\r\n pluginManager.addFileManager(new TildeFileManager());\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 组装 `css.preprocessorOptions.less`:映射 webpack `less-loader` 选项,\r\n * `less.resolveTilde: true` 时注入 `~` 解析插件(默认关闭)。\r\n * @public\r\n */\r\nexport function buildLessOptions(less?: LessOptions) {\r\n const resolveTilde = less?.resolveTilde === true;\r\n return {\r\n ...(less?.additionalData != null ? { additionalData: less.additionalData } : {}),\r\n ...(less?.modifyVars != null ? { modifyVars: less.modifyVars } : {}),\r\n ...(less?.javascriptEnabled != null ? { javascriptEnabled: less.javascriptEnabled } : {}),\r\n ...(resolveTilde ? { plugins: [lessTildeResolutionPlugin()] } : {}),\r\n };\r\n}\r\n","import babel from \"@rolldown/plugin-babel\";\r\nimport { reactCompilerPreset } from \"@vitejs/plugin-react\";\r\n\r\nimport type { ReactCompilerMode } from \"../types.ts\";\r\nimport type { PluginOption } from \"vite\";\r\n\r\n/** @public */\r\nexport interface ReactCompilerPluginOptions {\r\n command: string;\r\n /**\r\n * - `true`:始终启用\r\n * - `\"build-only\"`:仅 build,且 `REACT_COMPILER=false` 可关\r\n * - `false`:关闭\r\n */\r\n mode?: ReactCompilerMode;\r\n}\r\n\r\n/**\r\n * React Compiler(babel preset)。默认仅生产构建启用。\r\n * @public\r\n */\r\nexport function reactCompilerPlugin(options: ReactCompilerPluginOptions): PluginOption[] {\r\n const { command, mode = \"build-only\" } = options;\r\n if (mode === false) return [];\r\n\r\n const isBuild = command === \"build\";\r\n const enabled = mode === true ? true : isBuild && process.env.REACT_COMPILER !== \"false\";\r\n\r\n if (!enabled) return [];\r\n\r\n return [babel({ presets: [reactCompilerPreset()] })];\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport { transformWithOxc } from \"vite\";\r\n\r\nimport type { Config } from \"@svgr/core\";\r\nimport type { Plugin } from \"vite\";\r\n\r\n/**\r\n * @see https://react-svgr.com/docs/options/\r\n * @public\r\n */\r\nexport interface SvgReactOptions {\r\n /** @defaultValue true */\r\n svgo?: boolean;\r\n icon?: boolean;\r\n [key: string]: unknown;\r\n}\r\n\r\nconst SVG_EXT_RE = /\\.svg$/i;\r\n\r\n/**\r\n * `*.svg?react`(及带其它 query 时的 `react` 段)。\r\n * 不匹配 `?reactive` / webpack 的 `?svgEle`。\r\n */\r\nexport function isSvgReactId(id: string): boolean {\r\n const queryStart = id.indexOf(\"?\");\r\n if (queryStart === -1) return false;\r\n const file = id.slice(0, queryStart);\r\n if (!SVG_EXT_RE.test(file)) return false;\r\n return /(?:^|&)react(?:&|$)/.test(id.slice(queryStart + 1));\r\n}\r\n\r\nfunction missingPeerError(pkg: string, cause: unknown): Error {\r\n const error = new Error(\r\n `[svg-react] \"${pkg}\" is required to transform *.svg?react. Install the optional peer or disable CreateAppViteConfigOptions.svgr.`,\r\n );\r\n error.cause = cause;\r\n return error;\r\n}\r\n\r\nasync function resolveSvgrConfig(options: SvgReactOptions): Promise<Config> {\r\n const merged: Config = { svgo: true, ...options };\r\n if (merged.plugins != null) return merged;\r\n\r\n const plugins: NonNullable<Config[\"plugins\"]> = [];\r\n if (merged.svgo !== false) {\r\n try {\r\n plugins.push((await import(\"@svgr/plugin-svgo\")).default);\r\n } catch (cause) {\r\n throw missingPeerError(\"@svgr/plugin-svgo\", cause);\r\n }\r\n }\r\n try {\r\n plugins.push((await import(\"@svgr/plugin-jsx\")).default);\r\n } catch (cause) {\r\n throw missingPeerError(\"@svgr/plugin-jsx\", cause);\r\n }\r\n return { ...merged, plugins };\r\n}\r\n\r\n/**\r\n * 将 `import Icon from \"./icon.svg?react\"` 编成 React 组件。\r\n * 普通 `*.svg` 仍走 Vite 默认资源 URL,本插件不处理。\r\n *\r\n * `@svgr/core` / `@svgr/plugin-jsx`(以及默认开启 SVGO 时的 `@svgr/plugin-svgo`)\r\n * 仅在真正命中 `?react` 时动态加载,根入口不会静态依赖它们。\r\n * @public\r\n */\r\nexport function svgReactPlugin(options: SvgReactOptions = {}): Plugin {\r\n return {\r\n name: \"ccc:svg-react\",\r\n enforce: \"pre\",\r\n async load(id) {\r\n if (!isSvgReactId(id)) return;\r\n\r\n const filePath = id.slice(0, id.indexOf(\"?\"));\r\n const svg = await fs.readFile(filePath, \"utf8\");\r\n let transform;\r\n try {\r\n ({ transform } = await import(\"@svgr/core\"));\r\n } catch (cause) {\r\n throw missingPeerError(\"@svgr/core\", cause);\r\n }\r\n const componentCode = await transform(svg, await resolveSvgrConfig(options), { filePath });\r\n const result = await transformWithOxc(componentCode, `${filePath}.jsx`, {\r\n lang: \"jsx\",\r\n });\r\n return { code: result.code, map: result.map };\r\n },\r\n };\r\n}\r\n","import path from \"node:path\";\r\nimport basicSsl from \"@vitejs/plugin-basic-ssl\";\r\nimport react from \"@vitejs/plugin-react\";\r\nimport { mergeConfig, type PluginOption, type UserConfig } from \"vite\";\r\nimport { createHtmlPlugin } from \"vite-plugin-html\";\r\n\r\nimport { lifecyclePlugin } from \"./plugins/lifecycle.ts\";\r\nimport { buildLessOptions } from \"./plugins/less-tilde.ts\";\r\nimport { reactCompilerPlugin } from \"./plugins/react-compiler.ts\";\r\nimport { svgReactPlugin } from \"./plugins/svg-react.ts\";\r\n\r\nimport type { CreateLibraryViteConfigOptions, LibraryFormats } from \"./types.ts\";\r\n\r\n/**\r\n * 组件库构建默认外置\r\n * 传入 `externals` 时整表替换;追加时展开本常量。\r\n * @public\r\n */\r\nexport const DEFAULT_LIBRARY_EXTERNALS = [\"react\", \"react-dom\"] as const;\r\n\r\n/**\r\n * UMD / IIFE 默认全局名。未出现在表里的字符串 external 用自身包名。\r\n * @public\r\n */\r\nexport const DEFAULT_LIBRARY_GLOBALS: Record<string, string> = {\r\n react: \"React\",\r\n \"react-dom\": \"ReactDOM\",\r\n};\r\n\r\nconst DEFAULT_LIBRARY_FORMATS: LibraryFormats[] = [\"umd\"];\r\n\r\nfunction needsLibraryName(formats: readonly LibraryFormats[]): boolean {\r\n return formats.includes(\"umd\") || formats.includes(\"iife\");\r\n}\r\n\r\nfunction resolveExternals(\r\n externals: CreateLibraryViteConfigOptions[\"externals\"],\r\n): (string | RegExp)[] {\r\n if (externals === false) return [];\r\n if (externals == null) return [...DEFAULT_LIBRARY_EXTERNALS];\r\n return externals;\r\n}\r\n\r\nfunction resolveLibraryFileName(\r\n fileName: CreateLibraryViteConfigOptions[\"fileName\"],\r\n formats: readonly LibraryFormats[],\r\n): string | ((format: string, entryName: string) => string) {\r\n if (fileName != null) return fileName;\r\n if (formats.length === 1) {\r\n return () => \"index.js\";\r\n }\r\n // cjs 产物用 `.cjs` 后缀:宿主包若声明 `\"type\": \"module\"`,`.js` 会被当作 ESM 解析,\r\n // 而 cjs 产物内容是 CommonJS(module.exports),require() 会因 ESM 误判而失败。\r\n return (format) => {\r\n if (format === \"es\") return \"index.js\";\r\n if (format === \"cjs\") return \"index.cjs\";\r\n return `index.${format}.js`;\r\n };\r\n}\r\n\r\nfunction resolveLibraryGlobals(\r\n externals: readonly (string | RegExp)[],\r\n globals?: Record<string, string>,\r\n): Record<string, string> {\r\n const inferred: Record<string, string> = {};\r\n for (const ext of externals) {\r\n if (typeof ext !== \"string\") continue;\r\n inferred[ext] = DEFAULT_LIBRARY_GLOBALS[ext] ?? ext;\r\n }\r\n return { ...inferred, ...globals };\r\n}\r\n\r\n/** 字符串 external 同时匹配子路径(如 `react` → `react/jsx-runtime`)。 */\r\nexport function matchLibraryExternal(id: string, externals: readonly (string | RegExp)[]): boolean {\r\n const source = id.split(\"?\")[0] ?? id;\r\n return externals.some((ext) => {\r\n if (typeof ext === \"string\") {\r\n return source === ext || source.startsWith(`${ext}/`);\r\n }\r\n return ext.test(source);\r\n });\r\n}\r\n\r\nfunction resolveLibraryGlobalName(id: string, globals: Record<string, string>): string {\r\n const source = id.split(\"?\")[0] ?? id;\r\n if (globals[source]) return globals[source];\r\n const matched = Object.keys(globals).find(\r\n (key) => source === key || source.startsWith(`${key}/`),\r\n );\r\n return matched ? (globals[matched] ?? source) : source;\r\n}\r\n\r\n/**\r\n * 组装组件库 Vite 配置:build 走 `build.lib`(默认 UMD → `lib/`),serve 为预览应用。\r\n *\r\n * 不启用 Hash 部署、public 复制、public-config。不默认 `example/` 预览目录或 antd / Formily externals。\r\n *\r\n * 合并顺序:`base(options) → mergeConfig(base, vite) → configure(final)`\r\n * @public\r\n */\r\nexport function createLibraryViteConfig(options: CreateLibraryViteConfigOptions): UserConfig {\r\n const {\r\n rootDir,\r\n command,\r\n alias,\r\n entry = \"src/index.ts\",\r\n name,\r\n outDir = \"lib\",\r\n fileName,\r\n cssFileName = \"index\",\r\n formats = DEFAULT_LIBRARY_FORMATS,\r\n externals: externalsOption,\r\n globals: globalsOption,\r\n useHttps = false,\r\n openBrowser = true,\r\n devProxy,\r\n reactCompiler = \"build-only\",\r\n react: enableReact = true,\r\n svgr: svgrOption = false,\r\n less,\r\n previewHtml,\r\n onRun,\r\n onDone,\r\n plugins: extraPlugins = [],\r\n vite: viteOverride,\r\n configure,\r\n } = options;\r\n\r\n const isDev = command === \"serve\";\r\n const isBuild = command === \"build\";\r\n\r\n if (isBuild && needsLibraryName(formats) && (name == null || name.trim() === \"\")) {\r\n throw new Error(\r\n '[vite-config] createLibraryViteConfig: `name` is required when formats include \"umd\" or \"iife\".',\r\n );\r\n }\r\n\r\n const plugins: PluginOption[] = [\r\n ...(svgrOption ? [svgReactPlugin(svgrOption === true ? {} : svgrOption)] : []),\r\n ...(enableReact ? [react()] : []),\r\n ...reactCompilerPlugin({ command, mode: reactCompiler }),\r\n ...(isDev && previewHtml\r\n ? [\r\n createHtmlPlugin({\r\n minify: false,\r\n template: path.resolve(rootDir, previewHtml),\r\n }),\r\n ]\r\n : []),\r\n ...(isDev && useHttps ? [basicSsl()] : []),\r\n ...extraPlugins,\r\n ...(isBuild && (onRun || onDone) ? [lifecyclePlugin({ onRun, onDone })] : []),\r\n ];\r\n\r\n const resolvedExternals = resolveExternals(externalsOption);\r\n const resolvedGlobals = resolveLibraryGlobals(resolvedExternals, globalsOption);\r\n\r\n const base: UserConfig = {\r\n root: rootDir,\r\n publicDir: false,\r\n plugins,\r\n resolve: {\r\n alias,\r\n },\r\n css: {\r\n preprocessorOptions: {\r\n less: buildLessOptions(less),\r\n },\r\n },\r\n ...(isDev\r\n ? {\r\n server: {\r\n https: useHttps ? {} : undefined,\r\n host: true,\r\n open: openBrowser,\r\n ...(devProxy ? { proxy: devProxy } : {}),\r\n },\r\n }\r\n : {\r\n build: {\r\n outDir,\r\n emptyOutDir: true,\r\n lib: {\r\n entry: path.resolve(rootDir, entry),\r\n ...(name != null && name.trim() !== \"\" ? { name } : {}),\r\n formats,\r\n fileName: resolveLibraryFileName(fileName, formats),\r\n cssFileName,\r\n },\r\n rolldownOptions: {\r\n external: (id: string) => matchLibraryExternal(id, resolvedExternals),\r\n output: {\r\n globals: (id: string) => resolveLibraryGlobalName(id, resolvedGlobals),\r\n },\r\n },\r\n },\r\n }),\r\n };\r\n\r\n let merged = viteOverride ? mergeConfig(base, viteOverride) : base;\r\n if (configure) {\r\n merged = configure(merged);\r\n }\r\n return merged;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/plugins/lifecycle.ts","../src/plugins/less-tilde.ts","../src/plugins/react-compiler.ts","../src/plugins/svg-react.ts","../src/create-library-vite-config.ts"],"names":[],"mappings":"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","file":"create-library-vite-config.js","sourcesContent":["import type { PluginOption } from \"vite\";\n\n/** @public */\nexport interface LifecyclePluginOptions {\n /** 构建开始(Vite `buildStart`)。仅同步。 */\n onRun?: () => void;\n /**\n * 产物写盘成功之后(`writeBundle` sequential post)。\n * 工厂中排在 Hash 根入口写入之后;Hash 写入失败不会调用。\n */\n onDone?: () => void | Promise<void>;\n}\n\n/**\n * 构建起止回调。`onDone` 使用 sequential post `writeBundle`,\n * 以便排在 Hash 部署等其它 post 写入之后。\n * @public\n */\nexport function lifecyclePlugin(options: LifecyclePluginOptions = {}): PluginOption {\n const { onRun, onDone } = options;\n\n return {\n name: \"build-lifecycle\",\n enforce: \"post\",\n buildStart() {\n if (typeof onRun === \"function\") {\n onRun();\n }\n },\n writeBundle: {\n sequential: true,\n order: \"post\",\n async handler() {\n if (typeof onDone === \"function\") {\n await onDone();\n }\n },\n },\n };\n}\n","import type { LessOptions } from \"../types.ts\";\n\n/**\n * less 插件注入的 FileManager 实例表面类型。less@4 不自带 TS 类型,按实际使用的最小面声明。\n */\ninterface LessFileManagerInstance {\n supports(filename: string): boolean;\n loadFile(\n filename: string,\n currentDirectory: string,\n options: unknown,\n environment: unknown,\n ): unknown;\n}\n\n/** less.js 传给插件 `install` 的 less 环境实例表面。 */\ninterface LessPluginHost {\n FileManager: new (...args: unknown[]) => LessFileManagerInstance;\n}\n\n/** less.js 插件管理器表面。 */\ninterface LessPluginManager {\n addFileManager(manager: LessFileManagerInstance): void;\n}\n\n/**\n * Less 插件:把 webpack 遗留的 `~pkg/...` 导入解析到 node_modules。\n *\n * Less 自身不认识 `~`(那是 webpack `less-loader` 的约定:从 node_modules 解析);Vite 的\n * Less 预处理器也不处理 `~`,会回退到 Less 默认 FileManager 去查找 `node_modules/~pkg/...` 而失败。\n * 本插件注册一个 FileManager:仅当导入以 `~` 开头时拦截,去掉前缀后交给默认 FileManager 解析\n * (Vite 恒向 `less.render` 注入 `paths: [\"node_modules\"]`)。\n *\n * 第三方包(如 formily 系)自带 `@import \"~antd/...\"` 时尤其需要——消费方无法修改 node_modules。\n * @public\n */\nexport function lessTildeResolutionPlugin() {\n return {\n install(less: LessPluginHost, pluginManager: LessPluginManager) {\n class TildeFileManager extends less.FileManager {\n override supports(filename: string) {\n return filename.startsWith(\"~\");\n }\n override loadFile(\n filename: string,\n currentDirectory: string,\n options: unknown,\n environment: unknown,\n ) {\n // `~pkg/...` → `pkg/...`,让默认 FileManager 从 node_modules 解析\n return super.loadFile(filename.slice(1), currentDirectory, options, environment);\n }\n }\n pluginManager.addFileManager(new TildeFileManager());\n },\n };\n}\n\n/**\n * 组装 `css.preprocessorOptions.less`:映射 webpack `less-loader` 选项,\n * `less.resolveTilde: true` 时注入 `~` 解析插件(默认关闭)。\n * @public\n */\nexport function buildLessOptions(less?: LessOptions) {\n const resolveTilde = less?.resolveTilde === true;\n return {\n ...(less?.additionalData != null ? { additionalData: less.additionalData } : {}),\n ...(less?.modifyVars != null ? { modifyVars: less.modifyVars } : {}),\n ...(less?.javascriptEnabled != null ? { javascriptEnabled: less.javascriptEnabled } : {}),\n ...(resolveTilde ? { plugins: [lessTildeResolutionPlugin()] } : {}),\n };\n}\n","import babel from \"@rolldown/plugin-babel\";\nimport { reactCompilerPreset } from \"@vitejs/plugin-react\";\n\nimport type { ReactCompilerMode } from \"../types.ts\";\nimport type { PluginOption } from \"vite\";\n\n/** @public */\nexport interface ReactCompilerPluginOptions {\n command: string;\n /**\n * - `true`:始终启用\n * - `\"build-only\"`:仅 build,且 `REACT_COMPILER=false` 可关\n * - `false`:关闭\n */\n mode?: ReactCompilerMode;\n}\n\n/**\n * React Compiler(babel preset)。默认仅生产构建启用。\n * @public\n */\nexport function reactCompilerPlugin(options: ReactCompilerPluginOptions): PluginOption[] {\n const { command, mode = \"build-only\" } = options;\n if (mode === false) return [];\n\n const isBuild = command === \"build\";\n const enabled = mode === true ? true : isBuild && process.env.REACT_COMPILER !== \"false\";\n\n if (!enabled) return [];\n\n return [babel({ presets: [reactCompilerPreset()] })];\n}\n","import fs from \"node:fs/promises\";\nimport { transformWithOxc } from \"vite\";\n\nimport type { Config } from \"@svgr/core\";\nimport type { Plugin } from \"vite\";\n\n/**\n * @see https://react-svgr.com/docs/options/\n * @public\n */\nexport interface SvgReactOptions {\n /** @defaultValue true */\n svgo?: boolean;\n icon?: boolean;\n [key: string]: unknown;\n}\n\nconst SVG_EXT_RE = /\\.svg$/i;\n\n/**\n * `*.svg?react`(及带其它 query 时的 `react` 段)。\n * 不匹配 `?reactive` / webpack 的 `?svgEle`。\n */\nexport function isSvgReactId(id: string): boolean {\n const queryStart = id.indexOf(\"?\");\n if (queryStart === -1) return false;\n const file = id.slice(0, queryStart);\n if (!SVG_EXT_RE.test(file)) return false;\n return /(?:^|&)react(?:&|$)/.test(id.slice(queryStart + 1));\n}\n\nfunction missingPeerError(pkg: string, cause: unknown): Error {\n const error = new Error(\n `[svg-react] \"${pkg}\" is required to transform *.svg?react. Install the optional peer or disable CreateAppViteConfigOptions.svgr.`,\n );\n error.cause = cause;\n return error;\n}\n\nasync function resolveSvgrConfig(options: SvgReactOptions): Promise<Config> {\n const merged: Config = { svgo: true, ...options };\n if (merged.plugins != null) return merged;\n\n const plugins: NonNullable<Config[\"plugins\"]> = [];\n if (merged.svgo !== false) {\n try {\n plugins.push((await import(\"@svgr/plugin-svgo\")).default);\n } catch (cause) {\n throw missingPeerError(\"@svgr/plugin-svgo\", cause);\n }\n }\n try {\n plugins.push((await import(\"@svgr/plugin-jsx\")).default);\n } catch (cause) {\n throw missingPeerError(\"@svgr/plugin-jsx\", cause);\n }\n return { ...merged, plugins };\n}\n\n/**\n * 将 `import Icon from \"./icon.svg?react\"` 编成 React 组件。\n * 普通 `*.svg` 仍走 Vite 默认资源 URL,本插件不处理。\n *\n * `@svgr/core` / `@svgr/plugin-jsx`(以及默认开启 SVGO 时的 `@svgr/plugin-svgo`)\n * 仅在真正命中 `?react` 时动态加载,根入口不会静态依赖它们。\n * @public\n */\nexport function svgReactPlugin(options: SvgReactOptions = {}): Plugin {\n return {\n name: \"ccc:svg-react\",\n enforce: \"pre\",\n async load(id) {\n if (!isSvgReactId(id)) return;\n\n const filePath = id.slice(0, id.indexOf(\"?\"));\n const svg = await fs.readFile(filePath, \"utf8\");\n let transform;\n try {\n ({ transform } = await import(\"@svgr/core\"));\n } catch (cause) {\n throw missingPeerError(\"@svgr/core\", cause);\n }\n const componentCode = await transform(svg, await resolveSvgrConfig(options), { filePath });\n const result = await transformWithOxc(componentCode, `${filePath}.jsx`, {\n lang: \"jsx\",\n });\n return { code: result.code, map: result.map };\n },\n };\n}\n","import { readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport basicSsl from \"@vitejs/plugin-basic-ssl\";\nimport react from \"@vitejs/plugin-react\";\nimport { mergeConfig, type Plugin, type PluginOption, type UserConfig } from \"vite\";\nimport { createHtmlPlugin } from \"vite-plugin-html\";\n\nimport { lifecyclePlugin } from \"./plugins/lifecycle.ts\";\nimport { buildLessOptions } from \"./plugins/less-tilde.ts\";\nimport { reactCompilerPlugin } from \"./plugins/react-compiler.ts\";\nimport { svgReactPlugin } from \"./plugins/svg-react.ts\";\n\nimport type { CreateLibraryViteConfigOptions, LibraryFormats } from \"./types.ts\";\n\n/**\n * 组件库构建默认外置\n * 传入 `externals` 时整表替换;追加时展开本常量。\n * @public\n */\nexport const DEFAULT_LIBRARY_EXTERNALS = [\"react\", \"react-dom\"] as const;\n\n/**\n * UMD / IIFE 默认全局名。未出现在表里的字符串 external 用自身包名。\n * @public\n */\nexport const DEFAULT_LIBRARY_GLOBALS: Record<string, string> = {\n react: \"React\",\n \"react-dom\": \"ReactDOM\",\n};\n\nconst DEFAULT_LIBRARY_FORMATS: LibraryFormats[] = [\"umd\"];\n\n/**\n * 删除 CJS 产物的 sourcemap,并抹掉产物末尾的 `sourceMappingURL` 注释。\n *\n * 理由:webpack 5(`exports.import`)与 webpack 4(`mainFields: browser → module → main`)都命中\n * ESM 产物,CJS map 只对 Node SSR + `--enable-source-maps` 有意义,却让随包 map 体积翻倍\n * (实测 `form-render` 双份 701KB、`form-render-mobile` 622KB,超 check-package 的 512KB 守卫)。\n * 源码调试由 ESM map(含 `sourcesContent`)+ 随包发布的 `src` 覆盖。\n * 决策见 docs/src-direct-vs-dist-evaluation.md §11 第 6 项 (c)。\n */\nfunction stripCjsSourcemapPlugin(): Plugin {\n let outDir = \"\";\n return {\n name: \"hzab:strip-cjs-sourcemap\",\n apply: \"build\",\n configResolved(config) {\n outDir = config.build.outDir;\n },\n async writeBundle(_options, bundle) {\n for (const fileName of Object.keys(bundle)) {\n const file = path.resolve(outDir, fileName);\n if (fileName.endsWith(\".cjs.map\")) {\n await rm(file, { force: true });\n continue;\n }\n if (!fileName.endsWith(\".cjs\")) continue;\n // 注释必须一起删:留着会让 DevTools / webpack 去请求已不存在的 map。\n const code = await readFile(file, \"utf8\");\n const stripped = code.replace(/\\n?\\/\\/# sourceMappingURL=\\S+\\s*$/u, \"\\n\");\n if (stripped !== code) await writeFile(file, stripped, \"utf8\");\n }\n },\n };\n}\n\nfunction needsLibraryName(formats: readonly LibraryFormats[]): boolean {\n return formats.includes(\"umd\") || formats.includes(\"iife\");\n}\n\nfunction resolveExternals(\n externals: CreateLibraryViteConfigOptions[\"externals\"],\n): (string | RegExp)[] {\n if (externals === false) return [];\n if (externals == null) return [...DEFAULT_LIBRARY_EXTERNALS];\n return externals;\n}\n\nfunction resolveLibraryFileName(\n fileName: CreateLibraryViteConfigOptions[\"fileName\"],\n formats: readonly LibraryFormats[],\n): string | ((format: string, entryName: string) => string) {\n if (fileName != null) return fileName;\n if (formats.length === 1) {\n return () => \"index.js\";\n }\n // cjs 产物用 `.cjs` 后缀:宿主包若声明 `\"type\": \"module\"`,`.js` 会被当作 ESM 解析,\n // 而 cjs 产物内容是 CommonJS(module.exports),require() 会因 ESM 误判而失败。\n return (format) => {\n if (format === \"es\") return \"index.js\";\n if (format === \"cjs\") return \"index.cjs\";\n return `index.${format}.js`;\n };\n}\n\nfunction resolveLibraryGlobals(\n externals: readonly (string | RegExp)[],\n globals?: Record<string, string>,\n): Record<string, string> {\n const inferred: Record<string, string> = {};\n for (const ext of externals) {\n if (typeof ext !== \"string\") continue;\n inferred[ext] = DEFAULT_LIBRARY_GLOBALS[ext] ?? ext;\n }\n return { ...inferred, ...globals };\n}\n\n/** 字符串 external 同时匹配子路径(如 `react` → `react/jsx-runtime`)。 */\nexport function matchLibraryExternal(id: string, externals: readonly (string | RegExp)[]): boolean {\n const source = id.split(\"?\")[0] ?? id;\n return externals.some((ext) => {\n if (typeof ext === \"string\") {\n return source === ext || source.startsWith(`${ext}/`);\n }\n return ext.test(source);\n });\n}\n\nfunction resolveLibraryGlobalName(id: string, globals: Record<string, string>): string {\n const source = id.split(\"?\")[0] ?? id;\n if (globals[source]) return globals[source];\n const matched = Object.keys(globals).find(\n (key) => source === key || source.startsWith(`${key}/`),\n );\n return matched ? (globals[matched] ?? source) : source;\n}\n\n/**\n * 组装组件库 Vite 配置:build 走 `build.lib`(默认 UMD → `lib/`),serve 为预览应用。\n *\n * 不启用 Hash 部署、public 复制、public-config。不默认 `example/` 预览目录或 antd / Formily externals。\n *\n * 合并顺序:`base(options) → mergeConfig(base, vite) → configure(final)`\n * @public\n */\nexport function createLibraryViteConfig(options: CreateLibraryViteConfigOptions): UserConfig {\n const {\n rootDir,\n command,\n alias,\n entry = \"src/index.ts\",\n name,\n outDir = \"lib\",\n fileName,\n cssFileName = \"index\",\n formats = DEFAULT_LIBRARY_FORMATS,\n externals: externalsOption,\n globals: globalsOption,\n useHttps = false,\n openBrowser = true,\n devProxy,\n reactCompiler = \"build-only\",\n react: enableReact = true,\n svgr: svgrOption = false,\n less,\n previewHtml,\n onRun,\n onDone,\n plugins: extraPlugins = [],\n vite: viteOverride,\n configure,\n } = options;\n\n const isDev = command === \"serve\";\n const isBuild = command === \"build\";\n\n if (isBuild && needsLibraryName(formats) && (name == null || name.trim() === \"\")) {\n throw new Error(\n '[vite-config] createLibraryViteConfig: `name` is required when formats include \"umd\" or \"iife\".',\n );\n }\n\n const plugins: PluginOption[] = [\n ...(svgrOption ? [svgReactPlugin(svgrOption === true ? {} : svgrOption)] : []),\n ...(enableReact ? [react()] : []),\n ...reactCompilerPlugin({ command, mode: reactCompiler }),\n ...(isDev && previewHtml\n ? [\n createHtmlPlugin({\n minify: false,\n template: path.resolve(rootDir, previewHtml),\n }),\n ]\n : []),\n ...(isDev && useHttps ? [basicSsl()] : []),\n ...extraPlugins,\n ...(isBuild && (onRun || onDone) ? [lifecyclePlugin({ onRun, onDone })] : []),\n ...(isBuild ? [stripCjsSourcemapPlugin()] : []),\n ];\n\n const resolvedExternals = resolveExternals(externalsOption);\n const resolvedGlobals = resolveLibraryGlobals(resolvedExternals, globalsOption);\n\n const base: UserConfig = {\n root: rootDir,\n publicDir: false,\n plugins,\n resolve: {\n alias,\n },\n css: {\n preprocessorOptions: {\n less: buildLessOptions(less),\n },\n },\n ...(isDev\n ? {\n server: {\n https: useHttps ? {} : undefined,\n host: true,\n open: openBrowser,\n ...(devProxy ? { proxy: devProxy } : {}),\n },\n }\n : {\n build: {\n outDir,\n emptyOutDir: true,\n // 产物随包发布:消费方 webpack 的 devtool 会消费依赖自带的 map,缺失时\n // DevTools 只能看到缩短标识符后的编译产物(见 docs/src-direct-vs-dist-evaluation.md §7.1)。\n sourcemap: true,\n // 降到 ES2018:webpack 4(umi3 线 abt-app)内置 acorn 6 解析到 ES2019 为止,不认 ES2020 的\n // `?.` / `??`,产物保持默认 target 会让该线直接 Module parse failed。ES2018 是覆盖 acorn 6\n // 边界的最小目标(对象展开仍保留),见 docs/src-direct-vs-dist-evaluation.md §7.2。\n target: \"es2018\",\n lib: {\n entry: path.resolve(rootDir, entry),\n ...(name != null && name.trim() !== \"\" ? { name } : {}),\n formats,\n fileName: resolveLibraryFileName(fileName, formats),\n cssFileName,\n },\n rolldownOptions: {\n external: (id: string) => matchLibraryExternal(id, resolvedExternals),\n output: {\n globals: (id: string) => resolveLibraryGlobalName(id, resolvedGlobals),\n },\n },\n },\n }),\n };\n\n let merged = viteOverride ? mergeConfig(base, viteOverride) : base;\n if (configure) {\n merged = configure(merged);\n }\n return merged;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/stub-less.ts","../src/create-package-vitest-config.ts"],"names":["react","mergeConfig"],"mappings":";;;;;;;;;;;;AAEA,IAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAWf,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,KAAK,EAAA,EAAI;AACP,MAAA,IAAI,wBAAA,CAAyB,IAAA,CAAK,EAAE,CAAA,EAAG;AACrC,QAAA,OAAO,aAAA;AAAA,MACT;AACA,MAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,EAAE,CAAA,EAAG;AAC7B,QAAA,OAAO,EAAA;AAAA,MACT;AAAA,IACF;AAAA,GACF;AACF;;;ACZO,SAAS,0BACd,OAAA,EACkB;AAClB,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAO,WAAA,GAAc,KAAA;AAAA,IACrB,QAAA,GAAW,KAAA;AAAA,IACX,WAAA,GAAc,WAAA;AAAA,IACd,OAAA,GAAU,CAAC,mBAAmB,CAAA;AAAA,IAC9B,UAAA;AAAA,IACA,OAAA,EAAS,eAAe,EAAC;AAAA,IACzB,IAAA,EAAM,YAAA;AAAA,IACN;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,OAAA,GAA0B;AAAA,IAC9B,GAAI,WAAA,GAAc,CAACA,sBAAA,EAAO,IAAI,EAAC;AAAA,IAC/B,GAAI,QAAA,GAAW,CAAC,cAAA,EAAgB,IAAI,EAAC;AAAA,IACrC,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,IAAA,GAAyB;AAAA,IAC7B,IAAA,EAAM,WAAA;AAAA,IACN,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,WAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe;AAAC;AACrC,GACF;AAEA,EAAA,IAAI,MAAA,GAAS,YAAA,GAAeC,gBAAA,CAAY,IAAA,EAAM,YAAY,CAAA,GAAI,IAAA;AAC9D,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,GAAS,UAAU,MAAM,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,MAAA;AACT","file":"create-package-vitest-config.cjs","sourcesContent":["import type { Plugin } from \"vite\";\
|
|
1
|
+
{"version":3,"sources":["../src/plugins/stub-less.ts","../src/create-package-vitest-config.ts"],"names":["react","mergeConfig"],"mappings":";;;;;;;;;;;;AAEA,IAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAWf,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,KAAK,EAAA,EAAI;AACP,MAAA,IAAI,wBAAA,CAAyB,IAAA,CAAK,EAAE,CAAA,EAAG;AACrC,QAAA,OAAO,aAAA;AAAA,MACT;AACA,MAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,EAAE,CAAA,EAAG;AAC7B,QAAA,OAAO,EAAA;AAAA,MACT;AAAA,IACF;AAAA,GACF;AACF;;;ACZO,SAAS,0BACd,OAAA,EACkB;AAClB,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAO,WAAA,GAAc,KAAA;AAAA,IACrB,QAAA,GAAW,KAAA;AAAA,IACX,WAAA,GAAc,WAAA;AAAA,IACd,OAAA,GAAU,CAAC,mBAAmB,CAAA;AAAA,IAC9B,UAAA;AAAA,IACA,OAAA,EAAS,eAAe,EAAC;AAAA,IACzB,IAAA,EAAM,YAAA;AAAA,IACN;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,OAAA,GAA0B;AAAA,IAC9B,GAAI,WAAA,GAAc,CAACA,sBAAA,EAAO,IAAI,EAAC;AAAA,IAC/B,GAAI,QAAA,GAAW,CAAC,cAAA,EAAgB,IAAI,EAAC;AAAA,IACrC,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,IAAA,GAAyB;AAAA,IAC7B,IAAA,EAAM,WAAA;AAAA,IACN,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,WAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe;AAAC;AACrC,GACF;AAEA,EAAA,IAAI,MAAA,GAAS,YAAA,GAAeC,gBAAA,CAAY,IAAA,EAAM,YAAY,CAAA,GAAI,IAAA;AAC9D,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,GAAS,UAAU,MAAM,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,MAAA;AACT","file":"create-package-vitest-config.cjs","sourcesContent":["import type { Plugin } from \"vite\";\n\nconst cssModuleStub = `\nconst styles = new Proxy({}, {\n get: (_target, property) => typeof property === \"string\" ? property : undefined,\n});\nexport default styles;\n`;\n\n/**\n * 单测不解析 less,并为 CSS Modules 提供 identity stub\n * @public\n */\nexport function stubLessPlugin(): Plugin {\n return {\n name: \"stub-less\",\n load(id) {\n if (/\\.module\\.less(?:$|\\?)/.test(id)) {\n return cssModuleStub;\n }\n if (/\\.less(?:$|\\?)/.test(id)) {\n return \"\";\n }\n },\n };\n}\n","import react from \"@vitejs/plugin-react\";\nimport { mergeConfig, type PluginOption } from \"vite\";\n\nimport { stubLessPlugin } from \"./plugins/stub-less.ts\";\n\nimport type { CreatePackageVitestConfigOptions } from \"./vitest-types.ts\";\nimport type { ViteUserConfig as VitestUserConfig } from \"vitest/config\";\n\n/**\n * 组装包级 Vitest 配置。\n *\n * 合并顺序:`base(options) → mergeConfig(base, vite) → configure(final)`\n */\nexport function createPackageVitestConfig(\n options: CreatePackageVitestConfigOptions,\n): VitestUserConfig {\n const {\n packageRoot,\n alias,\n react: enableReact = false,\n stubLess = false,\n environment = \"happy-dom\",\n include = [\"test/**/*.test.ts\"],\n setupFiles,\n plugins: extraPlugins = [],\n vite: viteOverride,\n configure,\n } = options;\n\n const plugins: PluginOption[] = [\n ...(enableReact ? [react()] : []),\n ...(stubLess ? [stubLessPlugin()] : []),\n ...extraPlugins,\n ];\n\n const base: VitestUserConfig = {\n root: packageRoot,\n plugins,\n resolve: {\n alias,\n },\n test: {\n environment,\n include,\n ...(setupFiles ? { setupFiles } : {}),\n },\n };\n\n let merged = viteOverride ? mergeConfig(base, viteOverride) : base;\n if (configure) {\n merged = configure(merged);\n }\n return merged;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/stub-less.ts","../src/create-package-vitest-config.ts"],"names":[],"mappings":";;;;;;AAEA,IAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAWf,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,KAAK,EAAA,EAAI;AACP,MAAA,IAAI,wBAAA,CAAyB,IAAA,CAAK,EAAE,CAAA,EAAG;AACrC,QAAA,OAAO,aAAA;AAAA,MACT;AACA,MAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,EAAE,CAAA,EAAG;AAC7B,QAAA,OAAO,EAAA;AAAA,MACT;AAAA,IACF;AAAA,GACF;AACF;;;ACZO,SAAS,0BACd,OAAA,EACkB;AAClB,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAO,WAAA,GAAc,KAAA;AAAA,IACrB,QAAA,GAAW,KAAA;AAAA,IACX,WAAA,GAAc,WAAA;AAAA,IACd,OAAA,GAAU,CAAC,mBAAmB,CAAA;AAAA,IAC9B,UAAA;AAAA,IACA,OAAA,EAAS,eAAe,EAAC;AAAA,IACzB,IAAA,EAAM,YAAA;AAAA,IACN;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,OAAA,GAA0B;AAAA,IAC9B,GAAI,WAAA,GAAc,CAAC,KAAA,EAAO,IAAI,EAAC;AAAA,IAC/B,GAAI,QAAA,GAAW,CAAC,cAAA,EAAgB,IAAI,EAAC;AAAA,IACrC,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,IAAA,GAAyB;AAAA,IAC7B,IAAA,EAAM,WAAA;AAAA,IACN,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,WAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe;AAAC;AACrC,GACF;AAEA,EAAA,IAAI,MAAA,GAAS,YAAA,GAAe,WAAA,CAAY,IAAA,EAAM,YAAY,CAAA,GAAI,IAAA;AAC9D,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,GAAS,UAAU,MAAM,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,MAAA;AACT","file":"create-package-vitest-config.js","sourcesContent":["import type { Plugin } from \"vite\";\
|
|
1
|
+
{"version":3,"sources":["../src/plugins/stub-less.ts","../src/create-package-vitest-config.ts"],"names":[],"mappings":";;;;;;AAEA,IAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAWf,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,KAAK,EAAA,EAAI;AACP,MAAA,IAAI,wBAAA,CAAyB,IAAA,CAAK,EAAE,CAAA,EAAG;AACrC,QAAA,OAAO,aAAA;AAAA,MACT;AACA,MAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,EAAE,CAAA,EAAG;AAC7B,QAAA,OAAO,EAAA;AAAA,MACT;AAAA,IACF;AAAA,GACF;AACF;;;ACZO,SAAS,0BACd,OAAA,EACkB;AAClB,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAO,WAAA,GAAc,KAAA;AAAA,IACrB,QAAA,GAAW,KAAA;AAAA,IACX,WAAA,GAAc,WAAA;AAAA,IACd,OAAA,GAAU,CAAC,mBAAmB,CAAA;AAAA,IAC9B,UAAA;AAAA,IACA,OAAA,EAAS,eAAe,EAAC;AAAA,IACzB,IAAA,EAAM,YAAA;AAAA,IACN;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,OAAA,GAA0B;AAAA,IAC9B,GAAI,WAAA,GAAc,CAAC,KAAA,EAAO,IAAI,EAAC;AAAA,IAC/B,GAAI,QAAA,GAAW,CAAC,cAAA,EAAgB,IAAI,EAAC;AAAA,IACrC,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,IAAA,GAAyB;AAAA,IAC7B,IAAA,EAAM,WAAA;AAAA,IACN,OAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,WAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe;AAAC;AACrC,GACF;AAEA,EAAA,IAAI,MAAA,GAAS,YAAA,GAAe,WAAA,CAAY,IAAA,EAAM,YAAY,CAAA,GAAI,IAAA;AAC9D,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,GAAS,UAAU,MAAM,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,MAAA;AACT","file":"create-package-vitest-config.js","sourcesContent":["import type { Plugin } from \"vite\";\n\nconst cssModuleStub = `\nconst styles = new Proxy({}, {\n get: (_target, property) => typeof property === \"string\" ? property : undefined,\n});\nexport default styles;\n`;\n\n/**\n * 单测不解析 less,并为 CSS Modules 提供 identity stub\n * @public\n */\nexport function stubLessPlugin(): Plugin {\n return {\n name: \"stub-less\",\n load(id) {\n if (/\\.module\\.less(?:$|\\?)/.test(id)) {\n return cssModuleStub;\n }\n if (/\\.less(?:$|\\?)/.test(id)) {\n return \"\";\n }\n },\n };\n}\n","import react from \"@vitejs/plugin-react\";\nimport { mergeConfig, type PluginOption } from \"vite\";\n\nimport { stubLessPlugin } from \"./plugins/stub-less.ts\";\n\nimport type { CreatePackageVitestConfigOptions } from \"./vitest-types.ts\";\nimport type { ViteUserConfig as VitestUserConfig } from \"vitest/config\";\n\n/**\n * 组装包级 Vitest 配置。\n *\n * 合并顺序:`base(options) → mergeConfig(base, vite) → configure(final)`\n */\nexport function createPackageVitestConfig(\n options: CreatePackageVitestConfigOptions,\n): VitestUserConfig {\n const {\n packageRoot,\n alias,\n react: enableReact = false,\n stubLess = false,\n environment = \"happy-dom\",\n include = [\"test/**/*.test.ts\"],\n setupFiles,\n plugins: extraPlugins = [],\n vite: viteOverride,\n configure,\n } = options;\n\n const plugins: PluginOption[] = [\n ...(enableReact ? [react()] : []),\n ...(stubLess ? [stubLessPlugin()] : []),\n ...extraPlugins,\n ];\n\n const base: VitestUserConfig = {\n root: packageRoot,\n plugins,\n resolve: {\n alias,\n },\n test: {\n environment,\n include,\n ...(setupFiles ? { setupFiles } : {}),\n },\n };\n\n let merged = viteOverride ? mergeConfig(base, viteOverride) : base;\n if (configure) {\n merged = configure(merged);\n }\n return merged;\n}\n"]}
|
|
@@ -27,42 +27,157 @@ function resolveCopyPluginOptions(options) {
|
|
|
27
27
|
function copyPlugin(options) {
|
|
28
28
|
return vitePluginStaticCopy.viteStaticCopy(resolveCopyPluginOptions(options));
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
|
|
31
|
+
// src/plugins/hash-dir-name.ts
|
|
32
|
+
var tokenPattern = () => /YYYY|SSS|MM|DD|HH|mm|ss|timestamp|hash/g;
|
|
33
|
+
var DATE_TOKEN_WIDTH = { YYYY: 4, MM: 2, DD: 2, HH: 2, mm: 2, ss: 2, SSS: 3 };
|
|
34
|
+
var DATE_TOKEN_SLOT = {
|
|
35
|
+
YYYY: "year",
|
|
36
|
+
MM: "month",
|
|
37
|
+
DD: "day",
|
|
38
|
+
HH: "hour",
|
|
39
|
+
mm: "minute",
|
|
40
|
+
ss: "second",
|
|
41
|
+
SSS: "millisecond"
|
|
42
|
+
};
|
|
43
|
+
var TIME_TOKENS = ["timestamp", "YYYY", "MM", "DD", "HH", "mm", "ss", "SSS"];
|
|
44
|
+
var AVAILABLE_TOKENS = ["hash", ...TIME_TOKENS];
|
|
45
|
+
var DEFAULT_HASH_DIR_NAME_PATTERN = "hash-timestamp";
|
|
46
|
+
var ILLEGAL_DIR_CHAR_PATTERN = /[\\/:*?"<>|]/;
|
|
47
|
+
var pad = (value, length = 2) => String(value).padStart(length, "0");
|
|
48
|
+
function escapeRegExp(value) {
|
|
49
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
50
|
+
}
|
|
51
|
+
function assertPatternValue(pattern) {
|
|
52
|
+
if (pattern.trim() === "") {
|
|
53
|
+
throw new Error("[vite-config] hashDirName must be a non-empty string.");
|
|
54
|
+
}
|
|
35
55
|
}
|
|
36
|
-
function
|
|
37
|
-
|
|
56
|
+
function assertSafeDirName(dirName, pattern) {
|
|
57
|
+
const unsafe = ILLEGAL_DIR_CHAR_PATTERN.test(dirName) || dirName.includes("..") || dirName.startsWith(".") || dirName.endsWith(".") || dirName !== dirName.trim();
|
|
58
|
+
if (unsafe) {
|
|
59
|
+
throw new Error(
|
|
60
|
+
`[vite-config] hashDirName "${pattern}" resolves to unsafe directory name "${dirName}".`
|
|
61
|
+
);
|
|
62
|
+
}
|
|
38
63
|
}
|
|
39
|
-
function
|
|
40
|
-
|
|
64
|
+
function expandHashDirName(options) {
|
|
65
|
+
const { pattern, commitHash, now = Date.now() } = options;
|
|
66
|
+
assertPatternValue(pattern);
|
|
41
67
|
const date = new Date(now);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
68
|
+
const values = {
|
|
69
|
+
hash: commitHash || "local",
|
|
70
|
+
timestamp: String(now),
|
|
71
|
+
YYYY: String(date.getFullYear()),
|
|
72
|
+
MM: pad(date.getMonth() + 1),
|
|
73
|
+
DD: pad(date.getDate()),
|
|
74
|
+
HH: pad(date.getHours()),
|
|
75
|
+
mm: pad(date.getMinutes()),
|
|
76
|
+
ss: pad(date.getSeconds()),
|
|
77
|
+
SSS: pad(date.getMilliseconds(), 3)
|
|
78
|
+
};
|
|
79
|
+
let timeMatched = false;
|
|
80
|
+
const dirName = pattern.replace(tokenPattern(), (token) => {
|
|
81
|
+
if (TIME_TOKENS.includes(token)) timeMatched = true;
|
|
82
|
+
return values[token] ?? token;
|
|
83
|
+
});
|
|
84
|
+
if (!timeMatched) {
|
|
85
|
+
throw new Error(
|
|
86
|
+
`[vite-config] hashDirName "${pattern}" must contain a time token; available tokens: ${AVAILABLE_TOKENS.join(", ")}.`
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
assertSafeDirName(dirName, pattern);
|
|
90
|
+
return dirName;
|
|
91
|
+
}
|
|
92
|
+
function hasTimeToken(pattern) {
|
|
93
|
+
if (pattern.trim() === "") return false;
|
|
94
|
+
return [...pattern.matchAll(tokenPattern())].some(
|
|
95
|
+
(match) => TIME_TOKENS.includes(match[0])
|
|
96
|
+
);
|
|
50
97
|
}
|
|
51
|
-
function
|
|
98
|
+
function compileHashDirNameMatcher(pattern) {
|
|
99
|
+
assertPatternValue(pattern);
|
|
100
|
+
let source = "^";
|
|
101
|
+
let cursor = 0;
|
|
102
|
+
let groupIndex = 1;
|
|
103
|
+
let epochGroup = -1;
|
|
104
|
+
const dateTokens = [];
|
|
105
|
+
for (const match of pattern.matchAll(tokenPattern())) {
|
|
106
|
+
const index = match.index;
|
|
107
|
+
source += escapeRegExp(pattern.slice(cursor, index));
|
|
108
|
+
const token = match[0];
|
|
109
|
+
if (token === "hash") {
|
|
110
|
+
source += "(?:[0-9a-f]{12}|local)";
|
|
111
|
+
} else if (token === "timestamp") {
|
|
112
|
+
source += "(\\d{1,15})";
|
|
113
|
+
epochGroup = groupIndex;
|
|
114
|
+
groupIndex += 1;
|
|
115
|
+
} else {
|
|
116
|
+
const width = DATE_TOKEN_WIDTH[token];
|
|
117
|
+
source += `(\\d{${width}})`;
|
|
118
|
+
dateTokens.push(token);
|
|
119
|
+
groupIndex += 1;
|
|
120
|
+
}
|
|
121
|
+
cursor = index + token.length;
|
|
122
|
+
}
|
|
123
|
+
source += `${escapeRegExp(pattern.slice(cursor))}$`;
|
|
124
|
+
const regex = new RegExp(source);
|
|
125
|
+
return {
|
|
126
|
+
regex,
|
|
127
|
+
parseTimestamp(name) {
|
|
128
|
+
const matched = regex.exec(name);
|
|
129
|
+
if (!matched) return void 0;
|
|
130
|
+
if (epochGroup > 0) {
|
|
131
|
+
const epoch = matched[epochGroup];
|
|
132
|
+
return epoch == null ? void 0 : Number(epoch);
|
|
133
|
+
}
|
|
134
|
+
if (dateTokens.length === 0) return void 0;
|
|
135
|
+
const slots = {};
|
|
136
|
+
dateTokens.forEach((token, position) => {
|
|
137
|
+
const raw = matched[position + 1];
|
|
138
|
+
if (raw != null) slots[DATE_TOKEN_SLOT[token]] = Number(raw);
|
|
139
|
+
});
|
|
140
|
+
return new Date(
|
|
141
|
+
slots.year ?? 1970,
|
|
142
|
+
(slots.month ?? 1) - 1,
|
|
143
|
+
slots.day ?? 1,
|
|
144
|
+
slots.hour ?? 0,
|
|
145
|
+
slots.minute ?? 0,
|
|
146
|
+
slots.second ?? 0,
|
|
147
|
+
slots.millisecond ?? 0
|
|
148
|
+
).getTime();
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
var RECENT_BUILD_PROTECT_MS = 5 * 60 * 1e3;
|
|
153
|
+
function cleanupOldHashBuilds(deployRoot, currentBuildDir, keep, matcher) {
|
|
154
|
+
const now = Date.now();
|
|
52
155
|
const oldBuilds = fs__default.default.readdirSync(deployRoot, { withFileTypes: true }).flatMap((entry) => {
|
|
53
156
|
if (!entry.isDirectory() || entry.name === currentBuildDir) return [];
|
|
54
|
-
const
|
|
55
|
-
|
|
157
|
+
const timestamp = matcher.parseTimestamp(entry.name);
|
|
158
|
+
if (timestamp == null) return [];
|
|
159
|
+
if (now - timestamp < RECENT_BUILD_PROTECT_MS) return [];
|
|
160
|
+
return [{ name: entry.name, timestamp }];
|
|
56
161
|
}).sort((left, right) => right.timestamp - left.timestamp || right.name.localeCompare(left.name));
|
|
57
162
|
for (const build of oldBuilds.slice(Math.max(keep - 1, 0))) {
|
|
58
163
|
fs__default.default.rmSync(path__default.default.join(deployRoot, build.name), { recursive: true });
|
|
59
164
|
}
|
|
60
165
|
}
|
|
61
166
|
function hashDeployPlugin(options) {
|
|
62
|
-
const { rootDir, buildDirStr, publicPath, cleanup } = options;
|
|
167
|
+
const { rootDir, buildDirStr, buildDirNamePattern, publicPath, cleanup } = options;
|
|
63
168
|
if (cleanup && (!Number.isInteger(cleanup.keep) || cleanup.keep < 1)) {
|
|
64
169
|
throw new Error("[hash-deploy] cleanup.keep must be an integer greater than or equal to 1.");
|
|
65
170
|
}
|
|
171
|
+
const resolvedBuildDirNamePattern = buildDirNamePattern ?? DEFAULT_HASH_DIR_NAME_PATTERN;
|
|
172
|
+
if (cleanup && !hasTimeToken(resolvedBuildDirNamePattern)) {
|
|
173
|
+
throw new Error("[hash-deploy] cleanup requires a buildDirNamePattern with a time token.");
|
|
174
|
+
}
|
|
175
|
+
const cleanupMatcher = compileHashDirNameMatcher(resolvedBuildDirNamePattern);
|
|
176
|
+
if (cleanup && !cleanupMatcher.regex.test(buildDirStr)) {
|
|
177
|
+
throw new Error(
|
|
178
|
+
`[hash-deploy] buildDirStr "${buildDirStr}" does not match buildDirNamePattern "${resolvedBuildDirNamePattern}".`
|
|
179
|
+
);
|
|
180
|
+
}
|
|
66
181
|
let outputDir;
|
|
67
182
|
let deployRoot;
|
|
68
183
|
return {
|
|
@@ -107,7 +222,7 @@ function hashDeployPlugin(options) {
|
|
|
107
222
|
const rootHtml = publicPath.startsWith("./") ? sourceHtml.replace(/(\b(?:href|src)\s*=\s*["'])\.\//g, `$1${publicPath}`) : sourceHtml;
|
|
108
223
|
fs__default.default.writeFileSync(path__default.default.join(deployRoot, "index.html"), rootHtml);
|
|
109
224
|
if (cleanup) {
|
|
110
|
-
cleanupOldHashBuilds(deployRoot, buildDirStr, cleanup.keep);
|
|
225
|
+
cleanupOldHashBuilds(deployRoot, buildDirStr, cleanup.keep, cleanupMatcher);
|
|
111
226
|
}
|
|
112
227
|
}
|
|
113
228
|
}
|
|
@@ -129,13 +244,21 @@ function createHashBuildDirName(repositoryRootOrNowOrOptions, now = Date.now())
|
|
|
129
244
|
const {
|
|
130
245
|
repositoryRoot: repositoryRoot2,
|
|
131
246
|
now: optionsNow = Date.now(),
|
|
132
|
-
|
|
247
|
+
hashDirName
|
|
133
248
|
} = repositoryRootOrNowOrOptions;
|
|
134
|
-
return
|
|
249
|
+
return expandHashDirName({
|
|
250
|
+
pattern: hashDirName ?? DEFAULT_HASH_DIR_NAME_PATTERN,
|
|
251
|
+
commitHash: getCommitHash(repositoryRoot2),
|
|
252
|
+
now: optionsNow
|
|
253
|
+
});
|
|
135
254
|
}
|
|
136
255
|
const repositoryRoot = typeof repositoryRootOrNowOrOptions === "string" ? repositoryRootOrNowOrOptions : void 0;
|
|
137
256
|
const timestamp = typeof repositoryRootOrNowOrOptions === "number" ? repositoryRootOrNowOrOptions : now;
|
|
138
|
-
return
|
|
257
|
+
return expandHashDirName({
|
|
258
|
+
pattern: DEFAULT_HASH_DIR_NAME_PATTERN,
|
|
259
|
+
commitHash: getCommitHash(repositoryRoot),
|
|
260
|
+
now: timestamp
|
|
261
|
+
});
|
|
139
262
|
}
|
|
140
263
|
|
|
141
264
|
// src/plugins/less-tilde.ts
|
|
@@ -314,7 +437,7 @@ function createAppViteConfig(options) {
|
|
|
314
437
|
useHttps = false,
|
|
315
438
|
openBrowser = true,
|
|
316
439
|
hashDeploy = false,
|
|
317
|
-
|
|
440
|
+
hashDirName,
|
|
318
441
|
base: baseOption,
|
|
319
442
|
deployRoot: deployRootOption = "dist",
|
|
320
443
|
hashCleanup,
|
|
@@ -338,10 +461,19 @@ function createAppViteConfig(options) {
|
|
|
338
461
|
const isHash = isBuild && Boolean(hashDeploy) && mode !== "development";
|
|
339
462
|
const deployRoot = deployRootOption.replace(/\/+$/, "") || "dist";
|
|
340
463
|
const assetBase = normalizeAssetBase(baseOption);
|
|
464
|
+
const legacyHashTimestamp = options.hashTimestamp;
|
|
465
|
+
if (legacyHashTimestamp != null && legacyHashTimestamp !== "epoch") {
|
|
466
|
+
throw new Error(
|
|
467
|
+
`[vite-config] hashTimestamp: ${JSON.stringify(
|
|
468
|
+
legacyHashTimestamp
|
|
469
|
+
)} has been removed; use hashDirName instead (e.g. "hash-timestamp" or "hash-YYYY-MM-DD-HH-mm-ss").`
|
|
470
|
+
);
|
|
471
|
+
}
|
|
341
472
|
const buildDirStr = isHash ? createHashBuildDirName({
|
|
342
473
|
repositoryRoot: repositoryRoot ?? rootDir,
|
|
343
|
-
|
|
474
|
+
hashDirName
|
|
344
475
|
}) : "";
|
|
476
|
+
const buildDirNamePattern = hashDirName ?? DEFAULT_HASH_DIR_NAME_PATTERN;
|
|
345
477
|
const publicPath = isHash ? `${assetBase ?? "./"}${buildDirStr}/` : isBuild ? assetBase ?? "./" : "";
|
|
346
478
|
const htmlPublicPath = isHash && publicPath.startsWith("./") ? "./" : publicPath;
|
|
347
479
|
const isAbsoluteAssetBase = assetBase != null && (assetBase.startsWith("https://") || assetBase.startsWith("http://") || assetBase.startsWith("/"));
|
|
@@ -372,6 +504,7 @@ function createAppViteConfig(options) {
|
|
|
372
504
|
hashDeployPlugin({
|
|
373
505
|
rootDir,
|
|
374
506
|
buildDirStr,
|
|
507
|
+
buildDirNamePattern,
|
|
375
508
|
publicPath,
|
|
376
509
|
cleanup: hashCleanup
|
|
377
510
|
})
|