@hzab/vite-config 0.0.2-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.
Files changed (88) hide show
  1. package/CHANGELOG.md +95 -83
  2. package/LICENSE +21 -21
  3. package/README.md +184 -173
  4. package/dist/create-app-vite-config.cjs +160 -27
  5. package/dist/create-app-vite-config.cjs.map +1 -1
  6. package/dist/create-app-vite-config.js +160 -27
  7. package/dist/create-app-vite-config.js.map +1 -1
  8. package/dist/create-library-vite-config.cjs +39 -4
  9. package/dist/create-library-vite-config.cjs.map +1 -1
  10. package/dist/create-library-vite-config.js +38 -3
  11. package/dist/create-library-vite-config.js.map +1 -1
  12. package/dist/create-package-vitest-config.cjs.map +1 -1
  13. package/dist/create-package-vitest-config.js.map +1 -1
  14. package/dist/create-vite-config.cjs +160 -27
  15. package/dist/create-vite-config.cjs.map +1 -1
  16. package/dist/create-vite-config.js +160 -27
  17. package/dist/create-vite-config.js.map +1 -1
  18. package/dist/index.cjs +198 -30
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.js +199 -31
  23. package/dist/index.js.map +1 -1
  24. package/dist/plugins/copy.cjs.map +1 -1
  25. package/dist/plugins/copy.js.map +1 -1
  26. package/dist/plugins/hash-deploy.cjs +150 -25
  27. package/dist/plugins/hash-deploy.cjs.map +1 -1
  28. package/dist/plugins/hash-deploy.d.cts +16 -5
  29. package/dist/plugins/hash-deploy.d.ts +16 -5
  30. package/dist/plugins/hash-deploy.js +150 -25
  31. package/dist/plugins/hash-deploy.js.map +1 -1
  32. package/dist/plugins/less-tilde.cjs.map +1 -1
  33. package/dist/plugins/less-tilde.d.cts +17 -2
  34. package/dist/plugins/less-tilde.d.ts +17 -2
  35. package/dist/plugins/less-tilde.js.map +1 -1
  36. package/dist/plugins/lifecycle.cjs.map +1 -1
  37. package/dist/plugins/lifecycle.js.map +1 -1
  38. package/dist/plugins/public-assets.cjs.map +1 -1
  39. package/dist/plugins/public-assets.js.map +1 -1
  40. package/dist/plugins/public-config.cjs.map +1 -1
  41. package/dist/plugins/public-config.js.map +1 -1
  42. package/dist/plugins/react-compiler.cjs.map +1 -1
  43. package/dist/plugins/react-compiler.js.map +1 -1
  44. package/dist/plugins/relative-base.cjs.map +1 -1
  45. package/dist/plugins/relative-base.js.map +1 -1
  46. package/dist/plugins/stub-less.cjs.map +1 -1
  47. package/dist/plugins/stub-less.js.map +1 -1
  48. package/dist/plugins/svg-react.cjs.map +1 -1
  49. package/dist/plugins/svg-react.js.map +1 -1
  50. package/dist/types.d.cts +19 -8
  51. package/dist/types.d.ts +19 -8
  52. package/dist/vitest.cjs.map +1 -1
  53. package/dist/vitest.js.map +1 -1
  54. package/docs/README.md +15 -15
  55. package/docs/abt-management-ui/vite.config.mts +226 -226
  56. package/docs/api.md +404 -366
  57. package/docs/migration-from-webpack.md +723 -722
  58. package/docs/sync-public-path.md +52 -52
  59. package/docs/vite-config-integration.md +477 -476
  60. package/docs/vite-pnpm-integration.md +279 -279
  61. package/docs/vs-ccc-vite-config.md +26 -26
  62. package/docs/webpack-gap.md +108 -107
  63. package/package.json +1 -1
  64. package/src/client.d.ts +9 -9
  65. package/src/create-app-vite-config.ts +236 -218
  66. package/src/create-library-vite-config.ts +248 -199
  67. package/src/create-package-vitest-config.ts +54 -54
  68. package/src/create-vite-config.ts +22 -22
  69. package/src/index.ts +41 -42
  70. package/src/plugins/copy.ts +25 -25
  71. package/src/plugins/hash-deploy.ts +239 -199
  72. package/src/plugins/hash-dir-name.ts +212 -0
  73. package/src/plugins/less-tilde.ts +72 -44
  74. package/src/plugins/lifecycle.ts +40 -40
  75. package/src/plugins/public-assets.ts +28 -28
  76. package/src/plugins/public-config.ts +34 -34
  77. package/src/plugins/react-compiler.ts +32 -32
  78. package/src/plugins/relative-base.ts +20 -20
  79. package/src/plugins/stub-less.ts +26 -26
  80. package/src/plugins/svg-react.ts +90 -90
  81. package/src/svg-react-runtime.ts +4 -4
  82. package/src/svg-react.d.ts +6 -6
  83. package/src/types.ts +325 -314
  84. package/src/vitest-types.ts +20 -20
  85. package/src/vitest.ts +2 -2
  86. package/templates/src/vite-env.d.ts +2 -2
  87. package/templates/tsconfig.json +12 -12
  88. package/templates/vite.config.ts +26 -26
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/lifecycle.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","file":"lifecycle.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"]}
1
+ {"version":3,"sources":["../../src/plugins/lifecycle.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","file":"lifecycle.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"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/lifecycle.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","file":"lifecycle.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"]}
1
+ {"version":3,"sources":["../../src/plugins/lifecycle.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","file":"lifecycle.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"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/copy.ts","../../src/plugins/public-assets.ts"],"names":["viteStaticCopy"],"mappings":";;;;;AAaO,SAAS,yBAAyB,OAAA,EAAwC;AAC/E,EAAA,OAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,EAAE,OAAA,EAAS,SAAQ,GAAI,OAAA;AACzD;AAOO,SAAS,WAAW,OAAA,EAAmC;AAC5D,EAAA,OAAOA,mCAAA,CAAe,wBAAA,CAAyB,OAAO,CAAC,CAAA;AACzD;;;ACPO,SAAS,kBAAA,CAAmB,OAAA,GAAqC,EAAC,EAAiB;AACxF,EAAA,MAAM,EAAE,GAAA,GAAM,QAAA,EAAS,GAAI,OAAA;AAC3B,EAAA,OAAO,UAAA,CAAW;AAAA,IAChB,OAAA,EAAS;AAAA,MACP;AAAA,QACE,GAAA,EAAK,GAAG,GAAG,CAAA,KAAA,CAAA;AAAA,QACX,IAAA,EAAM;AAAA;AACR;AACF,GACD,CAAA;AACH","file":"public-assets.cjs","sourcesContent":["import { viteStaticCopy } from \"vite-plugin-static-copy\";\r\n\r\nimport type { PluginOption } from \"vite\";\r\nimport type { Target, ViteStaticCopyOptions } from \"vite-plugin-static-copy\";\r\n\r\n/** @public */\r\nexport type CopyTarget = Target;\r\n/** @public */\r\nexport type CopyPluginOptions = ViteStaticCopyOptions;\r\n\r\n/** @public */\r\nexport type CopyOption = CopyPluginOptions | CopyTarget[];\r\n\r\nexport function resolveCopyPluginOptions(options: CopyOption): CopyPluginOptions {\r\n return Array.isArray(options) ? { targets: options } : options;\r\n}\r\n\r\n/**\r\n * 通用静态复制,封装 `vite-plugin-static-copy`。\r\n * 可传完整选项,或直接传 `targets` 数组。\r\n * @public\r\n */\r\nexport function copyPlugin(options: CopyOption): PluginOption {\r\n return viteStaticCopy(resolveCopyPluginOptions(options));\r\n}\r\n","import { copyPlugin } from \"./copy.ts\";\r\n\r\nimport type { PluginOption } from \"vite\";\r\n\r\n/** @public */\r\nexport interface PublicAssetsPluginOptions {\r\n /**\r\n * 源目录,相对项目 root。\r\n * @defaultValue \"public\"\r\n */\r\n dir?: string;\r\n}\r\n\r\n/**\r\n * 将 `public/**` 复制到产物 `public/` 子目录(保留目录结构),替代 Vite 默认 publicDir 根目录散落。\r\n * @public\r\n */\r\nexport function publicAssetsPlugin(options: PublicAssetsPluginOptions = {}): PluginOption {\r\n const { dir = \"public\" } = options;\r\n return copyPlugin({\r\n targets: [\r\n {\r\n src: `${dir}/**/*`,\r\n dest: \".\",\r\n },\r\n ],\r\n });\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/plugins/copy.ts","../../src/plugins/public-assets.ts"],"names":["viteStaticCopy"],"mappings":";;;;;AAaO,SAAS,yBAAyB,OAAA,EAAwC;AAC/E,EAAA,OAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,EAAE,OAAA,EAAS,SAAQ,GAAI,OAAA;AACzD;AAOO,SAAS,WAAW,OAAA,EAAmC;AAC5D,EAAA,OAAOA,mCAAA,CAAe,wBAAA,CAAyB,OAAO,CAAC,CAAA;AACzD;;;ACPO,SAAS,kBAAA,CAAmB,OAAA,GAAqC,EAAC,EAAiB;AACxF,EAAA,MAAM,EAAE,GAAA,GAAM,QAAA,EAAS,GAAI,OAAA;AAC3B,EAAA,OAAO,UAAA,CAAW;AAAA,IAChB,OAAA,EAAS;AAAA,MACP;AAAA,QACE,GAAA,EAAK,GAAG,GAAG,CAAA,KAAA,CAAA;AAAA,QACX,IAAA,EAAM;AAAA;AACR;AACF,GACD,CAAA;AACH","file":"public-assets.cjs","sourcesContent":["import { viteStaticCopy } from \"vite-plugin-static-copy\";\n\nimport type { PluginOption } from \"vite\";\nimport type { Target, ViteStaticCopyOptions } from \"vite-plugin-static-copy\";\n\n/** @public */\nexport type CopyTarget = Target;\n/** @public */\nexport type CopyPluginOptions = ViteStaticCopyOptions;\n\n/** @public */\nexport type CopyOption = CopyPluginOptions | CopyTarget[];\n\nexport function resolveCopyPluginOptions(options: CopyOption): CopyPluginOptions {\n return Array.isArray(options) ? { targets: options } : options;\n}\n\n/**\n * 通用静态复制,封装 `vite-plugin-static-copy`。\n * 可传完整选项,或直接传 `targets` 数组。\n * @public\n */\nexport function copyPlugin(options: CopyOption): PluginOption {\n return viteStaticCopy(resolveCopyPluginOptions(options));\n}\n","import { copyPlugin } from \"./copy.ts\";\n\nimport type { PluginOption } from \"vite\";\n\n/** @public */\nexport interface PublicAssetsPluginOptions {\n /**\n * 源目录,相对项目 root。\n * @defaultValue \"public\"\n */\n dir?: string;\n}\n\n/**\n * 将 `public/**` 复制到产物 `public/` 子目录(保留目录结构),替代 Vite 默认 publicDir 根目录散落。\n * @public\n */\nexport function publicAssetsPlugin(options: PublicAssetsPluginOptions = {}): PluginOption {\n const { dir = \"public\" } = options;\n return copyPlugin({\n targets: [\n {\n src: `${dir}/**/*`,\n dest: \".\",\n },\n ],\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/copy.ts","../../src/plugins/public-assets.ts"],"names":[],"mappings":";;;AAaO,SAAS,yBAAyB,OAAA,EAAwC;AAC/E,EAAA,OAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,EAAE,OAAA,EAAS,SAAQ,GAAI,OAAA;AACzD;AAOO,SAAS,WAAW,OAAA,EAAmC;AAC5D,EAAA,OAAO,cAAA,CAAe,wBAAA,CAAyB,OAAO,CAAC,CAAA;AACzD;;;ACPO,SAAS,kBAAA,CAAmB,OAAA,GAAqC,EAAC,EAAiB;AACxF,EAAA,MAAM,EAAE,GAAA,GAAM,QAAA,EAAS,GAAI,OAAA;AAC3B,EAAA,OAAO,UAAA,CAAW;AAAA,IAChB,OAAA,EAAS;AAAA,MACP;AAAA,QACE,GAAA,EAAK,GAAG,GAAG,CAAA,KAAA,CAAA;AAAA,QACX,IAAA,EAAM;AAAA;AACR;AACF,GACD,CAAA;AACH","file":"public-assets.js","sourcesContent":["import { viteStaticCopy } from \"vite-plugin-static-copy\";\r\n\r\nimport type { PluginOption } from \"vite\";\r\nimport type { Target, ViteStaticCopyOptions } from \"vite-plugin-static-copy\";\r\n\r\n/** @public */\r\nexport type CopyTarget = Target;\r\n/** @public */\r\nexport type CopyPluginOptions = ViteStaticCopyOptions;\r\n\r\n/** @public */\r\nexport type CopyOption = CopyPluginOptions | CopyTarget[];\r\n\r\nexport function resolveCopyPluginOptions(options: CopyOption): CopyPluginOptions {\r\n return Array.isArray(options) ? { targets: options } : options;\r\n}\r\n\r\n/**\r\n * 通用静态复制,封装 `vite-plugin-static-copy`。\r\n * 可传完整选项,或直接传 `targets` 数组。\r\n * @public\r\n */\r\nexport function copyPlugin(options: CopyOption): PluginOption {\r\n return viteStaticCopy(resolveCopyPluginOptions(options));\r\n}\r\n","import { copyPlugin } from \"./copy.ts\";\r\n\r\nimport type { PluginOption } from \"vite\";\r\n\r\n/** @public */\r\nexport interface PublicAssetsPluginOptions {\r\n /**\r\n * 源目录,相对项目 root。\r\n * @defaultValue \"public\"\r\n */\r\n dir?: string;\r\n}\r\n\r\n/**\r\n * 将 `public/**` 复制到产物 `public/` 子目录(保留目录结构),替代 Vite 默认 publicDir 根目录散落。\r\n * @public\r\n */\r\nexport function publicAssetsPlugin(options: PublicAssetsPluginOptions = {}): PluginOption {\r\n const { dir = \"public\" } = options;\r\n return copyPlugin({\r\n targets: [\r\n {\r\n src: `${dir}/**/*`,\r\n dest: \".\",\r\n },\r\n ],\r\n });\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/plugins/copy.ts","../../src/plugins/public-assets.ts"],"names":[],"mappings":";;;AAaO,SAAS,yBAAyB,OAAA,EAAwC;AAC/E,EAAA,OAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,EAAE,OAAA,EAAS,SAAQ,GAAI,OAAA;AACzD;AAOO,SAAS,WAAW,OAAA,EAAmC;AAC5D,EAAA,OAAO,cAAA,CAAe,wBAAA,CAAyB,OAAO,CAAC,CAAA;AACzD;;;ACPO,SAAS,kBAAA,CAAmB,OAAA,GAAqC,EAAC,EAAiB;AACxF,EAAA,MAAM,EAAE,GAAA,GAAM,QAAA,EAAS,GAAI,OAAA;AAC3B,EAAA,OAAO,UAAA,CAAW;AAAA,IAChB,OAAA,EAAS;AAAA,MACP;AAAA,QACE,GAAA,EAAK,GAAG,GAAG,CAAA,KAAA,CAAA;AAAA,QACX,IAAA,EAAM;AAAA;AACR;AACF,GACD,CAAA;AACH","file":"public-assets.js","sourcesContent":["import { viteStaticCopy } from \"vite-plugin-static-copy\";\n\nimport type { PluginOption } from \"vite\";\nimport type { Target, ViteStaticCopyOptions } from \"vite-plugin-static-copy\";\n\n/** @public */\nexport type CopyTarget = Target;\n/** @public */\nexport type CopyPluginOptions = ViteStaticCopyOptions;\n\n/** @public */\nexport type CopyOption = CopyPluginOptions | CopyTarget[];\n\nexport function resolveCopyPluginOptions(options: CopyOption): CopyPluginOptions {\n return Array.isArray(options) ? { targets: options } : options;\n}\n\n/**\n * 通用静态复制,封装 `vite-plugin-static-copy`。\n * 可传完整选项,或直接传 `targets` 数组。\n * @public\n */\nexport function copyPlugin(options: CopyOption): PluginOption {\n return viteStaticCopy(resolveCopyPluginOptions(options));\n}\n","import { copyPlugin } from \"./copy.ts\";\n\nimport type { PluginOption } from \"vite\";\n\n/** @public */\nexport interface PublicAssetsPluginOptions {\n /**\n * 源目录,相对项目 root。\n * @defaultValue \"public\"\n */\n dir?: string;\n}\n\n/**\n * 将 `public/**` 复制到产物 `public/` 子目录(保留目录结构),替代 Vite 默认 publicDir 根目录散落。\n * @public\n */\nexport function publicAssetsPlugin(options: PublicAssetsPluginOptions = {}): PluginOption {\n const { dir = \"public\" } = options;\n return copyPlugin({\n targets: [\n {\n src: `${dir}/**/*`,\n dest: \".\",\n },\n ],\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/copy.ts","../../src/plugins/public-config.ts"],"names":["viteStaticCopy"],"mappings":";;;;;AAaO,SAAS,yBAAyB,OAAA,EAAwC;AAC/E,EAAA,OAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,EAAE,OAAA,EAAS,SAAQ,GAAI,OAAA;AACzD;AAOO,SAAS,WAAW,OAAA,EAAmC;AAC5D,EAAA,OAAOA,mCAAA,CAAe,wBAAA,CAAyB,OAAO,CAAC,CAAA;AACzD;;;ACJO,SAAS,mBAAmB,OAAA,EAAkD;AACnF,EAAA,MAAM,EAAE,UAAA,EAAY,IAAA,GAAO,QAAA,EAAS,GAAI,OAAA;AACxC,EAAA,OAAO,UAAA,CAAW;AAAA,IAChB,OAAA,EAAS;AAAA,MACP;AAAA,QACE,GAAA,EAAK,UAAA;AAAA,QACL,IAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,SAAA,EAAW;AAAA;AACb;AACF;AACF,GACD,CAAA;AACH","file":"public-config.cjs","sourcesContent":["import { viteStaticCopy } from \"vite-plugin-static-copy\";\r\n\r\nimport type { PluginOption } from \"vite\";\r\nimport type { Target, ViteStaticCopyOptions } from \"vite-plugin-static-copy\";\r\n\r\n/** @public */\r\nexport type CopyTarget = Target;\r\n/** @public */\r\nexport type CopyPluginOptions = ViteStaticCopyOptions;\r\n\r\n/** @public */\r\nexport type CopyOption = CopyPluginOptions | CopyTarget[];\r\n\r\nexport function resolveCopyPluginOptions(options: CopyOption): CopyPluginOptions {\r\n return Array.isArray(options) ? { targets: options } : options;\r\n}\r\n\r\n/**\r\n * 通用静态复制,封装 `vite-plugin-static-copy`。\r\n * 可传完整选项,或直接传 `targets` 数组。\r\n * @public\r\n */\r\nexport function copyPlugin(options: CopyOption): PluginOption {\r\n return viteStaticCopy(resolveCopyPluginOptions(options));\r\n}\r\n","import { copyPlugin } from \"./copy.ts\";\r\n\r\nimport type { PluginOption } from \"vite\";\r\n\r\n/** @public */\r\nexport interface PublicConfigPluginOptions {\r\n /** 源 glob,如 `config/public-config/development/*` */\r\n sourceGlob: string;\r\n /**\r\n * 产物目标目录(可由消费方覆盖)。\r\n * @defaultValue \"config\"(站点根 `/config/`)\r\n * @example \"public/config\"\r\n */\r\n dest?: string;\r\n}\r\n\r\n/**\r\n * 将运行时 public-config 复制到产物目录(默认 `config/`,配合 `window.globalConfig`)。\r\n * @public\r\n */\r\nexport function publicConfigPlugin(options: PublicConfigPluginOptions): PluginOption {\r\n const { sourceGlob, dest = \"config\" } = options;\r\n return copyPlugin({\r\n targets: [\r\n {\r\n src: sourceGlob,\r\n dest,\r\n rename: {\r\n stripBase: true,\r\n },\r\n },\r\n ],\r\n });\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/plugins/copy.ts","../../src/plugins/public-config.ts"],"names":["viteStaticCopy"],"mappings":";;;;;AAaO,SAAS,yBAAyB,OAAA,EAAwC;AAC/E,EAAA,OAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,EAAE,OAAA,EAAS,SAAQ,GAAI,OAAA;AACzD;AAOO,SAAS,WAAW,OAAA,EAAmC;AAC5D,EAAA,OAAOA,mCAAA,CAAe,wBAAA,CAAyB,OAAO,CAAC,CAAA;AACzD;;;ACJO,SAAS,mBAAmB,OAAA,EAAkD;AACnF,EAAA,MAAM,EAAE,UAAA,EAAY,IAAA,GAAO,QAAA,EAAS,GAAI,OAAA;AACxC,EAAA,OAAO,UAAA,CAAW;AAAA,IAChB,OAAA,EAAS;AAAA,MACP;AAAA,QACE,GAAA,EAAK,UAAA;AAAA,QACL,IAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,SAAA,EAAW;AAAA;AACb;AACF;AACF,GACD,CAAA;AACH","file":"public-config.cjs","sourcesContent":["import { viteStaticCopy } from \"vite-plugin-static-copy\";\n\nimport type { PluginOption } from \"vite\";\nimport type { Target, ViteStaticCopyOptions } from \"vite-plugin-static-copy\";\n\n/** @public */\nexport type CopyTarget = Target;\n/** @public */\nexport type CopyPluginOptions = ViteStaticCopyOptions;\n\n/** @public */\nexport type CopyOption = CopyPluginOptions | CopyTarget[];\n\nexport function resolveCopyPluginOptions(options: CopyOption): CopyPluginOptions {\n return Array.isArray(options) ? { targets: options } : options;\n}\n\n/**\n * 通用静态复制,封装 `vite-plugin-static-copy`。\n * 可传完整选项,或直接传 `targets` 数组。\n * @public\n */\nexport function copyPlugin(options: CopyOption): PluginOption {\n return viteStaticCopy(resolveCopyPluginOptions(options));\n}\n","import { copyPlugin } from \"./copy.ts\";\n\nimport type { PluginOption } from \"vite\";\n\n/** @public */\nexport interface PublicConfigPluginOptions {\n /** 源 glob,如 `config/public-config/development/*` */\n sourceGlob: string;\n /**\n * 产物目标目录(可由消费方覆盖)。\n * @defaultValue \"config\"(站点根 `/config/`)\n * @example \"public/config\"\n */\n dest?: string;\n}\n\n/**\n * 将运行时 public-config 复制到产物目录(默认 `config/`,配合 `window.globalConfig`)。\n * @public\n */\nexport function publicConfigPlugin(options: PublicConfigPluginOptions): PluginOption {\n const { sourceGlob, dest = \"config\" } = options;\n return copyPlugin({\n targets: [\n {\n src: sourceGlob,\n dest,\n rename: {\n stripBase: true,\n },\n },\n ],\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/copy.ts","../../src/plugins/public-config.ts"],"names":[],"mappings":";;;AAaO,SAAS,yBAAyB,OAAA,EAAwC;AAC/E,EAAA,OAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,EAAE,OAAA,EAAS,SAAQ,GAAI,OAAA;AACzD;AAOO,SAAS,WAAW,OAAA,EAAmC;AAC5D,EAAA,OAAO,cAAA,CAAe,wBAAA,CAAyB,OAAO,CAAC,CAAA;AACzD;;;ACJO,SAAS,mBAAmB,OAAA,EAAkD;AACnF,EAAA,MAAM,EAAE,UAAA,EAAY,IAAA,GAAO,QAAA,EAAS,GAAI,OAAA;AACxC,EAAA,OAAO,UAAA,CAAW;AAAA,IAChB,OAAA,EAAS;AAAA,MACP;AAAA,QACE,GAAA,EAAK,UAAA;AAAA,QACL,IAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,SAAA,EAAW;AAAA;AACb;AACF;AACF,GACD,CAAA;AACH","file":"public-config.js","sourcesContent":["import { viteStaticCopy } from \"vite-plugin-static-copy\";\r\n\r\nimport type { PluginOption } from \"vite\";\r\nimport type { Target, ViteStaticCopyOptions } from \"vite-plugin-static-copy\";\r\n\r\n/** @public */\r\nexport type CopyTarget = Target;\r\n/** @public */\r\nexport type CopyPluginOptions = ViteStaticCopyOptions;\r\n\r\n/** @public */\r\nexport type CopyOption = CopyPluginOptions | CopyTarget[];\r\n\r\nexport function resolveCopyPluginOptions(options: CopyOption): CopyPluginOptions {\r\n return Array.isArray(options) ? { targets: options } : options;\r\n}\r\n\r\n/**\r\n * 通用静态复制,封装 `vite-plugin-static-copy`。\r\n * 可传完整选项,或直接传 `targets` 数组。\r\n * @public\r\n */\r\nexport function copyPlugin(options: CopyOption): PluginOption {\r\n return viteStaticCopy(resolveCopyPluginOptions(options));\r\n}\r\n","import { copyPlugin } from \"./copy.ts\";\r\n\r\nimport type { PluginOption } from \"vite\";\r\n\r\n/** @public */\r\nexport interface PublicConfigPluginOptions {\r\n /** 源 glob,如 `config/public-config/development/*` */\r\n sourceGlob: string;\r\n /**\r\n * 产物目标目录(可由消费方覆盖)。\r\n * @defaultValue \"config\"(站点根 `/config/`)\r\n * @example \"public/config\"\r\n */\r\n dest?: string;\r\n}\r\n\r\n/**\r\n * 将运行时 public-config 复制到产物目录(默认 `config/`,配合 `window.globalConfig`)。\r\n * @public\r\n */\r\nexport function publicConfigPlugin(options: PublicConfigPluginOptions): PluginOption {\r\n const { sourceGlob, dest = \"config\" } = options;\r\n return copyPlugin({\r\n targets: [\r\n {\r\n src: sourceGlob,\r\n dest,\r\n rename: {\r\n stripBase: true,\r\n },\r\n },\r\n ],\r\n });\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/plugins/copy.ts","../../src/plugins/public-config.ts"],"names":[],"mappings":";;;AAaO,SAAS,yBAAyB,OAAA,EAAwC;AAC/E,EAAA,OAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,EAAE,OAAA,EAAS,SAAQ,GAAI,OAAA;AACzD;AAOO,SAAS,WAAW,OAAA,EAAmC;AAC5D,EAAA,OAAO,cAAA,CAAe,wBAAA,CAAyB,OAAO,CAAC,CAAA;AACzD;;;ACJO,SAAS,mBAAmB,OAAA,EAAkD;AACnF,EAAA,MAAM,EAAE,UAAA,EAAY,IAAA,GAAO,QAAA,EAAS,GAAI,OAAA;AACxC,EAAA,OAAO,UAAA,CAAW;AAAA,IAChB,OAAA,EAAS;AAAA,MACP;AAAA,QACE,GAAA,EAAK,UAAA;AAAA,QACL,IAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,SAAA,EAAW;AAAA;AACb;AACF;AACF,GACD,CAAA;AACH","file":"public-config.js","sourcesContent":["import { viteStaticCopy } from \"vite-plugin-static-copy\";\n\nimport type { PluginOption } from \"vite\";\nimport type { Target, ViteStaticCopyOptions } from \"vite-plugin-static-copy\";\n\n/** @public */\nexport type CopyTarget = Target;\n/** @public */\nexport type CopyPluginOptions = ViteStaticCopyOptions;\n\n/** @public */\nexport type CopyOption = CopyPluginOptions | CopyTarget[];\n\nexport function resolveCopyPluginOptions(options: CopyOption): CopyPluginOptions {\n return Array.isArray(options) ? { targets: options } : options;\n}\n\n/**\n * 通用静态复制,封装 `vite-plugin-static-copy`。\n * 可传完整选项,或直接传 `targets` 数组。\n * @public\n */\nexport function copyPlugin(options: CopyOption): PluginOption {\n return viteStaticCopy(resolveCopyPluginOptions(options));\n}\n","import { copyPlugin } from \"./copy.ts\";\n\nimport type { PluginOption } from \"vite\";\n\n/** @public */\nexport interface PublicConfigPluginOptions {\n /** 源 glob,如 `config/public-config/development/*` */\n sourceGlob: string;\n /**\n * 产物目标目录(可由消费方覆盖)。\n * @defaultValue \"config\"(站点根 `/config/`)\n * @example \"public/config\"\n */\n dest?: string;\n}\n\n/**\n * 将运行时 public-config 复制到产物目录(默认 `config/`,配合 `window.globalConfig`)。\n * @public\n */\nexport function publicConfigPlugin(options: PublicConfigPluginOptions): PluginOption {\n const { sourceGlob, dest = \"config\" } = options;\n return copyPlugin({\n targets: [\n {\n src: sourceGlob,\n dest,\n rename: {\n stripBase: true,\n },\n },\n ],\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/react-compiler.ts"],"names":["babel","reactCompilerPreset"],"mappings":";;;;;;;;;;AAqBO,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,CAACA,uBAAM,EAAE,OAAA,EAAS,CAACC,+BAAA,EAAqB,CAAA,EAAG,CAAC,CAAA;AACrD","file":"react-compiler.cjs","sourcesContent":["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"]}
1
+ {"version":3,"sources":["../../src/plugins/react-compiler.ts"],"names":["babel","reactCompilerPreset"],"mappings":";;;;;;;;;;AAqBO,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,CAACA,uBAAM,EAAE,OAAA,EAAS,CAACC,+BAAA,EAAqB,CAAA,EAAG,CAAC,CAAA;AACrD","file":"react-compiler.cjs","sourcesContent":["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"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/react-compiler.ts"],"names":[],"mappings":";;;;AAqBO,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","file":"react-compiler.js","sourcesContent":["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"]}
1
+ {"version":3,"sources":["../../src/plugins/react-compiler.ts"],"names":[],"mappings":";;;;AAqBO,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","file":"react-compiler.js","sourcesContent":["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"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/relative-base.ts"],"names":[],"mappings":";;;AAMO,SAAS,kBAAA,CAAmB,aAAqB,IAAA,EAAoB;AAC1E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,mBAAmB,IAAA,EAAc;AAC/B,MAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,sBAAA,EAAwB,CAAA,MAAA,EAAS,UAAU,CAAA,OAAA,CAAS,CAAA,CAC5D,OAAA,CAAQ,qBAAA,EAAuB,CAAA,KAAA,EAAQ,UAAU,CAAA,OAAA,CAAS,CAAA;AAAA,IAC/D,CAAA;AAAA,IACA,SAAA,CAAU,MAAc,EAAA,EAAY;AAClC,MAAA,IAAI,EAAA,CAAG,QAAA,CAAS,cAAc,CAAA,EAAG,OAAO,IAAA;AACxC,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,8BAAA,EAAgC,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,IACvE;AAAA,GACF;AACF","file":"relative-base.cjs","sourcesContent":["import type { PluginOption } from \"vite\";\r\n\r\n/**\r\n * hash 部署场景下,把资源路径与 `import.meta.env.BASE_URL` 改写成相对部署目录。\r\n * @public\r\n */\r\nexport function relativeBasePlugin(deployPath: string = \"./\"): PluginOption {\r\n return {\r\n name: \"relative-base\",\r\n transformIndexHtml(html: string) {\r\n return html\r\n .replace(/href=\"\\.?\\/assets\\//g, `href=\"${deployPath}assets/`)\r\n .replace(/src=\"\\.?\\/assets\\//g, `src=\"${deployPath}assets/`);\r\n },\r\n transform(code: string, id: string) {\r\n if (id.includes(\"node_modules\")) return null;\r\n return code.replace(/import\\.meta\\.env\\.BASE_URL/g, `'${deployPath}'`);\r\n },\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/plugins/relative-base.ts"],"names":[],"mappings":";;;AAMO,SAAS,kBAAA,CAAmB,aAAqB,IAAA,EAAoB;AAC1E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,mBAAmB,IAAA,EAAc;AAC/B,MAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,sBAAA,EAAwB,CAAA,MAAA,EAAS,UAAU,CAAA,OAAA,CAAS,CAAA,CAC5D,OAAA,CAAQ,qBAAA,EAAuB,CAAA,KAAA,EAAQ,UAAU,CAAA,OAAA,CAAS,CAAA;AAAA,IAC/D,CAAA;AAAA,IACA,SAAA,CAAU,MAAc,EAAA,EAAY;AAClC,MAAA,IAAI,EAAA,CAAG,QAAA,CAAS,cAAc,CAAA,EAAG,OAAO,IAAA;AACxC,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,8BAAA,EAAgC,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,IACvE;AAAA,GACF;AACF","file":"relative-base.cjs","sourcesContent":["import type { PluginOption } from \"vite\";\n\n/**\n * hash 部署场景下,把资源路径与 `import.meta.env.BASE_URL` 改写成相对部署目录。\n * @public\n */\nexport function relativeBasePlugin(deployPath: string = \"./\"): PluginOption {\n return {\n name: \"relative-base\",\n transformIndexHtml(html: string) {\n return html\n .replace(/href=\"\\.?\\/assets\\//g, `href=\"${deployPath}assets/`)\n .replace(/src=\"\\.?\\/assets\\//g, `src=\"${deployPath}assets/`);\n },\n transform(code: string, id: string) {\n if (id.includes(\"node_modules\")) return null;\n return code.replace(/import\\.meta\\.env\\.BASE_URL/g, `'${deployPath}'`);\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/relative-base.ts"],"names":[],"mappings":";AAMO,SAAS,kBAAA,CAAmB,aAAqB,IAAA,EAAoB;AAC1E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,mBAAmB,IAAA,EAAc;AAC/B,MAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,sBAAA,EAAwB,CAAA,MAAA,EAAS,UAAU,CAAA,OAAA,CAAS,CAAA,CAC5D,OAAA,CAAQ,qBAAA,EAAuB,CAAA,KAAA,EAAQ,UAAU,CAAA,OAAA,CAAS,CAAA;AAAA,IAC/D,CAAA;AAAA,IACA,SAAA,CAAU,MAAc,EAAA,EAAY;AAClC,MAAA,IAAI,EAAA,CAAG,QAAA,CAAS,cAAc,CAAA,EAAG,OAAO,IAAA;AACxC,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,8BAAA,EAAgC,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,IACvE;AAAA,GACF;AACF","file":"relative-base.js","sourcesContent":["import type { PluginOption } from \"vite\";\r\n\r\n/**\r\n * hash 部署场景下,把资源路径与 `import.meta.env.BASE_URL` 改写成相对部署目录。\r\n * @public\r\n */\r\nexport function relativeBasePlugin(deployPath: string = \"./\"): PluginOption {\r\n return {\r\n name: \"relative-base\",\r\n transformIndexHtml(html: string) {\r\n return html\r\n .replace(/href=\"\\.?\\/assets\\//g, `href=\"${deployPath}assets/`)\r\n .replace(/src=\"\\.?\\/assets\\//g, `src=\"${deployPath}assets/`);\r\n },\r\n transform(code: string, id: string) {\r\n if (id.includes(\"node_modules\")) return null;\r\n return code.replace(/import\\.meta\\.env\\.BASE_URL/g, `'${deployPath}'`);\r\n },\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/plugins/relative-base.ts"],"names":[],"mappings":";AAMO,SAAS,kBAAA,CAAmB,aAAqB,IAAA,EAAoB;AAC1E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,mBAAmB,IAAA,EAAc;AAC/B,MAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,sBAAA,EAAwB,CAAA,MAAA,EAAS,UAAU,CAAA,OAAA,CAAS,CAAA,CAC5D,OAAA,CAAQ,qBAAA,EAAuB,CAAA,KAAA,EAAQ,UAAU,CAAA,OAAA,CAAS,CAAA;AAAA,IAC/D,CAAA;AAAA,IACA,SAAA,CAAU,MAAc,EAAA,EAAY;AAClC,MAAA,IAAI,EAAA,CAAG,QAAA,CAAS,cAAc,CAAA,EAAG,OAAO,IAAA;AACxC,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,8BAAA,EAAgC,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,IACvE;AAAA,GACF;AACF","file":"relative-base.js","sourcesContent":["import type { PluginOption } from \"vite\";\n\n/**\n * hash 部署场景下,把资源路径与 `import.meta.env.BASE_URL` 改写成相对部署目录。\n * @public\n */\nexport function relativeBasePlugin(deployPath: string = \"./\"): PluginOption {\n return {\n name: \"relative-base\",\n transformIndexHtml(html: string) {\n return html\n .replace(/href=\"\\.?\\/assets\\//g, `href=\"${deployPath}assets/`)\n .replace(/src=\"\\.?\\/assets\\//g, `src=\"${deployPath}assets/`);\n },\n transform(code: string, id: string) {\n if (id.includes(\"node_modules\")) return null;\n return code.replace(/import\\.meta\\.env\\.BASE_URL/g, `'${deployPath}'`);\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/stub-less.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","file":"stub-less.cjs","sourcesContent":["import type { Plugin } from \"vite\";\r\n\r\nconst cssModuleStub = `\r\nconst styles = new Proxy({}, {\r\n get: (_target, property) => typeof property === \"string\" ? property : undefined,\r\n});\r\nexport default styles;\r\n`;\r\n\r\n/**\r\n * 单测不解析 less,并为 CSS Modules 提供 identity stub\r\n * @public\r\n */\r\nexport function stubLessPlugin(): Plugin {\r\n return {\r\n name: \"stub-less\",\r\n load(id) {\r\n if (/\\.module\\.less(?:$|\\?)/.test(id)) {\r\n return cssModuleStub;\r\n }\r\n if (/\\.less(?:$|\\?)/.test(id)) {\r\n return \"\";\r\n }\r\n },\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/plugins/stub-less.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","file":"stub-less.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"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/stub-less.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","file":"stub-less.js","sourcesContent":["import type { Plugin } from \"vite\";\r\n\r\nconst cssModuleStub = `\r\nconst styles = new Proxy({}, {\r\n get: (_target, property) => typeof property === \"string\" ? property : undefined,\r\n});\r\nexport default styles;\r\n`;\r\n\r\n/**\r\n * 单测不解析 less,并为 CSS Modules 提供 identity stub\r\n * @public\r\n */\r\nexport function stubLessPlugin(): Plugin {\r\n return {\r\n name: \"stub-less\",\r\n load(id) {\r\n if (/\\.module\\.less(?:$|\\?)/.test(id)) {\r\n return cssModuleStub;\r\n }\r\n if (/\\.less(?:$|\\?)/.test(id)) {\r\n return \"\";\r\n }\r\n },\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/plugins/stub-less.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","file":"stub-less.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"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/svg-react.ts"],"names":["fs","transformWithOxc"],"mappings":";;;;;;;;;;AAiBA,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,MAAMA,mBAAA,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,MAAMC,qBAAA,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","file":"svg-react.cjs","sourcesContent":["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"]}
1
+ {"version":3,"sources":["../../src/plugins/svg-react.ts"],"names":["fs","transformWithOxc"],"mappings":";;;;;;;;;;AAiBA,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,MAAMA,mBAAA,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,MAAMC,qBAAA,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","file":"svg-react.cjs","sourcesContent":["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"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/svg-react.ts"],"names":[],"mappings":";;;;AAiBA,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","file":"svg-react.js","sourcesContent":["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"]}
1
+ {"version":3,"sources":["../../src/plugins/svg-react.ts"],"names":[],"mappings":";;;;AAiBA,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","file":"svg-react.js","sourcesContent":["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"]}
package/dist/types.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { CopyOption } from './plugins/copy.cjs';
2
2
  export { CopyPluginOptions, CopyTarget } from './plugins/copy.cjs';
3
- import { HashTimestampFormat, HashCleanupOptions } from './plugins/hash-deploy.cjs';
3
+ import { HashCleanupOptions } from './plugins/hash-deploy.cjs';
4
4
  import { SvgReactOptions } from './plugins/svg-react.cjs';
5
5
  import { AliasOptions, ProxyOptions, PluginOption, UserConfig } from 'vite';
6
6
  import 'vite-plugin-static-copy';
@@ -79,11 +79,20 @@ interface CreateAppViteConfigOptions {
79
79
  /** 是否启用 hash 目录部署(且 mode !== development) */
80
80
  hashDeploy?: boolean;
81
81
  /**
82
- * Hash 子目录名中的时间戳格式。
83
- * - `"epoch"`(默认):`{commit}-{Date.now()}`
84
- * - `"datetime"`:`{commit}-YYYY-MM-DD-HH-mm-ss`(本地时区,零填充)
82
+ * Hash 子目录名模式串。token 大小写敏感:
83
+ * `hash` = 12 位 commit(非 git 回退 `local`)、`timestamp` = 毫秒时间戳、
84
+ * `YYYY`/`MM`/`DD`/`HH`/`mm`/`ss`/`SSS` = 本地时区格式化时间;其余字符(含 `-`)为字面文本。
85
+ * 模式串必须至少含一个时间 token(`timestamp` 或日期 token),只含 `hash` 会被拒绝;
86
+ * 不传时用默认 `hash-timestamp`。
87
+ *
88
+ * 例(commit `a1b2c3d4e5f6`、2026-09-17 15:30:52.123):
89
+ * - `hash-timestamp`(默认)→ `a1b2c3d4e5f6-1789630252123`
90
+ * - `hash-timestamp-YYYYMMDDHHmmssSSS` → `a1b2c3d4e5f6-1789630252123-20260917153052123`
91
+ * - `hash-YYYYMMDDHHmmssSSS` → `a1b2c3d4e5f6-20260917153052123`
92
+ *
93
+ * 与 `@hzab/webpack-config` 的 `hashDirName` 同语义。`hashCleanup` 按同一模式串识别历史目录。
85
94
  */
86
- hashTimestamp?: HashTimestampFormat;
95
+ hashDirName?: string;
87
96
  /**
88
97
  * 构建资源公共路径(Vite `base`)。
89
98
  * - 未传:build 默认 `"./"`(相对路径)
@@ -102,6 +111,9 @@ interface CreateAppViteConfigOptions {
102
111
  /**
103
112
  * Hash 构建成功后的旧版本清理策略。
104
113
  * 未传时保留所有版本,由部署系统负责清理。
114
+ *
115
+ * 只识别 `hashDirName` 模式串生成的目录;目录名时间戳距今不足 5 分钟的目录视为
116
+ * 并发构建产物,跳过清理。仅在根入口(`index.html`)写入成功后执行。
105
117
  */
106
118
  hashCleanup?: HashCleanupOptions;
107
119
  /**
@@ -175,9 +187,8 @@ interface CreateAppViteConfigOptions {
175
187
  */
176
188
  type CreateAppViteConfigResult = UserConfig & {
177
189
  /**
178
- * 本次 hash 部署子目录名(`{commit}-{timestamp}`,或 `hashTimestamp: "datetime"` 时为
179
- * `{commit}-YYYY-MM-DD-HH-mm-ss`)。
180
- * 未启用 hash 部署时为 `""`。
190
+ * 本次 hash 部署子目录名,即 `hashDirName` 模式串的展开结果
191
+ * (默认 `{commit}-{毫秒时间戳}`)。未启用 hash 部署时为 `""`。
181
192
  */
182
193
  readonly buildDirHash: string;
183
194
  };
package/dist/types.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { CopyOption } from './plugins/copy.js';
2
2
  export { CopyPluginOptions, CopyTarget } from './plugins/copy.js';
3
- import { HashTimestampFormat, HashCleanupOptions } from './plugins/hash-deploy.js';
3
+ import { HashCleanupOptions } from './plugins/hash-deploy.js';
4
4
  import { SvgReactOptions } from './plugins/svg-react.js';
5
5
  import { AliasOptions, ProxyOptions, PluginOption, UserConfig } from 'vite';
6
6
  import 'vite-plugin-static-copy';
@@ -79,11 +79,20 @@ interface CreateAppViteConfigOptions {
79
79
  /** 是否启用 hash 目录部署(且 mode !== development) */
80
80
  hashDeploy?: boolean;
81
81
  /**
82
- * Hash 子目录名中的时间戳格式。
83
- * - `"epoch"`(默认):`{commit}-{Date.now()}`
84
- * - `"datetime"`:`{commit}-YYYY-MM-DD-HH-mm-ss`(本地时区,零填充)
82
+ * Hash 子目录名模式串。token 大小写敏感:
83
+ * `hash` = 12 位 commit(非 git 回退 `local`)、`timestamp` = 毫秒时间戳、
84
+ * `YYYY`/`MM`/`DD`/`HH`/`mm`/`ss`/`SSS` = 本地时区格式化时间;其余字符(含 `-`)为字面文本。
85
+ * 模式串必须至少含一个时间 token(`timestamp` 或日期 token),只含 `hash` 会被拒绝;
86
+ * 不传时用默认 `hash-timestamp`。
87
+ *
88
+ * 例(commit `a1b2c3d4e5f6`、2026-09-17 15:30:52.123):
89
+ * - `hash-timestamp`(默认)→ `a1b2c3d4e5f6-1789630252123`
90
+ * - `hash-timestamp-YYYYMMDDHHmmssSSS` → `a1b2c3d4e5f6-1789630252123-20260917153052123`
91
+ * - `hash-YYYYMMDDHHmmssSSS` → `a1b2c3d4e5f6-20260917153052123`
92
+ *
93
+ * 与 `@hzab/webpack-config` 的 `hashDirName` 同语义。`hashCleanup` 按同一模式串识别历史目录。
85
94
  */
86
- hashTimestamp?: HashTimestampFormat;
95
+ hashDirName?: string;
87
96
  /**
88
97
  * 构建资源公共路径(Vite `base`)。
89
98
  * - 未传:build 默认 `"./"`(相对路径)
@@ -102,6 +111,9 @@ interface CreateAppViteConfigOptions {
102
111
  /**
103
112
  * Hash 构建成功后的旧版本清理策略。
104
113
  * 未传时保留所有版本,由部署系统负责清理。
114
+ *
115
+ * 只识别 `hashDirName` 模式串生成的目录;目录名时间戳距今不足 5 分钟的目录视为
116
+ * 并发构建产物,跳过清理。仅在根入口(`index.html`)写入成功后执行。
105
117
  */
106
118
  hashCleanup?: HashCleanupOptions;
107
119
  /**
@@ -175,9 +187,8 @@ interface CreateAppViteConfigOptions {
175
187
  */
176
188
  type CreateAppViteConfigResult = UserConfig & {
177
189
  /**
178
- * 本次 hash 部署子目录名(`{commit}-{timestamp}`,或 `hashTimestamp: "datetime"` 时为
179
- * `{commit}-YYYY-MM-DD-HH-mm-ss`)。
180
- * 未启用 hash 部署时为 `""`。
190
+ * 本次 hash 部署子目录名,即 `hashDirName` 模式串的展开结果
191
+ * (默认 `{commit}-{毫秒时间戳}`)。未启用 hash 部署时为 `""`。
181
192
  */
182
193
  readonly buildDirHash: string;
183
194
  };
@@ -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":"vitest.cjs","sourcesContent":["import type { Plugin } from \"vite\";\r\n\r\nconst cssModuleStub = `\r\nconst styles = new Proxy({}, {\r\n get: (_target, property) => typeof property === \"string\" ? property : undefined,\r\n});\r\nexport default styles;\r\n`;\r\n\r\n/**\r\n * 单测不解析 less,并为 CSS Modules 提供 identity stub\r\n * @public\r\n */\r\nexport function stubLessPlugin(): Plugin {\r\n return {\r\n name: \"stub-less\",\r\n load(id) {\r\n if (/\\.module\\.less(?:$|\\?)/.test(id)) {\r\n return cssModuleStub;\r\n }\r\n if (/\\.less(?:$|\\?)/.test(id)) {\r\n return \"\";\r\n }\r\n },\r\n };\r\n}\r\n","import react from \"@vitejs/plugin-react\";\r\nimport { mergeConfig, type PluginOption } from \"vite\";\r\n\r\nimport { stubLessPlugin } from \"./plugins/stub-less.ts\";\r\n\r\nimport type { CreatePackageVitestConfigOptions } from \"./vitest-types.ts\";\r\nimport type { ViteUserConfig as VitestUserConfig } from \"vitest/config\";\r\n\r\n/**\r\n * 组装包级 Vitest 配置。\r\n *\r\n * 合并顺序:`base(options) → mergeConfig(base, vite) → configure(final)`\r\n */\r\nexport function createPackageVitestConfig(\r\n options: CreatePackageVitestConfigOptions,\r\n): VitestUserConfig {\r\n const {\r\n packageRoot,\r\n alias,\r\n react: enableReact = false,\r\n stubLess = false,\r\n environment = \"happy-dom\",\r\n include = [\"test/**/*.test.ts\"],\r\n setupFiles,\r\n plugins: extraPlugins = [],\r\n vite: viteOverride,\r\n configure,\r\n } = options;\r\n\r\n const plugins: PluginOption[] = [\r\n ...(enableReact ? [react()] : []),\r\n ...(stubLess ? [stubLessPlugin()] : []),\r\n ...extraPlugins,\r\n ];\r\n\r\n const base: VitestUserConfig = {\r\n root: packageRoot,\r\n plugins,\r\n resolve: {\r\n alias,\r\n },\r\n test: {\r\n environment,\r\n include,\r\n ...(setupFiles ? { setupFiles } : {}),\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/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":"vitest.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":"vitest.js","sourcesContent":["import type { Plugin } from \"vite\";\r\n\r\nconst cssModuleStub = `\r\nconst styles = new Proxy({}, {\r\n get: (_target, property) => typeof property === \"string\" ? property : undefined,\r\n});\r\nexport default styles;\r\n`;\r\n\r\n/**\r\n * 单测不解析 less,并为 CSS Modules 提供 identity stub\r\n * @public\r\n */\r\nexport function stubLessPlugin(): Plugin {\r\n return {\r\n name: \"stub-less\",\r\n load(id) {\r\n if (/\\.module\\.less(?:$|\\?)/.test(id)) {\r\n return cssModuleStub;\r\n }\r\n if (/\\.less(?:$|\\?)/.test(id)) {\r\n return \"\";\r\n }\r\n },\r\n };\r\n}\r\n","import react from \"@vitejs/plugin-react\";\r\nimport { mergeConfig, type PluginOption } from \"vite\";\r\n\r\nimport { stubLessPlugin } from \"./plugins/stub-less.ts\";\r\n\r\nimport type { CreatePackageVitestConfigOptions } from \"./vitest-types.ts\";\r\nimport type { ViteUserConfig as VitestUserConfig } from \"vitest/config\";\r\n\r\n/**\r\n * 组装包级 Vitest 配置。\r\n *\r\n * 合并顺序:`base(options) → mergeConfig(base, vite) → configure(final)`\r\n */\r\nexport function createPackageVitestConfig(\r\n options: CreatePackageVitestConfigOptions,\r\n): VitestUserConfig {\r\n const {\r\n packageRoot,\r\n alias,\r\n react: enableReact = false,\r\n stubLess = false,\r\n environment = \"happy-dom\",\r\n include = [\"test/**/*.test.ts\"],\r\n setupFiles,\r\n plugins: extraPlugins = [],\r\n vite: viteOverride,\r\n configure,\r\n } = options;\r\n\r\n const plugins: PluginOption[] = [\r\n ...(enableReact ? [react()] : []),\r\n ...(stubLess ? [stubLessPlugin()] : []),\r\n ...extraPlugins,\r\n ];\r\n\r\n const base: VitestUserConfig = {\r\n root: packageRoot,\r\n plugins,\r\n resolve: {\r\n alias,\r\n },\r\n test: {\r\n environment,\r\n include,\r\n ...(setupFiles ? { setupFiles } : {}),\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/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":"vitest.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"]}
package/docs/README.md CHANGED
@@ -1,15 +1,15 @@
1
- # 文档目录
2
-
3
- Vite / Vitest 配置工厂与插件
4
-
5
- | 模块 | 说明 |
6
- | ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
7
- | [API](./api.md) | 工厂(应用 / 组件库 / Vitest)、`alias`(Vite 原生)、插件与自定义合并 |
8
- | [相对 webpack-config](./webpack-gap.md) | 已对齐项、真实缺口、Vite 原生覆盖与刻意不搬的耦合 |
9
- | [从 webpack-config 迁移](./migration-from-webpack.md) | 页面应用(`createPageConfig` → `createAppViteConfig`)与组件库(`createLibConfig` → `createLibraryViteConfig`)的落地步骤 |
10
- | [相对 Vite 仓 `@ccc/vite-config`](./vs-ccc-vite-config.md) | 2026-08-28 现状:能力已对齐;剩余为包名 / catalog / 覆盖率门槛 |
11
- | [`PUBLIC_PATH` 回灌记录](./sync-public-path.md) | 从 Vite 仓移植 JS `import.meta.env.PUBLIC_PATH` 与 `./client`(已实施) |
12
- | [发布](../README.md#发布) | 构建产物、打包检查与 npm 发布命令 |
13
- | [审查报告](../REVIEW.md) | 当前仍开问题、测试缺口与建议处理顺序 |
14
-
15
- 返回 [包说明](../README.md)。
1
+ # 文档目录
2
+
3
+ Vite / Vitest 配置工厂与插件
4
+
5
+ | 模块 | 说明 |
6
+ | ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
7
+ | [API](./api.md) | 工厂(应用 / 组件库 / Vitest)、`alias`(Vite 原生)、插件与自定义合并 |
8
+ | [相对 webpack-config](./webpack-gap.md) | 已对齐项、真实缺口、Vite 原生覆盖与刻意不搬的耦合 |
9
+ | [从 webpack-config 迁移](./migration-from-webpack.md) | 页面应用(`createPageConfig` → `createAppViteConfig`)与组件库(`createLibConfig` → `createLibraryViteConfig`)的落地步骤 |
10
+ | [相对 Vite 仓 `@ccc/vite-config`](./vs-ccc-vite-config.md) | 2026-08-28 现状:能力已对齐;剩余为包名 / catalog / 覆盖率门槛 |
11
+ | [`PUBLIC_PATH` 回灌记录](./sync-public-path.md) | 从 Vite 仓移植 JS `import.meta.env.PUBLIC_PATH` 与 `./client`(已实施) |
12
+ | [发布](../README.md#发布) | 构建产物、打包检查与 npm 发布命令 |
13
+ | [审查报告](../REVIEW.md) | 当前仍开问题、测试缺口与建议处理顺序 |
14
+
15
+ 返回 [包说明](../README.md)。