@hzab/vite-config 0.0.2-alpha.0 → 0.0.3-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,10 +1,12 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 0.0.3-alpha.0
4
4
 
5
5
  - 工厂注入 `import.meta.env.PUBLIC_PATH`:相对 Hash 为 `./{hash}/`,供根入口 JS `fetch`
6
6
  静态文件;不改 Vite `base` / `BASE_URL`。HTML 子目录模板 `PUBLIC_PATH` 仍为 `./`。
7
7
  类型入口:`@hzab/vite-config/client`。
8
+ - 组件库工厂 `resolveLibraryFileName` 修复 cjs 产物命名:`index.cjs.js` → `index.cjs`。
9
+ 此前 `"type": "module"` 的消费包中 `.cjs.js` 会被 Node 当 ESM 解析,`require()` 会失败。
8
10
 
9
11
  ## 0.0.2-alpha.0
10
12
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugins/copy.ts","../src/plugins/hash-deploy.ts","../src/plugins/less-tilde.ts","../src/plugins/lifecycle.ts","../src/plugins/public-assets.ts","../src/plugins/public-config.ts","../src/plugins/react-compiler.ts","../src/plugins/svg-react.ts","../src/create-app-vite-config.ts"],"names":["viteStaticCopy","fs","path","execFileSync","repositoryRoot","babel","reactCompilerPreset","transformWithOxc","react","createHtmlPlugin","basicSsl","mergeConfig"],"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;ACiBA,IAAM,sBAAA,GAAyB,oEAAA;AAE/B,SAAS,mBAAmB,KAAA,EAAuB;AACjD,EAAA,IAAI,QAAQ,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,OAAO,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,IAAA,GAAO,CAAA,EAAG,QAAQ,CAAA,EAAG,GAAA,GAAM,GAAG,IAAA,GAAO,CAAA,EAAG,SAAS,CAAA,EAAG,MAAA,GAAS,CAAC,CAAA,GAAI,KAAA,CACtE,MAAM,GAAG,CAAA,CACT,IAAI,MAAM,CAAA;AACb,EAAA,OAAO,IAAI,IAAA,CAAK,IAAA,EAAM,KAAA,GAAQ,CAAA,EAAG,KAAK,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA,CAAE,OAAA,EAAQ;AACtE;AAEA,SAAS,OAAO,KAAA,EAAuB;AACrC,EAAA,OAAO,MAAA,CAAO,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACtC;AAEA,SAAS,mBAAA,CAAoB,GAAA,EAAa,MAAA,GAA8B,OAAA,EAAiB;AACvF,EAAA,IAAI,MAAA,KAAW,UAAA,EAAY,OAAO,MAAA,CAAO,GAAG,CAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AACzB,EAAA,OAAO;AAAA,IACL,KAAK,WAAA,EAAY;AAAA,IACjB,MAAA,CAAO,IAAA,CAAK,QAAA,EAAS,GAAI,CAAC,CAAA;AAAA,IAC1B,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,IACrB,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,IACtB,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,CAAA;AAAA,IACxB,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY;AAAA,GAC1B,CAAE,KAAK,GAAG,CAAA;AACZ;AAEA,SAAS,oBAAA,CAAqB,UAAA,EAAoB,eAAA,EAAyB,IAAA,EAAoB;AAC7F,EAAA,MAAM,SAAA,GAAYC,mBAAA,CACf,WAAA,CAAY,UAAA,EAAY,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,CAC/C,OAAA,CAAQ,CAAC,KAAA,KAAU;AAClB,IAAA,IAAI,CAAC,MAAM,WAAA,EAAY,IAAK,MAAM,IAAA,KAAS,eAAA,SAAwB,EAAC;AACpE,IAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACpD,IAAA,OAAO,KAAA,GAAQ,CAAC,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,SAAA,EAAW,kBAAA,CAAmB,KAAA,CAAM,CAAC,CAAE,CAAA,EAAG,IAAI,EAAC;AAAA,EACrF,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,MAAM,KAAA,KAAU,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,aAAa,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AAEhG,EAAA,KAAA,MAAW,KAAA,IAAS,UAAU,KAAA,CAAM,IAAA,CAAK,IAAI,IAAA,GAAO,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG;AAC1D,IAAAA,mBAAA,CAAG,MAAA,CAAOC,qBAAA,CAAK,IAAA,CAAK,UAAA,EAAY,KAAA,CAAM,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,EAClE;AACF;AAQO,SAAS,iBAAiB,OAAA,EAAgD;AAC/E,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAa,UAAA,EAAY,SAAQ,GAAI,OAAA;AACtD,EAAA,IAAI,OAAA,KAAY,CAAC,MAAA,CAAO,SAAA,CAAU,QAAQ,IAAI,CAAA,IAAK,OAAA,CAAQ,IAAA,GAAO,CAAA,CAAA,EAAI;AACpE,IAAA,MAAM,IAAI,MAAM,2EAA2E,CAAA;AAAA,EAC7F;AACA,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,UAAA;AAEJ,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,eAAe,MAAA,EAAQ;AACrB,MAAA,MAAM,YAAA,GAAeA,qBAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAC7C,MAAA,MAAM,YAAA,GAAeA,qBAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,yBAAA,EAA4B,YAAY,CAAA,sBAAA,EAAyB,YAAY,CAAA,EAAA;AAAA,SAC/E;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,UAAA,CAAW,UAAA,CAAW,IAAI,IAAI,IAAA,GAAO,UAAA;AAC1D,MAAA,IAAI,MAAA,CAAO,SAAS,YAAA,EAAc;AAChC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,yBAAA,EAA4B,MAAA,CAAO,IAAI,CAAA,eAAA,EAAkB,YAAY,CAAA,yBAAA;AAAA,SACvE;AAAA,MACF;AAEA,MAAA,SAAA,GAAYA,qBAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,MAAA,CAAO,MAAM,MAAM,CAAA;AAC1D,MAAA,IAAIA,qBAAA,CAAK,QAAA,CAAS,SAAS,CAAA,KAAM,WAAA,EAAa;AAC5C,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,4BAAA,EAA+B,MAAA,CAAO,KAAA,CAAM,MAAM,uCAAuC,WAAW,CAAA,EAAA;AAAA,SACtG;AAAA,MACF;AACA,MAAA,UAAA,GAAaA,qBAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,UAAA,EAAY,IAAA;AAAA,MACZ,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,GAAU;AACR,QAAA,IAAI,CAAC,SAAA,IAAa,CAAC,UAAA,EAAY;AAC7B,UAAA,MAAM,IAAI,MAAM,uEAAuE,CAAA;AAAA,QACzF;AAEA,QAAA,MAAM,WAAA,GAAcA,qBAAA,CAAK,IAAA,CAAK,SAAA,EAAW,YAAY,CAAA;AACrD,QAAA,IAAI,CAACD,mBAAA,CAAG,UAAA,CAAW,WAAW,CAAA,EAAG;AAC/B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8CAAA,EAAiD,WAAW,CAAA,EAAA,CAAI,CAAA;AAAA,QAClF;AAEA,QAAAA,mBAAA,CAAG,SAAA,CAAU,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5C,QAAAA,mBAAA,CAAG,cAAcC,qBAAA,CAAK,IAAA,CAAK,UAAA,EAAY,UAAU,GAAG,WAAW,CAAA;AAC/D,QAAA,MAAM,UAAA,GAAaD,mBAAA,CAAG,YAAA,CAAa,WAAA,EAAa,MAAM,CAAA;AAGtD,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GACvC,UAAA,CAAW,OAAA,CAAQ,kCAAA,EAAoC,CAAA,EAAA,EAAK,UAAU,CAAA,CAAE,CAAA,GACxE,UAAA;AACJ,QAAAA,mBAAA,CAAG,cAAcC,qBAAA,CAAK,IAAA,CAAK,UAAA,EAAY,YAAY,GAAG,QAAQ,CAAA;AAC9D,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,oBAAA,CAAqB,UAAA,EAAY,WAAA,EAAa,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC5D;AAAA,MACF;AAAA;AACF,GACF;AACF;AAMO,SAAS,aAAA,CAAc,cAAA,GAAyB,OAAA,CAAQ,GAAA,EAAI,EAAW;AAC5E,EAAA,IAAI;AACF,IAAA,OAAOC,0BAAA,CAAa,KAAA,EAAO,CAAC,WAAA,EAAa,MAAM,CAAA,EAAG;AAAA,MAChD,GAAA,EAAK,cAAA;AAAA,MACL,QAAA,EAAU,MAAA;AAAA,MACV,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,QAAQ;AAAA,KACnC,CAAA,CACE,IAAA,EAAK,CACL,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,EAChB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAWO,SAAS,sBAAA,CACd,4BAAA,EACA,GAAA,GAAc,IAAA,CAAK,KAAI,EACf;AACR,EAAA,IAAI,4BAAA,IAAgC,IAAA,IAAQ,OAAO,4BAAA,KAAiC,QAAA,EAAU;AAC5F,IAAA,MAAM;AAAA,MACJ,cAAA,EAAAC,eAAAA;AAAA,MACA,GAAA,EAAK,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI;AAAA,MAC3B,eAAA,GAAkB;AAAA,KACpB,GAAI,4BAAA;AACJ,IAAA,OAAO,CAAA,EAAG,cAAcA,eAAc,CAAC,IAAI,mBAAA,CAAoB,UAAA,EAAY,eAAe,CAAC,CAAA,CAAA;AAAA,EAC7F;AACA,EAAA,MAAM,cAAA,GACJ,OAAO,4BAAA,KAAiC,QAAA,GAAW,4BAAA,GAA+B,MAAA;AACpF,EAAA,MAAM,SAAA,GACJ,OAAO,4BAAA,KAAiC,QAAA,GAAW,4BAAA,GAA+B,GAAA;AACpF,EAAA,OAAO,GAAG,aAAA,CAAc,cAAc,CAAC,CAAA,CAAA,EAAI,mBAAA,CAAoB,SAAS,CAAC,CAAA,CAAA;AAC3E;;;ACzLO,SAAS,yBAAA,GAA4B;AAC1C,EAAA,OAAO;AAAA,IACL,OAAA,CAAQ,MAAW,aAAA,EAAoB;AAAA,MACrC,MAAM,gBAAA,SAAyB,IAAA,CAAK,WAAA,CAAY;AAAA,QAC9C,SAAS,QAAA,EAAkB;AACzB,UAAA,OAAO,QAAA,CAAS,WAAW,GAAG,CAAA;AAAA,QAChC;AAAA,QACA,QAAA,CAAS,QAAA,EAAkB,gBAAA,EAA0B,OAAA,EAAc,WAAA,EAAkB;AAEnF,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;;;ACzBO,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;;;ACtBO,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;;;ACPO,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;ACZO,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,CAACC,uBAAM,EAAE,OAAA,EAAS,CAACC,yBAAA,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,MAAML,oBAAAA,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,MAAMM,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;;;ACxEA,IAAM,yBAAA,GAA4B,6BAAA;AAGlC,SAAS,mBAAmB,IAAA,EAA8C;AACxE,EAAA,IAAI,IAAA,IAAQ,MAAM,OAAO,MAAA;AACzB,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,OAAO,QAAQ,QAAA,CAAS,GAAG,CAAA,GAAI,OAAA,GAAU,GAAG,OAAO,CAAA,CAAA,CAAA;AACrD;AAEA,SAAS,oBAAoB,KAAA,EAAuB;AAClD,EAAA,OAAO,MAAM,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA,GAAQ,GAAG,KAAK,CAAA,CAAA,CAAA;AAC/C;AAMA,SAAS,mBAAA,CAAoB,MAAA,EAAiB,UAAA,EAAoB,MAAA,EAA4B;AAC5F,EAAA,IAAI,QAAQ,OAAO,UAAA;AACnB,EAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,YAAY,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AAC7D,IAAA,OAAO,mBAAA,CAAoB,OAAO,IAAI,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,UAAA,IAAc,GAAA;AACvB;AAEA,SAAS,uBAAA,CAAwB,QAAoB,UAAA,EAAgC;AACnF,EAAA,MAAA,CAAO,MAAA,GAAS;AAAA,IACd,GAAG,MAAA,CAAO,MAAA;AAAA,IACV,CAAC,yBAAyB,GAAG,IAAA,CAAK,UAAU,UAAU;AAAA,GACxD;AACA,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,oBACd,OAAA,EAC2B;AAC3B,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,WAAA,GAAc,IAAA;AAAA,IACd,UAAA,GAAa,KAAA;AAAA,IACb,aAAA,GAAgB,OAAA;AAAA,IAChB,IAAA,EAAM,UAAA;AAAA,IACN,YAAY,gBAAA,GAAmB,MAAA;AAAA,IAC/B,WAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA,EAAM,UAAA;AAAA,IACN,QAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA,GAAgB,YAAA;AAAA,IAChB,OAAO,WAAA,GAAc,IAAA;AAAA,IACrB,MAAM,UAAA,GAAa,KAAA;AAAA,IACnB,IAAA;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;AAC5B,EAAA,MAAM,MAAA,GAAS,OAAA,IAAW,OAAA,CAAQ,UAAU,KAAK,IAAA,KAAS,aAAA;AAC1D,EAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,MAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,mBAAmB,UAAU,CAAA;AAE/C,EAAA,MAAM,WAAA,GAAc,SAChB,sBAAA,CAAuB;AAAA,IACrB,gBAAgB,cAAA,IAAkB,OAAA;AAAA,IAClC,eAAA,EAAiB;AAAA,GAClB,CAAA,GACD,EAAA;AAOJ,EAAA,MAAM,UAAA,GAAa,MAAA,GACf,CAAA,EAAG,SAAA,IAAa,IAAI,GAAG,WAAW,CAAA,CAAA,CAAA,GAClC,OAAA,GACG,SAAA,IAAa,IAAA,GACd,EAAA;AAKN,EAAA,MAAM,iBAAiB,MAAA,IAAU,UAAA,CAAW,UAAA,CAAW,IAAI,IAAI,IAAA,GAAO,UAAA;AAEtE,EAAA,MAAM,mBAAA,GACJ,SAAA,IAAa,IAAA,KACZ,SAAA,CAAU,UAAA,CAAW,UAAU,CAAA,IAC9B,SAAA,CAAU,UAAA,CAAW,SAAS,CAAA,IAC9B,SAAA,CAAU,WAAW,GAAG,CAAA,CAAA;AAC5B,EAAA,MAAM,WAAW,MAAA,GACb,mBAAA,GACE,UAAA,GACA,IAAA,GACF,UACE,UAAA,GACA,MAAA;AACN,EAAA,MAAM,qBAAqB,YAAA,KAAiB,KAAA;AAE5C,EAAA,MAAM,OAAA,GAA0B;AAAA,IAC9B,GAAI,kBAAA,GACA,CAAC,kBAAA,CAAmB,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,EAAE,CAAC,IACzF,EAAC;AAAA,IACL,GAAI,UAAA,GAAa,CAAC,cAAA,CAAe,UAAA,KAAe,IAAA,GAAO,EAAC,GAAI,UAAU,CAAC,CAAA,GAAI,EAAC;AAAA,IAC5E,GAAI,WAAA,GAAc,CAACC,sBAAA,EAAO,IAAI,EAAC;AAAA,IAC/B,GAAG,mBAAA,CAAoB,EAAE,OAAA,EAAS,IAAA,EAAM,eAAe,CAAA;AAAA,IACvD,GAAI,YAAA,KAAiB,KAAA,IAAS,YAAA,IAAgB,IAAA,GAC1C,EAAC,GACD;AAAA,MACE,kBAAA,CAAmB;AAAA,QACjB,UAAA,EAAY,YAAA,CAAa,UAAA,IAAc,CAAA,qBAAA,EAAwB,aAAa,IAAI,CAAA,EAAA,CAAA;AAAA,QAChF,MAAM,YAAA,CAAa;AAAA,OACpB;AAAA,KACH;AAAA,IACJ,GAAI,UAAA,GAAa,CAAC,WAAW,UAAU,CAAC,IAAI,EAAC;AAAA,IAC7CC,+BAAA,CAAiB;AAAA,MACf,MAAA,EAAQ,OAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM;AAAA,UACJ,GAAG,QAAA;AAAA,UACH,aAAa,cAAA,IAAkB;AAAA;AACjC;AACF,KACD,CAAA;AAAA,IACD,GAAI,WAAW,MAAA,GACX;AAAA,MACE,gBAAA,CAAiB;AAAA,QACf,OAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA,EAAS;AAAA,OACV;AAAA,QAEH,EAAC;AAAA,IACL,GAAI,KAAA,IAAS,QAAA,GAAW,CAACC,yBAAA,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,IAAA,GAAmB;AAAA,IACvB,IAAA,EAAM,OAAA;AAAA,IACN,GAAI,QAAA,IAAY,IAAA,GAAO,EAAE,IAAA,EAAM,QAAA,KAAa,EAAC;AAAA,IAC7C,OAAA;AAAA,IACA,GAAI,kBAAA,GAAqB,EAAE,SAAA,EAAW,KAAA,KAAU,EAAC;AAAA,IACjD,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,QAAQ,MAAA,GAAS,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,CAAA,GAAM,UAAA;AAAA,QACnD,SAAA,EAAW,QAAA;AAAA,QACX,WAAA,EAAa;AAAA;AACf;AACF,GACN;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,uBAAA,CAAwB,MAAA,EAAQ,mBAAA,CAAoB,MAAA,EAAQ,UAAA,EAAY,MAAM,CAAC,CAAA;AAC/E,EAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,cAAA,EAAgB;AAAA,IAC5C,KAAA,EAAO,WAAA;AAAA,IACP,UAAA,EAAY,KAAA;AAAA,IACZ,YAAA,EAAc;AAAA,GACf,CAAA;AACD,EAAA,OAAO,MAAA;AACT","file":"create-app-vite-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 { execFileSync } from \"node:child_process\";\r\nimport fs from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\nimport type { PluginOption } from \"vite\";\r\n\r\n/** @public */\r\nexport type HashTimestampFormat = \"epoch\" | \"datetime\";\r\n\r\n/** @public */\r\nexport interface HashBuildDirNameOptions {\r\n repositoryRoot?: string;\r\n now?: number;\r\n /** @defaultValue \"epoch\" */\r\n timestampFormat?: HashTimestampFormat;\r\n}\r\n\r\n/** @public */\r\nexport interface HashCleanupOptions {\r\n /**\r\n * 每次成功构建后保留的 Hash 版本总数(含本次构建)。\r\n * 必须为大于等于 1 的整数。\r\n */\r\n keep: number;\r\n}\r\n\r\n/** @public */\r\nexport interface HashDeployPluginOptions {\r\n rootDir: string;\r\n /** hash 子目录名,如 `{commit}-{timestamp}` 或 `{commit}-YYYY-MM-DD-HH-mm-ss` */\r\n buildDirStr: string;\r\n /**\r\n * 与最终 Vite `base` 一致的资源前缀。\r\n * - 默认相对:`./{buildDirStr}/`\r\n * - 自定义 CDN:`https://cdn.example.com/app/{buildDirStr}/`\r\n */\r\n publicPath: string;\r\n /** 旧 Hash 目录清理策略;未传时永久保留,由部署系统负责清理。 */\r\n cleanup?: HashCleanupOptions;\r\n}\r\n\r\nconst HASH_BUILD_DIR_PATTERN = /^(?:[0-9a-f]{12}|local)-(\\d{4}-\\d{2}-\\d{2}-\\d{2}-\\d{2}-\\d{2}|\\d+)$/;\r\n\r\nfunction parseHashTimestamp(value: string): number {\r\n if (/^\\d+$/.test(value)) return Number(value);\r\n const [year = 0, month = 1, day = 1, hour = 0, minute = 0, second = 0] = value\r\n .split(\"-\")\r\n .map(Number);\r\n return new Date(year, month - 1, day, hour, minute, second).getTime();\r\n}\r\n\r\nfunction padTwo(value: number): string {\r\n return String(value).padStart(2, \"0\");\r\n}\r\n\r\nfunction formatHashTimestamp(now: number, format: HashTimestampFormat = \"epoch\"): string {\r\n if (format !== \"datetime\") return String(now);\r\n const date = new Date(now);\r\n return [\r\n date.getFullYear(),\r\n padTwo(date.getMonth() + 1),\r\n padTwo(date.getDate()),\r\n padTwo(date.getHours()),\r\n padTwo(date.getMinutes()),\r\n padTwo(date.getSeconds()),\r\n ].join(\"-\");\r\n}\r\n\r\nfunction cleanupOldHashBuilds(deployRoot: string, currentBuildDir: string, keep: number): void {\r\n const oldBuilds = fs\r\n .readdirSync(deployRoot, { withFileTypes: true })\r\n .flatMap((entry) => {\r\n if (!entry.isDirectory() || entry.name === currentBuildDir) return [];\r\n const match = HASH_BUILD_DIR_PATTERN.exec(entry.name);\r\n return match ? [{ name: entry.name, timestamp: parseHashTimestamp(match[1]!) }] : [];\r\n })\r\n .sort((left, right) => right.timestamp - left.timestamp || right.name.localeCompare(left.name));\r\n\r\n for (const build of oldBuilds.slice(Math.max(keep - 1, 0))) {\r\n fs.rmSync(path.join(deployRoot, build.name), { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * 构建结束后写 `dist/hash.txt`,并把 hash 子目录中的 `index.html` 复制到 `dist/index.html`。\r\n * 相对 `base` 时为根入口补上 hash 前缀;绝对 `base` 时产物已含完整 URL,原样复制即可。\r\n * 配置 `cleanup.keep` 时,成功写入根入口后只保留指定数量的最新 Hash 版本。\r\n * @public\r\n */\r\nexport function hashDeployPlugin(options: HashDeployPluginOptions): PluginOption {\r\n const { rootDir, buildDirStr, publicPath, cleanup } = options;\r\n if (cleanup && (!Number.isInteger(cleanup.keep) || cleanup.keep < 1)) {\r\n throw new Error(\"[hash-deploy] cleanup.keep must be an integer greater than or equal to 1.\");\r\n }\r\n let outputDir: string | undefined;\r\n let deployRoot: string | undefined;\r\n\r\n return {\r\n name: \"hash-deploy\",\r\n enforce: \"post\",\r\n configResolved(config) {\r\n const resolvedRoot = path.resolve(config.root);\r\n const expectedRoot = path.resolve(rootDir);\r\n if (resolvedRoot !== expectedRoot) {\r\n throw new Error(\r\n `[hash-deploy] Vite root \"${resolvedRoot}\" must match rootDir \"${expectedRoot}\".`,\r\n );\r\n }\r\n // 相对 hash:工厂 publicPath 为 `./{hash}/`,但 Vite base 必须保持 `./`。\r\n const expectedBase = publicPath.startsWith(\"./\") ? \"./\" : publicPath;\r\n if (config.base !== expectedBase) {\r\n throw new Error(\r\n `[hash-deploy] Vite base \"${config.base}\" must remain \"${expectedBase}\" during hash deployment.`,\r\n );\r\n }\r\n\r\n outputDir = path.resolve(resolvedRoot, config.build.outDir);\r\n if (path.basename(outputDir) !== buildDirStr) {\r\n throw new Error(\r\n `[hash-deploy] build.outDir \"${config.build.outDir}\" must end with the hash directory \"${buildDirStr}\".`,\r\n );\r\n }\r\n deployRoot = path.dirname(outputDir);\r\n },\r\n writeBundle: {\r\n sequential: true,\r\n order: \"post\",\r\n handler() {\r\n if (!outputDir || !deployRoot) {\r\n throw new Error(\"[hash-deploy] Vite configuration was not resolved before writeBundle.\");\r\n }\r\n\r\n const sourceIndex = path.join(outputDir, \"index.html\");\r\n if (!fs.existsSync(sourceIndex)) {\r\n throw new Error(`[hash-deploy] Generated entry was not found: \"${sourceIndex}\".`);\r\n }\r\n\r\n fs.mkdirSync(deployRoot, { recursive: true });\r\n fs.writeFileSync(path.join(deployRoot, \"hash.txt\"), buildDirStr);\r\n const sourceHtml = fs.readFileSync(sourceIndex, \"utf8\");\r\n // 相对 base(`./{hash}/`)时子目录 HTML 中的资源均相对于自身,根入口需统一补 hash;\r\n // 绝对 base 时 Vite 已写出完整 URL,直接复制。\r\n const rootHtml = publicPath.startsWith(\"./\")\r\n ? sourceHtml.replace(/(\\b(?:href|src)\\s*=\\s*[\"'])\\.\\//g, `$1${publicPath}`)\r\n : sourceHtml;\r\n fs.writeFileSync(path.join(deployRoot, \"index.html\"), rootHtml);\r\n if (cleanup) {\r\n cleanupOldHashBuilds(deployRoot, buildDirStr, cleanup.keep);\r\n }\r\n },\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 从指定仓库读取短 commit hash;非 git 环境回退 `local`。\r\n * @public\r\n */\r\nexport function getCommitHash(repositoryRoot: string = process.cwd()): string {\r\n try {\r\n return execFileSync(\"git\", [\"rev-parse\", \"HEAD\"], {\r\n cwd: repositoryRoot,\r\n encoding: \"utf8\",\r\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\r\n })\r\n .trim()\r\n .slice(0, 12);\r\n } catch {\r\n return \"local\";\r\n }\r\n}\r\n\r\n/**\r\n * 生成 hash 构建目录名;保留仅传时间戳的旧调用方式。\r\n * @public\r\n */\r\nexport function createHashBuildDirName(now?: number): string;\r\n/** @public */\r\nexport function createHashBuildDirName(repositoryRoot: string, now?: number): string;\r\n/** @public */\r\nexport function createHashBuildDirName(options: HashBuildDirNameOptions): string;\r\nexport function createHashBuildDirName(\r\n repositoryRootOrNowOrOptions?: string | number | HashBuildDirNameOptions,\r\n now: number = Date.now(),\r\n): string {\r\n if (repositoryRootOrNowOrOptions != null && typeof repositoryRootOrNowOrOptions === \"object\") {\r\n const {\r\n repositoryRoot,\r\n now: optionsNow = Date.now(),\r\n timestampFormat = \"epoch\",\r\n } = repositoryRootOrNowOrOptions;\r\n return `${getCommitHash(repositoryRoot)}-${formatHashTimestamp(optionsNow, timestampFormat)}`;\r\n }\r\n const repositoryRoot =\r\n typeof repositoryRootOrNowOrOptions === \"string\" ? repositoryRootOrNowOrOptions : undefined;\r\n const timestamp =\r\n typeof repositoryRootOrNowOrOptions === \"number\" ? repositoryRootOrNowOrOptions : now;\r\n return `${getCommitHash(repositoryRoot)}-${formatHashTimestamp(timestamp)}`;\r\n}\r\n","import type { LessOptions } from \"../types.ts\";\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: any, pluginManager: any) {\r\n class TildeFileManager extends less.FileManager {\r\n supports(filename: string) {\r\n return filename.startsWith(\"~\");\r\n }\r\n loadFile(filename: string, currentDirectory: string, options: any, environment: any) {\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 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 { 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","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","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 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 { copyPlugin } from \"./plugins/copy.ts\";\r\nimport { createHashBuildDirName, hashDeployPlugin } from \"./plugins/hash-deploy.ts\";\r\nimport { buildLessOptions } from \"./plugins/less-tilde.ts\";\r\nimport { lifecyclePlugin } from \"./plugins/lifecycle.ts\";\r\nimport { publicAssetsPlugin } from \"./plugins/public-assets.ts\";\r\nimport { publicConfigPlugin } from \"./plugins/public-config.ts\";\r\nimport { reactCompilerPlugin } from \"./plugins/react-compiler.ts\";\r\nimport { svgReactPlugin } from \"./plugins/svg-react.ts\";\r\n\r\nimport type { CreateAppViteConfigOptions, CreateAppViteConfigResult } from \"./types.ts\";\r\n\r\n/** 根入口运行时资源前缀,供 JS `fetch` / 动态 URL 使用。与 HTML 子目录 `PUBLIC_PATH` 可能不同。 */\r\nconst JS_PUBLIC_PATH_DEFINE_KEY = \"import.meta.env.PUBLIC_PATH\";\r\n\r\n/** 规范化资源 base:空串视为未设置;非空则保证尾 `/`。 */\r\nfunction normalizeAssetBase(base: string | undefined): string | undefined {\r\n if (base == null) return undefined;\r\n const trimmed = base.trim();\r\n if (!trimmed) return undefined;\r\n return trimmed.endsWith(\"/\") ? trimmed : `${trimmed}/`;\r\n}\r\n\r\nfunction ensureTrailingSlash(value: string): string {\r\n return value.endsWith(\"/\") ? value : `${value}/`;\r\n}\r\n\r\n/**\r\n * JS 可读的根入口前缀。相对 hash 必须用 `./{hash}/`,不能用 Vite `base`(后者保持 `./`)。\r\n * 非 hash 则跟最终 `config.base`;serve 未设 base 时为 `\"/\"`。\r\n */\r\nfunction resolveJsPublicPath(isHash: boolean, publicPath: string, config: UserConfig): string {\r\n if (isHash) return publicPath;\r\n if (typeof config.base === \"string\" && config.base.length > 0) {\r\n return ensureTrailingSlash(config.base);\r\n }\r\n return publicPath || \"/\";\r\n}\r\n\r\nfunction applyJsPublicPathDefine(config: UserConfig, publicPath: string): UserConfig {\r\n config.define = {\r\n ...config.define,\r\n [JS_PUBLIC_PATH_DEFINE_KEY]: JSON.stringify(publicPath),\r\n };\r\n return config;\r\n}\r\n\r\n/**\r\n * 组装应用侧 Vite 配置。\r\n *\r\n * 合并顺序:`base(options) → mergeConfig(base, vite) → configure(final)`,\r\n * 之后写入 `import.meta.env.PUBLIC_PATH`(同名 `define` 会被覆盖)。\r\n *\r\n * 返回值附带只读 `buildDirHash`(本次 hash 子目录名;未启用时为 `\"\"`)。\r\n * @public\r\n */\r\nexport function createAppViteConfig(\r\n options: CreateAppViteConfigOptions,\r\n): CreateAppViteConfigResult {\r\n const {\r\n rootDir,\r\n repositoryRoot,\r\n command,\r\n mode,\r\n alias,\r\n useHttps = false,\r\n openBrowser = true,\r\n hashDeploy = false,\r\n hashTimestamp = \"epoch\",\r\n base: baseOption,\r\n deployRoot: deployRootOption = \"dist\",\r\n hashCleanup,\r\n publicAssets,\r\n publicConfig,\r\n copy: copyOption,\r\n htmlData,\r\n devProxy,\r\n reactCompiler = \"build-only\",\r\n react: enableReact = true,\r\n svgr: svgrOption = false,\r\n less,\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 const isHash = isBuild && Boolean(hashDeploy) && mode !== \"development\";\r\n const deployRoot = deployRootOption.replace(/\\/+$/, \"\") || \"dist\";\r\n const assetBase = normalizeAssetBase(baseOption);\r\n\r\n const buildDirStr = isHash\r\n ? createHashBuildDirName({\r\n repositoryRoot: repositoryRoot ?? rootDir,\r\n timestampFormat: hashTimestamp,\r\n })\r\n : \"\";\r\n /**\r\n * HTML / 根入口资源前缀(JS `import.meta.env.PUBLIC_PATH` 用这个)。\r\n * - hash + 相对:`./{hash}/`(Vite `base` 仍为 `./`,由插件改写根入口)\r\n * - hash + 绝对 base:`{base}{hash}/`(与 Vite `base` 一致)\r\n * - 普通 build:`base` 或 `./`\r\n */\r\n const publicPath = isHash\r\n ? `${assetBase ?? \"./\"}${buildDirStr}/`\r\n : isBuild\r\n ? (assetBase ?? \"./\")\r\n : \"\";\r\n /**\r\n * Hash 子目录入口相对于自身加载资源;根入口由 hashDeployPlugin 再补 hash 前缀。\r\n * 绝对 base 则两个入口都使用同一个完整 URL。\r\n */\r\n const htmlPublicPath = isHash && publicPath.startsWith(\"./\") ? \"./\" : publicPath;\r\n /** 相对 base(含默认 `./`)在 hash 下必须保持 Vite `base: \"./\"`,否则 `./{hash}/` 会被规范成 `/`。 */\r\n const isAbsoluteAssetBase =\r\n assetBase != null &&\r\n (assetBase.startsWith(\"https://\") ||\r\n assetBase.startsWith(\"http://\") ||\r\n assetBase.startsWith(\"/\"));\r\n const viteBase = isHash\r\n ? isAbsoluteAssetBase\r\n ? publicPath\r\n : \"./\"\r\n : isBuild\r\n ? publicPath\r\n : undefined;\r\n const enablePublicAssets = publicAssets !== false;\r\n\r\n const plugins: PluginOption[] = [\r\n ...(enablePublicAssets\r\n ? [publicAssetsPlugin(publicAssets && typeof publicAssets === \"object\" ? publicAssets : {})]\r\n : []),\r\n ...(svgrOption ? [svgReactPlugin(svgrOption === true ? {} : svgrOption)] : []),\r\n ...(enableReact ? [react()] : []),\r\n ...reactCompilerPlugin({ command, mode: reactCompiler }),\r\n ...(publicConfig === false || publicConfig == null\r\n ? []\r\n : [\r\n publicConfigPlugin({\r\n sourceGlob: publicConfig.sourceGlob ?? `config/public-config/${publicConfig.mode}/*`,\r\n dest: publicConfig.dest,\r\n }),\r\n ]),\r\n ...(copyOption ? [copyPlugin(copyOption)] : []),\r\n createHtmlPlugin({\r\n minify: isBuild,\r\n inject: {\r\n data: {\r\n ...htmlData,\r\n PUBLIC_PATH: htmlPublicPath || \"\",\r\n },\r\n },\r\n }),\r\n ...(isBuild && isHash\r\n ? [\r\n hashDeployPlugin({\r\n rootDir,\r\n buildDirStr,\r\n publicPath,\r\n cleanup: hashCleanup,\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 base: UserConfig = {\r\n root: rootDir,\r\n ...(viteBase != null ? { base: viteBase } : {}),\r\n plugins,\r\n ...(enablePublicAssets ? { publicDir: false } : {}),\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: isHash ? `${deployRoot}/${buildDirStr}/` : deployRoot,\r\n assetsDir: \"assets\",\r\n emptyOutDir: true,\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 applyJsPublicPathDefine(merged, resolveJsPublicPath(isHash, publicPath, merged));\r\n Object.defineProperty(merged, \"buildDirHash\", {\r\n value: buildDirStr,\r\n enumerable: false,\r\n configurable: true,\r\n });\r\n return merged as CreateAppViteConfigResult;\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/plugins/copy.ts","../src/plugins/hash-deploy.ts","../src/plugins/less-tilde.ts","../src/plugins/lifecycle.ts","../src/plugins/public-assets.ts","../src/plugins/public-config.ts","../src/plugins/react-compiler.ts","../src/plugins/svg-react.ts","../src/create-app-vite-config.ts"],"names":["viteStaticCopy","fs","path","execFileSync","repositoryRoot","babel","reactCompilerPreset","transformWithOxc","react","createHtmlPlugin","basicSsl","mergeConfig"],"mappings":"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","file":"create-app-vite-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 { execFileSync } from \"node:child_process\";\r\nimport fs from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\nimport type { PluginOption } from \"vite\";\r\n\r\n/** @public */\r\nexport type HashTimestampFormat = \"epoch\" | \"datetime\";\r\n\r\n/** @public */\r\nexport interface HashBuildDirNameOptions {\r\n repositoryRoot?: string;\r\n now?: number;\r\n /** @defaultValue \"epoch\" */\r\n timestampFormat?: HashTimestampFormat;\r\n}\r\n\r\n/** @public */\r\nexport interface HashCleanupOptions {\r\n /**\r\n * 每次成功构建后保留的 Hash 版本总数(含本次构建)。\r\n * 必须为大于等于 1 的整数。\r\n */\r\n keep: number;\r\n}\r\n\r\n/** @public */\r\nexport interface HashDeployPluginOptions {\r\n rootDir: string;\r\n /** hash 子目录名,如 `{commit}-{timestamp}` 或 `{commit}-YYYY-MM-DD-HH-mm-ss` */\r\n buildDirStr: string;\r\n /**\r\n * 与最终 Vite `base` 一致的资源前缀。\r\n * - 默认相对:`./{buildDirStr}/`\r\n * - 自定义 CDN:`https://cdn.example.com/app/{buildDirStr}/`\r\n */\r\n publicPath: string;\r\n /** 旧 Hash 目录清理策略;未传时永久保留,由部署系统负责清理。 */\r\n cleanup?: HashCleanupOptions;\r\n}\r\n\r\nconst HASH_BUILD_DIR_PATTERN = /^(?:[0-9a-f]{12}|local)-(\\d{4}-\\d{2}-\\d{2}-\\d{2}-\\d{2}-\\d{2}|\\d+)$/;\r\n\r\nfunction parseHashTimestamp(value: string): number {\r\n if (/^\\d+$/.test(value)) return Number(value);\r\n const [year = 0, month = 1, day = 1, hour = 0, minute = 0, second = 0] = value\r\n .split(\"-\")\r\n .map(Number);\r\n return new Date(year, month - 1, day, hour, minute, second).getTime();\r\n}\r\n\r\nfunction padTwo(value: number): string {\r\n return String(value).padStart(2, \"0\");\r\n}\r\n\r\nfunction formatHashTimestamp(now: number, format: HashTimestampFormat = \"epoch\"): string {\r\n if (format !== \"datetime\") return String(now);\r\n const date = new Date(now);\r\n return [\r\n date.getFullYear(),\r\n padTwo(date.getMonth() + 1),\r\n padTwo(date.getDate()),\r\n padTwo(date.getHours()),\r\n padTwo(date.getMinutes()),\r\n padTwo(date.getSeconds()),\r\n ].join(\"-\");\r\n}\r\n\r\nfunction cleanupOldHashBuilds(deployRoot: string, currentBuildDir: string, keep: number): void {\r\n const oldBuilds = fs\r\n .readdirSync(deployRoot, { withFileTypes: true })\r\n .flatMap((entry) => {\r\n if (!entry.isDirectory() || entry.name === currentBuildDir) return [];\r\n const match = HASH_BUILD_DIR_PATTERN.exec(entry.name);\r\n return match ? [{ name: entry.name, timestamp: parseHashTimestamp(match[1]!) }] : [];\r\n })\r\n .sort((left, right) => right.timestamp - left.timestamp || right.name.localeCompare(left.name));\r\n\r\n for (const build of oldBuilds.slice(Math.max(keep - 1, 0))) {\r\n fs.rmSync(path.join(deployRoot, build.name), { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * 构建结束后写 `dist/hash.txt`,并把 hash 子目录中的 `index.html` 复制到 `dist/index.html`。\r\n * 相对 `base` 时为根入口补上 hash 前缀;绝对 `base` 时产物已含完整 URL,原样复制即可。\r\n * 配置 `cleanup.keep` 时,成功写入根入口后只保留指定数量的最新 Hash 版本。\r\n * @public\r\n */\r\nexport function hashDeployPlugin(options: HashDeployPluginOptions): PluginOption {\r\n const { rootDir, buildDirStr, publicPath, cleanup } = options;\r\n if (cleanup && (!Number.isInteger(cleanup.keep) || cleanup.keep < 1)) {\r\n throw new Error(\"[hash-deploy] cleanup.keep must be an integer greater than or equal to 1.\");\r\n }\r\n let outputDir: string | undefined;\r\n let deployRoot: string | undefined;\r\n\r\n return {\r\n name: \"hash-deploy\",\r\n enforce: \"post\",\r\n configResolved(config) {\r\n const resolvedRoot = path.resolve(config.root);\r\n const expectedRoot = path.resolve(rootDir);\r\n if (resolvedRoot !== expectedRoot) {\r\n throw new Error(\r\n `[hash-deploy] Vite root \"${resolvedRoot}\" must match rootDir \"${expectedRoot}\".`,\r\n );\r\n }\r\n // 相对 hash:工厂 publicPath 为 `./{hash}/`,但 Vite base 必须保持 `./`。\r\n const expectedBase = publicPath.startsWith(\"./\") ? \"./\" : publicPath;\r\n if (config.base !== expectedBase) {\r\n throw new Error(\r\n `[hash-deploy] Vite base \"${config.base}\" must remain \"${expectedBase}\" during hash deployment.`,\r\n );\r\n }\r\n\r\n outputDir = path.resolve(resolvedRoot, config.build.outDir);\r\n if (path.basename(outputDir) !== buildDirStr) {\r\n throw new Error(\r\n `[hash-deploy] build.outDir \"${config.build.outDir}\" must end with the hash directory \"${buildDirStr}\".`,\r\n );\r\n }\r\n deployRoot = path.dirname(outputDir);\r\n },\r\n writeBundle: {\r\n sequential: true,\r\n order: \"post\",\r\n handler() {\r\n if (!outputDir || !deployRoot) {\r\n throw new Error(\"[hash-deploy] Vite configuration was not resolved before writeBundle.\");\r\n }\r\n\r\n const sourceIndex = path.join(outputDir, \"index.html\");\r\n if (!fs.existsSync(sourceIndex)) {\r\n throw new Error(`[hash-deploy] Generated entry was not found: \"${sourceIndex}\".`);\r\n }\r\n\r\n fs.mkdirSync(deployRoot, { recursive: true });\r\n fs.writeFileSync(path.join(deployRoot, \"hash.txt\"), buildDirStr);\r\n const sourceHtml = fs.readFileSync(sourceIndex, \"utf8\");\r\n // 相对 base(`./{hash}/`)时子目录 HTML 中的资源均相对于自身,根入口需统一补 hash;\r\n // 绝对 base 时 Vite 已写出完整 URL,直接复制。\r\n const rootHtml = publicPath.startsWith(\"./\")\r\n ? sourceHtml.replace(/(\\b(?:href|src)\\s*=\\s*[\"'])\\.\\//g, `$1${publicPath}`)\r\n : sourceHtml;\r\n fs.writeFileSync(path.join(deployRoot, \"index.html\"), rootHtml);\r\n if (cleanup) {\r\n cleanupOldHashBuilds(deployRoot, buildDirStr, cleanup.keep);\r\n }\r\n },\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 从指定仓库读取短 commit hash;非 git 环境回退 `local`。\r\n * @public\r\n */\r\nexport function getCommitHash(repositoryRoot: string = process.cwd()): string {\r\n try {\r\n return execFileSync(\"git\", [\"rev-parse\", \"HEAD\"], {\r\n cwd: repositoryRoot,\r\n encoding: \"utf8\",\r\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\r\n })\r\n .trim()\r\n .slice(0, 12);\r\n } catch {\r\n return \"local\";\r\n }\r\n}\r\n\r\n/**\r\n * 生成 hash 构建目录名;保留仅传时间戳的旧调用方式。\r\n * @public\r\n */\r\nexport function createHashBuildDirName(now?: number): string;\r\n/** @public */\r\nexport function createHashBuildDirName(repositoryRoot: string, now?: number): string;\r\n/** @public */\r\nexport function createHashBuildDirName(options: HashBuildDirNameOptions): string;\r\nexport function createHashBuildDirName(\r\n repositoryRootOrNowOrOptions?: string | number | HashBuildDirNameOptions,\r\n now: number = Date.now(),\r\n): string {\r\n if (repositoryRootOrNowOrOptions != null && typeof repositoryRootOrNowOrOptions === \"object\") {\r\n const {\r\n repositoryRoot,\r\n now: optionsNow = Date.now(),\r\n timestampFormat = \"epoch\",\r\n } = repositoryRootOrNowOrOptions;\r\n return `${getCommitHash(repositoryRoot)}-${formatHashTimestamp(optionsNow, timestampFormat)}`;\r\n }\r\n const repositoryRoot =\r\n typeof repositoryRootOrNowOrOptions === \"string\" ? repositoryRootOrNowOrOptions : undefined;\r\n const timestamp =\r\n typeof repositoryRootOrNowOrOptions === \"number\" ? repositoryRootOrNowOrOptions : now;\r\n return `${getCommitHash(repositoryRoot)}-${formatHashTimestamp(timestamp)}`;\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 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 { 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","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","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 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 { copyPlugin } from \"./plugins/copy.ts\";\r\nimport { createHashBuildDirName, hashDeployPlugin } from \"./plugins/hash-deploy.ts\";\r\nimport { buildLessOptions } from \"./plugins/less-tilde.ts\";\r\nimport { lifecyclePlugin } from \"./plugins/lifecycle.ts\";\r\nimport { publicAssetsPlugin } from \"./plugins/public-assets.ts\";\r\nimport { publicConfigPlugin } from \"./plugins/public-config.ts\";\r\nimport { reactCompilerPlugin } from \"./plugins/react-compiler.ts\";\r\nimport { svgReactPlugin } from \"./plugins/svg-react.ts\";\r\n\r\nimport type { CreateAppViteConfigOptions, CreateAppViteConfigResult } from \"./types.ts\";\r\n\r\n/** 根入口运行时资源前缀,供 JS `fetch` / 动态 URL 使用。与 HTML 子目录 `PUBLIC_PATH` 可能不同。 */\r\nconst JS_PUBLIC_PATH_DEFINE_KEY = \"import.meta.env.PUBLIC_PATH\";\r\n\r\n/** 规范化资源 base:空串视为未设置;非空则保证尾 `/`。 */\r\nfunction normalizeAssetBase(base: string | undefined): string | undefined {\r\n if (base == null) return undefined;\r\n const trimmed = base.trim();\r\n if (!trimmed) return undefined;\r\n return trimmed.endsWith(\"/\") ? trimmed : `${trimmed}/`;\r\n}\r\n\r\nfunction ensureTrailingSlash(value: string): string {\r\n return value.endsWith(\"/\") ? value : `${value}/`;\r\n}\r\n\r\n/**\r\n * JS 可读的根入口前缀。相对 hash 必须用 `./{hash}/`,不能用 Vite `base`(后者保持 `./`)。\r\n * 非 hash 则跟最终 `config.base`;serve 未设 base 时为 `\"/\"`。\r\n */\r\nfunction resolveJsPublicPath(isHash: boolean, publicPath: string, config: UserConfig): string {\r\n if (isHash) return publicPath;\r\n if (typeof config.base === \"string\" && config.base.length > 0) {\r\n return ensureTrailingSlash(config.base);\r\n }\r\n return publicPath || \"/\";\r\n}\r\n\r\nfunction applyJsPublicPathDefine(config: UserConfig, publicPath: string): UserConfig {\r\n config.define = {\r\n ...config.define,\r\n [JS_PUBLIC_PATH_DEFINE_KEY]: JSON.stringify(publicPath),\r\n };\r\n return config;\r\n}\r\n\r\n/**\r\n * 组装应用侧 Vite 配置。\r\n *\r\n * 合并顺序:`base(options) → mergeConfig(base, vite) → configure(final)`,\r\n * 之后写入 `import.meta.env.PUBLIC_PATH`(同名 `define` 会被覆盖)。\r\n *\r\n * 返回值附带只读 `buildDirHash`(本次 hash 子目录名;未启用时为 `\"\"`)。\r\n * @public\r\n */\r\nexport function createAppViteConfig(\r\n options: CreateAppViteConfigOptions,\r\n): CreateAppViteConfigResult {\r\n const {\r\n rootDir,\r\n repositoryRoot,\r\n command,\r\n mode,\r\n alias,\r\n useHttps = false,\r\n openBrowser = true,\r\n hashDeploy = false,\r\n hashTimestamp = \"epoch\",\r\n base: baseOption,\r\n deployRoot: deployRootOption = \"dist\",\r\n hashCleanup,\r\n publicAssets,\r\n publicConfig,\r\n copy: copyOption,\r\n htmlData,\r\n devProxy,\r\n reactCompiler = \"build-only\",\r\n react: enableReact = true,\r\n svgr: svgrOption = false,\r\n less,\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 const isHash = isBuild && Boolean(hashDeploy) && mode !== \"development\";\r\n const deployRoot = deployRootOption.replace(/\\/+$/, \"\") || \"dist\";\r\n const assetBase = normalizeAssetBase(baseOption);\r\n\r\n const buildDirStr = isHash\r\n ? createHashBuildDirName({\r\n repositoryRoot: repositoryRoot ?? rootDir,\r\n timestampFormat: hashTimestamp,\r\n })\r\n : \"\";\r\n /**\r\n * HTML / 根入口资源前缀(JS `import.meta.env.PUBLIC_PATH` 用这个)。\r\n * - hash + 相对:`./{hash}/`(Vite `base` 仍为 `./`,由插件改写根入口)\r\n * - hash + 绝对 base:`{base}{hash}/`(与 Vite `base` 一致)\r\n * - 普通 build:`base` 或 `./`\r\n */\r\n const publicPath = isHash\r\n ? `${assetBase ?? \"./\"}${buildDirStr}/`\r\n : isBuild\r\n ? (assetBase ?? \"./\")\r\n : \"\";\r\n /**\r\n * Hash 子目录入口相对于自身加载资源;根入口由 hashDeployPlugin 再补 hash 前缀。\r\n * 绝对 base 则两个入口都使用同一个完整 URL。\r\n */\r\n const htmlPublicPath = isHash && publicPath.startsWith(\"./\") ? \"./\" : publicPath;\r\n /** 相对 base(含默认 `./`)在 hash 下必须保持 Vite `base: \"./\"`,否则 `./{hash}/` 会被规范成 `/`。 */\r\n const isAbsoluteAssetBase =\r\n assetBase != null &&\r\n (assetBase.startsWith(\"https://\") ||\r\n assetBase.startsWith(\"http://\") ||\r\n assetBase.startsWith(\"/\"));\r\n const viteBase = isHash\r\n ? isAbsoluteAssetBase\r\n ? publicPath\r\n : \"./\"\r\n : isBuild\r\n ? publicPath\r\n : undefined;\r\n const enablePublicAssets = publicAssets !== false;\r\n\r\n const plugins: PluginOption[] = [\r\n ...(enablePublicAssets\r\n ? [publicAssetsPlugin(publicAssets && typeof publicAssets === \"object\" ? publicAssets : {})]\r\n : []),\r\n ...(svgrOption ? [svgReactPlugin(svgrOption === true ? {} : svgrOption)] : []),\r\n ...(enableReact ? [react()] : []),\r\n ...reactCompilerPlugin({ command, mode: reactCompiler }),\r\n ...(publicConfig === false || publicConfig == null\r\n ? []\r\n : [\r\n publicConfigPlugin({\r\n sourceGlob: publicConfig.sourceGlob ?? `config/public-config/${publicConfig.mode}/*`,\r\n dest: publicConfig.dest,\r\n }),\r\n ]),\r\n ...(copyOption ? [copyPlugin(copyOption)] : []),\r\n createHtmlPlugin({\r\n minify: isBuild,\r\n inject: {\r\n data: {\r\n ...htmlData,\r\n PUBLIC_PATH: htmlPublicPath || \"\",\r\n },\r\n },\r\n }),\r\n ...(isBuild && isHash\r\n ? [\r\n hashDeployPlugin({\r\n rootDir,\r\n buildDirStr,\r\n publicPath,\r\n cleanup: hashCleanup,\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 base: UserConfig = {\r\n root: rootDir,\r\n ...(viteBase != null ? { base: viteBase } : {}),\r\n plugins,\r\n ...(enablePublicAssets ? { publicDir: false } : {}),\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: isHash ? `${deployRoot}/${buildDirStr}/` : deployRoot,\r\n assetsDir: \"assets\",\r\n emptyOutDir: true,\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 applyJsPublicPathDefine(merged, resolveJsPublicPath(isHash, publicPath, merged));\r\n Object.defineProperty(merged, \"buildDirHash\", {\r\n value: buildDirStr,\r\n enumerable: false,\r\n configurable: true,\r\n });\r\n return merged as CreateAppViteConfigResult;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugins/copy.ts","../src/plugins/hash-deploy.ts","../src/plugins/less-tilde.ts","../src/plugins/lifecycle.ts","../src/plugins/public-assets.ts","../src/plugins/public-config.ts","../src/plugins/react-compiler.ts","../src/plugins/svg-react.ts","../src/create-app-vite-config.ts"],"names":["repositoryRoot","fs"],"mappings":"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","file":"create-app-vite-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 { execFileSync } from \"node:child_process\";\r\nimport fs from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\nimport type { PluginOption } from \"vite\";\r\n\r\n/** @public */\r\nexport type HashTimestampFormat = \"epoch\" | \"datetime\";\r\n\r\n/** @public */\r\nexport interface HashBuildDirNameOptions {\r\n repositoryRoot?: string;\r\n now?: number;\r\n /** @defaultValue \"epoch\" */\r\n timestampFormat?: HashTimestampFormat;\r\n}\r\n\r\n/** @public */\r\nexport interface HashCleanupOptions {\r\n /**\r\n * 每次成功构建后保留的 Hash 版本总数(含本次构建)。\r\n * 必须为大于等于 1 的整数。\r\n */\r\n keep: number;\r\n}\r\n\r\n/** @public */\r\nexport interface HashDeployPluginOptions {\r\n rootDir: string;\r\n /** hash 子目录名,如 `{commit}-{timestamp}` 或 `{commit}-YYYY-MM-DD-HH-mm-ss` */\r\n buildDirStr: string;\r\n /**\r\n * 与最终 Vite `base` 一致的资源前缀。\r\n * - 默认相对:`./{buildDirStr}/`\r\n * - 自定义 CDN:`https://cdn.example.com/app/{buildDirStr}/`\r\n */\r\n publicPath: string;\r\n /** 旧 Hash 目录清理策略;未传时永久保留,由部署系统负责清理。 */\r\n cleanup?: HashCleanupOptions;\r\n}\r\n\r\nconst HASH_BUILD_DIR_PATTERN = /^(?:[0-9a-f]{12}|local)-(\\d{4}-\\d{2}-\\d{2}-\\d{2}-\\d{2}-\\d{2}|\\d+)$/;\r\n\r\nfunction parseHashTimestamp(value: string): number {\r\n if (/^\\d+$/.test(value)) return Number(value);\r\n const [year = 0, month = 1, day = 1, hour = 0, minute = 0, second = 0] = value\r\n .split(\"-\")\r\n .map(Number);\r\n return new Date(year, month - 1, day, hour, minute, second).getTime();\r\n}\r\n\r\nfunction padTwo(value: number): string {\r\n return String(value).padStart(2, \"0\");\r\n}\r\n\r\nfunction formatHashTimestamp(now: number, format: HashTimestampFormat = \"epoch\"): string {\r\n if (format !== \"datetime\") return String(now);\r\n const date = new Date(now);\r\n return [\r\n date.getFullYear(),\r\n padTwo(date.getMonth() + 1),\r\n padTwo(date.getDate()),\r\n padTwo(date.getHours()),\r\n padTwo(date.getMinutes()),\r\n padTwo(date.getSeconds()),\r\n ].join(\"-\");\r\n}\r\n\r\nfunction cleanupOldHashBuilds(deployRoot: string, currentBuildDir: string, keep: number): void {\r\n const oldBuilds = fs\r\n .readdirSync(deployRoot, { withFileTypes: true })\r\n .flatMap((entry) => {\r\n if (!entry.isDirectory() || entry.name === currentBuildDir) return [];\r\n const match = HASH_BUILD_DIR_PATTERN.exec(entry.name);\r\n return match ? [{ name: entry.name, timestamp: parseHashTimestamp(match[1]!) }] : [];\r\n })\r\n .sort((left, right) => right.timestamp - left.timestamp || right.name.localeCompare(left.name));\r\n\r\n for (const build of oldBuilds.slice(Math.max(keep - 1, 0))) {\r\n fs.rmSync(path.join(deployRoot, build.name), { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * 构建结束后写 `dist/hash.txt`,并把 hash 子目录中的 `index.html` 复制到 `dist/index.html`。\r\n * 相对 `base` 时为根入口补上 hash 前缀;绝对 `base` 时产物已含完整 URL,原样复制即可。\r\n * 配置 `cleanup.keep` 时,成功写入根入口后只保留指定数量的最新 Hash 版本。\r\n * @public\r\n */\r\nexport function hashDeployPlugin(options: HashDeployPluginOptions): PluginOption {\r\n const { rootDir, buildDirStr, publicPath, cleanup } = options;\r\n if (cleanup && (!Number.isInteger(cleanup.keep) || cleanup.keep < 1)) {\r\n throw new Error(\"[hash-deploy] cleanup.keep must be an integer greater than or equal to 1.\");\r\n }\r\n let outputDir: string | undefined;\r\n let deployRoot: string | undefined;\r\n\r\n return {\r\n name: \"hash-deploy\",\r\n enforce: \"post\",\r\n configResolved(config) {\r\n const resolvedRoot = path.resolve(config.root);\r\n const expectedRoot = path.resolve(rootDir);\r\n if (resolvedRoot !== expectedRoot) {\r\n throw new Error(\r\n `[hash-deploy] Vite root \"${resolvedRoot}\" must match rootDir \"${expectedRoot}\".`,\r\n );\r\n }\r\n // 相对 hash:工厂 publicPath 为 `./{hash}/`,但 Vite base 必须保持 `./`。\r\n const expectedBase = publicPath.startsWith(\"./\") ? \"./\" : publicPath;\r\n if (config.base !== expectedBase) {\r\n throw new Error(\r\n `[hash-deploy] Vite base \"${config.base}\" must remain \"${expectedBase}\" during hash deployment.`,\r\n );\r\n }\r\n\r\n outputDir = path.resolve(resolvedRoot, config.build.outDir);\r\n if (path.basename(outputDir) !== buildDirStr) {\r\n throw new Error(\r\n `[hash-deploy] build.outDir \"${config.build.outDir}\" must end with the hash directory \"${buildDirStr}\".`,\r\n );\r\n }\r\n deployRoot = path.dirname(outputDir);\r\n },\r\n writeBundle: {\r\n sequential: true,\r\n order: \"post\",\r\n handler() {\r\n if (!outputDir || !deployRoot) {\r\n throw new Error(\"[hash-deploy] Vite configuration was not resolved before writeBundle.\");\r\n }\r\n\r\n const sourceIndex = path.join(outputDir, \"index.html\");\r\n if (!fs.existsSync(sourceIndex)) {\r\n throw new Error(`[hash-deploy] Generated entry was not found: \"${sourceIndex}\".`);\r\n }\r\n\r\n fs.mkdirSync(deployRoot, { recursive: true });\r\n fs.writeFileSync(path.join(deployRoot, \"hash.txt\"), buildDirStr);\r\n const sourceHtml = fs.readFileSync(sourceIndex, \"utf8\");\r\n // 相对 base(`./{hash}/`)时子目录 HTML 中的资源均相对于自身,根入口需统一补 hash;\r\n // 绝对 base 时 Vite 已写出完整 URL,直接复制。\r\n const rootHtml = publicPath.startsWith(\"./\")\r\n ? sourceHtml.replace(/(\\b(?:href|src)\\s*=\\s*[\"'])\\.\\//g, `$1${publicPath}`)\r\n : sourceHtml;\r\n fs.writeFileSync(path.join(deployRoot, \"index.html\"), rootHtml);\r\n if (cleanup) {\r\n cleanupOldHashBuilds(deployRoot, buildDirStr, cleanup.keep);\r\n }\r\n },\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 从指定仓库读取短 commit hash;非 git 环境回退 `local`。\r\n * @public\r\n */\r\nexport function getCommitHash(repositoryRoot: string = process.cwd()): string {\r\n try {\r\n return execFileSync(\"git\", [\"rev-parse\", \"HEAD\"], {\r\n cwd: repositoryRoot,\r\n encoding: \"utf8\",\r\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\r\n })\r\n .trim()\r\n .slice(0, 12);\r\n } catch {\r\n return \"local\";\r\n }\r\n}\r\n\r\n/**\r\n * 生成 hash 构建目录名;保留仅传时间戳的旧调用方式。\r\n * @public\r\n */\r\nexport function createHashBuildDirName(now?: number): string;\r\n/** @public */\r\nexport function createHashBuildDirName(repositoryRoot: string, now?: number): string;\r\n/** @public */\r\nexport function createHashBuildDirName(options: HashBuildDirNameOptions): string;\r\nexport function createHashBuildDirName(\r\n repositoryRootOrNowOrOptions?: string | number | HashBuildDirNameOptions,\r\n now: number = Date.now(),\r\n): string {\r\n if (repositoryRootOrNowOrOptions != null && typeof repositoryRootOrNowOrOptions === \"object\") {\r\n const {\r\n repositoryRoot,\r\n now: optionsNow = Date.now(),\r\n timestampFormat = \"epoch\",\r\n } = repositoryRootOrNowOrOptions;\r\n return `${getCommitHash(repositoryRoot)}-${formatHashTimestamp(optionsNow, timestampFormat)}`;\r\n }\r\n const repositoryRoot =\r\n typeof repositoryRootOrNowOrOptions === \"string\" ? repositoryRootOrNowOrOptions : undefined;\r\n const timestamp =\r\n typeof repositoryRootOrNowOrOptions === \"number\" ? repositoryRootOrNowOrOptions : now;\r\n return `${getCommitHash(repositoryRoot)}-${formatHashTimestamp(timestamp)}`;\r\n}\r\n","import type { LessOptions } from \"../types.ts\";\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: any, pluginManager: any) {\r\n class TildeFileManager extends less.FileManager {\r\n supports(filename: string) {\r\n return filename.startsWith(\"~\");\r\n }\r\n loadFile(filename: string, currentDirectory: string, options: any, environment: any) {\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 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 { 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","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","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 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 { copyPlugin } from \"./plugins/copy.ts\";\r\nimport { createHashBuildDirName, hashDeployPlugin } from \"./plugins/hash-deploy.ts\";\r\nimport { buildLessOptions } from \"./plugins/less-tilde.ts\";\r\nimport { lifecyclePlugin } from \"./plugins/lifecycle.ts\";\r\nimport { publicAssetsPlugin } from \"./plugins/public-assets.ts\";\r\nimport { publicConfigPlugin } from \"./plugins/public-config.ts\";\r\nimport { reactCompilerPlugin } from \"./plugins/react-compiler.ts\";\r\nimport { svgReactPlugin } from \"./plugins/svg-react.ts\";\r\n\r\nimport type { CreateAppViteConfigOptions, CreateAppViteConfigResult } from \"./types.ts\";\r\n\r\n/** 根入口运行时资源前缀,供 JS `fetch` / 动态 URL 使用。与 HTML 子目录 `PUBLIC_PATH` 可能不同。 */\r\nconst JS_PUBLIC_PATH_DEFINE_KEY = \"import.meta.env.PUBLIC_PATH\";\r\n\r\n/** 规范化资源 base:空串视为未设置;非空则保证尾 `/`。 */\r\nfunction normalizeAssetBase(base: string | undefined): string | undefined {\r\n if (base == null) return undefined;\r\n const trimmed = base.trim();\r\n if (!trimmed) return undefined;\r\n return trimmed.endsWith(\"/\") ? trimmed : `${trimmed}/`;\r\n}\r\n\r\nfunction ensureTrailingSlash(value: string): string {\r\n return value.endsWith(\"/\") ? value : `${value}/`;\r\n}\r\n\r\n/**\r\n * JS 可读的根入口前缀。相对 hash 必须用 `./{hash}/`,不能用 Vite `base`(后者保持 `./`)。\r\n * 非 hash 则跟最终 `config.base`;serve 未设 base 时为 `\"/\"`。\r\n */\r\nfunction resolveJsPublicPath(isHash: boolean, publicPath: string, config: UserConfig): string {\r\n if (isHash) return publicPath;\r\n if (typeof config.base === \"string\" && config.base.length > 0) {\r\n return ensureTrailingSlash(config.base);\r\n }\r\n return publicPath || \"/\";\r\n}\r\n\r\nfunction applyJsPublicPathDefine(config: UserConfig, publicPath: string): UserConfig {\r\n config.define = {\r\n ...config.define,\r\n [JS_PUBLIC_PATH_DEFINE_KEY]: JSON.stringify(publicPath),\r\n };\r\n return config;\r\n}\r\n\r\n/**\r\n * 组装应用侧 Vite 配置。\r\n *\r\n * 合并顺序:`base(options) → mergeConfig(base, vite) → configure(final)`,\r\n * 之后写入 `import.meta.env.PUBLIC_PATH`(同名 `define` 会被覆盖)。\r\n *\r\n * 返回值附带只读 `buildDirHash`(本次 hash 子目录名;未启用时为 `\"\"`)。\r\n * @public\r\n */\r\nexport function createAppViteConfig(\r\n options: CreateAppViteConfigOptions,\r\n): CreateAppViteConfigResult {\r\n const {\r\n rootDir,\r\n repositoryRoot,\r\n command,\r\n mode,\r\n alias,\r\n useHttps = false,\r\n openBrowser = true,\r\n hashDeploy = false,\r\n hashTimestamp = \"epoch\",\r\n base: baseOption,\r\n deployRoot: deployRootOption = \"dist\",\r\n hashCleanup,\r\n publicAssets,\r\n publicConfig,\r\n copy: copyOption,\r\n htmlData,\r\n devProxy,\r\n reactCompiler = \"build-only\",\r\n react: enableReact = true,\r\n svgr: svgrOption = false,\r\n less,\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 const isHash = isBuild && Boolean(hashDeploy) && mode !== \"development\";\r\n const deployRoot = deployRootOption.replace(/\\/+$/, \"\") || \"dist\";\r\n const assetBase = normalizeAssetBase(baseOption);\r\n\r\n const buildDirStr = isHash\r\n ? createHashBuildDirName({\r\n repositoryRoot: repositoryRoot ?? rootDir,\r\n timestampFormat: hashTimestamp,\r\n })\r\n : \"\";\r\n /**\r\n * HTML / 根入口资源前缀(JS `import.meta.env.PUBLIC_PATH` 用这个)。\r\n * - hash + 相对:`./{hash}/`(Vite `base` 仍为 `./`,由插件改写根入口)\r\n * - hash + 绝对 base:`{base}{hash}/`(与 Vite `base` 一致)\r\n * - 普通 build:`base` 或 `./`\r\n */\r\n const publicPath = isHash\r\n ? `${assetBase ?? \"./\"}${buildDirStr}/`\r\n : isBuild\r\n ? (assetBase ?? \"./\")\r\n : \"\";\r\n /**\r\n * Hash 子目录入口相对于自身加载资源;根入口由 hashDeployPlugin 再补 hash 前缀。\r\n * 绝对 base 则两个入口都使用同一个完整 URL。\r\n */\r\n const htmlPublicPath = isHash && publicPath.startsWith(\"./\") ? \"./\" : publicPath;\r\n /** 相对 base(含默认 `./`)在 hash 下必须保持 Vite `base: \"./\"`,否则 `./{hash}/` 会被规范成 `/`。 */\r\n const isAbsoluteAssetBase =\r\n assetBase != null &&\r\n (assetBase.startsWith(\"https://\") ||\r\n assetBase.startsWith(\"http://\") ||\r\n assetBase.startsWith(\"/\"));\r\n const viteBase = isHash\r\n ? isAbsoluteAssetBase\r\n ? publicPath\r\n : \"./\"\r\n : isBuild\r\n ? publicPath\r\n : undefined;\r\n const enablePublicAssets = publicAssets !== false;\r\n\r\n const plugins: PluginOption[] = [\r\n ...(enablePublicAssets\r\n ? [publicAssetsPlugin(publicAssets && typeof publicAssets === \"object\" ? publicAssets : {})]\r\n : []),\r\n ...(svgrOption ? [svgReactPlugin(svgrOption === true ? {} : svgrOption)] : []),\r\n ...(enableReact ? [react()] : []),\r\n ...reactCompilerPlugin({ command, mode: reactCompiler }),\r\n ...(publicConfig === false || publicConfig == null\r\n ? []\r\n : [\r\n publicConfigPlugin({\r\n sourceGlob: publicConfig.sourceGlob ?? `config/public-config/${publicConfig.mode}/*`,\r\n dest: publicConfig.dest,\r\n }),\r\n ]),\r\n ...(copyOption ? [copyPlugin(copyOption)] : []),\r\n createHtmlPlugin({\r\n minify: isBuild,\r\n inject: {\r\n data: {\r\n ...htmlData,\r\n PUBLIC_PATH: htmlPublicPath || \"\",\r\n },\r\n },\r\n }),\r\n ...(isBuild && isHash\r\n ? [\r\n hashDeployPlugin({\r\n rootDir,\r\n buildDirStr,\r\n publicPath,\r\n cleanup: hashCleanup,\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 base: UserConfig = {\r\n root: rootDir,\r\n ...(viteBase != null ? { base: viteBase } : {}),\r\n plugins,\r\n ...(enablePublicAssets ? { publicDir: false } : {}),\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: isHash ? `${deployRoot}/${buildDirStr}/` : deployRoot,\r\n assetsDir: \"assets\",\r\n emptyOutDir: true,\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 applyJsPublicPathDefine(merged, resolveJsPublicPath(isHash, publicPath, merged));\r\n Object.defineProperty(merged, \"buildDirHash\", {\r\n value: buildDirStr,\r\n enumerable: false,\r\n configurable: true,\r\n });\r\n return merged as CreateAppViteConfigResult;\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/plugins/copy.ts","../src/plugins/hash-deploy.ts","../src/plugins/less-tilde.ts","../src/plugins/lifecycle.ts","../src/plugins/public-assets.ts","../src/plugins/public-config.ts","../src/plugins/react-compiler.ts","../src/plugins/svg-react.ts","../src/create-app-vite-config.ts"],"names":["repositoryRoot","fs"],"mappings":"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","file":"create-app-vite-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 { execFileSync } from \"node:child_process\";\r\nimport fs from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\nimport type { PluginOption } from \"vite\";\r\n\r\n/** @public */\r\nexport type HashTimestampFormat = \"epoch\" | \"datetime\";\r\n\r\n/** @public */\r\nexport interface HashBuildDirNameOptions {\r\n repositoryRoot?: string;\r\n now?: number;\r\n /** @defaultValue \"epoch\" */\r\n timestampFormat?: HashTimestampFormat;\r\n}\r\n\r\n/** @public */\r\nexport interface HashCleanupOptions {\r\n /**\r\n * 每次成功构建后保留的 Hash 版本总数(含本次构建)。\r\n * 必须为大于等于 1 的整数。\r\n */\r\n keep: number;\r\n}\r\n\r\n/** @public */\r\nexport interface HashDeployPluginOptions {\r\n rootDir: string;\r\n /** hash 子目录名,如 `{commit}-{timestamp}` 或 `{commit}-YYYY-MM-DD-HH-mm-ss` */\r\n buildDirStr: string;\r\n /**\r\n * 与最终 Vite `base` 一致的资源前缀。\r\n * - 默认相对:`./{buildDirStr}/`\r\n * - 自定义 CDN:`https://cdn.example.com/app/{buildDirStr}/`\r\n */\r\n publicPath: string;\r\n /** 旧 Hash 目录清理策略;未传时永久保留,由部署系统负责清理。 */\r\n cleanup?: HashCleanupOptions;\r\n}\r\n\r\nconst HASH_BUILD_DIR_PATTERN = /^(?:[0-9a-f]{12}|local)-(\\d{4}-\\d{2}-\\d{2}-\\d{2}-\\d{2}-\\d{2}|\\d+)$/;\r\n\r\nfunction parseHashTimestamp(value: string): number {\r\n if (/^\\d+$/.test(value)) return Number(value);\r\n const [year = 0, month = 1, day = 1, hour = 0, minute = 0, second = 0] = value\r\n .split(\"-\")\r\n .map(Number);\r\n return new Date(year, month - 1, day, hour, minute, second).getTime();\r\n}\r\n\r\nfunction padTwo(value: number): string {\r\n return String(value).padStart(2, \"0\");\r\n}\r\n\r\nfunction formatHashTimestamp(now: number, format: HashTimestampFormat = \"epoch\"): string {\r\n if (format !== \"datetime\") return String(now);\r\n const date = new Date(now);\r\n return [\r\n date.getFullYear(),\r\n padTwo(date.getMonth() + 1),\r\n padTwo(date.getDate()),\r\n padTwo(date.getHours()),\r\n padTwo(date.getMinutes()),\r\n padTwo(date.getSeconds()),\r\n ].join(\"-\");\r\n}\r\n\r\nfunction cleanupOldHashBuilds(deployRoot: string, currentBuildDir: string, keep: number): void {\r\n const oldBuilds = fs\r\n .readdirSync(deployRoot, { withFileTypes: true })\r\n .flatMap((entry) => {\r\n if (!entry.isDirectory() || entry.name === currentBuildDir) return [];\r\n const match = HASH_BUILD_DIR_PATTERN.exec(entry.name);\r\n return match ? [{ name: entry.name, timestamp: parseHashTimestamp(match[1]!) }] : [];\r\n })\r\n .sort((left, right) => right.timestamp - left.timestamp || right.name.localeCompare(left.name));\r\n\r\n for (const build of oldBuilds.slice(Math.max(keep - 1, 0))) {\r\n fs.rmSync(path.join(deployRoot, build.name), { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * 构建结束后写 `dist/hash.txt`,并把 hash 子目录中的 `index.html` 复制到 `dist/index.html`。\r\n * 相对 `base` 时为根入口补上 hash 前缀;绝对 `base` 时产物已含完整 URL,原样复制即可。\r\n * 配置 `cleanup.keep` 时,成功写入根入口后只保留指定数量的最新 Hash 版本。\r\n * @public\r\n */\r\nexport function hashDeployPlugin(options: HashDeployPluginOptions): PluginOption {\r\n const { rootDir, buildDirStr, publicPath, cleanup } = options;\r\n if (cleanup && (!Number.isInteger(cleanup.keep) || cleanup.keep < 1)) {\r\n throw new Error(\"[hash-deploy] cleanup.keep must be an integer greater than or equal to 1.\");\r\n }\r\n let outputDir: string | undefined;\r\n let deployRoot: string | undefined;\r\n\r\n return {\r\n name: \"hash-deploy\",\r\n enforce: \"post\",\r\n configResolved(config) {\r\n const resolvedRoot = path.resolve(config.root);\r\n const expectedRoot = path.resolve(rootDir);\r\n if (resolvedRoot !== expectedRoot) {\r\n throw new Error(\r\n `[hash-deploy] Vite root \"${resolvedRoot}\" must match rootDir \"${expectedRoot}\".`,\r\n );\r\n }\r\n // 相对 hash:工厂 publicPath 为 `./{hash}/`,但 Vite base 必须保持 `./`。\r\n const expectedBase = publicPath.startsWith(\"./\") ? \"./\" : publicPath;\r\n if (config.base !== expectedBase) {\r\n throw new Error(\r\n `[hash-deploy] Vite base \"${config.base}\" must remain \"${expectedBase}\" during hash deployment.`,\r\n );\r\n }\r\n\r\n outputDir = path.resolve(resolvedRoot, config.build.outDir);\r\n if (path.basename(outputDir) !== buildDirStr) {\r\n throw new Error(\r\n `[hash-deploy] build.outDir \"${config.build.outDir}\" must end with the hash directory \"${buildDirStr}\".`,\r\n );\r\n }\r\n deployRoot = path.dirname(outputDir);\r\n },\r\n writeBundle: {\r\n sequential: true,\r\n order: \"post\",\r\n handler() {\r\n if (!outputDir || !deployRoot) {\r\n throw new Error(\"[hash-deploy] Vite configuration was not resolved before writeBundle.\");\r\n }\r\n\r\n const sourceIndex = path.join(outputDir, \"index.html\");\r\n if (!fs.existsSync(sourceIndex)) {\r\n throw new Error(`[hash-deploy] Generated entry was not found: \"${sourceIndex}\".`);\r\n }\r\n\r\n fs.mkdirSync(deployRoot, { recursive: true });\r\n fs.writeFileSync(path.join(deployRoot, \"hash.txt\"), buildDirStr);\r\n const sourceHtml = fs.readFileSync(sourceIndex, \"utf8\");\r\n // 相对 base(`./{hash}/`)时子目录 HTML 中的资源均相对于自身,根入口需统一补 hash;\r\n // 绝对 base 时 Vite 已写出完整 URL,直接复制。\r\n const rootHtml = publicPath.startsWith(\"./\")\r\n ? sourceHtml.replace(/(\\b(?:href|src)\\s*=\\s*[\"'])\\.\\//g, `$1${publicPath}`)\r\n : sourceHtml;\r\n fs.writeFileSync(path.join(deployRoot, \"index.html\"), rootHtml);\r\n if (cleanup) {\r\n cleanupOldHashBuilds(deployRoot, buildDirStr, cleanup.keep);\r\n }\r\n },\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 从指定仓库读取短 commit hash;非 git 环境回退 `local`。\r\n * @public\r\n */\r\nexport function getCommitHash(repositoryRoot: string = process.cwd()): string {\r\n try {\r\n return execFileSync(\"git\", [\"rev-parse\", \"HEAD\"], {\r\n cwd: repositoryRoot,\r\n encoding: \"utf8\",\r\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\r\n })\r\n .trim()\r\n .slice(0, 12);\r\n } catch {\r\n return \"local\";\r\n }\r\n}\r\n\r\n/**\r\n * 生成 hash 构建目录名;保留仅传时间戳的旧调用方式。\r\n * @public\r\n */\r\nexport function createHashBuildDirName(now?: number): string;\r\n/** @public */\r\nexport function createHashBuildDirName(repositoryRoot: string, now?: number): string;\r\n/** @public */\r\nexport function createHashBuildDirName(options: HashBuildDirNameOptions): string;\r\nexport function createHashBuildDirName(\r\n repositoryRootOrNowOrOptions?: string | number | HashBuildDirNameOptions,\r\n now: number = Date.now(),\r\n): string {\r\n if (repositoryRootOrNowOrOptions != null && typeof repositoryRootOrNowOrOptions === \"object\") {\r\n const {\r\n repositoryRoot,\r\n now: optionsNow = Date.now(),\r\n timestampFormat = \"epoch\",\r\n } = repositoryRootOrNowOrOptions;\r\n return `${getCommitHash(repositoryRoot)}-${formatHashTimestamp(optionsNow, timestampFormat)}`;\r\n }\r\n const repositoryRoot =\r\n typeof repositoryRootOrNowOrOptions === \"string\" ? repositoryRootOrNowOrOptions : undefined;\r\n const timestamp =\r\n typeof repositoryRootOrNowOrOptions === \"number\" ? repositoryRootOrNowOrOptions : now;\r\n return `${getCommitHash(repositoryRoot)}-${formatHashTimestamp(timestamp)}`;\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 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 { 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","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","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 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 { copyPlugin } from \"./plugins/copy.ts\";\r\nimport { createHashBuildDirName, hashDeployPlugin } from \"./plugins/hash-deploy.ts\";\r\nimport { buildLessOptions } from \"./plugins/less-tilde.ts\";\r\nimport { lifecyclePlugin } from \"./plugins/lifecycle.ts\";\r\nimport { publicAssetsPlugin } from \"./plugins/public-assets.ts\";\r\nimport { publicConfigPlugin } from \"./plugins/public-config.ts\";\r\nimport { reactCompilerPlugin } from \"./plugins/react-compiler.ts\";\r\nimport { svgReactPlugin } from \"./plugins/svg-react.ts\";\r\n\r\nimport type { CreateAppViteConfigOptions, CreateAppViteConfigResult } from \"./types.ts\";\r\n\r\n/** 根入口运行时资源前缀,供 JS `fetch` / 动态 URL 使用。与 HTML 子目录 `PUBLIC_PATH` 可能不同。 */\r\nconst JS_PUBLIC_PATH_DEFINE_KEY = \"import.meta.env.PUBLIC_PATH\";\r\n\r\n/** 规范化资源 base:空串视为未设置;非空则保证尾 `/`。 */\r\nfunction normalizeAssetBase(base: string | undefined): string | undefined {\r\n if (base == null) return undefined;\r\n const trimmed = base.trim();\r\n if (!trimmed) return undefined;\r\n return trimmed.endsWith(\"/\") ? trimmed : `${trimmed}/`;\r\n}\r\n\r\nfunction ensureTrailingSlash(value: string): string {\r\n return value.endsWith(\"/\") ? value : `${value}/`;\r\n}\r\n\r\n/**\r\n * JS 可读的根入口前缀。相对 hash 必须用 `./{hash}/`,不能用 Vite `base`(后者保持 `./`)。\r\n * 非 hash 则跟最终 `config.base`;serve 未设 base 时为 `\"/\"`。\r\n */\r\nfunction resolveJsPublicPath(isHash: boolean, publicPath: string, config: UserConfig): string {\r\n if (isHash) return publicPath;\r\n if (typeof config.base === \"string\" && config.base.length > 0) {\r\n return ensureTrailingSlash(config.base);\r\n }\r\n return publicPath || \"/\";\r\n}\r\n\r\nfunction applyJsPublicPathDefine(config: UserConfig, publicPath: string): UserConfig {\r\n config.define = {\r\n ...config.define,\r\n [JS_PUBLIC_PATH_DEFINE_KEY]: JSON.stringify(publicPath),\r\n };\r\n return config;\r\n}\r\n\r\n/**\r\n * 组装应用侧 Vite 配置。\r\n *\r\n * 合并顺序:`base(options) → mergeConfig(base, vite) → configure(final)`,\r\n * 之后写入 `import.meta.env.PUBLIC_PATH`(同名 `define` 会被覆盖)。\r\n *\r\n * 返回值附带只读 `buildDirHash`(本次 hash 子目录名;未启用时为 `\"\"`)。\r\n * @public\r\n */\r\nexport function createAppViteConfig(\r\n options: CreateAppViteConfigOptions,\r\n): CreateAppViteConfigResult {\r\n const {\r\n rootDir,\r\n repositoryRoot,\r\n command,\r\n mode,\r\n alias,\r\n useHttps = false,\r\n openBrowser = true,\r\n hashDeploy = false,\r\n hashTimestamp = \"epoch\",\r\n base: baseOption,\r\n deployRoot: deployRootOption = \"dist\",\r\n hashCleanup,\r\n publicAssets,\r\n publicConfig,\r\n copy: copyOption,\r\n htmlData,\r\n devProxy,\r\n reactCompiler = \"build-only\",\r\n react: enableReact = true,\r\n svgr: svgrOption = false,\r\n less,\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 const isHash = isBuild && Boolean(hashDeploy) && mode !== \"development\";\r\n const deployRoot = deployRootOption.replace(/\\/+$/, \"\") || \"dist\";\r\n const assetBase = normalizeAssetBase(baseOption);\r\n\r\n const buildDirStr = isHash\r\n ? createHashBuildDirName({\r\n repositoryRoot: repositoryRoot ?? rootDir,\r\n timestampFormat: hashTimestamp,\r\n })\r\n : \"\";\r\n /**\r\n * HTML / 根入口资源前缀(JS `import.meta.env.PUBLIC_PATH` 用这个)。\r\n * - hash + 相对:`./{hash}/`(Vite `base` 仍为 `./`,由插件改写根入口)\r\n * - hash + 绝对 base:`{base}{hash}/`(与 Vite `base` 一致)\r\n * - 普通 build:`base` 或 `./`\r\n */\r\n const publicPath = isHash\r\n ? `${assetBase ?? \"./\"}${buildDirStr}/`\r\n : isBuild\r\n ? (assetBase ?? \"./\")\r\n : \"\";\r\n /**\r\n * Hash 子目录入口相对于自身加载资源;根入口由 hashDeployPlugin 再补 hash 前缀。\r\n * 绝对 base 则两个入口都使用同一个完整 URL。\r\n */\r\n const htmlPublicPath = isHash && publicPath.startsWith(\"./\") ? \"./\" : publicPath;\r\n /** 相对 base(含默认 `./`)在 hash 下必须保持 Vite `base: \"./\"`,否则 `./{hash}/` 会被规范成 `/`。 */\r\n const isAbsoluteAssetBase =\r\n assetBase != null &&\r\n (assetBase.startsWith(\"https://\") ||\r\n assetBase.startsWith(\"http://\") ||\r\n assetBase.startsWith(\"/\"));\r\n const viteBase = isHash\r\n ? isAbsoluteAssetBase\r\n ? publicPath\r\n : \"./\"\r\n : isBuild\r\n ? publicPath\r\n : undefined;\r\n const enablePublicAssets = publicAssets !== false;\r\n\r\n const plugins: PluginOption[] = [\r\n ...(enablePublicAssets\r\n ? [publicAssetsPlugin(publicAssets && typeof publicAssets === \"object\" ? publicAssets : {})]\r\n : []),\r\n ...(svgrOption ? [svgReactPlugin(svgrOption === true ? {} : svgrOption)] : []),\r\n ...(enableReact ? [react()] : []),\r\n ...reactCompilerPlugin({ command, mode: reactCompiler }),\r\n ...(publicConfig === false || publicConfig == null\r\n ? []\r\n : [\r\n publicConfigPlugin({\r\n sourceGlob: publicConfig.sourceGlob ?? `config/public-config/${publicConfig.mode}/*`,\r\n dest: publicConfig.dest,\r\n }),\r\n ]),\r\n ...(copyOption ? [copyPlugin(copyOption)] : []),\r\n createHtmlPlugin({\r\n minify: isBuild,\r\n inject: {\r\n data: {\r\n ...htmlData,\r\n PUBLIC_PATH: htmlPublicPath || \"\",\r\n },\r\n },\r\n }),\r\n ...(isBuild && isHash\r\n ? [\r\n hashDeployPlugin({\r\n rootDir,\r\n buildDirStr,\r\n publicPath,\r\n cleanup: hashCleanup,\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 base: UserConfig = {\r\n root: rootDir,\r\n ...(viteBase != null ? { base: viteBase } : {}),\r\n plugins,\r\n ...(enablePublicAssets ? { publicDir: false } : {}),\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: isHash ? `${deployRoot}/${buildDirStr}/` : deployRoot,\r\n assetsDir: \"assets\",\r\n emptyOutDir: true,\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 applyJsPublicPathDefine(merged, resolveJsPublicPath(isHash, publicPath, merged));\r\n Object.defineProperty(merged, \"buildDirHash\", {\r\n value: buildDirStr,\r\n enumerable: false,\r\n configurable: true,\r\n });\r\n return merged as CreateAppViteConfigResult;\r\n}\r\n"]}
@@ -150,7 +150,11 @@ function resolveLibraryFileName(fileName, formats) {
150
150
  if (formats.length === 1) {
151
151
  return () => "index.js";
152
152
  }
153
- return (format) => format === "es" ? "index.js" : `index.${format}.js`;
153
+ return (format) => {
154
+ if (format === "es") return "index.js";
155
+ if (format === "cjs") return "index.cjs";
156
+ return `index.${format}.js`;
157
+ };
154
158
  }
155
159
  function resolveLibraryGlobals(externals, globals) {
156
160
  const inferred = {};
@@ -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 插件:把 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: any, pluginManager: any) {\r\n class TildeFileManager extends less.FileManager {\r\n supports(filename: string) {\r\n return filename.startsWith(\"~\");\r\n }\r\n loadFile(filename: string, currentDirectory: string, options: any, environment: any) {\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 return (format) => (format === \"es\" ? \"index.js\" : `index.${format}.js`);\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","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"]}
@@ -140,7 +140,11 @@ function resolveLibraryFileName(fileName, formats) {
140
140
  if (formats.length === 1) {
141
141
  return () => "index.js";
142
142
  }
143
- return (format) => format === "es" ? "index.js" : `index.${format}.js`;
143
+ return (format) => {
144
+ if (format === "es") return "index.js";
145
+ if (format === "cjs") return "index.cjs";
146
+ return `index.${format}.js`;
147
+ };
144
148
  }
145
149
  function resolveLibraryGlobals(externals, globals) {
146
150
  const inferred = {};