create-fullstack-scaffold 0.5.3 → 0.5.7
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/dist/cli/index.js +15 -20
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
- package/template/package.json +1 -5
- package/template/src/client/entry-server.tsx +7 -1
- package/template/src/client/main.tsx +0 -8
- package/template/src/client/pages/ContentDetailPage.tsx +1 -1
- package/template/src/client/pages/ContentListPage.tsx +1 -1
- package/template/src/client/pages/TodoPage.tsx +20 -4
- package/template/src/client/ssr-pages.ts +10 -21
- package/template/src/server/entries/node.ts +67 -12
- package/template/src/server/ssr-bridge.ts +10 -0
- package/template/vite.config.ts +4 -73
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/generators/template-generator.ts","../../src/generators/file-filter.ts","../../src/generators/route-registry.ts","../../src/generators/rpc-surface.ts","../../src/generators/isr-modules.ts","../../src/generators/entry-stores.ts","../../src/generators/ssr-pages.ts","../../src/generators/client-navigation.ts","../../src/generators/client-app-test.ts","../../src/generators/client-navigation-test.ts","../../src/generators/admin-app.ts","../../src/generators/db-schema-barrel.ts","../../src/generators/db-init.ts","../../src/generators/server-app.ts","../../src/generators/shared-modules-index.ts","../../src/generators/shared-schemas-index.ts","../../src/generators/middleware-index.ts","../../src/generators/auth-middleware.ts","../../src/generators/auth-utils.ts","../../src/generators/client-components-index.ts","../../src/generators/cli-modules-index.ts","../../src/generators/package-json.ts","../../src/generators/vite-config.ts","../../src/generators/client-preset-ui-config.ts","../../src/generators/client-main.ts","../../src/commands/create.ts","../../src/index.ts"],"names":["key","moduleOrder","STANDALONE_SHARED_MODULES","MODULE_EXPORTS","pkg","join","path","getPresetType","__filename","__dirname","generatedFiles","gitignorePath","ignorePatterns","excludePatterns","fileURLToPath","readFileSync","chalk"],"mappings":";;;;;;;;;;AA+DA,IAAI,UAAA;AAEJ,eAAe,WAAA,GAAmC;AAChD,EAAA,IAAI,YAAY,OAAO,UAAA;AACvB,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,aAAa,CAAA;AAC/C,EAAA,UAAA,GAAa,QAAA;AACb,EAAA,OAAO,UAAA;AACT;AAEA,eAAsB,cAAc,WAAA,EAA2D;AAC7F,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAY;AACnC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,EAAa,KAAA,EAAO,QAAQ,CAAA;AACnD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA4B;AAEhD,EAAA,MAAM,OAAA,GAAU,YAAY,SAAS,CAAA;AACrC,EAAA,MAAM,aAAa,OAAA,CAAQ,MAAA;AAAA,IACzB,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,CAAW,SAAS,CAAA,IAAK,QAAA,CAAS,IAAA,CAAK,SAAA,EAAW,CAAC,CAAC,CAAA,CAAE,WAAA;AAAY,GAC3E;AAEA,EAAA,MAAM,YAAY,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,UAAU,CAAC,CAAA,CAAE,IAAA;AAE7D,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,EAAW,GAAA,EAAK,WAAW,CAAA;AACrD,IAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,QAAA,CAAS,YAAA,EAAc,EAAE,WAAW,CAAA;AACtD,MAAA,MAAM,WAA2B,GAAA,CAAI,OAAA;AACrC,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,CAAS,IAAA,EAAM;AAC/B,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAAyB,GAAG,CAAA,cAAA,CAAgB,CAAA;AAC1D,QAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAAA,IACrC,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAkC,GAAG,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,YAAY,WAAA,EAAgD;AAChF,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,EAAa,mBAAmB,CAAA;AACxD,EAAA,IAAI,CAAC,UAAA,CAAW,UAAU,CAAA,EAAG;AAC3B,IAAA,OAAO,CAAC,kBAAkB,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAY;AACnC,IAAA,MAAM,SAAA,GAAY,aAAA,CAAc,UAAU,CAAA,CAAE,IAAA;AAC5C,IAAA,MAAM,MAAM,MAAM,QAAA,CAAS,UAAA,EAAY,EAAE,WAAW,CAAA;AACpD,IAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,MAAA,OAAO,GAAA,CAAI,gBAAA;AAAA,IACb;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,kCAA6B,GAAG,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO,CAAC,kBAAkB,CAAA;AAC5B;AAEA,SAAS,gBAAA,GAAmC;AAC1C,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,iBAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,WAAA,EAAa,sBAAA;AAAA,IACb,OAAA,EAAS;AAAA,MACP,OAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;AAEO,SAAS,aAAA,CACd,QACA,YAAA,EACgB;AAChB,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA4B;AAEhD,EAAA,MAAM,SAAA,GAAY,CAAC,GAAG,MAAA,CAAO,OAAO,CAAA;AACpC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAElC,EAAA,OAAO,SAAA,CAAU,SAAS,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAA,GAAO,UAAU,KAAA,EAAM;AAC7B,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AACzB,IAAA,SAAA,CAAU,IAAI,IAAI,CAAA;AAElB,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AACtC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,QAAQ,CAAA;AAC1B,MAAA,KAAA,MAAW,GAAA,IAAO,SAAS,SAAA,EAAW;AACpC,QAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,UAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,IAAI,QAAA,GAAW,KAAA;AAEf,EAAA,KAAA,MAAW,QAAA,IAAY,OAAA,CAAQ,MAAA,EAAO,EAAG;AACvC,IAAA,IAAI,QAAA,CAAS,QAAQ,MAAA,GAAS,IAAA;AAC9B,IAAA,IAAI,QAAA,CAAS,cAAc,YAAA,GAAe,IAAA;AAC1C,IAAA,IAAI,SAAS,UAAA,IAAc,QAAA,CAAS,UAAA,CAAW,MAAA,GAAS,GAAG,QAAA,GAAW,IAAA;AACtE,IAAA,IAAI,QAAA,CAAS,OAAO,KAAA,IAAS,QAAA,CAAS,OAAO,KAAA,CAAM,MAAA,GAAS,GAAG,QAAA,GAAW,IAAA;AAAA,EAC5E;AAEA,EAAA,MAAM,SAAA,GAAY,OAAO,EAAA,KAAO,UAAA;AAEhC,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAW,CAAC,SAAA;AAAA,IACZ,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AAAA,IACvC,UAAA,EAAY,OAAA,CAAQ,GAAA,CAAI,SAAS;AAAA,GACnC;AACF;AAoBO,SAAS,iBAAiB,QAAA,EAAoC;AACnE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,GAAG,QAAQ,CAAA,IAAK,SAAS,OAAA,EAAS;AAC3C,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAA,CAAS,SAAA,CAAU,KAAK,CAAA;AAAA,IACxC;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,eAAe,QAAA,EAA6D;AAC1F,EAAA,MAAM,QAA2C,EAAC;AAClD,EAAA,KAAA,MAAW,GAAG,QAAQ,CAAA,IAAK,SAAS,OAAA,EAAS;AAC3C,IAAA,IAAI,SAAS,WAAA,EAAa;AACxB,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAA,CAAS,WAAW,CAAA;AAAA,IACpC;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAc,QAAA,EAAwD;AACpF,EAAA,MAAM,QAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,GAAG,QAAQ,CAAA,IAAK,SAAS,OAAA,EAAS;AAC3C,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAA,CAAS,UAAU,CAAA;AAAA,IACnC;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;;;ACzOO,SAAS,kBAAA,CACd,UACA,YAAA,EACU;AACV,EAAA,MAAM,WAAqB,EAAC;AAI5B,EAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,sBAAA;AAAA,MACA,kBAAA;AAAA,MACA,kCAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAIA,EAAA,QAAA,CAAS,KAAK,+BAA+B,CAAA;AAE7C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,CAAA,IAAK,YAAA,EAAc;AAC3C,IAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AAEhC,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE,CAAA;AAEzC,IAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,mBAAA,EAAsB,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA,CAAE,CAAA;AACjE,MAAA,IAAI,QAAA,CAAS,cAAc,eAAA,EAAiB;AAC1C,QAAA,KAAA,MAAW,KAAA,IAAS,QAAA,CAAS,aAAA,CAAc,eAAA,EAAiB;AAC1D,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,mBAAA,EAAsB,KAAK,CAAA,CAAE,CAAA;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,SAAA,CAAU,KAAA,EAAO;AAC3C,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,qBAAA,EAAwB,IAAI,CAAA,GAAA,CAAK,CAAA;AAAA,MACjD;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,WAAA,EAAa;AACxB,MAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,WAAA,EAAa;AACvC,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,iBAAA,EAAoB,IAAA,CAAK,IAAI,CAAA,IAAA,CAAM,CAAA;AACjD,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,2BAAA,EAA8B,IAAA,CAAK,IAAI,CAAA,SAAA,CAAW,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,YAAA,EAAc;AACzB,MAAA,KAAA,MAAW,KAAA,IAAS,SAAS,YAAA,EAAc;AACzC,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,kBAAA,EAAqB,KAAK,CAAA,GAAA,CAAK,CAAA;AAC7C,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,4BAAA,EAA+B,KAAK,CAAA,QAAA,CAAU,CAAA;AAAA,MAC9D;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,UAAA,EAAY;AACtC,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,gBAAA,EAAmB,IAAA,CAAK,IAAI,CAAA,IAAA,CAAM,CAAA;AAChD,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,0BAAA,EAA6B,IAAA,CAAK,IAAI,CAAA,SAAA,CAAW,CAAA;AAAA,MACjE;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,kBAAA,EAAoB;AAC/B,MAAA,KAAA,MAAW,EAAA,IAAM,SAAS,kBAAA,EAAoB;AAC5C,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,sBAAA,EAAyB,EAAA,CAAG,IAAI,CAAA,GAAA,CAAK,CAAA;AACnD,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,gCAAA,EAAmC,EAAA,CAAG,IAAI,CAAA,QAAA,CAAU,CAAA;AAAA,MACpE;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,QAAA,CAAS,KAAK,oDAAoD,CAAA;AAAA,IACpE;AAGA,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,gBAAA,EAAmB,QAAA,CAAS,SAAA,CAAU,GAAG,CAAA,CAAE,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAClC,IAAA,QAAA,CAAS,KAAK,WAAW,CAAA;AACzB,IAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,IAAA,QAAA,CAAS,KAAK,kBAAkB,CAAA;AAAA,EAClC;AAGA,EAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AACnC,IAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,IAAA,QAAA,CAAS,KAAK,aAAa,CAAA;AAC3B,IAAA,QAAA,CAAS,KAAK,2CAA2C,CAAA;AACzD,IAAA,QAAA,CAAS,KAAK,0DAA0D,CAAA;AAAA,EAC1E;AACA,EAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,EAAG;AACrC,IAAA,QAAA,CAAS,KAAK,cAAc,CAAA;AAC5B,IAAA,QAAA,CAAS,KAAK,eAAe,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,IAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,IAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,IAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,IAAA,QAAA,CAAS,KAAK,kBAAkB,CAAA;AAChC,IAAA,QAAA,CAAS,KAAK,WAAW,CAAA;AACzB,IAAA,QAAA,CAAS,KAAK,gBAAgB,CAAA;AAC9B,IAAA,QAAA,CAAS,KAAK,mBAAmB,CAAA;AACjC,IAAA,QAAA,CAAS,KAAK,oBAAoB,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,IAAA,QAAA,CAAS,KAAK,sCAAsC,CAAA;AACpD,IAAA,QAAA,CAAS,KAAK,qDAAqD,CAAA;AAAA,EACrE,CAAA,MAAA,IAAW,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,IAAK,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1E,IAAA,QAAA,CAAS,KAAK,sCAAsC,CAAA;AACpD,IAAA,QAAA,CAAS,KAAK,qDAAqD,CAAA;AACnE,IAAA,QAAA,CAAS,KAAK,0BAA0B,CAAA;AAAA,EAC1C;AAEA,EAAA,QAAA,CAAS,KAAK,gCAAgC,CAAA;AAQ9C,EAAA,MAAM,uBAAA,GAA0F;AAAA,IAC9F,IAAA,EAAM,EAAE,KAAA,EAAO,CAAC,UAAU,CAAA,EAAE;AAAA,IAC5B,SAAA,EAAW,EAAE,KAAA,EAAO,CAAC,YAAA,EAAc,aAAa,CAAA,EAAG,aAAA,EAAe,CAAC,SAAS,CAAA,EAAE;AAAA,IAC9E,SAAA,EAAW,EAAE,KAAA,EAAO,CAAC,eAAe,CAAA;AAAE,GACxC;AACA,EAAA,KAAA,MAAW,CAAC,UAAA,EAAY,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,uBAAuB,CAAA,EAAG;AAE1E,IAAA,MAAM,eAAA,GACJ,OAAO,KAAA,IACP,CAAC,GAAG,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,MAC7B,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,MAAA,CAAO,KAAA,CAAO,QAAA,CAAS,CAAA,CAAE,IAAI,CAAC,CAAA,IAAK;AAAA,KACnE;AAEF,IAAA,MAAM,uBAAA,GACJ,MAAA,CAAO,aAAA,EAAe,IAAA,CAAK,CAAA,EAAA,KAAM,SAAS,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAC,CAAA,IAAK,KAAA;AAChE,IAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,uBAAA,EAAyB;AAChD,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,mBAAA,EAAsB,UAAU,CAAA,CAAE,CAAA;AAAA,IAClD;AAAA,EACF;AAKA,EAAA,IAAI,CAAC,SAAS,aAAA,IAAiB,CAAC,SAAS,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5D,IAAA,QAAA,CAAS,KAAK,sCAAsC,CAAA;AACpD,IAAA,QAAA,CAAS,KAAK,qDAAqD,CAAA;AACnE,IAAA,QAAA,CAAS,KAAK,qDAAqD,CAAA;AACnE,IAAA,QAAA,CAAS,KAAK,8CAA8C,CAAA;AAC5D,IAAA,QAAA,CAAS,KAAK,+DAA+D,CAAA;AAC7E,IAAA,QAAA,CAAS,KAAK,yCAAyC,CAAA;AAAA,EACzD,CAAA,MAAA,IAAW,CAAC,QAAA,CAAS,aAAA,IAAiB,SAAS,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AAClE,IAAA,QAAA,CAAS,KAAK,sCAAsC,CAAA;AACpD,IAAA,QAAA,CAAS,KAAK,qDAAqD,CAAA;AACnE,IAAA,QAAA,CAAS,KAAK,qDAAqD,CAAA;AACnE,IAAA,QAAA,CAAS,KAAK,8CAA8C,CAAA;AAC5D,IAAA,QAAA,CAAS,KAAK,+DAA+D,CAAA;AAC7E,IAAA,QAAA,CAAS,KAAK,yCAAyC,CAAA;AACvD,IAAA,QAAA,CAAS,KAAK,uDAAuD,CAAA;AAAA,EACvE,WAAW,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACzC,IAAA,QAAA,CAAS,KAAK,+DAA+D,CAAA;AAAA,EAC/E;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AACpC,IAAA,QAAA,CAAS,KAAK,4CAA4C,CAAA;AAE1D,IAAA,QAAA,CAAS,KAAK,uCAAuC,CAAA;AACrD,IAAA,QAAA,CAAS,KAAK,kCAAkC,CAAA;AAChD,IAAA,QAAA,CAAS,KAAK,iDAAiD,CAAA;AAC/D,IAAA,QAAA,CAAS,KAAK,yDAAyD,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,kBAAkB,QAAA,EAAoC;AACpE,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,8BAAA;AAAA,IACA,2BAAA;AAAA,IACA,2BAAA;AAAA,IACA,mCAAA;AAAA,IACA,yBAAA;AAAA,IACA,+BAAA;AAAA,IACA,6BAAA;AAAA,IACA,6BAAA;AAAA,IACA,gCAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,oBAAA;AAAA,MACA,sCAAA;AAAA,MACA,gCAAA;AAAA,MACA,uBAAA;AAAA,MACA,8CAAA;AAAA,MACA,qDAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,SAAA,IAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACvD,IAAA,KAAA,CAAM,KAAK,mBAAmB,CAAA;AAC9B,IAAA,KAAA,CAAM,KAAK,+BAA+B,CAAA;AAC1C,IAAA,KAAA,CAAM,KAAK,iCAAiC,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,SAAS,SAAA,IAAa,CAAC,SAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACxD,IAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,SAAS,SAAA,IAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAEvD,IAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,CAAC,SAAS,aAAA,EAAe;AAC3B,IAAA,KAAA,CAAM,KAAK,+BAA+B,CAAA;AAC1C,IAAA,KAAA,CAAM,KAAK,0BAA0B,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,IAAI,OAAO,CAAA,IAAK,SAAS,aAAA,EAAe;AAC5D,IAAA,KAAA,CAAM,KAAK,0BAA0B,CAAA;AAAA,EACvC;AAGA,EAAA,KAAA,CAAM,KAAK,uBAAuB,CAAA;AAElC,EAAA,OAAO,KAAA;AACT;;;AC7OO,SAAS,sBAAsB,QAAA,EAAkC;AACtE,EAAA,MAAM,OAAA,GAAoB;AAAA,IACxB,CAAA,+CAAA,CAAA;AAAA,IACA,CAAA,6DAAA;AAAA,GACF;AAEA,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,cAAwB,EAAC;AAE/B,EAAA,MAAM,gBAAgB,CAAC,GAAG,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA;AAEpD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAElC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,CAAA,IAAK,aAAA,EAAe;AAC5C,IAAA,MAAM,SAAA,GAAY,UAAU,IAAI,CAAA,CAAA;AAEhC,IAAA,IAAI,QAAA,CAAS,OAAO,MAAA,EAAQ;AAC1B,MAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,GACxD,QAAA,CAAS,MAAA,CAAO,MAAA,GAChB,CAAC,QAAA,CAAS,OAAO,MAAM,CAAA;AAC3B,MAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,QAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAW,GAAI,KAAA;AACnC,QAAA,MAAM,YAAY,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,GACtC,CAAA,EAAG,IAAI,CAAA,EAAG,UAAA,CAAW,OAAO,CAAC,CAAA,CAAE,aAAa,CAAA,EAAG,WAAW,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAClE,UAAA;AACJ,QAAA,SAAA,CAAU,IAAI,SAAS,CAAA;AACvB,QAAA,MAAM,UAAA,GACJ,cAAc,UAAA,GACV,CAAA,SAAA,EAAY,UAAU,CAAA,WAAA,EAAc,SAAS,IAAI,UAAA,CAAW,OAAA,CAAQ,SAAS,EAAE,CAAC,MAChF,CAAA,SAAA,EAAY,UAAU,OAAO,SAAS,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,EAAI,UAAA,CAAW,OAAA;AAAA,UAC1E,OAAA;AAAA,UACA;AAAA,SACD,CAAA,CAAA,CAAA;AACP,QAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AACvB,QAAA,YAAA,CAAa,IAAA,CAAK,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,MACpD;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACzB,MAAA,KAAA,MAAW,KAAA,IAAS,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO;AACzC,QAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAW,GAAI,KAAA;AACnC,QAAA,MAAM,YAAY,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,GACtC,CAAA,EAAG,IAAI,CAAA,EAAG,UAAA,CAAW,OAAO,CAAC,CAAA,CAAE,aAAa,CAAA,EAAG,WAAW,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAClE,UAAA;AACJ,QAAA,SAAA,CAAU,IAAI,SAAS,CAAA;AACvB,QAAA,MAAM,UAAA,GACJ,cAAc,UAAA,GACV,CAAA,SAAA,EAAY,UAAU,CAAA,WAAA,EAAc,SAAS,IAAI,UAAA,CAAW,OAAA,CAAQ,SAAS,EAAE,CAAC,MAChF,CAAA,SAAA,EAAY,UAAU,OAAO,SAAS,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,EAAI,UAAA,CAAW,OAAA;AAAA,UAC1E,OAAA;AAAA,UACA;AAAA,SACD,CAAA,CAAA,CAAA;AACP,QAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AACvB,QAAA,WAAA,CAAY,IAAA,CAAK,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,MACnD;AAAA,IACF;AAAA,EAGF;AAEA,EAAA,IAAI,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AAEnC,EAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,EAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,EAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,EAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,EAAA,OAAA,IAAW,CAAA;;AAAA,CAAA;AAEX,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AAAA,EACvC,CAAA,MAAO;AACL,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,CAAA;;AAAA,CAAA;AAAA,EACb;AAEA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AAAA,EACtC,CAAA,MAAO;AACL,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,CAAA;;AAAA,CAAA;AAAA,EACb;AAEA,EAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AAEX,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,oBAAoB,QAAA,EAA6C;AAC/E,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAElC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,CAAA,IAAK,SAAS,OAAA,EAAS;AAC/C,IAAA,IAAI,QAAA,CAAS,OAAO,UAAA,EAAY;AAC9B,MAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAU,GAAI,SAAS,MAAA,CAAO,UAAA;AAClD,MAAA,MAAM,YAAY,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,GACtC,CAAA,EAAG,IAAI,CAAA,EAAG,UAAA,CAAW,OAAO,CAAC,CAAA,CAAE,aAAa,CAAA,EAAG,WAAW,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAClE,UAAA;AACJ,MAAA,SAAA,CAAU,IAAI,SAAS,CAAA;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,SAAA,EAAW,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC1FA,SAAS,gBAAgB,OAAA,EAA2B;AAClD,EAAA,MAAM,EAAA,GAAK,gDAAA;AACX,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,CAAA;AACJ,EAAA,OAAA,CAAQ,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,OAAO,CAAA,MAAO,MAAM,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,CAAC,CAAC,CAAA;AACvD,EAAA,OAAO,KAAA;AACT;AAOA,SAAS,eAAA,CACP,OAAA,EACA,aAAA,EACA,OAAA,EACA,QAAQ,CAAA,EACE;AACV,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAAA,GAAS,kCAAA;AACf,EAAA,IAAI,CAAA;AACJ,EAAA,OAAA,CAAQ,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,MAAO,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAEzD,EAAA,IAAI,QAAQ,CAAA,EAAG;AAEb,IAAA,MAAM,QAAA,GAAW,mDAAA;AACjB,IAAA,OAAA,CAAQ,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAC5C,MAAA,MAAM,QAAQ,CAAA,CAAE,CAAC,EACd,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAA,EAAK,CAAE,MAAM,MAAM,CAAA,CAAE,CAAC,CAAC,CAAA,CAClC,OAAO,OAAO,CAAA;AACjB,MAAA,MAAM,UAAU,CAAA,CAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,SAAS,EAAE,CAAA;AAExC,MAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AAAA,QAAK,CAAA,CAAA,KAC3B,IAAI,MAAA,CAAO,CAAA,2BAAA,EAA8B,CAAC,CAAA,OAAA,CAAS,CAAA,CAAE,KAAK,OAAO;AAAA,OACnE;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,MAAM,MAAM,aAAA,CAAc,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AACjD,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,KAAA,MAAW,CAAA,IAAK,eAAA,CAAgB,GAAA,EAAK,aAAA,EAAe,OAAA,EAAS,QAAQ,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AAAA,MACrF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,IAAI,CAAA;AACjB;AAEO,SAAS,kBAAA,CACd,UACA,aAAA,EACQ;AACR,EAAA,MAAM,UAA2B,EAAC;AAClC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAElC,EAAA,MAAM,OAAA,GAAU,CACd,UAAA,EACA,QAAA,EACAA,IAAAA,KACG;AACH,IAAA,MAAM,GAAA,GAAO,QAAA,CAAS,MAAA,CAAmCA,IAAG,CAAA;AAC5D,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,GAAM,CAAC,GAAG,CAAA;AAC5C,IAAA,KAAA,MAAW,SAAS,IAAA,EAA2D;AAE7E,MAAA,MAAM,SAAA,GAAY,CAAA,OAAA,EAAU,UAAU,CAAA,CAAA,EAAI,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAC,CAAA,CAAA;AACpG,MAAA,IAAI,SAAA,GAAY,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,GAC1C,CAAA,EAAG,SAAA,CACA,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,EAAI,CACJ,OAAA;AAAA,QAAQ,WAAA;AAAA,QAAa,CAAC,CAAA,EAAG,CAAA,KACxB,CAAA,CAAE,WAAA;AAAY,OACf,CAAA,EAAG,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,MAAM,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,KAC1E,KAAA,CAAM,UAAA;AACV,MAAA,OAAO,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA,EAAG,SAAA,IAAa,GAAA;AAC9C,MAAA,SAAA,CAAU,IAAI,SAAS,CAAA;AAEvB,MAAA,MAAM,OAAA,GAAU,cAAc,SAAS,CAAA;AACvC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,SAAA,GAAY,gBAAgB,OAAO,CAAA;AACzC,MAAA,MAAM,QAAA,GAAW,eAAA;AAAA,QACf,OAAA;AAAA,QACA,aAAA;AAAA,QACA,SAAA,CAAU,MAAM,GAAG,CAAA,CAAE,MAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG;AAAA,OAC5C;AACA,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,OAAA,CAAQ,KAAK,EAAE,SAAA,EAAW,SAAA,EAAW,QAAA,EAAU,UAAU,CAAA;AAAA,MAC3D;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,MAAW,CAAC,UAAA,EAAY,QAAQ,CAAA,IAAK,CAAC,GAAG,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,CAAA,EAAG;AACpE,IAAA,OAAA,CAAQ,UAAA,EAAY,UAAmB,QAAQ,CAAA;AAC/C,IAAA,OAAA,CAAQ,UAAA,EAAY,UAAmB,OAAO,CAAA;AAAA,EAChD;AAGA,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAGxB;AACF,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,GAAA,KAAQ;AAC1B,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,QAAA,EAAU;AAC5B,MAAA,MAAM,IAAA,GAAO,aAAA,CAAc,GAAA,CAAI,GAAG,KAAK,EAAC;AACxC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,SAAA,EAAW,CAAA,CAAE,SAAA,EAAW,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,SAAA,EAAW,CAAA,CAAE,SAAA,EAAW,GAAA,EAAK,CAAA;AACvF,MAAA,aAAA,CAAc,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoB,CAAC,GAAG,aAAA,CAAc,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAA,MAAA,KAAU,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAEtF,EAAA,MAAM,OAAA,GAAoB;AAAA,IACxB,CAAA,gCAAA,CAAA;AAAA,IACA,GAAI,iBAAA,GAAoB,CAAC,CAAA,6CAAA,CAA+C,IAAI;AAAC,GAC/E;AACA,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,OAAA,CAAQ,KAAK,CAAA,cAAA,EAAiB,CAAA,CAAE,QAAQ,CAAA,WAAA,EAAc,CAAA,CAAE,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,IAAA,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,CAAE,SAAS,SAAS,CAAC,CAAA,MAAA,EAAS,CAAA,CAAE,QAAQ,CAAA,eAAA,CAAiB,CAAA;AAAA,EACnF,CAAC,CAAA;AAED,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,MAAM,GAAA,GAAM,CAAC,GAAA,KAAiB,wBAAA,CAAyB,KAAK,GAAG,CAAA,GAAI,GAAA,GAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAA;AAEhF,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAiB,wBAAA,CAAyB,IAAA,CAAK,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,CAAA;AAC1F,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,CAAA,IAAK,aAAA,EAAe;AAEzC,IAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,GAAA,GAAM,EAAE,GAAG,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,SAAS,CAAA,MAAA,EAAS,CAAA,CAAE,GAAG,CAAA,EAAG,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AACzE,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,IAAA,CAAK,WAAW,CAAA,GACZ,CAAA,MAAA,EAAS,IAAI,GAAG,CAAC,KAAK,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,CAAA,GAC7B,CAAA,MAAA,EAAS,IAAI,GAAG,CAAC,qBAAqB,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA;AAAA,KAC3D;AAAA,EACF;AAEA,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAWP,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAYlB,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA;AAAA,EAIlB,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAOpB;;;ACjMO,SAAS,kBAAA,CACd,UACA,gBAAA,EACQ;AACR,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,CAAC,UAAU,CAAA,IAAK,CAAC,GAAG,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,CAAA,EAAG;AAC1D,IAAA,IAAI,gBAAA,CAAiB,UAAA,EAAY,QAAQ,CAAA,EAAG;AAC1C,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAA0B,UAAU,CAAA,KAAA,CAAO,CAAA;AAAA,IAC1D;AAAA,EACF;AAEA,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAQP,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AAEpB;;;ACtBO,SAAS,mBAAA,CACd,UACA,gBAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,SAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,IAAK,gBAAA,CAAiB,SAAS,cAAc,CAAA;AAE1F,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;AAAA,EAiBT;AAEA,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAiCT;;;ACvDA,IAAM,YAAA,GAA4F;AAAA,EAChG,EAAE,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,OAAO,QAAA,EAAS;AAAA,EAC3D,EAAE,IAAA,EAAM,iBAAA,EAAmB,SAAA,EAAW,iBAAA,EAAmB,OAAO,UAAA,EAAW;AAAA,EAC3E;AAAA,IACE,IAAA,EAAM,mBAAA;AAAA,IACN,SAAA,EAAW,mBAAA;AAAA,IACX,KAAA,EAAO,cAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,EAAE,IAAA,EAAM,YAAA,EAAc,SAAA,EAAW,YAAA,EAAc,OAAO,SAAA;AACxD,CAAA;AAEO,SAAS,gBAAA,CACd,UACA,cAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,eAAe,QAAQ,CAAA;AACrC,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAEhD,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,IAAI,KAAK,CAAC,cAAA,CAAe,CAAA,CAAE,IAAI,CAAA,EAAG;AACvD,IAAA,OAAA,CAAQ,KAAK,CAAA,SAAA,EAAY,CAAA,CAAE,SAAS,CAAA,iBAAA,EAAoB,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAA;AACjE,IAAA,OAAA,CAAQ,KAAK,CAAA,GAAA,EAAM,CAAA,CAAE,KAAK,CAAA,GAAA,EAAM,CAAA,CAAE,SAAS,CAAA,CAAA,CAAG,CAAA;AAC9C,IAAA,IAAI,EAAE,OAAA,EAAS;AACb,MAAA,QAAA,CAAS,KAAK,CAAA,aAAA,EAAgB,CAAA,CAAE,OAAO,CAAA,cAAA,EAAiB,CAAA,CAAE,SAAS,CAAA,GAAA,CAAK,CAAA;AAAA,IAC1E;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAA,KAAW,CAAA;AAEnC,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,EAUP,OAAA,GACI;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA,GASA;AAAA,EACJ,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA,EAGlB,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA,EAIlB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAYrB,CAAA,CAAA;AACA;;;ACrFA,IAAM,YAAA,GAAe,QAAA;AAErB,IAAM,QAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,aAAA;AAAA,EACV,gBAAA,EAAkB,MAAA;AAAA,EAClB,aAAA,EAAe,MAAA;AAAA,EACf,eAAA,EAAiB,UAAA;AAAA,EACjB,WAAA,EAAa,SAAA;AAAA,EACb,cAAA,EAAgB,MAAA;AAAA,EAChB,UAAA,EAAY,QAAA;AAAA,EACZ,WAAA,EAAa,QAAA;AAAA,EACb,sBAAA,EAAwB,MAAA;AAAA,EACxB,gBAAA,EAAkB,SAAA;AAAA,EAClB,UAAA,EAAY,MAAA;AAAA,EACZ,WAAA,EAAa,MAAA;AAAA,EACb,aAAA,EAAe,iBAAA;AAAA,EACf,YAAA,EAAc,UAAA;AAAA,EACd,QAAA,EAAU,cAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AAEO,SAAS,yBAAyB,QAAA,EAAkC;AACzE,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,KAAA,CAAM,QAAA,CAAS,GAAG,CAAC,CAAA;AACzE,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAE3C,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,IAAK,YAAA;AACpC,IAAA,MAAM,KAAA,GACJ,IAAA,CAAK,IAAA,KAAS,UAAA,GACV,UACA,IAAA,CAAK,IAAA,KAAS,kBAAA,GACd,eAAA,GACA,KAAK,IAAA,KAAS,eAAA,GACd,WAAA,GACA,IAAA,CAAK,SAAS,aAAA,GACd,SAAA,GACA,IAAA,CAAK,IAAA,KAAS,mBACd,YAAA,GACA,IAAA,CAAK,IAAA,KAAS,YAAA,GACd,WACA,IAAA,CAAK,IAAA,KAAS,aAAA,GACd,SAAA,GACA,KAAK,IAAA,KAAS,wBAAA,GACd,WAAA,GACA,IAAA,CAAK,SAAS,YAAA,GACd,QAAA,GACA,IAAA,CAAK,IAAA,KAAS,gBACd,SAAA,GACA,IAAA,CAAK,IAAA,KAAS,eAAA,GACd,cACA,IAAA,CAAK,IAAA,KAAS,cAAA,GACd,UAAA,GACA,KAAK,IAAA,KAAS,UAAA,GACd,MAAA,GACA,IAAA,CAAK,SAAS,YAAA,GACd,QAAA,GACA,IAAA,CAAK,KAAA,CAAM,QAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GACpD,IAAA,CAAK,MAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA;AAC3C,IAAA,QAAA,CAAS,IAAA,CAAK,iBAAiB,KAAK,CAAA,UAAA,EAAa,IAAI,CAAA,UAAA,EAAa,IAAA,CAAK,KAAK,CAAA,IAAA,CAAM,CAAA;AAAA,EACpF;AAEA,EAAA,MAAM,aAAa,OAAA,GAAU;AAAA,kDAAA,CAAA,GAAyD,EAAA;AAEtF,EAAA,MAAM,cAAc,OAAA,GAChB;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,GA2CA;AAAA;AAAA;AAAA;AAAA,CAAA;AAMJ,EAAA,OAAO,CAAA,gBAAA,EAAmB,OAAA,GAAU,QAAA,GAAW,EAAE,CAAA;AAAA,+CAAA,EACF,UAAU;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASzD,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA2Db;;;ACvLO,SAAS,sBAAsB,QAAA,EAAkC;AACtE,EAAA,MAAM,KAAA,GAAQ,eAAe,QAAQ,CAAA;AAErC,EAAA,MAAM,QAAQ,KAAA,CACX,GAAA;AAAA,IACC,CAAA,CAAA,KACE,CAAA,uBAAA,EAA0B,CAAA,CAAE,IAAI,CAAA;AAAA,EAAA,EACpC,CAAA,CAAE,IAAI,CAAA,0BAAA,EAA6B,CAAA,CAAE,KAAK,WAAA,EAAa,CAAA,OAAA,EAAU,CAAA,CAAE,IAAI,CAAA;AAAA,GAAA;AAAA,GAEvE,CACC,KAAK,QAAQ,CAAA;AAEhB,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA,EAAA,EAKL,KAAK;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA2CT;;;AC5DA,IAAM,SAAA,GAAoC;AAAA,EACxC,QAAA,EAAU,OAAA;AAAA,EACV,gBAAA,EAAkB,eAAA;AAAA,EAClB,aAAA,EAAe,WAAA;AAAA,EACf,WAAA,EAAa,SAAA;AAAA,EACb,cAAA,EAAgB,YAAA;AAAA,EAChB,UAAA,EAAY,QAAA;AAAA,EACZ,WAAA,EAAa,SAAA;AAAA,EACb,sBAAA,EAAwB,WAAA;AAAA,EACxB,UAAA,EAAY,QAAA;AAAA,EACZ,WAAA,EAAa,SAAA;AAAA,EACb,aAAA,EAAe,WAAA;AAAA,EACf,YAAA,EAAc,UAAA;AAAA,EACd,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AAEO,SAAS,6BAA6B,QAAA,EAAkC;AAC7E,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,KAAA,CAAM,QAAA,CAAS,GAAG,CAAC,CAAA;AACzE,EAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AAEzB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAgBT;AAEA,EAAA,MAAM,UAAA,GAAa,UAAU,SAAA,CAAU,IAAI,KAAK,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAEjF,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,0BAAA,EAkBmB,UAAU,CAAA,+BAAA,EAAkC,SAAA,CAAU,KAAK,CAAA;AAAA;AAAA;AAAA,6BAAA,EAGxD,UAAU,CAAA;AAAA;AAAA;AAAA,CAAA;AAIzC;;;AChEO,SAAS,iBAAiB,QAAA,EAAyC;AACxE,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,EAAU,OAAO,IAAA;AAE/B,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,QAAQ,CAAA,IAAK,EAAC;AAC1C,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAG/B,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AAChD,EAAA,MAAM,iBAAiB,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,QAAQ,CAAA;AAGpD,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,CAAA,yEAAA,CAAA;AAAA,IACA,CAAA,qCAAA,CAAA;AAAA,IACA,CAAA,yCAAA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,OAAA,CAAQ,KAAK,CAAA,SAAA,EAAY,IAAA,CAAK,IAAI,CAAA,iBAAA,EAAoB,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACpE;AAGA,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,UAAA,GAAa,gBAAA,GAAmB,EAAA;AAC/D,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAA0B,aAAa,CAAA,sBAAA,CAAwB,CAAA;AAG5E,EAAA,MAAM,yBAAyB,cAAA,CAAe,GAAA;AAAA,IAC5C,OAAK,CAAA,iCAAA,EAAoC,CAAA,CAAE,KAAK,CAAA,YAAA,EAAe,EAAE,IAAI,CAAA,OAAA;AAAA,GACvE;AAEA,EAAA,MAAM,wBAAwB,cAAA,CAAe,MAAA,GAAS,IAAI,cAAA,CAAe,CAAC,EAAE,KAAA,GAAQ,GAAA;AAEpF,EAAA,MAAM,cAAA,GAAiB,SAAS,UAAA,GAAa;AAAA,wBAAA,CAAA,GAA+B,EAAA;AAE5E,EAAA,MAAM,mBAAmB,WAAA,CAAY,GAAA;AAAA,IACnC,OAAK,CAAA,uBAAA,EAA0B,CAAA,CAAE,KAAK,CAAA,YAAA,EAAe,EAAE,IAAI,CAAA,OAAA;AAAA,GAC7D;AAEA,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAa5B,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2DAAA,EAOgC,qBAAqB,CAAA;AAAA,EAChF,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,EAOhB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAMjC;AAMO,SAAS,6BAA6B,QAAA,EAAyC;AACpF,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,EAAU,OAAO,IAAA;AAE/B,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,uCAAA,CAAA;AAAA,IACA,CAAA,uCAAA,CAAA;AAAA,IACA,CAAA,yCAAA,CAAA;AAAA,IACA,CAAA,+CAAA,CAAA;AAAA,IACA,CAAA,iDAAA;AAAA,GACF;AAEA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,KAAA,CAAM,KAAK,CAAA,6CAAA,CAA+C,CAAA;AAAA,EAC5D;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,kFAAA,CAAoF,CAAA;AAE/F,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC5B;AAMO,SAAS,uBAAuB,QAAA,EAAyC;AAC9E,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,EAAU,OAAO,IAAA;AAE/B,EAAA,MAAM,aAAA,GAAgB,SAAS,UAAA,GAC3B,CAAA;AAAA,CAAA,GACA,EAAA;AACJ,EAAA,MAAM,iBAAA,GAAoB,SAAS,UAAA,GAC/B,CAAA;;AAAA,CAAA,GACA,EAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,SAAS,UAAA,GAC5B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,GAMA,CAAA,oCAAA,CAAA;AAEJ,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,EAUP,aAAa,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,EA2Bb,iBAAiB,CAAA;AAAA;AAAA,EAEjB,cAAc,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAkBhB;;;ACjLO,SAAS,uBAAuB,QAAA,EAAkC;AACvE,EAAA,MAAM,KAAA,GAAQ,iBAAiB,QAAQ,CAAA;AAEvC,EAAA,MAAM,UAAU,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,iBAAA,EAAoB,CAAC,CAAA,CAAA,CAAG,CAAA;AAEvD,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC9B;;;ACVA,IAAM,mBAAA,GAAsB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AA2Q5B,IAAM,aAAA,GAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","file":"index.js","sourcesContent":["import { existsSync, readdirSync, statSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { pathToFileURL } from 'node:url'\n\nexport interface ModuleManifest {\n name: string\n description: string\n category: 'core' | 'communication' | 'business' | 'system'\n dependsOn: string[]\n routes: {\n client?:\n | { importPath: string; exportName: string }\n | { importPath: string; exportName: string }[]\n admin?: { importPath: string; exportName: string }[]\n standalone?: { importPath: string; exportName: string; mountPath: string }\n }\n sharedSchemas?: { path: string; additionalPaths?: string[] }\n clientPages?: { name: string; route: string }[]\n adminPages?: {\n name: string\n route: string\n isPublic?: boolean\n requiredPermission?: string\n }[]\n dbSchemas?: {\n files: string[]\n hasSeed: boolean\n seed?: { serviceFile: string; functionName: string }\n }\n dependencies?: Record<string, string>\n clientStores?: string[]\n providesMiddleware?: {\n name: string\n importPath: string\n appliesTo: string\n }[]\n hasSSE?: boolean\n hasWebSocket?: boolean\n cliModule?: { dir: string; registerFunction: string }\n}\n\nexport interface TemplatePreset {\n id: string\n name: string\n description: string\n modules: string[]\n}\n\nexport interface ResolvedPreset {\n preset: TemplatePreset\n modules: Map<string, ModuleManifest>\n hasAdmin: boolean\n hasClient: boolean\n hasCli: boolean\n hasSSE: boolean\n hasWebSocket: boolean\n hasPermission: boolean\n hasCaptcha: boolean\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TsImportFn = (id: string, opts: { parentURL: string }) => Promise<any>\n\nlet tsImportFn: TsImportFn | undefined\n\nasync function getTsImport(): Promise<TsImportFn> {\n if (tsImportFn) return tsImportFn\n const { tsImport } = await import('tsx/esm/api')\n tsImportFn = tsImport\n return tsImportFn\n}\n\nexport async function loadManifests(templateDir: string): Promise<Map<string, ModuleManifest>> {\n const tsImport = await getTsImport()\n const serverDir = join(templateDir, 'src', 'server')\n const modules = new Map<string, ModuleManifest>()\n\n const entries = readdirSync(serverDir)\n const moduleDirs = entries.filter(\n e => e.startsWith('module-') && statSync(join(serverDir, e)).isDirectory()\n )\n\n const parentURL = pathToFileURL(join(serverDir, 'dummy.ts')).href\n\n for (const dir of moduleDirs) {\n const manifestPath = join(serverDir, dir, 'module.ts')\n if (!existsSync(manifestPath)) continue\n\n try {\n const mod = await tsImport(manifestPath, { parentURL })\n const manifest: ModuleManifest = mod.default\n if (!manifest || !manifest.name) {\n console.error(`❌ Invalid manifest in ${dir}: missing name`)\n continue\n }\n modules.set(manifest.name, manifest)\n } catch (err) {\n console.error(`❌ Failed to load manifest from ${dir}:`, err)\n }\n }\n\n return modules\n}\n\nexport async function loadPresets(templateDir: string): Promise<TemplatePreset[]> {\n const configPath = join(templateDir, 'modules.config.ts')\n if (!existsSync(configPath)) {\n return [getDefaultPreset()]\n }\n\n try {\n const tsImport = await getTsImport()\n const parentURL = pathToFileURL(configPath).href\n const mod = await tsImport(configPath, { parentURL })\n if (mod.TEMPLATE_PRESETS) {\n return mod.TEMPLATE_PRESETS\n }\n } catch (err) {\n console.error('❌ Failed to load presets:', err)\n }\n\n return [getDefaultPreset()]\n}\n\nfunction getDefaultPreset(): TemplatePreset {\n return {\n id: 'fullstack-admin',\n name: 'Full Admin',\n description: 'All modules included',\n modules: [\n 'todos',\n 'chat',\n 'notifications',\n 'file',\n 'captcha',\n 'permission',\n 'admin',\n 'order',\n 'ticket',\n 'dispute',\n 'content',\n ],\n }\n}\n\nexport function resolvePreset(\n preset: TemplatePreset,\n allManifests: Map<string, ModuleManifest>\n): ResolvedPreset {\n const modules = new Map<string, ModuleManifest>()\n\n const toProcess = [...preset.modules]\n const processed = new Set<string>()\n\n while (toProcess.length > 0) {\n const name = toProcess.shift()!\n if (processed.has(name)) continue\n processed.add(name)\n\n const manifest = allManifests.get(name)\n if (manifest) {\n modules.set(name, manifest)\n for (const dep of manifest.dependsOn) {\n if (!processed.has(dep)) {\n toProcess.push(dep)\n }\n }\n }\n }\n\n let hasSSE = false\n let hasWebSocket = false\n let hasAdmin = false\n\n for (const manifest of modules.values()) {\n if (manifest.hasSSE) hasSSE = true\n if (manifest.hasWebSocket) hasWebSocket = true\n if (manifest.adminPages && manifest.adminPages.length > 0) hasAdmin = true\n if (manifest.routes.admin && manifest.routes.admin.length > 0) hasAdmin = true\n }\n\n const isCliOnly = preset.id === 'cli-only'\n\n return {\n preset,\n modules,\n hasAdmin,\n hasClient: !isCliOnly,\n hasCli: true,\n hasSSE,\n hasWebSocket,\n hasPermission: modules.has('permission'),\n hasCaptcha: modules.has('captcha'),\n }\n}\n\nexport function getModuleDirectories(resolved: ResolvedPreset): string[] {\n const dirs: string[] = []\n for (const [name] of resolved.modules) {\n dirs.push(`module-${name}`)\n }\n return dirs\n}\n\nexport function getSharedModuleDirs(resolved: ResolvedPreset): string[] {\n const dirs: string[] = []\n for (const [, manifest] of resolved.modules) {\n if (manifest.sharedSchemas) {\n dirs.push(manifest.sharedSchemas.path)\n }\n }\n return dirs\n}\n\nexport function getDbSchemaFiles(resolved: ResolvedPreset): string[] {\n const files: string[] = []\n for (const [, manifest] of resolved.modules) {\n if (manifest.dbSchemas) {\n files.push(...manifest.dbSchemas.files)\n }\n }\n return files\n}\n\nexport function getClientPages(resolved: ResolvedPreset): { name: string; route: string }[] {\n const pages: { name: string; route: string }[] = []\n for (const [, manifest] of resolved.modules) {\n if (manifest.clientPages) {\n pages.push(...manifest.clientPages)\n }\n }\n return pages\n}\n\nexport function getAdminPages(resolved: ResolvedPreset): ModuleManifest['adminPages'] {\n const pages: ModuleManifest['adminPages'] = []\n for (const [, manifest] of resolved.modules) {\n if (manifest.adminPages) {\n pages.push(...manifest.adminPages)\n }\n }\n return pages\n}\n\nexport function getClientStores(resolved: ResolvedPreset): string[] {\n const stores: string[] = []\n for (const [, manifest] of resolved.modules) {\n if (manifest.clientStores) {\n stores.push(...manifest.clientStores)\n }\n }\n return stores\n}\n\nexport function getDefaultRoute(resolved: ResolvedPreset): string {\n const pages = getClientPages(resolved)\n if (pages.length > 0) {\n return pages[0].route\n }\n return '/'\n}\n","import type { ModuleManifest } from './template-generator'\nimport type { ResolvedPreset } from './template-generator'\n\nexport interface FileFilterRule {\n pattern: string\n action: 'include' | 'exclude'\n condition: string\n}\n\nexport function getExcludePatterns(\n resolved: ResolvedPreset,\n allManifests: Map<string, ModuleManifest>\n): string[] {\n const excludes: string[] = []\n\n // 无 client 的 preset(cli-only):排除仅服务客户端的框架件,\n // 否则 tsc/build 因 react、@client/entry-server、playwright 等悬空引用失败\n if (!resolved.hasClient) {\n excludes.push(\n 'playwright.config.ts',\n 'src/shared/hooks',\n 'src/server/entries/cloudflare.ts',\n 'tests/e2e'\n )\n }\n\n // TS2589 哨兵只属于框架仓库:它 import 全部模块,进小 preset 会编译失败。\n // 生成的 app 由 rpc-surface.ts 本身提供等价的按模块实例化覆盖。\n excludes.push('src/server/rpc-type-canary.ts')\n\n for (const [name, manifest] of allManifests) {\n if (resolved.modules.has(name)) continue\n\n excludes.push(`src/server/module-${name}`)\n\n if (manifest.sharedSchemas) {\n excludes.push(`src/shared/modules/${manifest.sharedSchemas.path}`)\n if (manifest.sharedSchemas.additionalPaths) {\n for (const extra of manifest.sharedSchemas.additionalPaths) {\n excludes.push(`src/shared/modules/${extra}`)\n }\n }\n }\n\n if (manifest.dbSchemas) {\n for (const file of manifest.dbSchemas.files) {\n excludes.push(`src/server/db/schema/${file}.ts`)\n }\n }\n\n if (manifest.clientPages) {\n for (const page of manifest.clientPages) {\n excludes.push(`src/client/pages/${page.name}.tsx`)\n excludes.push(`src/client/pages/__tests__/${page.name}.test.tsx`)\n }\n }\n\n if (manifest.clientStores) {\n for (const store of manifest.clientStores) {\n excludes.push(`src/client/stores/${store}.ts`)\n excludes.push(`src/client/stores/__tests__/${store}.test.ts`)\n }\n }\n\n if (manifest.adminPages) {\n for (const page of manifest.adminPages) {\n excludes.push(`src/admin/pages/${page.name}.tsx`)\n excludes.push(`src/admin/pages/__tests__/${page.name}.test.tsx`)\n }\n }\n\n if (manifest.providesMiddleware) {\n for (const mw of manifest.providesMiddleware) {\n excludes.push(`src/server/middleware/${mw.name}.ts`)\n excludes.push(`src/server/middleware/__tests__/${mw.name}.test.ts`)\n }\n }\n\n if (name === 'todos') {\n excludes.push('src/server/__tests__/integration/todos-api.test.ts')\n }\n\n // Exclude CLI module dir when the server module is not in the preset\n if (manifest.cliModule) {\n excludes.push(`src/cli/modules/${manifest.cliModule.dir}`)\n }\n }\n\n if (!resolved.modules.has('admin')) {\n excludes.push('src/admin')\n excludes.push('admin.html')\n excludes.push('auth-inject.html')\n }\n\n // tenant/merchant directories: tenant needs tenant dir, merchant needs merchant dir\n if (!resolved.modules.has('tenant')) {\n excludes.push('src/tenant')\n excludes.push('tenant.html')\n excludes.push('src/server/middleware/tenant-isolation.ts')\n excludes.push('src/server/middleware/__tests__/tenant-isolation.test.ts')\n }\n if (!resolved.modules.has('merchant')) {\n excludes.push('src/merchant')\n excludes.push('merchant.html')\n }\n\n if (!resolved.hasClient) {\n excludes.push('src/client')\n excludes.push('index.html')\n excludes.push('admin.html')\n excludes.push('auth-inject.html')\n excludes.push('src/admin')\n excludes.push('vite.config.ts')\n excludes.push('postcss.config.js')\n excludes.push('tailwind.config.js')\n }\n\n if (!resolved.hasClient) {\n excludes.push('src/client/components/AuthButton.tsx')\n excludes.push('src/client/components/__tests__/AuthButton.test.tsx')\n } else if (!resolved.modules.has('admin') && !resolved.modules.has('auth')) {\n excludes.push('src/client/components/AuthButton.tsx')\n excludes.push('src/client/components/__tests__/AuthButton.test.tsx')\n excludes.push('src/server/utils/auth.ts')\n }\n\n excludes.push('src/client/preset-ui-config.ts')\n\n // Exclude standalone shared modules (cart, community, dashboard) that are not needed\n // by the current preset. These have no server module manifest of their own, but are\n // declared as clientPages by other modules or imported by server routes.\n // Include when:\n // 1. A module in the preset declares the relevant client page, OR\n // 2. A server module that imports their schemas is present (e.g., content needs community).\n const standaloneSharedModules: Record<string, { pages?: string[]; serverModules?: string[] }> = {\n cart: { pages: ['CartPage'] },\n community: { pages: ['TopicsPage', 'ProfilePage'], serverModules: ['content'] },\n dashboard: { pages: ['DashboardPage'] },\n }\n for (const [moduleName, config] of Object.entries(standaloneSharedModules)) {\n // Check if any module's clientPages includes a relevant page\n const hasRelevantPage =\n config.pages &&\n [...resolved.modules.values()].some(\n m => m.clientPages?.some(p => config.pages!.includes(p.name)) ?? false\n )\n // Check if any required server module is included\n const hasRelevantServerModule =\n config.serverModules?.some(sm => resolved.modules.has(sm)) ?? false\n if (!hasRelevantPage && !hasRelevantServerModule) {\n excludes.push(`src/shared/modules/${moduleName}`)\n }\n }\n\n // LoginPage/RegisterPage are excluded via the for loop above (auth clientPages)\n // when auth module is not in the preset\n\n if (!resolved.hasPermission && !resolved.modules.has('auth')) {\n excludes.push('src/server/utils/permission-utils.ts')\n excludes.push('src/server/utils/__tests__/permission-utils.test.ts')\n excludes.push('src/server/middleware/__tests__/auth-simple.test.ts')\n excludes.push('src/server/middleware/__tests__/auth.test.ts')\n excludes.push('src/server/middleware/__tests__/error-response-format.test.ts')\n excludes.push('src/server/utils/__tests__/auth.test.ts')\n } else if (!resolved.hasPermission && resolved.modules.has('auth')) {\n excludes.push('src/server/utils/permission-utils.ts')\n excludes.push('src/server/utils/__tests__/permission-utils.test.ts')\n excludes.push('src/server/middleware/__tests__/auth-simple.test.ts')\n excludes.push('src/server/middleware/__tests__/auth.test.ts')\n excludes.push('src/server/middleware/__tests__/error-response-format.test.ts')\n excludes.push('src/server/utils/__tests__/auth.test.ts')\n excludes.push('src/server/module-auth/__tests__/auth-service.test.ts')\n } else if (!resolved.modules.has('admin')) {\n excludes.push('src/server/middleware/__tests__/error-response-format.test.ts')\n }\n\n if (!resolved.modules.has('captcha')) {\n excludes.push('src/server/utils/__tests__/captcha.test.ts')\n // CaptchaModal component depends on captcha module (store, API, types)\n excludes.push('src/admin/components/CaptchaModal.tsx')\n excludes.push('src/admin/stores/captchaStore.ts')\n excludes.push('src/admin/stores/__tests__/captchaStore.test.ts')\n excludes.push('src/admin/stores/__tests__/captchaStoreBranches.test.ts')\n }\n\n return excludes\n}\n\nexport function getGeneratedFiles(resolved: ResolvedPreset): string[] {\n const files: string[] = [\n 'src/server/route-registry.ts',\n 'src/server/rpc-surface.ts',\n 'src/server/isr-modules.ts',\n 'src/client/stores/entry-stores.ts',\n 'src/client/ssr-pages.ts',\n 'src/server/db/schema/index.ts',\n 'src/shared/modules/index.ts',\n 'src/shared/schemas/index.ts',\n 'src/server/middleware/index.ts',\n 'src/server/app.ts',\n 'src/cli/modules/index.ts',\n ]\n\n if (resolved.hasClient) {\n files.push(\n 'src/client/App.tsx',\n 'src/client/components/Navigation.tsx',\n 'src/client/components/index.ts',\n 'src/client/Layout.tsx',\n 'src/client/components/__tests__/App.test.tsx',\n 'src/client/components/__tests__/Navigation.test.tsx',\n 'src/client/main.tsx',\n 'src/client/preset-ui-config.ts'\n )\n }\n\n if (resolved.hasClient && resolved.modules.has('admin')) {\n files.push('src/admin/App.tsx')\n files.push('src/admin/components/index.ts')\n files.push('src/admin/services/apiClient.ts')\n }\n\n if (resolved.hasClient && !resolved.modules.has('admin')) {\n files.push('vite.config.ts')\n }\n\n if (resolved.hasClient && resolved.modules.has('admin')) {\n // admin preset needs generated vite.config.ts to filter tenant/merchant entries\n files.push('vite.config.ts')\n }\n\n if (!resolved.hasPermission) {\n files.push('src/server/middleware/auth.ts')\n files.push('src/server/utils/auth.ts')\n }\n\n if (!resolved.modules.has('admin') && resolved.hasPermission) {\n files.push('src/server/utils/auth.ts')\n }\n\n // Always generate init.ts — every preset has different seed combinations\n files.push('src/server/db/init.ts')\n\n return files\n}\n","import type { ResolvedPreset } from './template-generator'\n\nexport interface StandaloneRoute {\n localName: string\n mountPath: string\n}\n\nexport function generateRouteRegistry(resolved: ResolvedPreset): string {\n const imports: string[] = [\n `import { OpenAPIHono } from '@hono/zod-openapi'`,\n `import { rateLimitMiddleware } from './middleware/rate-limit'`,\n ]\n\n const clientRoutes: string[] = []\n const adminRoutes: string[] = []\n\n const moduleEntries = [...resolved.modules.entries()]\n\n const usedNames = new Set<string>()\n\n for (const [name, manifest] of moduleEntries) {\n const moduleDir = `module-${name}`\n\n if (manifest.routes.client) {\n const clientRouteList = Array.isArray(manifest.routes.client)\n ? manifest.routes.client\n : [manifest.routes.client]\n for (const route of clientRouteList) {\n const { importPath, exportName } = route\n const localName = usedNames.has(exportName)\n ? `${name}${exportName.charAt(0).toUpperCase()}${exportName.slice(1)}`\n : exportName\n usedNames.add(localName)\n const importStmt =\n localName === exportName\n ? `import { ${exportName} } from './${moduleDir}/${importPath.replace(/^\\.\\//, '')}'`\n : `import { ${exportName} as ${localName} } from './${moduleDir}/${importPath.replace(\n /^\\.\\//,\n ''\n )}'`\n imports.push(importStmt)\n clientRoutes.push(` .route('/api', ${localName})`)\n }\n }\n\n if (manifest.routes.admin) {\n for (const route of manifest.routes.admin) {\n const { importPath, exportName } = route\n const localName = usedNames.has(exportName)\n ? `${name}${exportName.charAt(0).toUpperCase()}${exportName.slice(1)}`\n : exportName\n usedNames.add(localName)\n const importStmt =\n localName === exportName\n ? `import { ${exportName} } from './${moduleDir}/${importPath.replace(/^\\.\\//, '')}'`\n : `import { ${exportName} as ${localName} } from './${moduleDir}/${importPath.replace(\n /^\\.\\//,\n ''\n )}'`\n imports.push(importStmt)\n adminRoutes.push(` .route('/api', ${localName})`)\n }\n }\n // Note: standalone routes are NOT included in route-registry.\n // They are imported and mounted directly by server-app.ts generator.\n }\n\n let content = imports.join('\\n') + '\\n\\n'\n\n content += `const apiRateLimit = rateLimitMiddleware({\\n`\n content += ` windowMs: 60_000,\\n`\n content += ` max: 100,\\n`\n content += ` message: 'Too many requests, please try again later',\\n`\n content += `})\\n\\n`\n\n if (clientRoutes.length > 0) {\n content += `// client API routes\\n`\n content += `export const clientApiRoutes = new OpenAPIHono()\\n`\n content += ` .use('*', apiRateLimit)\\n`\n content += clientRoutes.join('\\n') + '\\n\\n'\n } else {\n content += `// No client modules selected\\n`\n content += `export const clientApiRoutes = new OpenAPIHono()\\n\\n`\n }\n\n if (adminRoutes.length > 0) {\n content += `// admin API routes\\n`\n content += `export const adminApiRoutes = new OpenAPIHono()\\n`\n content += adminRoutes.join('\\n') + '\\n\\n'\n } else {\n content += `// No admin modules selected\\n`\n content += `export const adminApiRoutes = new OpenAPIHono()\\n\\n`\n }\n\n content += `// 类型出口已移除:巨型 merge 类型是 TS2589 根源,客户端改用 rpc-surface.ts 门面\\n`\n\n return content\n}\n\n/**\n * Get standalone route info from resolved preset manifests.\n * Used by server-app.ts generator to mount standalone routes.\n */\nexport function getStandaloneRoutes(resolved: ResolvedPreset): StandaloneRoute[] {\n const routes: StandaloneRoute[] = []\n const usedNames = new Set<string>()\n\n for (const [name, manifest] of resolved.modules) {\n if (manifest.routes.standalone) {\n const { exportName, mountPath } = manifest.routes.standalone\n const localName = usedNames.has(exportName)\n ? `${name}${exportName.charAt(0).toUpperCase()}${exportName.slice(1)}`\n : exportName\n usedNames.add(localName)\n routes.push({ localName, mountPath })\n }\n }\n\n return routes\n}\n","import type { ResolvedPreset } from './template-generator'\n\n/**\n * 生成按模块拆分的 RPC 门面(src/server/rpc-surface.ts)。\n *\n * 这是 TS2589 治理的生成侧:preset 决定包含哪些模块,本生成器扫描\n * 所选模块路由文件的 `export type XxxApiType`(模块级窄类型)与路径段\n * (`path: '/<segment>'`,含嵌套 .route 挂载的递归扫描),生成\n * createApiFacade() 工厂。客户端/admin/测试/CLI 都通过该工厂获得\n * 与旧 mega-merge 类型同形的调用面。\n *\n * 约束(由 eslint 规则 no-merged-api-type-export 强制):\n * 生成物不得导出 `typeof <链式merge实例>` 或 `ReturnType<typeof <app工厂>>`。\n */\n\ninterface RouteFileInfo {\n /** 模块内路由文件相对路径(相对 src/server/),如 module-todos/routes/todos-routes */\n routePath: string\n /** import 时的本地变量前缀(去重后) */\n localName: string\n}\n\ninterface SegmentSource extends RouteFileInfo {\n /** 路由文件里导出的窄类型名,如 TodosApiType */\n typeName: string\n segments: string[]\n}\n\n/** 从路由文件文本提取 `export type XxxApiType = typeof yyy` */\nfunction extractApiTypes(content: string): string[] {\n const re = /export type (\\w+ApiType)\\s*=\\s*typeof\\s+(\\w+)/g\n const names: string[] = []\n let m: RegExpExecArray | null\n while ((m = re.exec(content)) !== null) names.push(m[1])\n return names\n}\n\n/**\n * 提取路径首段('todos'、'orders-mock')。\n * 递归扫描嵌套挂载:admin-routes 这类通过 .route('/', subApp) 组合的文件,\n * 其路径在子路由文件里声明。\n */\nfunction extractSegments(\n content: string,\n readRouteFile: (p: string) => string | null,\n baseDir: string,\n depth = 0\n): string[] {\n const segs = new Set<string>()\n const pathRe = /path:\\s*'\\/([a-zA-Z][a-zA-Z-]*)/g\n let m: RegExpExecArray | null\n while ((m = pathRe.exec(content)) !== null) segs.add(m[1])\n\n if (depth < 3) {\n // 嵌套挂载: import { X } from './sub' + .route('/', X)\n const importRe = /import\\s*\\{([^}]+)\\}\\s*from\\s*'(\\.\\/[a-zA-Z-]+)'/g\n while ((m = importRe.exec(content)) !== null) {\n const names = m[1]\n .split(',')\n .map(s => s.trim().split(' as ')[0])\n .filter(Boolean)\n const subPath = m[2].replace(/^\\.\\//, '')\n // 仅当导入的名字确实被 .route('/', name) 挂载时才递归\n const isMounted = names.some(n =>\n new RegExp(`\\\\.route\\\\(\\\\s*'/'\\\\s*,\\\\s*${n}\\\\s*\\\\)`).test(content)\n )\n if (!isMounted) continue\n const sub = readRouteFile(`${baseDir}/${subPath}`)\n if (sub) {\n for (const s of extractSegments(sub, readRouteFile, baseDir, depth + 1)) segs.add(s)\n }\n }\n }\n return [...segs]\n}\n\nexport function generateRpcSurface(\n resolved: ResolvedPreset,\n readRouteFile: (p: string) => string | null\n): string {\n const sources: SegmentSource[] = []\n const usedNames = new Set<string>()\n\n const collect = (\n moduleName: string,\n manifest: { routes: { client?: unknown; admin?: unknown } & Record<string, unknown> },\n key: 'client' | 'admin'\n ) => {\n const raw = (manifest.routes as Record<string, unknown>)[key]\n if (!raw) return\n const list = Array.isArray(raw) ? raw : [raw]\n for (const entry of list as Array<{ importPath: string; exportName: string }>) {\n // importPath 相对模块目录('./routes/todos-routes'),补上 module-<name>/ 前缀\n const routePath = `module-${moduleName}/${entry.importPath.replace(/^\\.\\//, '').replace(/\\.ts$/, '')}`\n let localName = usedNames.has(entry.exportName)\n ? `${routePath\n .split('/')\n .pop()!\n .replace(/-([a-z])/g, (_, c: string) =>\n c.toUpperCase()\n )}${entry.exportName.charAt(0).toUpperCase()}${entry.exportName.slice(1)}`\n : entry.exportName\n while (usedNames.has(localName)) localName += 'X'\n usedNames.add(localName)\n\n const content = readRouteFile(routePath)\n if (!content) continue\n const typeNames = extractApiTypes(content)\n const segments = extractSegments(\n content,\n readRouteFile,\n routePath.split('/').slice(0, -1).join('/')\n )\n for (const typeName of typeNames) {\n sources.push({ routePath, localName, typeName, segments })\n }\n }\n }\n\n for (const [moduleName, manifest] of [...resolved.modules.entries()]) {\n collect(moduleName, manifest as never, 'client')\n collect(moduleName, manifest as never, 'admin')\n }\n\n // 段 → 多来源(同段跨模块时生成 mergeRpcObjects)\n const segmentOwners = new Map<\n string,\n Array<{ localName: string; typeName: string; routePath: string; idx: number }>\n >()\n sources.forEach((s, idx) => {\n for (const seg of s.segments) {\n const list = segmentOwners.get(seg) ?? []\n list.push({ localName: s.localName, typeName: s.typeName, routePath: s.routePath, idx })\n segmentOwners.set(seg, list)\n }\n })\n\n const hasMergedSegments = [...segmentOwners.values()].some(owners => owners.length > 1)\n\n const imports: string[] = [\n `import { hc } from 'hono/client'`,\n ...(hasMergedSegments ? [`import { mergeRpcObjects } from './rpc-merge'`] : []),\n ]\n for (const s of sources) {\n imports.push(`import type { ${s.typeName} } from './${s.routePath}'`)\n }\n\n const clients: string[] = []\n sources.forEach((s, i) => {\n clients.push(` const ${s.localName}Client${i} = hc<${s.typeName}>(api, options)`)\n })\n\n const entries: string[] = []\n // 对象字面量键位:合法标识符直接写,否则引号字符串\n const key = (seg: string) => (/^[a-zA-Z][a-zA-Z0-9]*$/.test(seg) ? seg : `'${seg}'`)\n // 属性访问位:非标识符段必须用方括号(client.'x-y' 是语法错误)\n const access = (seg: string) => (/^[a-zA-Z][a-zA-Z0-9]*$/.test(seg) ? `.${seg}` : `['${seg}']`)\n for (const [seg, owners] of segmentOwners) {\n // 同段多来源:与运行时挂载顺序一致(先注册者优先)\n owners.sort((a, b) => a.idx - b.idx)\n const refs = owners.map(o => `${o.localName}Client${o.idx}${access(seg)}`)\n entries.push(\n refs.length === 1\n ? ` ${key(seg)}: ${refs[0]},`\n : ` ${key(seg)}: mergeRpcObjects(${refs.join(', ')}),`\n )\n }\n\n return `/**\n * @framework-baseline rpc-surface-v1\n *\n * 按模块拆分的类型安全 RPC 门面(本文件由 CLI 生成,勿手改)。\n * 生成器: src/generators/rpc-surface.ts\n *\n * 每个模块单独实例化窄客户端(深度 = 1 个模块),组装成与旧\n * \\`hc<MergedApiType>\\` 完全同形的门面。禁止导出链式 merge 类型\n * (eslint: no-merged-api-type-export)。\n */\n\n${imports.join('\\n')}\n\n/** hono hc 的选项类型(fetch / webSocket / sse / headers 等) */\nexport type RpcClientOptions = NonNullable<Parameters<typeof hc>[1]>\n\n/**\n * 创建按模块拆分的 RPC 门面。\n * 调用形态与旧 mega 客户端兼容:facade.api.todos.$get()。\n */\nexport function createApiFacade(baseUrl: string, options: RpcClientOptions = {}) {\n const api = \\`\\${baseUrl.replace(/\\\\/$/, '')}/api\\`\n\n${clients.join('\\n')}\n\n return {\n api: {\n${entries.join('\\n')}\n },\n }\n}\n\nexport type ApiFacade = ReturnType<typeof createApiFacade>\n`\n}\n","import type { ResolvedPreset } from './template-generator'\n\n/**\n * 生成 src/server/isr-modules.ts:按 preset 汇总各模块的 ISR 注册副作用导入。\n *\n * 背景:entries/cloudflare.ts 曾静态 import '@server/module-todos/isr' 与\n * '@server/module-content/isr',preset 裁掉 content 后 CF 构建(esbuild)与\n * tsc 均因悬空导入失败。生成器只为\"选中且存在 isr.ts 的模块\"生成导入。\n */\nexport function generateIsrModules(\n resolved: ResolvedPreset,\n moduleFileExists: (moduleName: string, relPath: string) => boolean\n): string {\n const imports: string[] = []\n\n for (const [moduleName] of [...resolved.modules.entries()]) {\n if (moduleFileExists(moduleName, 'isr.ts')) {\n imports.push(`import '@server/module-${moduleName}/isr'`)\n }\n }\n\n return `/**\n * ISR 模块注册汇总(本文件由 CLI 生成,勿手改)。\n * 生成器: src/generators/isr-modules.ts\n *\n * 按 preset 只导入选中模块的 ISR 注册副作用;未被裁剪风险的单一入口\n * 由 entries/cloudflare.ts import 本文件。\n */\n\n${imports.join('\\n')}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\n\n/**\n * 生成 src/client/entry-stores.ts:entry-server 的 store 种子逻辑。\n *\n * 背景:entry-server.tsx 曾硬编码 import todoStore 并预填充,preset 裁掉\n * todos 模块后(forum 等)构建因悬空导入失败。生成器只在选中 todo 模块\n * 时生成 todoStore 种子实现,否则生成空实现。\n */\nexport function generateEntryStores(\n resolved: ResolvedPreset,\n moduleFileExists: (moduleName: string, relPath: string) => boolean\n): string {\n const hasTodos = resolved.modules.has('todos') && moduleFileExists('todos', 'todoStore.ts')\n\n if (!hasTodos) {\n return `/**\n * Entry SSR store 种子(本文件由 CLI 生成,勿手改)。\n * 当前 preset 不含 todo 模块:无 store 需要预填充,全部为空实现。\n */\n\nexport interface SSRData {\n [key: string]: unknown\n}\n\nexport function snapshotEntryStores(): Record<string, unknown> {\n return {}\n}\n\nexport function seedEntryStores(_data: SSRData): void {}\n\nexport function restoreEntryStores(_snapshot: Record<string, unknown>): void {}\n`\n }\n\n return `/**\n * Entry SSR store 种子(本文件由 CLI 生成,勿手改)。\n * todo 模块在选中列表中:预填充 todoStore 供 ISR 渲染真实内容。\n */\n\nimport { useTodoStore } from './todoStore'\nimport type { Todo } from '@shared/schemas'\n\nexport interface SSRData {\n todos?: Todo[]\n [key: string]: unknown\n}\n\nexport interface EntryStoreSnapshot {\n todos: Todo[]\n loading: boolean\n}\n\nexport function snapshotEntryStores(): EntryStoreSnapshot {\n const state = useTodoStore.getState()\n return { todos: state.todos, loading: state.loading }\n}\n\nexport function seedEntryStores(data: SSRData): void {\n if (data.todos) {\n useTodoStore.setState({ todos: data.todos, loading: false })\n }\n}\n\nexport function restoreEntryStores(snapshot: EntryStoreSnapshot): void {\n useTodoStore.setState({ todos: snapshot.todos, loading: snapshot.loading })\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\nimport { getClientPages } from './template-generator'\n\n/**\n * 生成 src/client/ssr-pages.ts:按 preset 实际包含的页面生成静态导入注册表。\n *\n * 背景:entry-server 的页面级 SSR 需要静态 import(renderToString 解析\n * 不了 React.lazy)。模板全量版静态导入全部 ISR 页面,但小 preset 会裁掉\n * 部分页面(如 todo-app 无 TopicsPage)——悬空导入令生成 app 的 tsc 失败。\n * 因此本文件必须由 CLI 按 preset 生成,只导入该 preset 真实存在的页面。\n */\n\n/** 页面文件名 → ssr-pages 的组件名与 ISR 路由(顺序即注册表顺序) */\nconst SSR_PAGE_MAP: Array<{ file: string; component: string; route: string; pattern?: string }> = [\n { file: 'TodoPage', component: 'TodoPage', route: '/todos' },\n { file: 'ContentListPage', component: 'ContentListPage', route: '/content' },\n {\n file: 'ContentDetailPage',\n component: 'ContentDetailPage',\n route: '/content/:id',\n pattern: '/content/',\n },\n { file: 'TopicsPage', component: 'TopicsPage', route: '/topics' },\n]\n\nexport function generateSsrPages(\n resolved: ResolvedPreset,\n pageFileExists: (name: string) => boolean\n): string {\n const pages = getClientPages(resolved)\n const available = new Set(pages.map(p => p.name))\n\n const imports: string[] = []\n const entries: string[] = []\n const patterns: string[] = []\n\n for (const m of SSR_PAGE_MAP) {\n if (!available.has(m.file) && !pageFileExists(m.file)) continue\n imports.push(`import { ${m.component} } from './pages/${m.file}'`)\n entries.push(` '${m.route}': ${m.component},`)\n if (m.pattern) {\n patterns.push(` { prefix: '${m.pattern}', component: ${m.component} },`)\n }\n }\n\n const noPages = imports.length === 0\n\n return `/**\n * SSR 静态页面注册表(本文件由 CLI 生成,勿手改)。\n * 生成器: src/generators/ssr-pages.ts\n *\n * renderToString 解析不了 React.lazy——ISR 路由的页面级 SSR 依赖这里的\n * 静态同构组件。只导入本 preset 实际包含的页面(模板全量版会被覆盖)。\n */\n\nimport type { ComponentType } from 'react'\n${\n noPages\n ? `\n// 本 preset 没有关联的 ISR 页面——SSR 输出布局壳 + meta(合理:\n// 该 preset 的页面无需 SEO 或均为管理/工具型)\nexport const SSR_PAGES: Record<string, ComponentType> = {}\n\nexport function getSsrPage(_pathname: string): ComponentType | null {\n return null\n}\n`\n : `\n${imports.join('\\n')}\n\nexport const SSR_PAGES: Record<string, ComponentType> = {\n${entries.join('\\n')}\n}\n\nconst SSR_PATTERNS: Array<{ prefix: string; component: ComponentType }> = [\n${patterns.join('\\n')}\n]\n\n/** ISR 路径是否有关联静态组件(决定 body 渲染真实内容还是仅 meta) */\nexport function getSsrPage(pathname: string): ComponentType | null {\n if (SSR_PAGES[pathname]) return SSR_PAGES[pathname]\n for (const p of SSR_PATTERNS) {\n if (pathname.startsWith(p.prefix)) return p.component\n }\n return null\n}\n`\n}`\n}\n","import type { ResolvedPreset } from './template-generator'\nimport { getClientPages } from './template-generator'\n\nconst DEFAULT_ICON = 'Circle'\n\nconst ICON_MAP: Record<string, string> = {\n TodoPage: 'CheckCircle',\n NotificationPage: 'Bell',\n WebSocketPage: 'Plug',\n ContentListPage: 'FileText',\n PluginsPage: 'Package',\n CategoriesPage: 'Grid',\n SearchPage: 'Search',\n PublishPage: 'Upload',\n DeveloperDashboardPage: 'Code',\n PluginDetailPage: 'Package',\n TopicsPage: 'Hash',\n ProfilePage: 'User',\n DashboardPage: 'LayoutDashboard',\n SettingsPage: 'Settings',\n CartPage: 'ShoppingCart',\n OrdersPage: 'Package',\n}\n\nexport function generateClientNavigation(resolved: ResolvedPreset): string {\n const pages = getClientPages(resolved).filter(p => !p.route.includes(':'))\n const hasAuth = resolved.modules.has('auth')\n\n const navItems: string[] = []\n for (const page of pages) {\n const icon = ICON_MAP[page.name] || DEFAULT_ICON\n const label =\n page.name === 'TodoPage'\n ? 'Todos'\n : page.name === 'NotificationPage'\n ? 'Notifications'\n : page.name === 'WebSocketPage'\n ? 'WebSocket'\n : page.name === 'PluginsPage'\n ? 'Plugins'\n : page.name === 'CategoriesPage'\n ? 'Categories'\n : page.name === 'SearchPage'\n ? 'Search'\n : page.name === 'PublishPage'\n ? 'Publish'\n : page.name === 'DeveloperDashboardPage'\n ? 'Developer'\n : page.name === 'TopicsPage'\n ? 'Topics'\n : page.name === 'ProfilePage'\n ? 'Profile'\n : page.name === 'DashboardPage'\n ? 'Dashboard'\n : page.name === 'SettingsPage'\n ? 'Settings'\n : page.name === 'CartPage'\n ? 'Cart'\n : page.name === 'OrdersPage'\n ? 'Orders'\n : page.route.replace(/^\\//, '').charAt(0).toUpperCase() +\n page.route.replace(/^\\//, '').slice(1)\n navItems.push(` { label: '${label}', icon: '${icon}', path: '${page.route}' },`)\n }\n\n const authImport = hasAuth ? `\\nimport { useAuthStore } from '../stores/authStore'` : ''\n\n const authSection = hasAuth\n ? `\nfunction AuthSection({ style }: { style: string }) {\n const isAuthenticated = useAuthStore((state: any) => state.isAuthenticated)\n const user = useAuthStore((state: any) => state.user)\n const logout = useAuthStore((state: any) => state.logout)\n\n if (style === 'none') return null\n\n if (isAuthenticated) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-gray-600\">{user?.username}</span>\n <button onClick={logout} className=\"text-xs text-gray-400 hover:text-red-500\">Sign Out</button>\n </div>\n )\n }\n\n if (style === 'buttons') {\n return (\n <div className=\"flex items-center gap-2\">\n <Link\n to=\"/login\"\n className=\"px-3 py-1 text-sm bg-blue-500 text-white rounded hover:bg-blue-600\"\n >\n Sign In\n </Link>\n <Link\n to=\"/register\"\n className=\"px-3 py-1 text-sm border border-gray-300 text-gray-700 rounded hover:bg-gray-50\"\n >\n Sign Up\n </Link>\n </div>\n )\n }\n\n return (\n <Link to=\"/login\" className=\"text-sm text-gray-500 hover:text-gray-900\">\n Login\n </Link>\n )\n}\n`\n : `\nfunction AuthSection(_style: { style: string }) {\n return null\n}\n`\n\n return `import { NavLink${hasAuth ? ', Link' : ''} } from 'react-router-dom'\nimport { Rocket, Sparkles } from 'lucide-react'${authImport}\nimport type { PresetTheme, NavigationConfig, ClientNavItem } from '../preset-ui-config'\n\ninterface NavigationProps {\n preset?: string\n items?: ClientNavItem[]\n theme?: PresetTheme\n navigation?: NavigationConfig\n}\n${authSection}\nexport const Navigation: React.FC<NavigationProps> = ({\n items,\n theme,\n navigation,\n}) => {\n const navItems = navigation?.navItems === 'none' ? [] : (items ?? [])\n const primaryColor = theme?.primaryColor ?? '#6366f1'\n const logoText = theme?.logoText ?? 'Biomimic'\n const showLogo = navigation?.showLogo !== false\n const authStyle = navigation?.authStyle ?? 'none'\n\n return (\n <nav className=\"hidden md:block bg-white/80 backdrop-blur-md border-b border-gray-200 sticky top-0 z-50\" data-testid=\"app-nav\">\n <div className=\"max-w-7xl mx-auto px-4 h-16 flex items-center justify-between gap-3\">\n {showLogo && (\n <NavLink to=\"/\" className=\"flex items-center gap-2 group shrink-0\" data-testid=\"app-title\">\n <div\n className=\"w-8 h-8 rounded-lg flex items-center justify-center shadow-sm group-hover:shadow-md transition-shadow\"\n style={{ backgroundColor: primaryColor }}\n >\n <Rocket className=\"w-4 h-4 text-white\" />\n </div>\n <span className=\"text-lg font-semibold text-gray-900 tracking-tight whitespace-nowrap\">\n {logoText}\n </span>\n <Sparkles className=\"w-3.5 h-3.5 shrink-0\" style={{ color: primaryColor }} />\n </NavLink>\n )}\n\n <div className=\"flex items-center gap-0.5 overflow-x-auto flex-1 min-w-0 scrollbar-hide\">\n {navItems.map(item => (\n <NavLink\n key={item.path}\n to={item.path}\n data-testid={\\`nav-\\${item.label.toLowerCase().replace(/\\\\s+/g, '-')}-button\\`}\n className={({ isActive }: { isActive: boolean }) =>\n \\`px-3 py-1.5 rounded-lg text-sm font-medium transition-all duration-200 shrink-0 whitespace-nowrap \\${\n isActive ? 'text-white' : 'text-gray-500 hover:text-gray-900 hover:bg-gray-50'\n }\\`\n }\n style={\n (({ isActive }: { isActive: boolean }) =>\n isActive\n ? { backgroundColor: \\`\\${primaryColor}15\\`, color: primaryColor }\n : undefined) as never\n }\n >\n {item.label}\n </NavLink>\n ))}\n </div>\n\n <AuthSection style={authStyle} />\n </div>\n </nav>\n )\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\nimport { getClientPages } from './template-generator'\n\nexport function generateClientAppTest(resolved: ResolvedPreset): string {\n const pages = getClientPages(resolved)\n\n const mocks = pages\n .map(\n p =>\n `vi.mock('@client/pages/${p.name}', () => ({\n ${p.name}: () => <div data-testid=\"${p.name.toLowerCase()}-page\">${p.name}</div>,\n}))`\n )\n .join('\\n\\n ')\n\n return `import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'\nimport { render, screen, cleanup } from '@testing-library/react'\nimport '@testing-library/jest-dom'\nimport { App } from '@client/App'\n\n ${mocks}\n\ndescribe('App Component', () => {\n beforeEach(() => {\n vi.clearAllMocks()\n })\n\n afterEach(() => {\n cleanup()\n })\n\n describe('Initial Render', () => {\n it('should render navigation', () => {\n render(<App />)\n // 布局感知:top-nav 有 app-nav;sidebar 布局没有顶栏(有 app-container/app-main)\n expect(\n document.querySelector('[data-testid=\"app-nav\"], [data-testid=\"app-container\"]')\n ).toBeTruthy()\n })\n\n it('should render main content area', () => {\n render(<App />)\n expect(screen.getByTestId('app-main')).toBeInTheDocument()\n })\n\n it('should render container', () => {\n render(<App />)\n expect(screen.getByTestId('app-container')).toBeInTheDocument()\n })\n })\n\n describe('Navigation Links', () => {\n it('should render footer', () => {\n render(<App />)\n // 页脚仅 top-nav 布局渲染(Layout: showFooter = layout === 'top-nav')\n expect(\n document.querySelector('[data-testid=\"app-footer\"]') ||\n document.querySelector('[data-testid=\"app-container\"]')\n ).toBeTruthy()\n })\n })\n})\n`\n}\n","import type { ResolvedPreset } from './template-generator'\nimport { getClientPages } from './template-generator'\n\nconst LABEL_MAP: Record<string, string> = {\n TodoPage: 'Todos',\n NotificationPage: 'Notifications',\n WebSocketPage: 'WebSocket',\n PluginsPage: 'Plugins',\n CategoriesPage: 'Categories',\n SearchPage: 'Search',\n PublishPage: 'Publish',\n DeveloperDashboardPage: 'Developer',\n TopicsPage: 'Topics',\n ProfilePage: 'Profile',\n DashboardPage: 'Dashboard',\n SettingsPage: 'Settings',\n CartPage: 'Cart',\n OrdersPage: 'Orders',\n}\n\nexport function generateClientNavigationTest(resolved: ResolvedPreset): string {\n const pages = getClientPages(resolved).filter(p => !p.route.includes(':'))\n const firstPage = pages[0]\n\n if (!firstPage) {\n return `import { describe, it, expect } from 'vitest'\nimport { render, screen } from '@testing-library/react'\nimport { BrowserRouter } from 'react-router-dom'\nimport { Navigation } from '../Navigation'\n\nconst renderWithRouter = (component: React.ReactNode) => {\n return render(<BrowserRouter>{component}</BrowserRouter>)\n}\n\ndescribe('Navigation', () => {\n it('should render navigation', () => {\n renderWithRouter(<Navigation />)\n expect(screen.getByTestId('app-nav')).toBeInTheDocument()\n })\n})\n`\n }\n\n const firstLabel = LABEL_MAP[firstPage.name] || firstPage.name.replace('Page', '')\n\n return `import { describe, it, expect } from 'vitest'\nimport { render, screen } from '@testing-library/react'\nimport { BrowserRouter } from 'react-router-dom'\nimport { Navigation } from '../Navigation'\n\nconst renderWithRouter = (component: React.ReactNode) => {\n return render(<BrowserRouter>{component}</BrowserRouter>)\n}\n\ndescribe('Navigation', () => {\n it('should render navigation', () => {\n renderWithRouter(<Navigation />)\n expect(screen.getByTestId('app-nav')).toBeInTheDocument()\n })\n\n it('should render nav items', () => {\n renderWithRouter(\n <Navigation\n items={[{ label: '${firstLabel}', icon: 'CheckSquare', path: '${firstPage.route}' }]}\n />\n )\n expect(screen.getByText('${firstLabel}')).toBeInTheDocument()\n })\n})\n`\n}\n","/**\n * Generates admin/App.tsx content based on resolved preset\n */\nimport type { ResolvedPreset } from './template-generator'\nimport { getAdminPages } from './template-generator'\n\nexport function generateAdminApp(resolved: ResolvedPreset): string | null {\n if (!resolved.hasAdmin) return null\n\n const pages = getAdminPages(resolved) ?? []\n if (pages.length === 0) return null\n\n // Separate public and protected pages\n const publicPages = pages.filter(p => p.isPublic)\n const protectedPages = pages.filter(p => !p.isPublic)\n\n // Build imports\n const imports = [\n `import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'`,\n `import { ConfigProvider } from 'antd'`,\n `import { Layout } from './layouts/Layout'`,\n ]\n\n for (const page of pages) {\n imports.push(`import { ${page.name} } from './pages/${page.name}'`)\n }\n\n // CaptchaModal only if captcha module is included\n const captchaImport = resolved.hasCaptcha ? ', CaptchaModal' : ''\n imports.push(`import { ProtectedRoute${captchaImport} } from './components'`)\n\n // Build protected route elements\n const protectedRouteElements = protectedPages.map(\n p => ` <Route path=\"${p.route}\" element={<${p.name} />} />`\n )\n\n const defaultProtectedRoute = protectedPages.length > 0 ? protectedPages[0].route : '/'\n\n const captchaElement = resolved.hasCaptcha ? `\\n <CaptchaModal />` : ''\n\n const publicRouteLines = publicPages.map(\n p => ` <Route path=\"${p.route}\" element={<${p.name} />} />`\n )\n\n return `${imports.join('\\n')}\n\nexport const App: React.FC<{ basePath?: string }> = ({ basePath = '/admin' }) => {\n return (\n <ConfigProvider\n theme={{\n token: {\n colorPrimary: '#1890ff',\n },\n }}\n >\n <BrowserRouter basename={basePath}>\n <Routes>\n${publicRouteLines.join('\\n')}\n <Route\n path=\"/*\"\n element={\n <ProtectedRoute>\n <Layout>\n <Routes>\n <Route path=\"/\" element={<Navigate to=\"${defaultProtectedRoute}\" replace />} />\n${protectedRouteElements.join('\\n')}\n <Route path=\"/system/monitor\" element={<div className=\"p-6\"><h2 className=\"text-xl font-semibold\">System Monitor</h2><p className=\"text-gray-500 mt-2\">Coming soon...</p></div>} />\n </Routes>\n </Layout>\n </ProtectedRoute>\n }\n />\n </Routes>${captchaElement}\n </BrowserRouter>\n </ConfigProvider>\n )\n}\n`\n}\n\n/**\n * Generates admin/components/index.ts content based on resolved preset.\n * Conditionally includes CaptchaModal only when captcha module is present.\n */\nexport function generateAdminComponentsIndex(resolved: ResolvedPreset): string | null {\n if (!resolved.hasAdmin) return null\n\n const lines = [\n `export { UserTable } from './UserTable'`,\n `export { StatsCard } from './StatsCard'`,\n `export { PageHeader } from './PageHeader'`,\n `export { UserFormModal } from './UserFormModal'`,\n `export { ProtectedRoute } from './ProtectedRoute'`,\n ]\n\n if (resolved.hasCaptcha) {\n lines.push(`export { CaptchaModal } from './CaptchaModal'`)\n }\n\n lines.push(`export { PermissionGuard, PermissionButton, Can, Cannot } from './PermissionGuard'`)\n\n return lines.join('\\n') + '\\n'\n}\n\n/**\n * Generates admin/services/apiClient.ts content based on resolved preset.\n * Conditionally imports captchaStore only when captcha module is present.\n */\nexport function generateAdminApiClient(resolved: ResolvedPreset): string | null {\n if (!resolved.hasAdmin) return null\n\n const captchaImport = resolved.hasCaptcha\n ? `import { useCaptchaStore } from '../stores/captchaStore'\\n`\n : ''\n const captchaFetchSetup = resolved.hasCaptcha\n ? ` const showCaptcha = useCaptchaStore.getState().show\\n\\n`\n : ''\n const captchaHandler = resolved.hasCaptcha\n ? ` onShowCaptcha: async config => {\n return showCaptcha({\n type: config.type,\n captchaUrl: config.captchaUrl,\n })\n },`\n : ` onShowCaptcha: async () => true,`\n\n return `/**\n * @framework-baseline ab16e97716a7556e\n * @framework-modify\n * @reason Conditional captcha support based on preset modules\n * @impact Captcha module excluded = no captchaStore import\n */\n\nimport { WSClientImpl } from '@shared/core/ws-client'\nimport { SSEClientImpl } from '@shared/core/sse-client'\nimport { createRequestInterceptor } from './requestInterceptor'\n${captchaImport}import { createApiFacade } from '@server/rpc-surface'\n\nconst baseUrl = import.meta.env.API_BASE_URL || window.location.origin\n\nconst TOKEN_KEY = 'admin-storage'\n\nfunction clearAuthAndRedirect(): void {\n localStorage.removeItem(TOKEN_KEY)\n if (window.location.pathname !== '/admin/login') {\n window.location.href = '/admin/login'\n }\n}\n\nfunction getAuthToken(): string | null {\n try {\n const stored = localStorage.getItem(TOKEN_KEY)\n if (stored) {\n const parsed = JSON.parse(stored)\n return parsed.state?.token || null\n }\n } catch {\n return null\n }\n return null\n}\n\nfunction createCustomFetch() {\n${captchaFetchSetup} return createRequestInterceptor({\n onShowLogin: clearAuthAndRedirect,\n${captchaHandler} })\n}\n\nexport const apiClient = createApiFacade(baseUrl, {\n fetch: createCustomFetch() as typeof fetch,\n webSocket: url => new WSClientImpl(url) as unknown as WebSocket,\n sse: url => {\n const token = getAuthToken()\n const headers: Record<string, string> = {}\n if (token) {\n headers['Authorization'] = \\`Bearer \\${token}\\`\n }\n return new SSEClientImpl(url, headers)\n },\n})\n\nexport { api } from '@shared/core/api-request'\n`\n}\n","/**\n * Generates server/db/schema/index.ts barrel file based on resolved preset\n */\nimport type { ResolvedPreset } from './template-generator'\nimport { getDbSchemaFiles } from './template-generator'\n\nexport function generateDbSchemaBarrel(resolved: ResolvedPreset): string {\n const files = getDbSchemaFiles(resolved)\n\n const exports = files.map(f => `export * from './${f}'`)\n\n return exports.join('\\n') + '\\n'\n}\n","import type { ResolvedPreset } from './template-generator'\n\nconst INITIAL_PERMISSIONS = `const initialPermissions = [\n {\n id: 'perm_user_view',\n code: 'user:view',\n name: '查看用户',\n label: '查看用户',\n category: 'user',\n sortOrder: 1,\n },\n {\n id: 'perm_user_create',\n code: 'user:create',\n name: '创建用户',\n label: '创建用户',\n category: 'user',\n sortOrder: 2,\n },\n {\n id: 'perm_user_edit',\n code: 'user:edit',\n name: '编辑用户',\n label: '编辑用户',\n category: 'user',\n sortOrder: 3,\n },\n {\n id: 'perm_user_delete',\n code: 'user:delete',\n name: '删除用户',\n label: '删除用户',\n category: 'user',\n sortOrder: 4,\n },\n {\n id: 'perm_content_view',\n code: 'content:view',\n name: '查看内容',\n label: '查看内容',\n category: 'content',\n sortOrder: 1,\n },\n {\n id: 'perm_content_create',\n code: 'content:create',\n name: '创建内容',\n label: '创建内容',\n category: 'content',\n sortOrder: 2,\n },\n {\n id: 'perm_content_edit',\n code: 'content:edit',\n name: '编辑内容',\n label: '编辑内容',\n category: 'content',\n sortOrder: 3,\n },\n {\n id: 'perm_content_delete',\n code: 'content:delete',\n name: '删除内容',\n label: '删除内容',\n category: 'content',\n sortOrder: 4,\n },\n {\n id: 'perm_system_settings',\n code: 'system:settings',\n name: '系统设置',\n label: '系统设置',\n category: 'system',\n sortOrder: 1,\n },\n {\n id: 'perm_system_logs',\n code: 'system:logs',\n name: '系统日志',\n label: '系统日志',\n category: 'system',\n sortOrder: 2,\n },\n {\n id: 'perm_system_monitor',\n code: 'system:monitor',\n name: '系统监控',\n label: '系统监控',\n category: 'system',\n sortOrder: 3,\n },\n {\n id: 'perm_data_export',\n code: 'data:export',\n name: '数据导出',\n label: '数据导出',\n category: 'data',\n sortOrder: 1,\n },\n {\n id: 'perm_data_import',\n code: 'data:import',\n name: '数据导入',\n label: '数据导入',\n category: 'data',\n sortOrder: 2,\n },\n {\n id: 'perm_order_view',\n code: 'order:view',\n name: '查看订单',\n label: '查看订单',\n category: 'order',\n sortOrder: 1,\n },\n {\n id: 'perm_order_create',\n code: 'order:create',\n name: '创建订单',\n label: '创建订单',\n category: 'order',\n sortOrder: 2,\n },\n {\n id: 'perm_order_edit',\n code: 'order:edit',\n name: '编辑订单',\n label: '编辑订单',\n category: 'order',\n sortOrder: 3,\n },\n {\n id: 'perm_order_delete',\n code: 'order:delete',\n name: '删除订单',\n label: '删除订单',\n category: 'order',\n sortOrder: 4,\n },\n {\n id: 'perm_order_process',\n code: 'order:process',\n name: '处理订单',\n label: '处理订单',\n category: 'order',\n sortOrder: 5,\n },\n {\n id: 'perm_ticket_view',\n code: 'ticket:view',\n name: '查看工单',\n label: '查看工单',\n category: 'ticket',\n sortOrder: 1,\n },\n {\n id: 'perm_ticket_create',\n code: 'ticket:create',\n name: '创建工单',\n label: '创建工单',\n category: 'ticket',\n sortOrder: 2,\n },\n {\n id: 'perm_ticket_edit',\n code: 'ticket:edit',\n name: '编辑工单',\n label: '编辑工单',\n category: 'ticket',\n sortOrder: 3,\n },\n {\n id: 'perm_ticket_delete',\n code: 'ticket:delete',\n name: '删除工单',\n label: '删除工单',\n category: 'ticket',\n sortOrder: 4,\n },\n {\n id: 'perm_ticket_reply',\n code: 'ticket:reply',\n name: '回复工单',\n label: '回复工单',\n category: 'ticket',\n sortOrder: 5,\n },\n {\n id: 'perm_ticket_close',\n code: 'ticket:close',\n name: '关闭工单',\n label: '关闭工单',\n category: 'ticket',\n sortOrder: 6,\n },\n {\n id: 'perm_dispute_view',\n code: 'dispute:view',\n name: '查看争议',\n label: '查看争议',\n category: 'dispute',\n sortOrder: 1,\n },\n {\n id: 'perm_dispute_create',\n code: 'dispute:create',\n name: '创建争议',\n label: '创建争议',\n category: 'dispute',\n sortOrder: 2,\n },\n {\n id: 'perm_dispute_edit',\n code: 'dispute:edit',\n name: '编辑争议',\n label: '编辑争议',\n category: 'dispute',\n sortOrder: 3,\n },\n {\n id: 'perm_dispute_delete',\n code: 'dispute:delete',\n name: '删除争议',\n label: '删除争议',\n category: 'dispute',\n sortOrder: 4,\n },\n {\n id: 'perm_dispute_resolve',\n code: 'dispute:resolve',\n name: '解决争议',\n label: '解决争议',\n category: 'dispute',\n sortOrder: 5,\n },\n {\n id: 'perm_role_view',\n code: 'role:view',\n name: '查看角色',\n label: '查看角色',\n category: 'role',\n sortOrder: 1,\n },\n {\n id: 'perm_role_create',\n code: 'role:create',\n name: '创建角色',\n label: '创建角色',\n category: 'role',\n sortOrder: 2,\n },\n {\n id: 'perm_role_edit',\n code: 'role:edit',\n name: '编辑角色',\n label: '编辑角色',\n category: 'role',\n sortOrder: 3,\n },\n {\n id: 'perm_role_delete',\n code: 'role:delete',\n name: '删除角色',\n label: '删除角色',\n category: 'role',\n sortOrder: 4,\n },\n]`\n\nconst INITIAL_ROLES = `const initialRoles = [\n {\n id: 'role_super_admin',\n code: 'super_admin',\n name: '超级管理员',\n label: '超级管理员',\n isSystem: true,\n sortOrder: 1,\n },\n {\n id: 'role_customer_service',\n code: 'customer_service',\n name: '客服人员',\n label: '客服人员',\n isSystem: true,\n sortOrder: 2,\n },\n {\n id: 'role_user',\n code: 'user',\n name: '普通用户',\n label: '普通用户',\n isSystem: true,\n sortOrder: 3,\n },\n]`\n\nconst INITIAL_ROLE_PERMISSIONS = `const initialRolePermissions = [\n { roleId: 'role_super_admin', permissionId: 'perm_user_view' },\n { roleId: 'role_super_admin', permissionId: 'perm_user_create' },\n { roleId: 'role_super_admin', permissionId: 'perm_user_edit' },\n { roleId: 'role_super_admin', permissionId: 'perm_user_delete' },\n { roleId: 'role_super_admin', permissionId: 'perm_content_view' },\n { roleId: 'role_super_admin', permissionId: 'perm_content_create' },\n { roleId: 'role_super_admin', permissionId: 'perm_content_edit' },\n { roleId: 'role_super_admin', permissionId: 'perm_content_delete' },\n { roleId: 'role_super_admin', permissionId: 'perm_system_settings' },\n { roleId: 'role_super_admin', permissionId: 'perm_system_logs' },\n { roleId: 'role_super_admin', permissionId: 'perm_system_monitor' },\n { roleId: 'role_super_admin', permissionId: 'perm_data_export' },\n { roleId: 'role_super_admin', permissionId: 'perm_data_import' },\n { roleId: 'role_super_admin', permissionId: 'perm_order_view' },\n { roleId: 'role_super_admin', permissionId: 'perm_order_create' },\n { roleId: 'role_super_admin', permissionId: 'perm_order_edit' },\n { roleId: 'role_super_admin', permissionId: 'perm_order_delete' },\n { roleId: 'role_super_admin', permissionId: 'perm_order_process' },\n { roleId: 'role_super_admin', permissionId: 'perm_ticket_view' },\n { roleId: 'role_super_admin', permissionId: 'perm_ticket_create' },\n { roleId: 'role_super_admin', permissionId: 'perm_ticket_edit' },\n { roleId: 'role_super_admin', permissionId: 'perm_ticket_delete' },\n { roleId: 'role_super_admin', permissionId: 'perm_ticket_reply' },\n { roleId: 'role_super_admin', permissionId: 'perm_ticket_close' },\n { roleId: 'role_super_admin', permissionId: 'perm_dispute_view' },\n { roleId: 'role_super_admin', permissionId: 'perm_dispute_create' },\n { roleId: 'role_super_admin', permissionId: 'perm_dispute_edit' },\n { roleId: 'role_super_admin', permissionId: 'perm_dispute_delete' },\n { roleId: 'role_super_admin', permissionId: 'perm_dispute_resolve' },\n { roleId: 'role_customer_service', permissionId: 'perm_content_view' },\n { roleId: 'role_customer_service', permissionId: 'perm_order_view' },\n { roleId: 'role_customer_service', permissionId: 'perm_order_create' },\n { roleId: 'role_customer_service', permissionId: 'perm_order_edit' },\n { roleId: 'role_customer_service', permissionId: 'perm_order_delete' },\n { roleId: 'role_customer_service', permissionId: 'perm_order_process' },\n { roleId: 'role_customer_service', permissionId: 'perm_ticket_view' },\n { roleId: 'role_customer_service', permissionId: 'perm_ticket_create' },\n { roleId: 'role_customer_service', permissionId: 'perm_ticket_edit' },\n { roleId: 'role_customer_service', permissionId: 'perm_ticket_delete' },\n { roleId: 'role_customer_service', permissionId: 'perm_ticket_reply' },\n { roleId: 'role_customer_service', permissionId: 'perm_ticket_close' },\n { roleId: 'role_customer_service', permissionId: 'perm_dispute_view' },\n { roleId: 'role_customer_service', permissionId: 'perm_dispute_create' },\n { roleId: 'role_customer_service', permissionId: 'perm_dispute_edit' },\n { roleId: 'role_customer_service', permissionId: 'perm_dispute_delete' },\n { roleId: 'role_customer_service', permissionId: 'perm_dispute_resolve' },\n { roleId: 'role_customer_service', permissionId: 'perm_data_export' },\n { roleId: 'role_customer_service', permissionId: 'perm_system_logs' },\n { roleId: 'role_user', permissionId: 'perm_content_view' },\n { roleId: 'role_user', permissionId: 'perm_order_view' },\n]`\n\nexport function generateDbInit(resolved: ResolvedPreset): string {\n // Collect seed info from manifests dynamically\n const activeSeeds: { moduleDir: string; serviceFile: string; functionName: string }[] = []\n for (const [name, manifest] of resolved.modules) {\n if (manifest.dbSchemas?.hasSeed && manifest.dbSchemas.seed) {\n activeSeeds.push({\n moduleDir: `module-${name}`,\n serviceFile: manifest.dbSchemas.seed.serviceFile,\n functionName: manifest.dbSchemas.seed.functionName,\n })\n }\n }\n\n if (!resolved.hasPermission) {\n return generateMinimalDbInit(activeSeeds)\n }\n\n return generateFullDbInit(activeSeeds)\n}\n\nfunction generateMinimalDbInit(\n activeSeeds: { moduleDir: string; serviceFile: string; functionName: string }[]\n): string {\n const seedCalls = activeSeeds\n .map(s => ` import('../${s.moduleDir}/services/${s.serviceFile}').then(m => m.${s.functionName}()),`)\n .join('\\n')\n\n const seedBlock =\n activeSeeds.length > 0\n ? `\n log.info({}, 'Seeding module data...')\n await Promise.all([\n${seedCalls}\n ])\n log.info({}, 'Module data seeding complete!')`\n : ''\n\n return `import { getDb } from './driver'\nimport { logger } from '../utils/logger'\n\nconst log = logger.db()\n\nexport async function initializeDatabase() {\n await getDb()\n\n log.info({}, 'Initializing database...')\n\n log.info({}, 'Database initialization complete!')${seedBlock}\n}\n`\n}\n\nfunction generateFullDbInit(\n activeSeeds: { moduleDir: string; serviceFile: string; functionName: string }[]\n): string {\n const seedCalls = activeSeeds\n .map(s => ` import('../${s.moduleDir}/services/${s.serviceFile}').then(m => m.${s.functionName}()),`)\n .join('\\n')\n\n const seedBlock =\n activeSeeds.length > 0\n ? `\n log.info({}, 'Seeding module data...')\n await Promise.all([\n${seedCalls}\n ])\n log.info({}, 'Module data seeding complete!')`\n : ''\n\n return `import { getDb } from './driver'\nimport { permissions, roles, rolePermissions } from './schema'\nimport { logger } from '../utils/logger'\n\nconst log = logger.db()\n\n${INITIAL_PERMISSIONS}\n\n${INITIAL_ROLES}\n\n${INITIAL_ROLE_PERMISSIONS}\n\nexport async function initializeDatabase() {\n const db = await getDb()\n\n log.info({}, 'Initializing database...')\n\n const existingPermissions = await db.select().from(permissions)\n if (existingPermissions.length === 0) {\n log.info({}, 'Inserting initial permissions...')\n await db.insert(permissions).values(\n initialPermissions.map(p => ({\n ...p,\n description: null,\n isActive: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n }))\n )\n }\n\n const existingRoles = await db.select().from(roles)\n if (existingRoles.length === 0) {\n log.info({}, 'Inserting initial roles...')\n await db.insert(roles).values(\n initialRoles.map(r => ({\n ...r,\n description: null,\n isActive: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n }))\n )\n }\n\n const existingRolePermissions = await db.select().from(rolePermissions)\n if (existingRolePermissions.length === 0) {\n log.info({}, 'Inserting initial role permissions...')\n await db.insert(rolePermissions).values(\n initialRolePermissions.map(rp => ({\n ...rp,\n createdAt: new Date(),\n }))\n )\n }\n\n log.info({}, 'Database initialization complete!')${seedBlock}\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\nimport { getStandaloneRoutes } from './route-registry'\n\nexport function generateServerApp(resolved: ResolvedPreset): string {\n const useRealtime = resolved.hasSSE || resolved.hasWebSocket\n const useAuditLog = resolved.hasPermission\n const useCaptcha = resolved.hasCaptcha\n const standaloneRoutes = getStandaloneRoutes(resolved)\n\n const imports: string[] = [\n `import { OpenAPIHono } from '@hono/zod-openapi'`,\n ``,\n `import { HTTPException } from 'hono/http-exception'`,\n `import type { ContentfulStatusCode } from 'hono/utils/http-status'`,\n `import { ZodError } from 'zod'`,\n `import type { AppBindings, CreateAppOptions } from './types/bindings'`,\n `import { AppError } from './utils/app-error'`,\n `import { autoRegisterRealtime } from './core/realtime-scanner'`,\n `import { corsMiddleware, loggerMiddleware, errorHandlerMiddleware } from './middleware'`,\n ]\n\n if (useRealtime) {\n imports.push(`import { realtimeEnvMiddleware } from './middleware/realtime-env'`)\n }\n if (useAuditLog) {\n imports.push(`import { auditLogMiddleware } from './middleware/audit-log'`)\n }\n if (useCaptcha) {\n imports.push(`import { captchaMiddleware } from './middleware/captcha'`)\n }\n\n imports.push(\n `import { createModuleLoggerSync } from './utils/logger'`,\n `import { adminApiRoutes, clientApiRoutes } from './route-registry'`\n )\n\n // Import standalone routes from their source modules (already imported via route-registry)\n // But standalone routes are NOT part of the aggregated clientApiRoutes/adminApiRoutes,\n // so we import them directly for mounting at their custom paths.\n const standaloneImportSet = new Set<string>()\n for (const [name, manifest] of resolved.modules) {\n if (manifest.routes.standalone) {\n const { importPath, exportName } = manifest.routes.standalone\n const moduleDir = `module-${name}`\n const relPath = importPath.replace(/^\\.\\//, '')\n // Check if this import is already in the route-registry (which re-exports aren't — we import directly)\n const stmt = `import { ${exportName} } from './${moduleDir}/${relPath}'`\n if (!standaloneImportSet.has(stmt)) {\n standaloneImportSet.add(stmt)\n imports.push(stmt)\n }\n }\n }\n\n const middlewareChain: string[] = [\n `.use('*', errorHandlerMiddleware())`,\n `.use('*', loggerMiddleware())`,\n `.use('*', corsMiddleware())`,\n ]\n\n if (useRealtime) {\n middlewareChain.push(`.use('*', realtimeEnvMiddleware())`)\n }\n if (useAuditLog) {\n middlewareChain.push(`.use('/api/*', auditLogMiddleware())`)\n }\n if (useCaptcha) {\n middlewareChain.push(\n `.use(\\n '/api/admin/*',\\n captchaMiddleware({\\n maxRequests: 20,\\n windowMs: 60000,\\n })\\n )`\n )\n }\n\n const routes: string[] = [`.route('/', clientApiRoutes)`, `.route('/', adminApiRoutes)`]\n\n // Dynamically mount standalone routes at their custom paths\n for (const sr of standaloneRoutes) {\n routes.push(`.route('${sr.mountPath}', ${sr.localName})`)\n }\n\n const indent = ' '\n const chain = [...middlewareChain, ...routes].join(`\\n${indent}`)\n\n return `${imports.join('\\n')}\n\nexport { type AppBindings, type CreateAppOptions } from './types/bindings'\n\nexport function createApp<T extends AppBindings = AppBindings>(_options: CreateAppOptions = {}) {\n const app = new OpenAPIHono<{ Bindings: T }>()\n ${chain}\n .get('/health', async c => {\n try {\n const { getDb } = await import('./db')\n await getDb()\n return c.json({ status: 'ok', timestamp: new Date().toISOString(), db: 'connected' })\n } catch {\n return c.json({ status: 'ok', timestamp: new Date().toISOString(), db: 'not configured' })\n }\n })\n // 测试辅助端点:仅开发/测试环境注册(Cloudflare 构建时 NODE_ENV 被替换为\n // \"production\",此端点不会出现在生产 bundle 中)\n if (process.env.NODE_ENV !== 'production') {\n app.post('/api/__test__/cleanup', async c => {\n try {\n const { cleanupTestDatabase } = await import('./db/test-setup')\n await cleanupTestDatabase()\n return c.json({ success: true as const, message: 'Database cleaned up' })\n } catch (error) {\n console.error('Error during database cleanup:', error)\n return c.json({ success: false as const, message: 'Failed to cleanup database' }, 500)\n }\n })\n }\n\n autoRegisterRealtime(app as unknown as Parameters<typeof autoRegisterRealtime>[0])\n\n app.onError((err, c) => {\n const log = createModuleLoggerSync('api')\n c.res.headers.set('Content-Type', 'application/json')\n\n if (AppError.isAppError(err)) {\n return c.json(\n {\n success: false as const,\n error: err.message,\n status: err.statusCode,\n details: err.details,\n },\n err.statusCode as ContentfulStatusCode\n )\n }\n\n if (err instanceof HTTPException) {\n return c.json(\n { success: false as const, error: err.message, status: err.status },\n err.status as ContentfulStatusCode\n )\n }\n\n if (err instanceof ZodError) {\n const details = err.issues.map(issue => ({\n field: issue.path.join('.'),\n message: issue.message,\n }))\n return c.json(\n { success: false as const, error: 'Validation failed', status: 400, details },\n 400\n )\n }\n\n log.error({ err, path: c.req.path }, 'Unhandled error')\n return c.json(\n { success: false as const, error: err.message || 'Internal server error', status: 500 },\n 500\n )\n })\n\n return app\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\n\nconst MODULE_EXPORTS: Record<string, { namedExports: string[]; hasTypeOnly?: boolean }> = {\n chat: {\n namedExports: ['ChatProtocolSchema', 'type ChatProtocol'],\n },\n todos: {\n namedExports: [\n 'TodoSchema',\n 'TodoStatusSchema',\n 'CreateTodoSchema',\n 'UpdateTodoSchema',\n 'TodoIdSchema',\n 'type Todo',\n 'type TodoStatus',\n 'type CreateTodoInput',\n 'type UpdateTodoInput',\n ],\n },\n files: {\n namedExports: [\n 'FileDownloadSchema',\n 'PrivateFileQuerySchema',\n 'PublicFileUrlSchema',\n 'PrivateFileUrlSchema',\n 'GenerateUrlRequestSchema',\n 'FileUrlResponseSchema',\n 'EmptySchema',\n ],\n },\n notifications: {\n namedExports: [\n 'NotificationSchema',\n 'NotificationTypeSchema',\n 'CreateNotificationSchema',\n 'NotificationListQuerySchema',\n 'SSEEventSchema',\n 'AppSSEProtocolSchema',\n 'type AppNotification',\n 'type NotificationType',\n 'type CreateNotificationInput',\n 'type NotificationListQuery',\n 'type SSEEvent',\n 'type AppSSEProtocol',\n ],\n },\n admin: {\n namedExports: [\n 'SystemStatsSchema',\n 'HealthCheckSchema',\n 'RecentActivityItemSchema',\n 'RecentActivitySchema',\n 'AuthUserSchema',\n 'ClearTodosResultSchema',\n 'type SystemStats',\n 'type HealthCheck',\n 'type RecentActivityItem',\n 'type AuthUserResponse',\n 'type ClearTodosResult',\n ],\n },\n permission: {\n namedExports: [\n 'RoleEnum',\n 'RoleInfoSchema',\n 'PermissionInfoSchema',\n 'UserPermissionsSchema',\n 'RoleListSchema',\n 'PermissionListSchema',\n 'Role',\n 'Permission',\n 'ROLE_PERMISSIONS',\n 'ROLE_LABELS',\n 'PERMISSION_LABELS',\n 'PERMISSION_CATEGORIES',\n 'getPermissionsByRole',\n 'hasPermission',\n 'hasAnyPermission',\n 'hasAllPermissions',\n 'type PermissionRoleType',\n 'type RoleInfo',\n 'type PermissionInfo',\n 'type UserPermissions',\n ],\n },\n auth: {\n namedExports: [\n 'DeveloperProfileSchema',\n 'LoginSchema',\n 'RegisterSchema',\n 'TokenResponseSchema',\n 'type DeveloperProfile',\n 'type LoginInput',\n 'type RegisterInput',\n 'type TokenResponse',\n ],\n },\n plugin: {\n namedExports: [\n 'PluginSchema',\n 'PluginStatusSchema',\n 'CreatePluginSchema',\n 'UpdatePluginSchema',\n 'PluginVersionStatusSchema',\n 'VersionSchema',\n 'CategorySchema',\n 'ReviewSchema',\n 'CreateReviewSchema',\n 'MarketplaceStatsSchema',\n 'PluginListResponseSchema',\n 'AdminPluginSchema',\n 'AdminDashboardStatsSchema',\n 'PluginListQuerySchema',\n 'PluginSlugSchema',\n 'type Plugin',\n 'type PluginStatus',\n 'type CreatePluginInput',\n 'type UpdatePluginInput',\n 'type PluginVersionStatus',\n 'type Version',\n 'type Category',\n 'type Review',\n 'type CreateReviewInput',\n 'type MarketplaceStats',\n 'type PluginListResponse',\n 'type AdminPlugin',\n 'type AdminDashboardStats',\n 'type PluginListQuery',\n ],\n },\n plugins: {\n namedExports: [\n 'PluginSchema',\n 'PluginStatusSchema',\n 'CreatePluginSchema',\n 'UpdatePluginSchema',\n 'PluginVersionStatusSchema',\n 'VersionSchema',\n 'CategorySchema',\n 'ReviewSchema',\n 'CreateReviewSchema',\n 'MarketplaceStatsSchema',\n 'PluginListResponseSchema',\n 'AdminPluginSchema',\n 'AdminDashboardStatsSchema',\n 'PluginListQuerySchema',\n 'PluginSlugSchema',\n 'type Plugin',\n 'type PluginStatus',\n 'type CreatePluginInput',\n 'type UpdatePluginInput',\n 'type PluginVersionStatus',\n 'type Version',\n 'type Category',\n 'type Review',\n 'type CreateReviewInput',\n 'type MarketplaceStats',\n 'type PluginListResponse',\n 'type AdminPlugin',\n 'type AdminDashboardStats',\n 'type PluginListQuery',\n ],\n },\n merchant: {\n namedExports: [\n 'ProductSchema',\n 'CreateProductSchema',\n 'UpdateProductSchema',\n 'ProductListSchema',\n 'type Product',\n 'type CreateProductInput',\n 'type UpdateProductInput',\n ],\n },\n tenant: {\n namedExports: [\n 'TenantSchema',\n 'TenantStatusSchema',\n 'TenantPlanSchema',\n 'TenantSettingsSchema',\n 'CreateTenantSchema',\n 'UpdateTenantSchema',\n 'TenantIdSchema',\n 'TenantSlugSchema',\n 'TenantListResponseSchema',\n 'TenantQuerySchema',\n 'TenantIdResponseSchema',\n 'type Tenant',\n 'type TenantStatus',\n 'type TenantPlan',\n 'type TenantSettings',\n 'type CreateTenantInput',\n 'type UpdateTenantInput',\n 'type TenantId',\n 'type TenantSlug',\n 'type TenantListResponse',\n 'type TenantQuery',\n 'type TenantIdResponse',\n ],\n },\n order: {\n namedExports: [\n 'OrderStatusSchema',\n 'OrderSchema',\n 'CreateOrderSchema',\n 'UpdateOrderSchema',\n 'OrderListSchema',\n 'OrderQuerySchema',\n 'OrderDeleteResultSchema',\n 'ProcessOrderSchema',\n 'CancelOrderSchema',\n 'RemoveCartItemResponseSchema',\n 'ECommerceProductSchema',\n 'ECommerceOrderStatusSchema',\n 'ECommerceOrderSchema',\n 'ECommerceOrderListSchema',\n 'type OrderStatus',\n 'type Order',\n 'type CreateOrderInput',\n 'type UpdateOrderInput',\n 'type OrderDeleteResult',\n 'type ProcessOrderInput',\n 'type CancelOrderInput',\n 'type OrderQueryInput',\n 'type RemoveCartItemResponse',\n 'type ECommerceProduct',\n 'type ECommerceOrderStatus',\n 'type ECommerceOrder',\n ],\n },\n ticket: {\n namedExports: [\n 'TicketStatusSchema',\n 'TicketPrioritySchema',\n 'TicketCategorySchema',\n 'TicketReplySchema',\n 'TicketSchema',\n 'CreateTicketSchema',\n 'UpdateTicketSchema',\n 'ReplyTicketSchema',\n 'TicketListSchema',\n 'TicketDeleteResultSchema',\n 'type TicketStatus',\n 'type TicketPriority',\n 'type TicketCategory',\n 'type TicketReply',\n 'type Ticket',\n 'type CreateTicketInput',\n 'type UpdateTicketInput',\n 'type ReplyTicketInput',\n 'type TicketDeleteResult',\n ],\n },\n dispute: {\n namedExports: [\n 'DisputeTypeSchema',\n 'DisputeStatusSchema',\n 'DisputeSchema',\n 'CreateDisputeSchema',\n 'UpdateDisputeSchema',\n 'ResolveDisputeSchema',\n 'DisputeListSchema',\n 'DisputeDeleteResultSchema',\n 'type DisputeType',\n 'type DisputeStatus',\n 'type Dispute',\n 'type CreateDisputeInput',\n 'type UpdateDisputeInput',\n 'type ResolveDisputeInput',\n 'type DisputeDeleteResult',\n ],\n },\n content: {\n namedExports: [\n 'ContentCategorySchema',\n 'ContentStatusSchema',\n 'ContentSchema',\n 'CreateContentSchema',\n 'UpdateContentSchema',\n 'ContentListSchema',\n 'ContentDeleteResultSchema',\n 'type ContentCategory',\n 'type ContentStatus',\n 'type Content',\n 'type CreateContentInput',\n 'type UpdateContentInput',\n 'type ContentDeleteResult',\n ],\n },\n captcha: {\n namedExports: [\n 'CaptchaResponseSchema',\n 'VerifyCaptchaRequestSchema',\n 'CaptchaVerifyResponseSchema',\n 'type CaptchaResponse',\n 'type VerifyCaptchaRequest',\n 'type CaptchaVerifyResponse',\n ],\n },\n dashboard: {\n namedExports: [\n 'DashboardStatSchema',\n 'RevenueDataSchema',\n 'ActivityStatusSchema',\n 'ActivitySchema',\n 'DashboardResponseSchema',\n 'type DashboardStat',\n 'type RevenueData',\n 'type ActivityStatus',\n 'type Activity',\n 'type DashboardResponse',\n ],\n },\n cart: {\n namedExports: [\n 'CartItemSchema',\n 'CartSummarySchema',\n 'CartResponseSchema',\n 'AddCartItemSchema',\n 'CartItemIdSchema',\n 'type CartItem',\n 'type CartSummary',\n 'type CartResponse',\n 'type AddCartItemInput',\n ],\n },\n community: {\n namedExports: [\n 'TopicStatusSchema',\n 'TopicTagSchema',\n 'TopicAuthorSchema',\n 'TopicSchema',\n 'TopicsResponseSchema',\n 'ProfileStatsSchema',\n 'ActivityTypeSchema',\n 'ProfileActivitySchema',\n 'ProfileResponseSchema',\n 'type TopicStatus',\n 'type TopicTag',\n 'type TopicAuthor',\n 'type Topic',\n 'type ProfileStats',\n 'type ActivityType',\n 'type ProfileActivity',\n 'type ProfileResponse',\n ],\n },\n audit: {\n namedExports: ['ResourceTypeSchema', 'ActionTypeSchema', 'AuditLogSchema', 'type AuditLogType'],\n },\n role: {\n namedExports: [\n 'RoleSchema',\n 'CreateRoleSchema',\n 'UpdateRoleSchema',\n 'UpdateRolePermissionsSchema',\n 'RoleSuccessSchema',\n 'type RoleDataType',\n 'type CreateRoleType',\n 'type UpdateRoleType',\n ],\n },\n}\n\nexport function generateSharedModulesIndex(resolved: ResolvedPreset): string {\n const lines: string[] = []\n\n const moduleOrder = [\n 'chat',\n 'todos',\n 'file',\n 'notifications',\n 'admin',\n 'permission',\n 'auth',\n 'plugin',\n 'plugins',\n 'merchant',\n 'tenant',\n 'order',\n 'ticket',\n 'dispute',\n 'content',\n 'captcha',\n ]\n\n // Standalone shared modules: include when preset has pages or server modules that use them\n const STANDALONE_SHARED_MODULES: Record<string, { pages?: string[]; serverModules?: string[] }> =\n {\n cart: { pages: ['CartPage.tsx'] },\n community: { pages: ['TopicsPage.tsx', 'ProfilePage.tsx'], serverModules: ['content'] },\n dashboard: { pages: ['DashboardPage.tsx'] },\n }\n\n for (const moduleName of moduleOrder) {\n if (!resolved.modules.has(moduleName)) continue\n\n const manifest = resolved.modules.get(moduleName)!\n const exportKey = manifest.sharedSchemas?.path ?? moduleName\n const exports = MODULE_EXPORTS[exportKey]\n if (!exports) continue\n\n lines.push(`export {\\n ${exports.namedExports.join(',\\n ')},\\n} from './${exportKey}'`)\n }\n\n // Export additional paths from manifests (e.g., 'role', 'audit' from permission module)\n const additionalExported = new Set<string>()\n for (const moduleName of moduleOrder) {\n if (!resolved.modules.has(moduleName)) continue\n\n const manifest = resolved.modules.get(moduleName)!\n if (manifest.sharedSchemas?.additionalPaths) {\n for (const extra of manifest.sharedSchemas.additionalPaths) {\n if (additionalExported.has(extra)) continue\n additionalExported.add(extra)\n\n const exports = MODULE_EXPORTS[extra]\n if (!exports) continue\n\n lines.push(`export {\\n ${exports.namedExports.join(',\\n ')},\\n} from './${extra}'`)\n }\n }\n }\n\n // Standalone modules: include when preset has pages or server modules that use them\n for (const [moduleName, config] of Object.entries(STANDALONE_SHARED_MODULES)) {\n // Check if any module's clientPages includes a relevant page\n const hasRelevantPage =\n config.pages &&\n [...resolved.modules.values()].some(\n m => m.clientPages?.some(p => config.pages!.includes(p.name + '.tsx')) ?? false\n )\n // Check if any required server module is included\n const hasRelevantServerModule =\n config.serverModules?.some(sm => resolved.modules.has(sm)) ?? false\n if (!hasRelevantPage && !hasRelevantServerModule) continue\n\n const exports = MODULE_EXPORTS[moduleName]\n if (!exports) continue\n\n lines.push(`export {\\n ${exports.namedExports.join(',\\n ')},\\n} from './${moduleName}'`)\n }\n\n return lines.join('\\n') + '\\n'\n}\n","import type { ResolvedPreset } from './template-generator'\n\nconst MODULE_EXPORTS: Record<string, { namedExports: string[] }> = {\n chat: {\n namedExports: [\n 'ChatProtocolSchema',\n 'WebSocketStatusSchema',\n 'type ChatProtocol',\n 'type WebSocketStatus',\n ],\n },\n file: {\n namedExports: [\n 'FileDownloadSchema',\n 'PrivateFileQuerySchema',\n 'PublicFileUrlSchema',\n 'PrivateFileUrlSchema',\n 'GenerateUrlRequestSchema',\n 'FileUrlResponseSchema',\n 'EmptySchema',\n 'UploadResultSchema',\n 'UploadFileBodySchema',\n ],\n },\n todos: {\n namedExports: [\n 'TodoSchema',\n 'TodoStatusSchema',\n 'CreateTodoSchema',\n 'UpdateTodoSchema',\n 'TodoIdSchema',\n 'TodoIdResponseSchema',\n 'TodoAttachmentSchema',\n 'TodoAttachmentListSchema',\n 'TodoWithAttachmentsSchema',\n 'UploadFileSchema',\n 'AttachmentIdResponseSchema',\n 'TodoListResponseSchema',\n 'TodoListQuerySchema',\n 'type TodoListResponse',\n 'type TodoListQuery',\n 'type Todo',\n 'type TodoStatus',\n 'type CreateTodoInput',\n 'type UpdateTodoInput',\n 'type TodoIdResponse',\n 'type TodoAttachment',\n 'type TodoWithAttachments',\n ],\n },\n notifications: {\n namedExports: [\n 'NotificationSchema',\n 'NotificationTypeSchema',\n 'CreateNotificationSchema',\n 'NotificationListQuerySchema',\n 'SSEEventSchema',\n 'AppSSEProtocolSchema',\n 'UnreadCountSchema',\n 'NotificationIdSchema',\n 'UnreadCountEventSchema',\n 'type AppNotification',\n 'type NotificationType',\n 'type CreateNotificationInput',\n 'type NotificationListQuery',\n 'type SSEEvent',\n 'type AppSSEProtocol',\n 'type UnreadCount',\n 'type NotificationId',\n 'type UnreadCountEvent',\n ],\n },\n auth: {\n namedExports: [\n 'DeveloperProfileSchema',\n 'LoginSchema',\n 'RegisterSchema',\n 'TokenResponseSchema',\n 'ProfileSchema',\n 'type DeveloperProfile',\n 'type LoginInput',\n 'type RegisterInput',\n 'type TokenResponse',\n 'type Profile',\n ],\n },\n plugin: {\n namedExports: [\n 'PluginSchema',\n 'PluginStatusSchema',\n 'CreatePluginSchema',\n 'UpdatePluginSchema',\n 'PluginVersionStatusSchema',\n 'VersionSchema',\n 'CategorySchema',\n 'ReviewSchema',\n 'CreateReviewSchema',\n 'MarketplaceStatsSchema',\n 'PluginListResponseSchema',\n 'AdminPluginSchema',\n 'AdminDashboardStatsSchema',\n 'PluginListQuerySchema',\n 'PluginSlugSchema',\n 'PluginSearchQuerySchema',\n 'PluginDeleteResponseSchema',\n 'ReviewIdParamsSchema',\n 'ReviewDeleteResponseSchema',\n 'CategorySlugParamsSchema',\n 'CategoryPluginsQuerySchema',\n 'PluginListAdminSchema',\n 'AdminListQuerySchema',\n 'AdminListAllQuerySchema',\n 'RejectPluginBodySchema',\n 'BulkApproveBodySchema',\n 'BulkRejectBodySchema',\n 'BulkResponseSchema',\n 'CreateCategoryBodySchema',\n 'UpdateCategoryBodySchema',\n 'CategoryIdParamsSchema',\n 'CategoryIdResponseSchema',\n 'type Plugin',\n 'type PluginStatus',\n 'type CreatePluginInput',\n 'type UpdatePluginInput',\n 'type PluginVersionStatus',\n 'type Version',\n 'type Category',\n 'type Review',\n 'type CreateReviewInput',\n 'type MarketplaceStats',\n 'type PluginListResponse',\n 'type AdminPlugin',\n 'type AdminDashboardStats',\n 'type PluginListQuery',\n ],\n },\n plugins: {\n namedExports: [\n 'PluginSchema',\n 'PluginStatusSchema',\n 'CreatePluginSchema',\n 'UpdatePluginSchema',\n 'PluginVersionStatusSchema',\n 'VersionSchema',\n 'CategorySchema',\n 'ReviewSchema',\n 'CreateReviewSchema',\n 'MarketplaceStatsSchema',\n 'PluginListResponseSchema',\n 'AdminPluginSchema',\n 'AdminDashboardStatsSchema',\n 'PluginListQuerySchema',\n 'PluginSlugSchema',\n 'PluginSearchQuerySchema',\n 'PluginDeleteResponseSchema',\n 'ReviewIdParamsSchema',\n 'ReviewDeleteResponseSchema',\n 'CategorySlugParamsSchema',\n 'CategoryPluginsQuerySchema',\n 'PluginListAdminSchema',\n 'AdminListQuerySchema',\n 'AdminListAllQuerySchema',\n 'RejectPluginBodySchema',\n 'BulkApproveBodySchema',\n 'BulkRejectBodySchema',\n 'BulkResponseSchema',\n 'CreateCategoryBodySchema',\n 'UpdateCategoryBodySchema',\n 'CategoryIdParamsSchema',\n 'CategoryIdResponseSchema',\n 'type Plugin',\n 'type PluginStatus',\n 'type CreatePluginInput',\n 'type UpdatePluginInput',\n 'type PluginVersionStatus',\n 'type Version',\n 'type Category',\n 'type Review',\n 'type CreateReviewInput',\n 'type MarketplaceStats',\n 'type PluginListResponse',\n 'type AdminPlugin',\n 'type AdminDashboardStats',\n 'type PluginListQuery',\n ],\n },\n admin: {\n namedExports: [\n 'SystemStatsSchema',\n 'HealthCheckSchema',\n 'RecentActivityItemSchema',\n 'RecentActivitySchema',\n 'AuthUserSchema',\n 'LoginRequestSchema',\n 'LoginResponseSchema',\n 'RegisterRequestSchema',\n 'UserSchema',\n 'UserListSchema',\n 'UpdateUserRequestSchema',\n 'CreateUserRequestSchema',\n 'ClearTodosResultSchema',\n 'AdminSuccessSchema',\n 'DownloadTokenSchema',\n 'type SystemStats',\n 'type HealthCheck',\n 'type RecentActivityItem',\n 'type AuthUserResponse',\n 'type CreateUserRequest',\n 'type LoginRequest',\n 'type LoginResponse',\n 'type RegisterRequest',\n 'type User',\n 'type UpdateUserRequest',\n 'type ClearTodosResult',\n ],\n },\n audit: {\n namedExports: ['ResourceTypeSchema', 'ActionTypeSchema', 'AuditLogSchema', 'type AuditLogType'],\n },\n captcha: {\n namedExports: [\n 'CaptchaResponseSchema',\n 'VerifyCaptchaRequestSchema',\n 'CaptchaVerifyResponseSchema',\n 'type CaptchaResponse',\n 'type VerifyCaptchaRequest',\n 'type CaptchaVerifyResponse',\n ],\n },\n cart: {\n namedExports: [\n 'CartItemSchema',\n 'CartSummarySchema',\n 'CartResponseSchema',\n 'AddCartItemSchema',\n 'CartItemIdSchema',\n 'type CartItem',\n 'type CartSummary',\n 'type CartResponse',\n 'type AddCartItemInput',\n ],\n },\n community: {\n namedExports: [\n 'TopicStatusSchema',\n 'TopicTagSchema',\n 'TopicAuthorSchema',\n 'TopicSchema',\n 'TopicsResponseSchema',\n 'ProfileStatsSchema',\n 'ActivityTypeSchema',\n 'ProfileActivitySchema',\n 'ProfileResponseSchema',\n 'type TopicStatus',\n 'type TopicTag',\n 'type TopicAuthor',\n 'type Topic',\n 'type ProfileStats',\n 'type ActivityType',\n 'type ProfileActivity',\n 'type ProfileResponse',\n ],\n },\n content: {\n namedExports: [\n 'ContentCategorySchema',\n 'ContentStatusSchema',\n 'ContentSchema',\n 'CreateContentSchema',\n 'UpdateContentSchema',\n 'ContentListSchema',\n 'ContentDeleteResultSchema',\n 'type ContentCategory',\n 'type ContentStatus',\n 'type Content',\n 'type CreateContentInput',\n 'type UpdateContentInput',\n 'type ContentDeleteResult',\n ],\n },\n dashboard: {\n namedExports: [\n 'DashboardStatSchema',\n 'RevenueDataSchema',\n 'ActivityStatusSchema',\n 'ActivitySchema',\n 'DashboardResponseSchema',\n 'type DashboardStat',\n 'type RevenueData',\n 'type ActivityStatus',\n 'type Activity',\n 'type DashboardResponse',\n ],\n },\n merchant: {\n namedExports: [\n 'MerchantSchema',\n 'MerchantLoginSchema',\n 'MerchantLoginResponseSchema',\n 'MerchantStatsSchema',\n 'ProductSchema',\n 'CreateProductSchema',\n 'UpdateProductSchema',\n 'ProductListSchema',\n 'ProductListResponseSchema',\n 'ProductQuerySchema',\n 'type Merchant',\n 'type MerchantLoginInput',\n 'type MerchantLoginResponse',\n 'type MerchantStats',\n 'type Product',\n 'type CreateProductInput',\n 'type UpdateProductInput',\n 'type ProductListResponse',\n 'type ProductQuery',\n ],\n },\n tenant: {\n namedExports: [\n 'TenantSchema',\n 'TenantStatusSchema',\n 'TenantPlanSchema',\n 'TenantSettingsSchema',\n 'CreateTenantSchema',\n 'UpdateTenantSchema',\n 'TenantIdSchema',\n 'TenantSlugSchema',\n 'TenantListResponseSchema',\n 'TenantQuerySchema',\n 'TenantIdResponseSchema',\n 'type Tenant',\n 'type TenantStatus',\n 'type TenantPlan',\n 'type TenantSettings',\n 'type CreateTenantInput',\n 'type UpdateTenantInput',\n 'type TenantId',\n 'type TenantSlug',\n 'type TenantListResponse',\n 'type TenantQuery',\n 'type TenantIdResponse',\n ],\n },\n dispute: {\n namedExports: [\n 'DisputeTypeSchema',\n 'DisputeStatusSchema',\n 'DisputeSchema',\n 'CreateDisputeSchema',\n 'UpdateDisputeSchema',\n 'ResolveDisputeSchema',\n 'DisputeListSchema',\n 'DisputeDeleteResultSchema',\n 'type DisputeType',\n 'type DisputeStatus',\n 'type Dispute',\n 'type CreateDisputeInput',\n 'type UpdateDisputeInput',\n 'type ResolveDisputeInput',\n 'type DisputeDeleteResult',\n ],\n },\n order: {\n namedExports: [\n 'OrderStatusSchema',\n 'OrderSchema',\n 'CreateOrderSchema',\n 'UpdateOrderSchema',\n 'OrderListSchema',\n 'OrderQuerySchema',\n 'OrderDeleteResultSchema',\n 'ProcessOrderSchema',\n 'CancelOrderSchema',\n 'RemoveCartItemResponseSchema',\n 'ECommerceProductSchema',\n 'ECommerceOrderStatusSchema',\n 'ECommerceOrderSchema',\n 'ECommerceOrderListSchema',\n 'type OrderStatus',\n 'type Order',\n 'type CreateOrderInput',\n 'type UpdateOrderInput',\n 'type OrderDeleteResult',\n 'type ProcessOrderInput',\n 'type CancelOrderInput',\n 'type OrderQueryInput',\n 'type RemoveCartItemResponse',\n 'type ECommerceProduct',\n 'type ECommerceOrderStatus',\n 'type ECommerceOrder',\n ],\n },\n permission: {\n namedExports: [\n 'RoleEnum',\n 'PermissionEnum',\n 'RoleInfoSchema',\n 'PermissionInfoSchema',\n 'UserPermissionsSchema',\n 'MenuItemSchema',\n 'PageActionSchema',\n 'PagePermissionConfigSchema',\n 'PermissionCategorySchema',\n 'RoleListSchema',\n 'PermissionListSchema',\n 'MenuConfigSchema',\n 'PagePermissionsSchema',\n 'PermissionCategoriesSchema',\n 'RoleLabelsSchema',\n 'PermissionLabelsSchema',\n 'PermissionInitSchema',\n 'type PermissionRoleType',\n 'type PermissionType',\n 'type RoleInfo',\n 'type PermissionInfo',\n 'type UserPermissions',\n 'type MenuItem',\n 'type PageAction',\n 'type PagePermissionConfig',\n 'type PermissionCategory',\n 'type PermissionInit',\n 'Role',\n 'Permission',\n 'ROLE_PERMISSIONS',\n 'ROLE_LABELS',\n 'PERMISSION_LABELS',\n 'PERMISSION_CATEGORIES',\n 'getPermissionsByRole',\n 'hasPermission',\n 'hasAnyPermission',\n 'hasAllPermissions',\n ],\n },\n role: {\n namedExports: [\n 'RoleSchema',\n 'CreateRoleSchema',\n 'UpdateRoleSchema',\n 'UpdateRolePermissionsSchema',\n 'RoleSuccessSchema',\n 'type RoleDataType',\n 'type CreateRoleType',\n 'type UpdateRoleType',\n ],\n },\n ticket: {\n namedExports: [\n 'TicketStatusSchema',\n 'TicketPrioritySchema',\n 'TicketCategorySchema',\n 'TicketReplySchema',\n 'TicketSchema',\n 'CreateTicketSchema',\n 'UpdateTicketSchema',\n 'ReplyTicketSchema',\n 'TicketListSchema',\n 'TicketDeleteResultSchema',\n 'type TicketStatus',\n 'type TicketPriority',\n 'type TicketCategory',\n 'type TicketReply',\n 'type Ticket',\n 'type CreateTicketInput',\n 'type UpdateTicketInput',\n 'type ReplyTicketInput',\n 'type TicketDeleteResult',\n ],\n },\n}\n\nconst ADDITIONAL_PATHS_MAP: Record<string, string[]> = {\n permission: ['role', 'audit'],\n}\n\n// Standalone shared modules that have no server module manifest but are used by client pages\n// or server routes. Include when:\n// 1. The preset has client pages that import their schemas, OR\n// 2. The preset has server modules whose routes import their schemas.\nconst STANDALONE_SHARED_MODULES: Record<string, { pages?: string[]; serverModules?: string[] }> = {\n cart: { pages: ['CartPage.tsx'] },\n community: { pages: ['TopicsPage.tsx', 'ProfilePage.tsx'], serverModules: ['content'] },\n dashboard: { pages: ['DashboardPage.tsx'] },\n}\n\nconst moduleOrder = [\n 'chat',\n 'file',\n 'todos',\n 'notifications',\n 'auth',\n 'plugin',\n 'plugins',\n 'admin',\n 'audit',\n 'captcha',\n 'cart',\n 'community',\n 'content',\n 'dashboard',\n 'dispute',\n 'merchant',\n 'order',\n 'permission',\n 'role',\n 'tenant',\n 'ticket',\n]\n\nexport function generateSharedSchemasIndex(resolved: ResolvedPreset): string {\n const header = `// Re-export interfaces from implementation files\nexport type { WSClient, WSProtocol, WSStatus } from '../core/ws-client'\nexport type { SSEClient, SSEProtocol } from '../core/sse-client'\n\n// Re-export core\nexport {\n ApiSuccessSchema,\n ApiErrorSchema,\n ApiResponseSchema,\n type ApiSuccess,\n type ApiError,\n type ApiResponse,\n type RpcMethod,\n type EventName,\n type RpcInput,\n type RpcOutput,\n type EventPayload,\n createWSClient,\n createSSEClient,\n} from '../core'\n\n// Re-export modules\n`\n\n const moduleLines: string[] = []\n const exportedNames = new Set<string>()\n const firstSeenModule = new Map<string, string>()\n const droppedExports: { name: string; moduleName: string; originalModule: string }[] = []\n\n for (const moduleName of moduleOrder) {\n const exports = MODULE_EXPORTS[moduleName]\n if (!exports) continue\n\n const shouldInclude = shouldIncludeModule(moduleName, resolved)\n if (!shouldInclude) continue\n\n const uniqueExports = exports.namedExports.filter(name => {\n if (exportedNames.has(name)) {\n const originalModule = firstSeenModule.get(name) ?? 'unknown'\n droppedExports.push({ name, moduleName, originalModule })\n return false\n }\n exportedNames.add(name)\n firstSeenModule.set(name, moduleName)\n return true\n })\n\n if (uniqueExports.length === 0) continue\n\n const importPath = getImportPath(moduleName, resolved)\n\n moduleLines.push(\n `export {\\n ${uniqueExports.join(',\\n ')},\\n} from '../modules/${importPath}'`\n )\n }\n\n for (const { name, moduleName, originalModule } of droppedExports) {\n console.warn(\n `⚠️ Schema collision: \"${name}\" defined in both ${originalModule} and ${moduleName}. Using ${originalModule}'s version. Rename to avoid ambiguity.`\n )\n }\n\n return header + moduleLines.join('\\n') + '\\n'\n}\n\nfunction shouldIncludeModule(moduleName: string, resolved: ResolvedPreset): boolean {\n if (resolved.modules.has(moduleName)) return true\n\n // Standalone shared modules: include when a module in the preset\n // declares client pages that use their schemas OR server modules that import them\n const standalone = STANDALONE_SHARED_MODULES[moduleName]\n if (standalone) {\n // Check if any module's clientPages includes a relevant page\n const hasRelevantPage =\n standalone.pages &&\n [...resolved.modules.values()].some(\n m => m.clientPages?.some(p => standalone.pages!.includes(p.name + '.tsx')) ?? false\n )\n // Check if any required server module is included\n const hasRelevantServerModule =\n standalone.serverModules?.some(sm => resolved.modules.has(sm)) ?? false\n return !!(hasRelevantPage || hasRelevantServerModule)\n }\n\n for (const [parentModule, additionalPaths] of Object.entries(ADDITIONAL_PATHS_MAP)) {\n if (additionalPaths.includes(moduleName) && resolved.modules.has(parentModule)) {\n return true\n }\n }\n\n return false\n}\n\nfunction getImportPath(moduleName: string, resolved: ResolvedPreset): string {\n const manifest = resolved.modules.get(moduleName)\n if (manifest?.sharedSchemas?.path) {\n return manifest.sharedSchemas.path\n }\n return moduleName\n}\n","import type { ResolvedPreset } from './template-generator'\n\nexport function generateMiddlewareIndex(resolved: ResolvedPreset): string {\n const lines: string[] = []\n const hasAuthOrPermission = resolved.modules.has('auth') || resolved.hasPermission\n\n lines.push(`export { corsMiddleware, createCorsMiddleware, type CorsOptions } from './cors'`)\n lines.push(\n `export { loggerMiddleware, createLoggerMiddleware, type LoggerOptions } from './logger'`\n )\n lines.push(\n `export {\\n errorHandlerMiddleware,\\n createErrorHandlerMiddleware,\\n type ErrorHandlerOptions,\\n} from './error-handler'`\n )\n\n if (hasAuthOrPermission) {\n lines.push(\n `export {\\n authMiddleware,\\n requireSuperAdminMiddleware,\\n requireCustomerServiceMiddleware,\\n requirePermissionsMiddleware,\\n type AuthUser,\\n type AuthMiddlewareOptions,\\n} from './auth'`\n )\n }\n\n if (resolved.hasCaptcha) {\n lines.push(\n `export {\\n captchaMiddleware,\\n markCaptchaVerifiedMiddleware,\\n clearCaptchaSessionMiddleware,\\n type CaptchaConfig,\\n} from './captcha'`\n )\n }\n\n if (resolved.hasPermission) {\n lines.push(`export { permissionMiddleware } from './permission'`)\n }\n\n lines.push(`export { rateLimitMiddleware, type RateLimitOptions } from './rate-limit'`)\n\n if (hasAuthOrPermission) {\n lines.push(`export { getAuthUser } from '../utils/auth'`)\n }\n\n return lines.join('\\n') + '\\n'\n}\n","import type { ResolvedPreset } from './template-generator'\n\nexport function generateAuthMiddleware(resolved: ResolvedPreset): string {\n if (resolved.modules.has('auth') && !resolved.hasPermission) {\n return generateSimplifiedAuthMiddleware()\n }\n\n return generateNoopAuthMiddleware()\n}\n\nfunction generateSimplifiedAuthMiddleware(): string {\n return `import type { MiddlewareHandler } from 'hono'\nimport { createModuleLoggerSync } from '../utils/logger'\n\nexport type UserRole = 'user' | 'admin'\n\nexport interface AuthUser {\n id: string\n username: string\n email: string\n role: UserRole\n avatar?: string\n}\n\nexport interface AuthMiddlewareOptions {\n requiredRole?: UserRole\n}\n\ndeclare module 'hono' {\n interface ContextVariableMap {\n authUser: AuthUser\n }\n}\n\nfunction extractToken(authHeader: string | undefined): string | null {\n if (!authHeader) return null\n if (!authHeader.startsWith('Bearer ')) return null\n return authHeader.slice(7)\n}\n\n// dev tokens:与模板完整版 auth.ts 语义一致(开发/测试便利后门,production 默认禁用)\nfunction isDevTokensEnabled(): boolean {\n if (process.env.ENABLE_DEV_TOKENS === 'true') return true\n if (process.env.ENABLE_DEV_TOKENS === 'false') return false\n if (process.env.NODE_ENV === 'production') return false\n return true\n}\n\nfunction verifyDevToken(token: string): AuthUser | null {\n if (token === 'admin-token' || token === 'super-admin-token') {\n return {\n id: 'super-admin-1',\n username: 'superadmin',\n email: 'superadmin@example.com',\n role: 'admin',\n }\n }\n if (token === 'user-token') {\n return {\n id: 'user-1',\n username: 'Demo User',\n email: 'demo@example.com',\n role: 'user',\n }\n }\n return null\n}\n\nexport function authMiddleware(_options: AuthMiddlewareOptions = {}): MiddlewareHandler {\n const log = createModuleLoggerSync('auth')\n\n return async (c, next) => {\n const token = extractToken(c.req.header('Authorization'))\n\n if (!token) {\n log.warn({ path: c.req.path, method: c.req.method }, 'Missing auth token')\n return c.json({ success: false, error: 'Authentication required', status: 401 }, 401)\n }\n\n if (isDevTokensEnabled()) {\n const devUser = verifyDevToken(token)\n if (devUser) {\n c.set('authUser', devUser)\n log.warn({ module: 'auth' }, 'DEV TOKEN USED - This should not appear in production!')\n await next()\n return\n }\n }\n\n try {\n const jwt = await import('jsonwebtoken')\n const secretKey = process.env.AUTH_SECRET_KEY || 'dev-secret-key-change-in-production'\n const decoded = jwt.verify(token, secretKey) as {\n userId: string\n username: string\n email: string\n role: string\n }\n\n const user: AuthUser = {\n id: decoded.userId,\n username: decoded.username,\n email: decoded.email,\n role: decoded.role as UserRole,\n }\n\n c.set('authUser', user)\n log.info({ userId: user.id, path: c.req.path }, 'User authenticated')\n await next()\n } catch {\n log.warn({ path: c.req.path, method: c.req.method }, 'Invalid auth token')\n return c.json({ success: false, error: 'Invalid or expired token', status: 401 }, 401)\n }\n }\n}\n\nexport function requireSuperAdminMiddleware(): MiddlewareHandler {\n return authMiddleware()\n}\n\nexport function requireCustomerServiceMiddleware(): MiddlewareHandler {\n return authMiddleware()\n}\n\nexport function requirePermissionsMiddleware(): MiddlewareHandler {\n return authMiddleware()\n}\n`\n}\n\nfunction generateNoopAuthMiddleware(): string {\n return `import type { MiddlewareHandler } from 'hono'\nimport { createModuleLoggerSync } from '../utils/logger'\n\nexport type UserRole = 'user' | 'admin'\n\nexport interface AuthUser {\n id: string\n username: string\n email: string\n role: UserRole\n avatar?: string\n}\n\nexport interface AuthMiddlewareOptions {\n requiredRole?: UserRole\n}\n\ndeclare module 'hono' {\n interface ContextVariableMap {\n authUser: AuthUser\n }\n}\n\nconst DEV_USER: AuthUser = {\n id: 'dev-user-1',\n username: 'devuser',\n email: 'dev@example.com',\n role: 'admin',\n avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=dev',\n}\n\nfunction extractToken(authHeader: string | undefined): string | null {\n if (!authHeader) return null\n if (!authHeader.startsWith('Bearer ')) return null\n return authHeader.slice(7)\n}\n\nexport function authMiddleware(_options: AuthMiddlewareOptions = {}): MiddlewareHandler {\n const log = createModuleLoggerSync('auth')\n\n return async (c, next) => {\n const token = extractToken(c.req.header('Authorization'))\n\n if (!token) {\n c.set('authUser', { ...DEV_USER, id: 'anonymous' })\n log.info({ path: c.req.path }, 'Anonymous access')\n await next()\n return\n }\n\n c.set('authUser', DEV_USER)\n log.info({ userId: DEV_USER.id, path: c.req.path }, 'Dev user authenticated')\n await next()\n }\n}\n\nexport function requireSuperAdminMiddleware(): MiddlewareHandler {\n return authMiddleware()\n}\n\nexport function requireCustomerServiceMiddleware(): MiddlewareHandler {\n return authMiddleware()\n}\n\nexport function requirePermissionsMiddleware(): MiddlewareHandler {\n return authMiddleware()\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\n\nexport function generateAuthUtils(resolved: ResolvedPreset): string {\n const hasAuthOrPermission = resolved.modules.has('auth') || resolved.hasPermission\n\n if (!hasAuthOrPermission) {\n return `import type { Context } from 'hono'\nimport type { AuthUser } from '../middleware/auth'\n\nexport function getAuthUser(c: Context): AuthUser {\n return c.get('authUser')\n}\n`\n }\n\n if (resolved.modules.has('auth') && !resolved.hasPermission) {\n return `import type { Context } from 'hono'\nimport type { AuthUser } from '../middleware/auth'\n\nexport function getAuthUser(c: Context): AuthUser {\n return c.get('authUser')\n}\n\nexport function getOptionalAuthUser(c: Context): AuthUser | null {\n try {\n return c.get('authUser')\n } catch {\n return null\n }\n}\n`\n }\n\n return `import type { Context } from 'hono'\nimport type { AuthUser } from '../middleware/auth'\nimport { Role } from '@shared/modules/permission'\n\ninterface MockUser {\n id: string\n username: string\n email: string\n role: string\n status: string\n avatar: string\n createdAt: string\n updatedAt: string\n}\n\nconst mockUsers: MockUser[] = [\n {\n id: '1',\n username: 'superadmin',\n email: 'superadmin@example.com',\n role: Role.SUPER_ADMIN,\n status: 'active',\n avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=superadmin',\n createdAt: '2024-01-01T00:00:00Z',\n updatedAt: '2024-01-01T00:00:00Z',\n },\n {\n id: '2',\n username: 'customerservice',\n email: 'customerservice@example.com',\n role: Role.CUSTOMER_SERVICE,\n status: 'active',\n avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=customerservice',\n createdAt: '2024-01-02T00:00:00Z',\n updatedAt: '2024-01-02T00:00:00Z',\n },\n {\n id: '3',\n username: 'user1',\n email: 'user1@example.com',\n role: Role.USER,\n status: 'active',\n avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=user1',\n createdAt: '2024-01-03T00:00:00Z',\n updatedAt: '2024-01-03T00:00:00Z',\n },\n]\n\nconst mockTokens: Map<string, string> = new Map([\n ['super-admin-token', '1'],\n ['customer-service-token', '2'],\n ['user-token', '3'],\n])\n\nexport function getAuthUser(c: Context): AuthUser {\n return c.get('authUser')\n}\n\nexport function verifyToken(token: string): MockUser | null {\n const userId = mockTokens.get(token)\n\n if (!userId) {\n return null\n }\n\n return mockUsers.find(u => u.id === userId) || null\n}\n\nexport function getMockUsers(): MockUser[] {\n return mockUsers\n}\n\nexport function getMockTokens(): Map<string, string> {\n return mockTokens\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\n\nexport function generateClientComponentsIndex(resolved: ResolvedPreset): string {\n const lines: string[] = []\n\n lines.push(`export { StatusBadge, type ColorScheme } from './StatusBadge'`)\n lines.push(`export { LoadingSpinner } from './LoadingSpinner'`)\n lines.push(`export { EmptyState } from './EmptyState'`)\n\n if (resolved.modules.has('chat') || resolved.modules.has('notifications')) {\n lines.push(`export { ConnectionStatus } from './ConnectionStatus'`)\n }\n\n if (resolved.modules.has('chat')) {\n lines.push(`export { MessageCard } from './MessageCard'`)\n }\n\n if (resolved.modules.has('admin') || resolved.modules.has('auth')) {\n lines.push(`export { AuthButton } from './AuthButton'`)\n }\n\n return lines.join('\\n') + '\\n'\n}\n","import type { ResolvedPreset } from './template-generator'\n\n/**\n * CLI module registry: auto-discovers CLI modules from manifest declarations.\n * When a server module with `cliModule` field is included in a preset,\n * its CLI commands are auto-registered.\n *\n * To add CLI support for a new module:\n * 1. Create the CLI module at template/src/cli/modules/{dir}/index.ts\n * 2. Export a `register{Name}Commands(site: SiteInstance)` function\n * 3. Add `cliModule: { dir: '...', registerFunction: '...' }` to the module's module.ts manifest\n */\n\n// Config module is always included (manages base URL, status, etc.)\nconst ALWAYS_INCLUDED = {\n dir: 'config',\n registerFunction: 'registerConfigCommands',\n}\n\nexport function generateCliModulesIndex(resolved: ResolvedPreset): string {\n const modules: string[] = []\n const registrations: string[] = []\n\n // Auto-register CLI modules based on manifest cliModule declarations\n for (const [, manifest] of resolved.modules) {\n if (manifest.cliModule) {\n const { dir, registerFunction } = manifest.cliModule\n modules.push(`import { ${registerFunction} } from './${dir}'`)\n registrations.push(`${registerFunction}(site)`)\n }\n }\n\n // Always include config module\n modules.push(`import { ${ALWAYS_INCLUDED.registerFunction} } from './${ALWAYS_INCLUDED.dir}'`)\n registrations.push(`${ALWAYS_INCLUDED.registerFunction}(site)`)\n\n const exports = modules\n .map(m => {\n const match = m.match(/\\{ (\\w+) \\}/)\n return match ? match[1] : ''\n })\n .filter(Boolean)\n\n return `import type { Core } from '@dyyz1993/xcli-core'\n${modules.join('\\n')}\n\n/**\n * Register all builtin CLI commands to xcli-core.\n * Each register function receives a SiteInstance for command registration.\n */\nexport function registerBuiltinCommands(app: Core) {\n const api = app.loader.getAPI()\n\n const site = api.createSite({\n name: 'local-server',\n url: 'http://localhost:3010',\n })\n\n${registrations.map(r => ` ${r}`).join('\\n')}\n}\n\nexport { ${exports.join(', ')} }\n`\n}\n","/**\n * Filters package.json dependencies based on the resolved preset.\n * Removes module-specific packages that aren't needed.\n */\nimport type { ResolvedPreset } from './template-generator'\n\n/** Packages only needed by specific modules */\nconst MODULE_PACKAGES: Record<string, string[]> = {\n admin: ['bcryptjs'],\n auth: ['bcryptjs'],\n}\n\n/** Packages needed by the admin panel UI */\nconst ADMIN_PANEL_PACKAGES = ['antd', '@ant-design/icons']\n\n/** Packages needed by the CLI app (xcli-core based) */\nconst CLI_PACKAGES = ['commander'] // legacy, removed from template\n\n/** Packages that are never imported (unused) */\nconst UNUSED_PACKAGES = ['lodash-es', 'chalk', 'mysql2']\n\n/** Packages only needed by the web client (React frontend) */\nconst CLIENT_PACKAGES = [\n 'react',\n 'react-dom',\n 'react-helmet-async',\n 'react-router-dom',\n 'lucide-react',\n 'zustand',\n]\n\n/** Dev packages only needed when a web client is present */\nconst CLIENT_DEV_PACKAGES = [\n '@vitejs/plugin-react',\n '@testing-library/react',\n '@testing-library/jest-dom',\n '@testing-library/dom',\n 'vite',\n 'jsdom',\n 'tailwindcss',\n '@tailwindcss/postcss',\n 'postcss',\n 'autoprefixer',\n '@playwright/test',\n 'playwright',\n '@prerenderer/renderer-jsdom',\n '@prerenderer/renderer-puppeteer',\n 'puppeteer',\n '@prerenderer/rollup-plugin',\n 'eventsource',\n]\n\n/** Type packages only needed when a web client is present */\nconst CLIENT_TYPE_PACKAGES = ['@types/react', '@types/react-dom']\n\n/**\n * Filter package.json dependencies for the given preset\n * Returns a new package.json object with filtered deps\n */\nexport function filterPackageJson(\n pkg: Record<string, unknown>,\n resolved: ResolvedPreset\n): Record<string, unknown> {\n const result = { ...pkg }\n\n // Collect packages to remove\n const packagesToRemove = new Set<string>(UNUSED_PACKAGES)\n\n // Remove module-specific packages only if ALL modules requiring it are absent\n const packageToModules: Record<string, string[]> = {}\n for (const [module, packages] of Object.entries(MODULE_PACKAGES)) {\n for (const pkg of packages) {\n if (!packageToModules[pkg]) packageToModules[pkg] = []\n packageToModules[pkg].push(module)\n }\n }\n\n for (const [pkg, modules] of Object.entries(packageToModules)) {\n if (!modules.some(m => resolved.modules.has(m))) {\n packagesToRemove.add(pkg)\n }\n }\n\n // Remove admin panel packages if no admin/tenant/merchant module uses them\n // (antd is used by admin, tenant, and merchant pages)\n const hasAntdConsumer =\n resolved.modules.has('admin') ||\n resolved.modules.has('tenant') ||\n resolved.modules.has('merchant')\n if (!hasAntdConsumer) {\n for (const pkg of ADMIN_PANEL_PACKAGES) {\n packagesToRemove.add(pkg)\n }\n }\n\n // Remove CLI legacy packages (commander was replaced by xcli-core)\n // commander is no longer in template dependencies, but guard against it\n for (const pkg of CLI_PACKAGES) {\n packagesToRemove.add(pkg)\n }\n\n // Remove client packages if no web client\n if (!resolved.hasClient) {\n for (const pkg of CLIENT_PACKAGES) {\n packagesToRemove.add(pkg)\n }\n }\n\n // Filter dependencies\n if (result.dependencies && typeof result.dependencies === 'object') {\n const deps = { ...(result.dependencies as Record<string, string>) }\n for (const pkg of packagesToRemove) {\n delete deps[pkg]\n }\n result.dependencies = deps\n }\n\n // Filter devDependencies — remove admin-only test packages\n if (result.devDependencies && typeof result.devDependencies === 'object') {\n const devDeps = { ...(result.devDependencies as Record<string, string>) }\n if (!resolved.modules.has('admin')) {\n delete devDeps['@testing-library/user-event']\n }\n if (!resolved.hasClient) {\n for (const pkg of CLIENT_DEV_PACKAGES) {\n delete devDeps[pkg]\n }\n for (const pkg of CLIENT_TYPE_PACKAGES) {\n delete devDeps[pkg]\n }\n }\n result.devDependencies = devDeps\n }\n\n // Adjust scripts for cli-only preset\n if (!resolved.hasClient && result.scripts && typeof result.scripts === 'object') {\n const scripts = { ...(result.scripts as Record<string, string>) }\n\n // Override dev to start server directly instead of vite\n scripts['dev'] = 'NODE_ENV=development node --import tsx src/server/entries/node.ts'\n scripts['build'] = 'npm run build:server && npm run build:cli'\n scripts['build:all'] = 'npm run build:server && npm run build:cli'\n delete scripts['build:client']\n delete scripts['build:cloudflare']\n delete scripts['preview']\n delete scripts['dev:todo']\n delete scripts['dev:plugin']\n delete scripts['dev:ecommerce']\n delete scripts['dev:community']\n delete scripts['dev:forum']\n delete scripts['dev:saas']\n delete scripts['dev:cf']\n delete scripts['deploy:cf']\n delete scripts['test:e2e']\n delete scripts['test:e2e:ui']\n delete scripts['test:e2e:debug']\n delete scripts['test:full']\n\n result.scripts = scripts\n }\n\n return result\n}\n","import { readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport type { ResolvedPreset } from './template-generator'\n\nexport function generateViteConfig(resolved: ResolvedPreset, templateDir: string): string {\n const originalPath = join(templateDir, 'vite.config.ts')\n let content = readFileSync(originalPath, 'utf-8')\n\n const entriesToRemove: string[] = []\n const aliasesToRemove: string[] = []\n\n if (!resolved.modules.has('admin')) {\n entriesToRemove.push('admin')\n aliasesToRemove.push('@admin')\n }\n if (!resolved.modules.has('tenant')) {\n entriesToRemove.push('tenant')\n aliasesToRemove.push('@tenant')\n }\n if (!resolved.modules.has('merchant')) {\n entriesToRemove.push('merchant')\n aliasesToRemove.push('@merchant')\n }\n\n // antd is used by admin, tenant, and merchant pages — must match package-json.ts logic\n const hasAntdConsumer =\n resolved.modules.has('admin') ||\n resolved.modules.has('tenant') ||\n resolved.modules.has('merchant')\n\n // Remove rollupOptions input entries: \" name: path.resolve(__dirname, 'name.html'),\"\n for (const name of entriesToRemove) {\n const re = new RegExp(\n `^\\\\s*${name}:\\\\s*path\\\\.resolve\\\\(__dirname,\\\\s*['\"]${name}\\\\.html['\"]\\\\),\\\\s*$\\\\n?`,\n 'gm'\n )\n content = content.replace(re, '')\n }\n\n // Remove path aliases: \" '@name': path.resolve(__dirname, 'src/name'),\"\n for (const alias of aliasesToRemove) {\n const escapedAlias = alias.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const dirName = alias.replace('@', '')\n const re = new RegExp(\n `^\\\\s*'${escapedAlias}':\\\\s*path\\\\.resolve\\\\(__dirname,\\\\s*['\"]src\\\\/${dirName}['\"]\\\\),\\\\s*$\\\\n?`,\n 'gm'\n )\n content = content.replace(re, '')\n }\n\n // Remove antd-related chunks and warnings when no antd consumer exists\n if (!hasAntdConsumer) {\n const antdChunkRe = /^(\\s*'vendor-antd':\\s*\\['antd',\\s*'@ant-design\\/icons'\\],\\s*\\n)/gm\n content = content.replace(antdChunkRe, '')\n\n const onwarnRe =\n /^\\s*\\/\\/ Suppress antd \"use client\" directive warnings[^\\n]*\\n\\s*if \\(warning\\.code === 'MODULE_LEVEL_DIRECTIVE'\\) return\\n/gm\n content = content.replace(onwarnRe, '')\n }\n\n return content\n}\n","import type { ResolvedPreset } from './template-generator'\n\nfunction getPresetType(presetId: string): string {\n const map: Record<string, string> = {\n 'todo-app': 'todo',\n 'xbrowser-marketplace': 'plugin',\n ecommerce: 'ecommerce',\n 'fullstack-admin': 'saas',\n forum: 'community',\n minimal: 'todo',\n }\n return map[presetId] || 'todo'\n}\n\nfunction getThemeForPresetType(presetType: string): { constName: string; theme: string } {\n const themes: Record<string, { constName: string; theme: string }> = {\n todo: {\n constName: 'TODO_THEME',\n theme: `{\n primaryColor: '#6366f1',\n primaryHover: '#4f46e5',\n bgColor: '#ffffff',\n textColor: '#111827',\n secondaryBg: '#f9fafb',\n borderColor: '#e5e7eb',\n borderRadius: '12px',\n logoText: 'Biomimic',\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n}`,\n },\n plugin: {\n constName: 'PLUGIN_MARKET_THEME',\n theme: `{\n primaryColor: '#3b82f6',\n primaryHover: '#2563eb',\n bgColor: '#ffffff',\n textColor: '#111827',\n secondaryBg: '#f0f9ff',\n borderColor: '#bae6fd',\n borderRadius: '12px',\n logoText: 'PluginHub',\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n}`,\n },\n ecommerce: {\n constName: 'ECOMMERCE_THEME',\n theme: `{\n primaryColor: '#f59e0b',\n primaryHover: '#d97706',\n bgColor: '#ffffff',\n textColor: '#111827',\n secondaryBg: '#fffbeb',\n borderColor: '#fde68a',\n borderRadius: '12px',\n logoText: 'ShopMart',\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n}`,\n },\n saas: {\n constName: 'SAAS_ADMIN_THEME',\n theme: `{\n primaryColor: '#1f2937',\n primaryHover: '#374151',\n bgColor: '#f9fafb',\n textColor: '#111827',\n secondaryBg: '#f3f4f6',\n borderColor: '#e5e7eb',\n borderRadius: '8px',\n logoText: 'AdminPanel',\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n}`,\n },\n community: {\n constName: 'COMMUNITY_THEME',\n theme: `{\n primaryColor: '#f97316',\n primaryHover: '#ea580c',\n bgColor: '#ffffff',\n textColor: '#111827',\n secondaryBg: '#fff7ed',\n borderColor: '#fed7aa',\n borderRadius: '12px',\n logoText: 'CommunityHub',\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n}`,\n },\n }\n return themes[presetType] || themes.todo\n}\n\ninterface LazyRoute {\n path: string\n importPath: string\n componentName: string\n label: string\n}\n\nfunction getRoutesForPreset(presetType: string, resolved: ResolvedPreset): LazyRoute[] {\n const hasModule = (m: string) => resolved.modules.has(m)\n\n const loginRoute = {\n path: '/login',\n importPath: './pages/LoginPage',\n componentName: 'LoginPage',\n label: 'Login',\n }\n const registerRoute = {\n path: '/register',\n importPath: './pages/RegisterPage',\n componentName: 'RegisterPage',\n label: 'Register',\n }\n const maybeAuthRoutes = hasModule('auth')\n ? [\n loginRoute,\n registerRoute,\n {\n path: '/profile',\n importPath: './pages/ProfilePage',\n componentName: 'ProfilePage',\n label: 'Profile',\n },\n ]\n : []\n\n switch (presetType) {\n case 'todo': {\n const routes: LazyRoute[] = [\n ...maybeAuthRoutes,\n {\n path: '/todos',\n importPath: './pages/TodoPage',\n componentName: 'TodoPage',\n label: 'Todos',\n },\n ]\n if (hasModule('notifications')) {\n routes.push({\n path: '/notifications',\n importPath: './pages/NotificationPage',\n componentName: 'NotificationPage',\n label: 'Notifications',\n })\n }\n if (hasModule('chat')) {\n routes.push({\n path: '/websocket',\n importPath: './pages/WebSocketPage',\n componentName: 'WebSocketPage',\n label: 'WebSocket',\n })\n }\n return routes\n }\n\n case 'plugin': {\n const routes: LazyRoute[] = []\n if (hasModule('plugin')) {\n routes.push(\n {\n path: '/',\n importPath: './pages/PluginsPage',\n componentName: 'PluginsPage',\n label: 'Home',\n },\n {\n path: '/plugins',\n importPath: './pages/PluginsPage',\n componentName: 'PluginsPage',\n label: 'Plugins',\n },\n {\n path: '/plugins/:slug',\n importPath: './pages/PluginDetailPage',\n componentName: 'PluginDetailPage',\n label: 'Plugin Detail',\n },\n {\n path: '/categories',\n importPath: './pages/CategoriesPage',\n componentName: 'CategoriesPage',\n label: 'Categories',\n },\n {\n path: '/search',\n importPath: './pages/SearchPage',\n componentName: 'SearchPage',\n label: 'Search',\n },\n {\n path: '/publish',\n importPath: './pages/PublishPage',\n componentName: 'PublishPage',\n label: 'Publish',\n },\n {\n path: '/developer',\n importPath: './pages/DeveloperDashboardPage',\n componentName: 'DeveloperDashboardPage',\n label: 'Developer',\n }\n )\n }\n routes.push(...maybeAuthRoutes)\n if (hasModule('notifications')) {\n routes.push({\n path: '/notifications',\n importPath: './pages/NotificationPage',\n componentName: 'NotificationPage',\n label: 'Notifications',\n })\n }\n return routes\n }\n\n case 'ecommerce': {\n const routes: LazyRoute[] = []\n if (hasModule('content')) {\n routes.push(\n {\n path: '/',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Home',\n },\n {\n path: '/products',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Products',\n },\n {\n path: '/products/:id',\n importPath: './pages/ContentDetailPage',\n componentName: 'ContentDetailPage',\n label: 'Product Detail',\n },\n {\n path: '/content',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Content',\n },\n {\n path: '/content/:id',\n importPath: './pages/ContentDetailPage',\n componentName: 'ContentDetailPage',\n label: 'Content Detail',\n }\n )\n }\n if (hasModule('order')) {\n routes.push(\n {\n path: '/cart',\n importPath: './pages/CartPage',\n componentName: 'CartPage',\n label: 'Cart',\n },\n {\n path: '/orders',\n importPath: './pages/OrdersPage',\n componentName: 'OrdersPage',\n label: 'Orders',\n }\n )\n }\n routes.push(...maybeAuthRoutes)\n return routes\n }\n\n case 'saas': {\n const routes: LazyRoute[] = []\n if (hasModule('admin')) {\n routes.push(\n {\n path: '/dashboard',\n importPath: './pages/DashboardPage',\n componentName: 'DashboardPage',\n label: 'Dashboard',\n },\n {\n path: '/settings',\n importPath: './pages/SettingsPage',\n componentName: 'SettingsPage',\n label: 'Settings',\n }\n )\n }\n routes.push(...maybeAuthRoutes)\n return routes\n }\n\n case 'community': {\n const routes: LazyRoute[] = []\n if (hasModule('content')) {\n routes.push(\n {\n path: '/',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Home',\n },\n {\n path: '/topics',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Topics',\n },\n {\n path: '/topics/:id',\n importPath: './pages/ContentDetailPage',\n componentName: 'ContentDetailPage',\n label: 'Topic Detail',\n },\n {\n path: '/popular',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Popular',\n },\n {\n path: '/content',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Content',\n },\n {\n path: '/content/:id',\n importPath: './pages/ContentDetailPage',\n componentName: 'ContentDetailPage',\n label: 'Content Detail',\n }\n )\n }\n if (hasModule('chat')) {\n routes.push({\n path: '/websocket',\n importPath: './pages/WebSocketPage',\n componentName: 'WebSocketPage',\n label: 'WebSocket',\n })\n }\n if (hasModule('notifications')) {\n routes.push({\n path: '/notifications',\n importPath: './pages/NotificationPage',\n componentName: 'NotificationPage',\n label: 'Notifications',\n })\n }\n routes.push(...maybeAuthRoutes)\n return routes\n }\n\n default:\n return [...maybeAuthRoutes]\n }\n}\n\nfunction getNavConfigForPreset(\n presetType: string,\n hasAuth: boolean\n): {\n desktopNav: string[]\n mobileTabs: string[]\n defaultRoute: string\n name: string\n appType: string\n layout: string\n navigationObj: string\n} {\n switch (presetType) {\n case 'todo':\n return {\n name: 'Todo App',\n appType: 'client',\n layout: 'top-nav',\n navigationObj: hasAuth\n ? \"{ visible: true, showLogo: true, showSearch: false, showCart: false, authStyle: 'buttons', navItems: 'desktop' }\"\n : \"{ visible: true, showLogo: true, showSearch: false, showCart: false, authStyle: 'none', navItems: 'desktop' }\",\n desktopNav: [\n \"{ label: 'Todos', icon: 'CheckSquare', path: '/todos' }\",\n \"{ label: 'SSE Demo', icon: 'Bell', path: '/notifications' }\",\n \"{ label: 'WebSocket', icon: 'Zap', path: '/websocket' }\",\n ],\n mobileTabs: [\n \"{ label: 'Todos', icon: 'CheckSquare', path: '/todos' }\",\n \"{ label: 'SSE', icon: 'Bell', path: '/notifications' }\",\n \"{ label: 'WS', icon: 'Zap', path: '/websocket' }\",\n ],\n defaultRoute: '/todos',\n }\n\n case 'plugin':\n return {\n name: 'Plugin Market',\n appType: 'client',\n layout: 'top-nav',\n navigationObj:\n \"{ visible: true, showLogo: true, showSearch: true, showCart: false, authStyle: 'text-link', navItems: 'desktop' }\",\n desktopNav: [\n \"{ label: 'Discover', icon: 'Compass', path: '/plugins' }\",\n \"{ label: 'Plugins', icon: 'Puzzle', path: '/plugins/list' }\",\n \"{ label: 'Categories', icon: 'Tags', path: '/categories' }\",\n \"{ label: 'Search', icon: 'Search', path: '/search' }\",\n \"{ label: 'Publish', icon: 'PlusCircle', path: '/publish' }\",\n \"{ label: 'Developer', icon: 'Code', path: '/developer' }\",\n ],\n mobileTabs: [\n \"{ label: 'Discover', icon: 'Compass', path: '/plugins' }\",\n \"{ label: 'Plugins', icon: 'Puzzle', path: '/plugins/list' }\",\n \"{ label: 'Categories', icon: 'Tags', path: '/categories' }\",\n \"{ label: 'Search', icon: 'Search', path: '/search' }\",\n \"{ label: 'My', icon: 'User', path: '/developer' }\",\n ],\n defaultRoute: '/plugins',\n }\n\n case 'ecommerce':\n return {\n name: 'E-Commerce',\n appType: 'client',\n layout: 'top-nav',\n navigationObj:\n \"{ visible: true, showLogo: true, showSearch: true, showCart: true, authStyle: 'icon', navItems: 'desktop' }\",\n desktopNav: [\n \"{ label: 'Home', icon: 'Home', path: '/' }\",\n \"{ label: 'Products', icon: 'ShoppingBag', path: '/products' }\",\n \"{ label: 'Cart', icon: 'ShoppingCart', path: '/cart' }\",\n \"{ label: 'Orders', icon: 'Package', path: '/orders' }\",\n \"{ label: 'Account', icon: 'User', path: '/content' }\",\n ],\n mobileTabs: [\n \"{ label: 'Home', icon: 'Home', path: '/' }\",\n \"{ label: 'Products', icon: 'ShoppingBag', path: '/products' }\",\n \"{ label: 'Cart', icon: 'ShoppingCart', path: '/cart' }\",\n \"{ label: 'Orders', icon: 'Package', path: '/orders' }\",\n \"{ label: 'Me', icon: 'User', path: '/content' }\",\n ],\n defaultRoute: '/',\n }\n\n case 'saas':\n return {\n name: 'SaaS Admin',\n appType: 'admin',\n layout: 'minimal',\n navigationObj:\n \"{ visible: false, showLogo: false, showSearch: false, showCart: false, authStyle: 'none', navItems: 'none' }\",\n desktopNav: [\n \"{ label: 'Dashboard', icon: 'LayoutDashboard', path: '/dashboard' }\",\n \"{ label: 'Settings', icon: 'Settings', path: '/settings' }\",\n ],\n mobileTabs: [\n \"{ label: 'Dashboard', icon: 'LayoutDashboard', path: '/dashboard' }\",\n \"{ label: 'Settings', icon: 'Settings', path: '/settings' }\",\n ],\n defaultRoute: '/dashboard',\n }\n\n case 'community':\n return {\n name: 'Community Forum',\n appType: 'client',\n layout: 'top-nav',\n navigationObj:\n \"{ visible: true, showLogo: true, showSearch: true, showCart: false, authStyle: 'text-link', navItems: 'desktop' }\",\n desktopNav: [\n \"{ label: 'Home', icon: 'Home', path: '/' }\",\n \"{ label: 'Topics', icon: 'MessageSquare', path: '/topics' }\",\n \"{ label: 'Popular', icon: 'Flame', path: '/popular' }\",\n \"{ label: 'Profile', icon: 'User', path: '/profile' }\",\n \"{ label: 'Chat', icon: 'MessageCircle', path: '/websocket' }\",\n ],\n mobileTabs: [\n \"{ label: 'Home', icon: 'Home', path: '/' }\",\n \"{ label: 'Topics', icon: 'MessageSquare', path: '/topics' }\",\n \"{ label: 'Popular', icon: 'Flame', path: '/popular' }\",\n \"{ label: 'Profile', icon: 'User', path: '/profile' }\",\n \"{ label: 'Chat', icon: 'MessageCircle', path: '/websocket' }\",\n ],\n defaultRoute: '/',\n }\n\n default:\n return {\n name: 'App',\n appType: 'client',\n layout: 'top-nav',\n navigationObj:\n \"{ visible: true, showLogo: true, showSearch: false, showCart: false, authStyle: 'none', navItems: 'desktop' }\",\n desktopNav: [\"{ label: 'Home', icon: 'Home', path: '/' }\"],\n mobileTabs: [\"{ label: 'Home', icon: 'Home', path: '/' }\"],\n defaultRoute: '/',\n }\n }\n}\n\nfunction filterNavByModules(navItems: string[], resolved: ResolvedPreset): string[] {\n const hasModule = (path: string) => {\n if (path === '/todos') return resolved.modules.has('todos')\n if (path === '/notifications') return resolved.modules.has('notifications')\n if (path === '/websocket') return resolved.modules.has('chat')\n if (\n path.startsWith('/plugins') ||\n path === '/categories' ||\n path === '/search' ||\n path === '/publish' ||\n path === '/developer'\n )\n return resolved.modules.has('plugin')\n if (path === '/cart' || path === '/orders') return resolved.modules.has('order')\n if (path.startsWith('/content') || path === '/products' || path === '/')\n return resolved.modules.has('content')\n if (path === '/topics' || path === '/popular' || path === '/profile')\n return resolved.modules.has('content')\n if (path === '/dashboard' || path === '/settings') return resolved.modules.has('admin')\n return true\n }\n return navItems.filter(item => {\n const pathMatch = item.match(/path:\\s*'([^']+)'/)\n if (!pathMatch) return true\n return hasModule(pathMatch[1])\n })\n}\n\nexport function generatePresetUIConfig(resolved: ResolvedPreset, presetId: string): string {\n const presetType = getPresetType(presetId)\n const { constName, theme } = getThemeForPresetType(presetType)\n const hasAuth = resolved.modules.has('auth')\n const navConfig = getNavConfigForPreset(presetType, hasAuth)\n const routes = getRoutesForPreset(presetType, resolved)\n\n // Build aliases: presetId → presetType (only if they differ)\n const aliases: Record<string, string> = {}\n if (presetId !== presetType) {\n aliases[presetId] = presetType\n }\n // Also add common aliases for convenience (e.g., 'fullstack-admin' → 'saas')\n const allAliases: Record<string, string> = {\n 'todo-app': 'todo',\n 'xbrowser-marketplace': 'plugin',\n ecommerce: 'ecommerce',\n 'fullstack-admin': 'saas',\n forum: 'community',\n minimal: 'todo',\n saas: 'saas',\n }\n // Include all aliases that point to the same preset type\n for (const [alias, type] of Object.entries(allAliases)) {\n if (type === presetType && alias !== presetType) {\n aliases[alias] = presetType\n }\n }\n\n const desktopNav = filterNavByModules(navConfig.desktopNav, resolved)\n const mobileTabs = filterNavByModules(navConfig.mobileTabs, resolved)\n\n const routeDefs = routes.map(r => {\n return ` {\n path: '${r.path}',\n component: lazy(() => import('${r.importPath}').then(m => ({ default: m.${r.componentName} }))),\n label: '${r.label}',\n }`\n })\n\n return `import { lazy, type ComponentType } from 'react'\n\nexport type PresetType = '${presetType}'\n\nexport type AppType = 'client' | 'admin'\nexport type LayoutType = 'top-nav' | 'minimal'\nexport type AuthStyle = 'buttons' | 'text-link' | 'icon' | 'avatar' | 'none'\n\n// ClientNavItem is intentionally simpler than admin MenuItem (no permissions/children needed for client nav)\n// eslint-disable-next-line local-rules/prefer-shared-types\nexport interface ClientNavItem {\n label: string\n icon: string\n path: string\n}\n\nexport type TabItem = ClientNavItem\n\nexport interface NavigationConfig {\n visible: boolean\n showLogo: boolean\n showSearch: boolean\n showCart: boolean\n authStyle: AuthStyle\n navItems: 'desktop' | 'none'\n}\n\nexport interface PresetTheme {\n primaryColor: string\n primaryHover: string\n bgColor: string\n textColor: string\n secondaryBg: string\n borderColor: string\n borderRadius: string\n logoText: string\n fontFamily: string\n}\n\nexport interface RouteDef {\n path: string\n component: ComponentType<Record<string, unknown>> | null\n label: string\n}\n\nexport interface PresetUIConfig {\n id: PresetType\n name: string\n appType: AppType\n layout: LayoutType\n theme: PresetTheme\n navigation: NavigationConfig\n desktopNav: ClientNavItem[]\n mobileTabs: ClientNavItem[]\n routes: RouteDef[]\n defaultRoute: string\n}\n\nconst ${constName}: PresetTheme = ${theme}\n\n// Preset ID aliases: allows dev:xxx scripts and VITE_PRESET to use config IDs\nconst PRESET_ALIASES: Record<string, '${presetType}'> = {\n${Object.entries(aliases)\n .map(([k, v]) => ` '${k}': '${v}',`)\n .join('\\n')}\n}\n\nexport const PRESET_UI_CONFIGS: Record<PresetType, PresetUIConfig> = {\n ${presetType}: {\n id: '${presetType}',\n name: '${navConfig.name}',\n appType: '${navConfig.appType}',\n layout: '${navConfig.layout}',\n theme: ${constName},\n navigation: ${navConfig.navigationObj},\n desktopNav: [\n${desktopNav.map(i => ` ${i}`).join(',\\n')}\n ],\n mobileTabs: [\n${mobileTabs.map(i => ` ${i}`).join(',\\n')}\n ],\n defaultRoute: '${navConfig.defaultRoute}',\n routes: [\n${routeDefs.join(',\\n')}\n ],\n },\n}\n\nexport function getPresetUIConfig(id: string): PresetUIConfig {\n const resolvedId = PRESET_ALIASES[id] ?? (id as PresetType)\n return PRESET_UI_CONFIGS[resolvedId] ?? PRESET_UI_CONFIGS['${presetType}']\n}\n\nexport function getPresetUIConfigs(): Record<PresetType, PresetUIConfig> {\n return PRESET_UI_CONFIGS\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\n\nfunction getPresetType(presetId: string): string {\n const map: Record<string, string> = {\n 'todo-app': 'todo',\n 'xbrowser-marketplace': 'plugin',\n ecommerce: 'ecommerce',\n 'fullstack-admin': 'saas',\n forum: 'community',\n minimal: 'todo',\n }\n return map[presetId] || 'todo'\n}\n\nexport function generateClientMain(resolved: ResolvedPreset, presetId: string): string {\n const presetType = getPresetType(presetId)\n const isSaas = presetType === 'saas'\n\n const authTokenBlock = isSaas\n ? ''\n : `\nif (preset !== 'saas') {\n try {\n const raw = localStorage.getItem('auth-token')\n const parsed = raw ? JSON.parse(raw) : null\n if (!parsed?.state?.token) {\n localStorage.setItem('auth-token', JSON.stringify({\n state: {\n token: 'user-token',\n isAuthenticated: true,\n user: { id: 'user-1', username: 'Demo User', role: 'USER' },\n loading: false,\n error: null,\n },\n version: 0,\n }))\n }\n } catch {\n localStorage.setItem('auth-token', JSON.stringify({\n state: { token: 'user-token', isAuthenticated: true, user: { id: 'user-1', username: 'Demo User', role: 'USER' }, loading: false, error: null },\n version: 0,\n }))\n }\n}\n`\n\n if (isSaas) {\n return `import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport './index.css'\n\nconst AdminApp = React.lazy(() => import('@admin/App').then(m => ({ default: m.App })))\n\nconst RootApp = () => {\n return (\n <React.Suspense fallback={<div className=\"flex items-center justify-center h-screen text-gray-400\">Loading...</div>}>\n <AdminApp basePath=\"/\" />\n </React.Suspense>\n )\n}\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <RootApp />\n </React.StrictMode>,\n)\n\nif (typeof window !== 'undefined') {\n requestAnimationFrame(() => {\n setTimeout(() => {\n document.dispatchEvent(new CustomEvent('prerender-ready'))\n }, 100)\n })\n}\n`\n }\n\n return `import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport { HelmetProvider } from 'react-helmet-async'\nimport { App as ClientApp } from './App'\nimport './index.css'\n\nconst preset = import.meta.env.VITE_PRESET || '${presetType}'\n${authTokenBlock}\nconst RootApp = () => {\n return (\n <HelmetProvider>\n <ClientApp presetId={preset} />\n </HelmetProvider>\n )\n}\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <RootApp />\n </React.StrictMode>,\n)\n\nif (typeof window !== 'undefined') {\n requestAnimationFrame(() => {\n setTimeout(() => {\n document.dispatchEvent(new CustomEvent('prerender-ready'))\n }, 100)\n })\n}\n`\n}\n","import path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport fs from 'fs-extra'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport {\n loadManifests,\n loadPresets,\n resolvePreset,\n type ResolvedPreset,\n} from '../generators/template-generator'\nimport { getExcludePatterns, getGeneratedFiles } from '../generators/file-filter'\nimport { generateRouteRegistry } from '../generators/route-registry'\nimport { generateRpcSurface } from '../generators/rpc-surface'\nimport { generateIsrModules } from '../generators/isr-modules'\nimport { generateEntryStores } from '../generators/entry-stores'\nimport { generateSsrPages } from '../generators/ssr-pages'\nimport { generateClientNavigation } from '../generators/client-navigation'\nimport { generateClientAppTest } from '../generators/client-app-test'\nimport { generateClientNavigationTest } from '../generators/client-navigation-test'\nimport {\n generateAdminApp,\n generateAdminComponentsIndex,\n generateAdminApiClient,\n} from '../generators/admin-app'\nimport { generateDbSchemaBarrel } from '../generators/db-schema-barrel'\nimport { generateDbInit } from '../generators/db-init'\nimport { generateServerApp } from '../generators/server-app'\nimport { generateSharedModulesIndex } from '../generators/shared-modules-index'\nimport { generateSharedSchemasIndex } from '../generators/shared-schemas-index'\nimport { generateMiddlewareIndex } from '../generators/middleware-index'\nimport { generateAuthMiddleware } from '../generators/auth-middleware'\nimport { generateAuthUtils } from '../generators/auth-utils'\nimport { generateClientComponentsIndex } from '../generators/client-components-index'\nimport { generateCliModulesIndex } from '../generators/cli-modules-index'\nimport { filterPackageJson } from '../generators/package-json'\nimport { generateViteConfig } from '../generators/vite-config'\nimport { generatePresetUIConfig } from '../generators/client-preset-ui-config'\nimport { generateClientMain } from '../generators/client-main'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\nconst TEMPLATE_PROJECT_NAME = 'biomimic-todo-app'\nconst TEMPLATE_DB_NAME = 'biomimic-todo-db'\n\nexport class ScaffoldError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ScaffoldError'\n }\n}\n\nfunction validateProjectName(name: string): void {\n if (!name || name.trim().length === 0) {\n throw new ScaffoldError('Project name cannot be empty')\n }\n const validNameRegex = /^(@[a-z0-9-~][a-z0-9-._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*$/\n if (!validNameRegex.test(name)) {\n throw new ScaffoldError(\n `Invalid project name \"${name}\". Use lowercase letters, numbers, hyphens, and underscores only.`\n )\n }\n if (name.length > 214) {\n throw new ScaffoldError('Project name must be 214 characters or less')\n }\n if (name.includes('..') || name.includes('/') || name.includes('\\\\')) {\n throw new ScaffoldError('Project name cannot contain path separators')\n }\n}\n\nfunction parseGitignore(content: string): string[] {\n const negatePatterns: string[] = []\n const includePatterns = content\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line && !line.startsWith('#'))\n .map(line => {\n if (line.startsWith('!')) {\n negatePatterns.push(line.slice(1))\n return null\n }\n return line\n })\n .filter((line): line is string => line !== null)\n .map(pattern => pattern.replace(/\\/$/, ''))\n .map(pattern => pattern.replace(/^\\*\\./, ''))\n .map(pattern => pattern.replace(/^\\/+/, ''))\n .filter(pattern => !pattern.includes('*'))\n return [...includePatterns, ...negatePatterns.map(p => `!${p}`)]\n}\n\nfunction generateDbName(projectName: string): string {\n const sanitized = projectName\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n return `${sanitized}-db`\n}\n\nasync function updateWranglerToml(targetDir: string, projectName: string): Promise<void> {\n const wranglerPath = path.join(targetDir, 'wrangler.toml')\n if (!(await fs.pathExists(wranglerPath))) {\n return\n }\n\n let content = await fs.readFile(wranglerPath, 'utf-8')\n const dbName = generateDbName(projectName)\n\n content = content.replace(\n new RegExp(`^name = \"${TEMPLATE_PROJECT_NAME}\"`, 'm'),\n `name = \"${projectName}\"`\n )\n\n content = content.replace(\n new RegExp(`database_name = \"${TEMPLATE_DB_NAME}\"`, 'g'),\n `database_name = \"${dbName}\"`\n )\n\n content = content.replace(\n /database_id = \"[^\"]+\"/,\n `database_id = \"\" # TODO: Run 'wrangler d1 create ${dbName}' and paste the ID here`\n )\n\n await fs.writeFile(wranglerPath, content)\n}\n\nasync function updatePackageJson(\n targetDir: string,\n projectName: string,\n resolved: ResolvedPreset\n): Promise<void> {\n const pkgJsonPath = path.join(targetDir, 'package.json')\n if (!(await fs.pathExists(pkgJsonPath))) {\n return\n }\n\n let pkgJson = await fs.readJson(pkgJsonPath)\n\n pkgJson = filterPackageJson(pkgJson, resolved)\n\n pkgJson.name = projectName\n\n if (pkgJson.bin) {\n delete pkgJson.bin\n }\n\n await fs.writeJson(pkgJsonPath, pkgJson, { spaces: 2 })\n}\n\nasync function updatePackageLockJson(targetDir: string, projectName: string): Promise<void> {\n const lockFilePath = path.join(targetDir, 'package-lock.json')\n if (!(await fs.pathExists(lockFilePath))) {\n return\n }\n\n const lockFile = await fs.readJson(lockFilePath)\n\n if (lockFile.name === TEMPLATE_PROJECT_NAME) {\n lockFile.name = projectName\n }\n\n if (lockFile.packages?.['']?.name === TEMPLATE_PROJECT_NAME) {\n lockFile.packages[''].name = projectName\n }\n\n await fs.writeJson(lockFilePath, lockFile, { spaces: 2 })\n}\n\nasync function updateReadme(targetDir: string, projectName: string): Promise<void> {\n const readmePath = path.join(targetDir, 'README.md')\n if (!(await fs.pathExists(readmePath))) {\n return\n }\n\n let content = await fs.readFile(readmePath, 'utf-8')\n\n content = content.replace(/^# (.+)$/m, `# ${projectName}`)\n\n await fs.writeFile(readmePath, content)\n}\n\nexport interface CreateOptions {\n projectName: string\n currentDir: boolean\n preset?: string\n outputDir?: string\n dryRun?: boolean\n install?: boolean\n}\n\nexport async function createProject(options: CreateOptions): Promise<void>\nexport async function createProject(\n projectName: string,\n useCurrentDir?: boolean,\n preset?: string\n): Promise<void>\nexport async function createProject(\n projectNameOrOptions: string | CreateOptions,\n useCurrentDir: boolean = false,\n preset?: string\n): Promise<void> {\n let projectName: string\n let currentDir: boolean\n let presetId: string | undefined\n let outputDir: string | undefined\n let dryRun: boolean\n let install: boolean\n\n if (typeof projectNameOrOptions === 'string') {\n projectName = projectNameOrOptions\n currentDir = useCurrentDir\n presetId = preset\n dryRun = false\n install = true\n } else {\n projectName = projectNameOrOptions.projectName\n currentDir = projectNameOrOptions.currentDir\n presetId = projectNameOrOptions.preset\n outputDir = projectNameOrOptions.outputDir\n dryRun = projectNameOrOptions.dryRun ?? false\n install = projectNameOrOptions.install ?? true\n }\n\n if (!currentDir) {\n validateProjectName(projectName)\n }\n\n const templateDir = path.join(__dirname, '../../template')\n let targetDir: string\n\n if (currentDir) {\n targetDir = process.cwd()\n projectName = path.basename(targetDir)\n } else if (outputDir) {\n targetDir = path.resolve(outputDir)\n if (await fs.pathExists(targetDir)) {\n throw new ScaffoldError(`Directory ${outputDir} already exists`)\n }\n } else {\n targetDir = path.resolve(process.cwd(), projectName)\n if (await fs.pathExists(targetDir)) {\n throw new ScaffoldError(`Directory ${projectName} already exists`)\n }\n }\n\n try {\n const manifestSpinner = ora('Loading module manifests...').start()\n const allManifests = await loadManifests(templateDir)\n const presets = await loadPresets(templateDir)\n\n const selectedPresetId = presetId || 'fullstack-admin'\n const selectedPreset = presets.find(p => p.id === selectedPresetId)\n if (!selectedPreset) {\n throw new ScaffoldError(\n `Unknown preset: ${selectedPresetId}. Available: ${presets.map(p => p.id).join(', ')}`\n )\n }\n\n const resolved = resolvePreset(selectedPreset, allManifests)\n manifestSpinner.succeed(\n chalk.green(`Using preset: ${selectedPreset.name} (${resolved.modules.size} modules)`)\n )\n\n if (dryRun) {\n const resolvedModuleNames = [...resolved.modules.keys()]\n const generatedFiles = getGeneratedFiles(resolved)\n\n console.log('')\n console.log(chalk.blue('📋 Dry Run - Files that would be generated:\\n'))\n for (const file of generatedFiles) {\n console.log(` ${chalk.green('✓')} ${file}`)\n }\n\n const gitignorePath = path.join(templateDir, '.gitignore')\n let ignorePatterns: string[] = []\n if (await fs.pathExists(gitignorePath)) {\n const gitignoreContent = await fs.readFile(gitignorePath, 'utf-8')\n ignorePatterns = parseGitignore(gitignoreContent)\n }\n ignorePatterns.push('node_modules', '.wrangler')\n const excludePatterns = getExcludePatterns(resolved, allManifests)\n\n let templateFileCount = 0\n const templateFiles = await fs.readdir(templateDir, { recursive: true })\n for (const file of templateFiles) {\n const relative = String(file)\n if (!relative) continue\n const negated = ignorePatterns.filter((p: string) => p.startsWith('!'))\n const gitIgnored = ignorePatterns.filter(\n (p: string) => !p.startsWith('!') && relative.startsWith(p)\n )\n if (gitIgnored.length > 0) {\n const allowed = negated.some((p: string) => relative === p.slice(1))\n if (!allowed) continue\n }\n const normalizedRelative = relative.replace(/\\\\/g, '/')\n let excluded = false\n for (const pattern of excludePatterns) {\n const normalizedPattern = pattern.replace(/\\\\/g, '/')\n if (\n normalizedRelative === normalizedPattern ||\n normalizedRelative.startsWith(normalizedPattern + '/')\n ) {\n excluded = true\n break\n }\n }\n if (!excluded) templateFileCount++\n }\n\n console.log('')\n console.log(chalk.blue('📁 Template files that would be copied:\\n'))\n console.log(` ${chalk.green('✓')} ${templateFileCount} template files`)\n console.log('')\n console.log(chalk.yellow(` Total generated files: ${generatedFiles.length}`))\n console.log(chalk.yellow(` Preset: ${selectedPreset.name}`))\n console.log(chalk.yellow(` Modules: ${resolvedModuleNames.join(', ')}`))\n console.log('')\n return\n }\n\n if (!currentDir) {\n const dirSpinner = ora('Creating project directory...').start()\n await fs.ensureDir(targetDir)\n dirSpinner.succeed(chalk.green('Project directory created'))\n }\n\n const copySpinner = ora('Copying template files...').start()\n const gitignorePath = path.join(templateDir, '.gitignore')\n let ignorePatterns: string[] = []\n if (await fs.pathExists(gitignorePath)) {\n const gitignoreContent = await fs.readFile(gitignorePath, 'utf-8')\n ignorePatterns = parseGitignore(gitignoreContent)\n }\n ignorePatterns.push('node_modules', '.wrangler')\n\n const excludePatterns = getExcludePatterns(resolved, allManifests)\n\n await fs.copy(templateDir, targetDir, {\n filter: (src: string) => {\n const relative = path.relative(templateDir, src)\n if (relative === '') return true\n\n const negated = ignorePatterns.filter(p => p.startsWith('!'))\n const gitIgnored = ignorePatterns.filter(p => !p.startsWith('!') && relative.startsWith(p))\n if (gitIgnored.length > 0) {\n const allowed = negated.some(p => relative === p.slice(1))\n if (!allowed) return false\n }\n\n const normalizedRelative = relative.replace(/\\\\/g, '/')\n for (const pattern of excludePatterns) {\n const normalizedPattern = pattern.replace(/\\\\/g, '/')\n if (\n normalizedRelative === normalizedPattern ||\n normalizedRelative.startsWith(normalizedPattern + '/')\n ) {\n return false\n }\n }\n\n return true\n },\n dereference: false,\n })\n copySpinner.succeed(chalk.green('Template files copied'))\n\n const genSpinner = ora('Generating module-specific files...').start()\n\n const routeRegistryContent = generateRouteRegistry(resolved)\n await fs.writeFile(path.join(targetDir, 'src/server/route-registry.ts'), routeRegistryContent)\n\n // 按模块拆分的 RPC 门面(读取已复制的模块路由文件,提取窄类型与路径段)\n const rpcSurfaceContent = generateRpcSurface(resolved, relPath => {\n const full = path.join(targetDir, 'src/server', `${relPath}.ts`)\n return fs.existsSync(full) ? fs.readFileSync(full, 'utf-8') : null\n })\n await fs.writeFile(path.join(targetDir, 'src/server/rpc-surface.ts'), rpcSurfaceContent)\n\n // 按 preset 修正客户端默认值(模板全量版硬编码 'todo',小 preset 查不到配置)\n for (const [rel, from, to] of [\n ['src/client/App.tsx', \"presetId = 'todo'\", `presetId = '${selectedPreset.id}'`],\n [\n 'src/client/entry-server.tsx',\n \"const preset = 'todo'\",\n `const preset = '${selectedPreset.id}'`,\n ],\n ] as const) {\n const p = path.join(targetDir, rel)\n if (await fs.pathExists(p)) {\n let content = await fs.readFile(p, 'utf-8')\n content = content.split(from).join(to)\n await fs.writeFile(p, content)\n }\n }\n\n // 无 client 的 preset:剥掉 shared barrel 的 hooks 再导出(hooks 目录已被过滤)\n if (!resolved.hasClient) {\n const barrelPath = path.join(targetDir, 'src/shared/index.ts')\n if (await fs.pathExists(barrelPath)) {\n let barrel = await fs.readFile(barrelPath, 'utf-8')\n barrel = barrel.replaceAll(\"export * from './hooks'\\n\", '')\n await fs.writeFile(barrelPath, barrel)\n }\n }\n\n const isrModulesContent = generateIsrModules(resolved, (moduleName, relPath) =>\n fs.existsSync(path.join(targetDir, 'src/server', `module-${moduleName}`, relPath))\n )\n await fs.writeFile(path.join(targetDir, 'src/server/isr-modules.ts'), isrModulesContent)\n\n if (resolved.hasClient) {\n const entryStoresContent = generateEntryStores(resolved, (_moduleName, relPath) =>\n fs.existsSync(path.join(targetDir, 'src/client/stores', relPath))\n )\n await fs.ensureDir(path.join(targetDir, 'src/client/stores'))\n await fs.writeFile(\n path.join(targetDir, 'src/client/stores/entry-stores.ts'),\n entryStoresContent\n )\n\n // SSR 静态页面注册表:只导入本 preset 实际存在的页面\n //(模板全量版含全部导入,小 preset 裁页后会悬空)\n const ssrPagesContent = generateSsrPages(resolved, name =>\n fs.existsSync(path.join(targetDir, 'src/client/pages', `${name}.tsx`))\n )\n await fs.writeFile(path.join(targetDir, 'src/client/ssr-pages.ts'), ssrPagesContent)\n }\n\n const dbSchemaContent = generateDbSchemaBarrel(resolved)\n await fs.writeFile(path.join(targetDir, 'src/server/db/schema/index.ts'), dbSchemaContent)\n\n if (resolved.hasClient) {\n const clientNavContent = generateClientNavigation(resolved)\n await fs.writeFile(\n path.join(targetDir, 'src/client/components/Navigation.tsx'),\n clientNavContent\n )\n\n const clientAppTestContent = generateClientAppTest(resolved)\n await fs.ensureDir(path.join(targetDir, 'src/client/components/__tests__'))\n await fs.writeFile(\n path.join(targetDir, 'src/client/components/__tests__/App.test.tsx'),\n clientAppTestContent\n )\n\n const clientNavTestContent = generateClientNavigationTest(resolved)\n await fs.writeFile(\n path.join(targetDir, 'src/client/components/__tests__/Navigation.test.tsx'),\n clientNavTestContent\n )\n\n const presetUIConfigContent = generatePresetUIConfig(resolved, selectedPreset.id)\n await fs.writeFile(\n path.join(targetDir, 'src/client/preset-ui-config.ts'),\n presetUIConfigContent\n )\n\n const clientMainContent = generateClientMain(resolved, selectedPreset.id)\n await fs.writeFile(path.join(targetDir, 'src/client/main.tsx'), clientMainContent)\n }\n\n if (resolved.hasClient && resolved.modules.has('admin')) {\n const adminAppContent = generateAdminApp(resolved)\n if (adminAppContent) {\n await fs.ensureDir(path.join(targetDir, 'src/admin'))\n await fs.writeFile(path.join(targetDir, 'src/admin/App.tsx'), adminAppContent)\n }\n // Generate admin/components/index.ts with conditional CaptchaModal export\n const adminComponentsIndex = generateAdminComponentsIndex(resolved)\n if (adminComponentsIndex) {\n await fs.ensureDir(path.join(targetDir, 'src/admin/components'))\n await fs.writeFile(\n path.join(targetDir, 'src/admin/components/index.ts'),\n adminComponentsIndex\n )\n }\n // Generate admin/services/apiClient.ts with conditional captcha support\n const adminApiClient = generateAdminApiClient(resolved)\n if (adminApiClient) {\n await fs.ensureDir(path.join(targetDir, 'src/admin/services'))\n await fs.writeFile(path.join(targetDir, 'src/admin/services/apiClient.ts'), adminApiClient)\n }\n }\n\n const serverAppContent = generateServerApp(resolved)\n await fs.writeFile(path.join(targetDir, 'src/server/app.ts'), serverAppContent)\n\n const generatedFiles = getGeneratedFiles(resolved)\n if (generatedFiles.includes('src/server/db/init.ts')) {\n const dbInitContent = generateDbInit(resolved)\n await fs.writeFile(path.join(targetDir, 'src/server/db/init.ts'), dbInitContent)\n }\n\n const sharedModulesContent = generateSharedModulesIndex(resolved)\n await fs.writeFile(path.join(targetDir, 'src/shared/modules/index.ts'), sharedModulesContent)\n\n const sharedSchemasContent = generateSharedSchemasIndex(resolved)\n await fs.writeFile(path.join(targetDir, 'src/shared/schemas/index.ts'), sharedSchemasContent)\n\n const middlewareIndexContent = generateMiddlewareIndex(resolved)\n await fs.writeFile(\n path.join(targetDir, 'src/server/middleware/index.ts'),\n middlewareIndexContent\n )\n\n if (generatedFiles.includes('src/server/middleware/auth.ts')) {\n const authMiddlewareContent = generateAuthMiddleware(resolved)\n await fs.writeFile(\n path.join(targetDir, 'src/server/middleware/auth.ts'),\n authMiddlewareContent\n )\n }\n\n if (generatedFiles.includes('src/server/utils/auth.ts')) {\n const authUtilsContent = generateAuthUtils(resolved)\n await fs.writeFile(path.join(targetDir, 'src/server/utils/auth.ts'), authUtilsContent)\n }\n\n if (resolved.hasClient) {\n const clientComponentsContent = generateClientComponentsIndex(resolved)\n await fs.writeFile(\n path.join(targetDir, 'src/client/components/index.ts'),\n clientComponentsContent\n )\n }\n\n // CLI modules index is always generated (CLI is independent of admin)\n const cliModulesContent = generateCliModulesIndex(resolved)\n await fs.writeFile(path.join(targetDir, 'src/cli/modules/index.ts'), cliModulesContent)\n\n if (resolved.hasClient && generatedFiles.includes('vite.config.ts')) {\n const viteConfigContent = generateViteConfig(resolved, templateDir)\n await fs.writeFile(path.join(targetDir, 'vite.config.ts'), viteConfigContent)\n }\n\n genSpinner.succeed(chalk.green('Module-specific files generated'))\n\n const pkgSpinner = ora('Configuring package.json...').start()\n await updatePackageJson(targetDir, projectName, resolved)\n pkgSpinner.succeed(chalk.green('package.json configured'))\n\n const lockSpinner = ora('Configuring package-lock.json...').start()\n await updatePackageLockJson(targetDir, projectName)\n lockSpinner.succeed(chalk.green('package-lock.json configured'))\n\n const wranglerSpinner = ora('Configuring wrangler.toml...').start()\n await updateWranglerToml(targetDir, projectName)\n wranglerSpinner.succeed(chalk.green('wrangler.toml configured'))\n\n const readmeSpinner = ora('Configuring README.md...').start()\n await updateReadme(targetDir, projectName)\n readmeSpinner.succeed(chalk.green('README.md configured'))\n\n let installSucceeded = false\n if (install && !dryRun) {\n const installSpinner = ora('Installing dependencies...').start()\n try {\n const { execSync } = await import('node:child_process')\n execSync('npm install --legacy-peer-deps', {\n env: { ...process.env, PUPPETEER_SKIP_DOWNLOAD: '1' },\n cwd: targetDir,\n stdio: 'pipe',\n timeout: 300000,\n })\n installSpinner.succeed(chalk.green('Dependencies installed'))\n installSucceeded = true\n } catch {\n installSpinner.warn(\n chalk.yellow('Dependency installation failed (you can run npm install manually)')\n )\n }\n }\n\n if (installSucceeded) {\n const patchesDir = path.join(targetDir, 'patches')\n if (await fs.pathExists(patchesDir)) {\n try {\n const { execSync } = await import('node:child_process')\n execSync('npx patch-package', {\n cwd: targetDir,\n stdio: 'pipe',\n timeout: 60000,\n })\n } catch {\n // patch-package may fail if patches don't apply, not critical\n }\n }\n }\n\n console.log('')\n console.log(chalk.green(' ✓ Project created successfully!'))\n console.log(chalk.gray(` Preset: ${selectedPreset.name}`))\n console.log(chalk.gray(` Modules: ${[...resolved.modules.keys()].join(', ')}`))\n console.log('')\n console.log(chalk.cyan(' Next steps:'))\n if (!currentDir && !outputDir) {\n console.log(chalk.white(` cd ${projectName}`))\n }\n if (!install || !installSucceeded) {\n console.log(chalk.white(' npm install'))\n }\n\n if (resolved.hasClient) {\n console.log(chalk.white(' npm run dev'))\n console.log('')\n console.log(chalk.yellow(' ⚠️ Cloudflare Setup:'))\n console.log(\n chalk.white(` 1. Create D1 database: wrangler d1 create ${generateDbName(projectName)}`)\n )\n console.log(chalk.white(' 2. Copy the database ID to wrangler.toml'))\n console.log(chalk.white(' 3. Deploy: npm run deploy:cf'))\n } else {\n console.log(chalk.white(' npm run build'))\n console.log(chalk.white(' npm start'))\n console.log('')\n console.log(chalk.cyan(' CLI usage:'))\n console.log(chalk.white(' node dist/cli/index.js config status'))\n console.log(chalk.white(' node dist/cli/index.js todo list'))\n console.log(chalk.white(' node dist/cli/index.js --help'))\n }\n console.log('')\n console.log(chalk.gray(' Happy coding! 🐟'))\n\n // agent 钩子环境提示:工作区 .zcode/ 已随模板生成(ZCode 打开即生效);\n // 全局级钩子按需用 hooks:sync 同步(幂等,支持 ZCode / Codex)\n const home = process.env.HOME || ''\n const agents: string[] = []\n if (home) {\n if (await fs.pathExists(path.join(home, '.zcode'))) agents.push('ZCode')\n if (await fs.pathExists(path.join(home, '.codex'))) agents.push('Codex')\n if (await fs.pathExists(path.join(home, '.claude'))) agents.push('Claude Code')\n if (await fs.pathExists(path.join(home, '.cursor'))) agents.push('Cursor')\n }\n if (agents.length > 0) {\n console.log('')\n console.log(chalk.cyan(` 🪝 Agent hooks (检测到 ${agents.join(' / ')}):`))\n console.log(\n chalk.gray(' 工作区钩子已生成(.zcode/,禁止 --no-verify 提交),ZCode 自动生效')\n )\n console.log(chalk.gray(' 同步到全局(Codex 等):npm run hooks:sync -- --global'))\n }\n console.log('')\n } catch (error) {\n if (error instanceof ScaffoldError) throw error\n throw new ScaffoldError(`Error creating project: ${error}`)\n }\n}\n","import { readFileSync } from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { Command } from 'commander'\nimport chalk from 'chalk'\nimport { select } from '@inquirer/prompts'\nimport { createProject, ScaffoldError } from './commands/create.js'\nimport { loadPresets } from './generators/template-generator.js'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\n// __dirname is:\n// - dev: .../create-biomimic-app/src\n// - built: .../create-biomimic-app/dist/cli\n// Both should resolve rootDir to the package root (where package.json + template/ live)\nconst rootDir = __dirname.endsWith(path.join('src'))\n ? path.resolve(__dirname, '..')\n : __dirname.endsWith(path.join('dist', 'cli'))\n ? path.resolve(__dirname, '..', '..')\n : path.resolve(__dirname, '..', '..')\n\nconst packageJson = JSON.parse(readFileSync(path.join(rootDir, 'package.json'), 'utf-8'))\n\nconst program = new Command()\n\nprogram\n .name('create-fullstack-scaffold')\n .description('Create a new full-stack scaffold app with Todo List example')\n .version(packageJson.version)\n .argument('[project-name]', 'Name of your project')\n .option('-c, --current-dir', 'Create project in current directory')\n .option(\n '-p, --preset <preset>',\n 'Template preset to use (fullstack-admin, todo-app, ecommerce, xbrowser-marketplace, forum, cli-only, minimal, saas)'\n )\n .option('-o, --output-dir <path>', 'Output directory (defaults to project name)')\n .option('--dry-run', 'Show what would be generated without creating files')\n .option('--no-install', 'Skip automatic dependency installation')\n .action(\n async (\n projectName = 'my-fullstack-app',\n options: {\n currentDir?: boolean\n preset?: string\n outputDir?: string\n dryRun?: boolean\n install?: boolean\n }\n ) => {\n console.log('')\n console.log(chalk.cyan.bold(' ╔══════════════════════════════════════════╗'))\n console.log(chalk.cyan.bold(' ║ Create Fullstack Scaffold App ║'))\n console.log(chalk.cyan.bold(' ║ React + Hono + Vite + Zustand + TS ║'))\n console.log(chalk.cyan.bold(' ╚══════════════════════════════════════════╝'))\n console.log('')\n\n let preset = options.preset\n\n if (!preset && process.stdin.isTTY) {\n const templateDir = path.join(rootDir, 'template')\n const presets = await loadPresets(templateDir)\n preset = await select({\n message: 'Choose a template preset:',\n choices: presets.map(p => ({\n value: p.id,\n name: `${p.name} — ${p.description}`,\n })),\n })\n }\n\n if (!preset) {\n preset = 'fullstack-admin'\n }\n\n try {\n await createProject({\n projectName,\n currentDir: options.currentDir ?? false,\n preset,\n outputDir: options.outputDir,\n dryRun: options.dryRun ?? false,\n install: options.install,\n })\n } catch (error) {\n if (error instanceof ScaffoldError) {\n console.error(chalk.red(` ✖ ${error.message}`))\n process.exit(1)\n }\n throw error\n }\n }\n )\n\nprogram\n .command('presets')\n .description('List available template presets')\n .action(async () => {\n const templateDir = path.join(rootDir, 'template')\n const presets = await loadPresets(templateDir)\n console.log(chalk.cyan('\\nAvailable presets:\\n'))\n for (const preset of presets) {\n console.log(` ${chalk.green(preset.id.padEnd(20))} ${preset.name}`)\n console.log(` ${' '.repeat(20)} ${preset.description}`)\n console.log(` ${' '.repeat(20)} Modules: ${preset.modules.join(', ')}`)\n console.log()\n }\n })\n\nprogram.parse()\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/generators/template-generator.ts","../../src/generators/file-filter.ts","../../src/generators/route-registry.ts","../../src/generators/rpc-surface.ts","../../src/generators/isr-modules.ts","../../src/generators/entry-stores.ts","../../src/generators/ssr-pages.ts","../../src/generators/client-navigation.ts","../../src/generators/client-app-test.ts","../../src/generators/client-navigation-test.ts","../../src/generators/admin-app.ts","../../src/generators/db-schema-barrel.ts","../../src/generators/db-init.ts","../../src/generators/server-app.ts","../../src/generators/shared-modules-index.ts","../../src/generators/shared-schemas-index.ts","../../src/generators/middleware-index.ts","../../src/generators/auth-middleware.ts","../../src/generators/auth-utils.ts","../../src/generators/client-components-index.ts","../../src/generators/cli-modules-index.ts","../../src/generators/package-json.ts","../../src/generators/vite-config.ts","../../src/generators/client-preset-ui-config.ts","../../src/generators/client-main.ts","../../src/commands/create.ts","../../src/index.ts"],"names":["key","moduleOrder","STANDALONE_SHARED_MODULES","MODULE_EXPORTS","pkg","join","path","getPresetType","__filename","__dirname","generatedFiles","gitignorePath","ignorePatterns","excludePatterns","fileURLToPath","readFileSync","chalk"],"mappings":";;;;;;;;;;AA+DA,IAAI,UAAA;AAEJ,eAAe,WAAA,GAAmC;AAChD,EAAA,IAAI,YAAY,OAAO,UAAA;AACvB,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,aAAa,CAAA;AAC/C,EAAA,UAAA,GAAa,QAAA;AACb,EAAA,OAAO,UAAA;AACT;AAEA,eAAsB,cAAc,WAAA,EAA2D;AAC7F,EAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAY;AACnC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,EAAa,KAAA,EAAO,QAAQ,CAAA;AACnD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA4B;AAEhD,EAAA,MAAM,OAAA,GAAU,YAAY,SAAS,CAAA;AACrC,EAAA,MAAM,aAAa,OAAA,CAAQ,MAAA;AAAA,IACzB,CAAA,CAAA,KAAK,CAAA,CAAE,UAAA,CAAW,SAAS,CAAA,IAAK,QAAA,CAAS,IAAA,CAAK,SAAA,EAAW,CAAC,CAAC,CAAA,CAAE,WAAA;AAAY,GAC3E;AAEA,EAAA,MAAM,YAAY,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,UAAU,CAAC,CAAA,CAAE,IAAA;AAE7D,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,EAAW,GAAA,EAAK,WAAW,CAAA;AACrD,IAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,QAAA,CAAS,YAAA,EAAc,EAAE,WAAW,CAAA;AACtD,MAAA,MAAM,WAA2B,GAAA,CAAI,OAAA;AACrC,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,CAAS,IAAA,EAAM;AAC/B,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAAyB,GAAG,CAAA,cAAA,CAAgB,CAAA;AAC1D,QAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAAA,IACrC,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAkC,GAAG,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,YAAY,WAAA,EAAgD;AAChF,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,EAAa,mBAAmB,CAAA;AACxD,EAAA,IAAI,CAAC,UAAA,CAAW,UAAU,CAAA,EAAG;AAC3B,IAAA,OAAO,CAAC,kBAAkB,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,EAAY;AACnC,IAAA,MAAM,SAAA,GAAY,aAAA,CAAc,UAAU,CAAA,CAAE,IAAA;AAC5C,IAAA,MAAM,MAAM,MAAM,QAAA,CAAS,UAAA,EAAY,EAAE,WAAW,CAAA;AACpD,IAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,MAAA,OAAO,GAAA,CAAI,gBAAA;AAAA,IACb;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,kCAA6B,GAAG,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO,CAAC,kBAAkB,CAAA;AAC5B;AAEA,SAAS,gBAAA,GAAmC;AAC1C,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,iBAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,WAAA,EAAa,sBAAA;AAAA,IACb,OAAA,EAAS;AAAA,MACP,OAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;AAEO,SAAS,aAAA,CACd,QACA,YAAA,EACgB;AAChB,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA4B;AAEhD,EAAA,MAAM,SAAA,GAAY,CAAC,GAAG,MAAA,CAAO,OAAO,CAAA;AACpC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAElC,EAAA,OAAO,SAAA,CAAU,SAAS,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAA,GAAO,UAAU,KAAA,EAAM;AAC7B,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AACzB,IAAA,SAAA,CAAU,IAAI,IAAI,CAAA;AAElB,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AACtC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,QAAQ,CAAA;AAC1B,MAAA,KAAA,MAAW,GAAA,IAAO,SAAS,SAAA,EAAW;AACpC,QAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,UAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,IAAI,QAAA,GAAW,KAAA;AAEf,EAAA,KAAA,MAAW,QAAA,IAAY,OAAA,CAAQ,MAAA,EAAO,EAAG;AACvC,IAAA,IAAI,QAAA,CAAS,QAAQ,MAAA,GAAS,IAAA;AAC9B,IAAA,IAAI,QAAA,CAAS,cAAc,YAAA,GAAe,IAAA;AAC1C,IAAA,IAAI,SAAS,UAAA,IAAc,QAAA,CAAS,UAAA,CAAW,MAAA,GAAS,GAAG,QAAA,GAAW,IAAA;AACtE,IAAA,IAAI,QAAA,CAAS,OAAO,KAAA,IAAS,QAAA,CAAS,OAAO,KAAA,CAAM,MAAA,GAAS,GAAG,QAAA,GAAW,IAAA;AAAA,EAC5E;AAEA,EAAA,MAAM,SAAA,GAAY,OAAO,EAAA,KAAO,UAAA;AAEhC,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAW,CAAC,SAAA;AAAA,IACZ,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AAAA,IACvC,UAAA,EAAY,OAAA,CAAQ,GAAA,CAAI,SAAS;AAAA,GACnC;AACF;AAoBO,SAAS,iBAAiB,QAAA,EAAoC;AACnE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,GAAG,QAAQ,CAAA,IAAK,SAAS,OAAA,EAAS;AAC3C,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAA,CAAS,SAAA,CAAU,KAAK,CAAA;AAAA,IACxC;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,eAAe,QAAA,EAA6D;AAC1F,EAAA,MAAM,QAA2C,EAAC;AAClD,EAAA,KAAA,MAAW,GAAG,QAAQ,CAAA,IAAK,SAAS,OAAA,EAAS;AAC3C,IAAA,IAAI,SAAS,WAAA,EAAa;AACxB,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAA,CAAS,WAAW,CAAA;AAAA,IACpC;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAc,QAAA,EAAwD;AACpF,EAAA,MAAM,QAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,GAAG,QAAQ,CAAA,IAAK,SAAS,OAAA,EAAS;AAC3C,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAA,CAAS,UAAU,CAAA;AAAA,IACnC;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;;;ACzOO,SAAS,kBAAA,CACd,UACA,YAAA,EACU;AACV,EAAA,MAAM,WAAqB,EAAC;AAI5B,EAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,sBAAA;AAAA,MACA,kBAAA;AAAA,MACA,kCAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAIA,EAAA,QAAA,CAAS,KAAK,+BAA+B,CAAA;AAE7C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,CAAA,IAAK,YAAA,EAAc;AAC3C,IAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AAEhC,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE,CAAA;AAEzC,IAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,mBAAA,EAAsB,QAAA,CAAS,aAAA,CAAc,IAAI,CAAA,CAAE,CAAA;AACjE,MAAA,IAAI,QAAA,CAAS,cAAc,eAAA,EAAiB;AAC1C,QAAA,KAAA,MAAW,KAAA,IAAS,QAAA,CAAS,aAAA,CAAc,eAAA,EAAiB;AAC1D,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,mBAAA,EAAsB,KAAK,CAAA,CAAE,CAAA;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,SAAA,CAAU,KAAA,EAAO;AAC3C,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,qBAAA,EAAwB,IAAI,CAAA,GAAA,CAAK,CAAA;AAAA,MACjD;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,WAAA,EAAa;AACxB,MAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,WAAA,EAAa;AACvC,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,iBAAA,EAAoB,IAAA,CAAK,IAAI,CAAA,IAAA,CAAM,CAAA;AACjD,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,2BAAA,EAA8B,IAAA,CAAK,IAAI,CAAA,SAAA,CAAW,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,YAAA,EAAc;AACzB,MAAA,KAAA,MAAW,KAAA,IAAS,SAAS,YAAA,EAAc;AACzC,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,kBAAA,EAAqB,KAAK,CAAA,GAAA,CAAK,CAAA;AAC7C,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,4BAAA,EAA+B,KAAK,CAAA,QAAA,CAAU,CAAA;AAAA,MAC9D;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,UAAA,EAAY;AACtC,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,gBAAA,EAAmB,IAAA,CAAK,IAAI,CAAA,IAAA,CAAM,CAAA;AAChD,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,0BAAA,EAA6B,IAAA,CAAK,IAAI,CAAA,SAAA,CAAW,CAAA;AAAA,MACjE;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,kBAAA,EAAoB;AAC/B,MAAA,KAAA,MAAW,EAAA,IAAM,SAAS,kBAAA,EAAoB;AAC5C,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,sBAAA,EAAyB,EAAA,CAAG,IAAI,CAAA,GAAA,CAAK,CAAA;AACnD,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,gCAAA,EAAmC,EAAA,CAAG,IAAI,CAAA,QAAA,CAAU,CAAA;AAAA,MACpE;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,QAAA,CAAS,KAAK,oDAAoD,CAAA;AAAA,IACpE;AAGA,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,gBAAA,EAAmB,QAAA,CAAS,SAAA,CAAU,GAAG,CAAA,CAAE,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAClC,IAAA,QAAA,CAAS,KAAK,WAAW,CAAA;AACzB,IAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,IAAA,QAAA,CAAS,KAAK,kBAAkB,CAAA;AAAA,EAClC;AAGA,EAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AACnC,IAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,IAAA,QAAA,CAAS,KAAK,aAAa,CAAA;AAC3B,IAAA,QAAA,CAAS,KAAK,2CAA2C,CAAA;AACzD,IAAA,QAAA,CAAS,KAAK,0DAA0D,CAAA;AAAA,EAC1E;AACA,EAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,EAAG;AACrC,IAAA,QAAA,CAAS,KAAK,cAAc,CAAA;AAC5B,IAAA,QAAA,CAAS,KAAK,eAAe,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,IAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,IAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,IAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,IAAA,QAAA,CAAS,KAAK,kBAAkB,CAAA;AAChC,IAAA,QAAA,CAAS,KAAK,WAAW,CAAA;AACzB,IAAA,QAAA,CAAS,KAAK,gBAAgB,CAAA;AAC9B,IAAA,QAAA,CAAS,KAAK,mBAAmB,CAAA;AACjC,IAAA,QAAA,CAAS,KAAK,oBAAoB,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,CAAC,SAAS,SAAA,EAAW;AACvB,IAAA,QAAA,CAAS,KAAK,sCAAsC,CAAA;AACpD,IAAA,QAAA,CAAS,KAAK,qDAAqD,CAAA;AAAA,EACrE,CAAA,MAAA,IAAW,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,IAAK,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1E,IAAA,QAAA,CAAS,KAAK,sCAAsC,CAAA;AACpD,IAAA,QAAA,CAAS,KAAK,qDAAqD,CAAA;AACnE,IAAA,QAAA,CAAS,KAAK,0BAA0B,CAAA;AAAA,EAC1C;AAEA,EAAA,QAAA,CAAS,KAAK,gCAAgC,CAAA;AAQ9C,EAAA,MAAM,uBAAA,GAA0F;AAAA,IAC9F,IAAA,EAAM,EAAE,KAAA,EAAO,CAAC,UAAU,CAAA,EAAE;AAAA,IAC5B,SAAA,EAAW,EAAE,KAAA,EAAO,CAAC,YAAA,EAAc,aAAa,CAAA,EAAG,aAAA,EAAe,CAAC,SAAS,CAAA,EAAE;AAAA,IAC9E,SAAA,EAAW,EAAE,KAAA,EAAO,CAAC,eAAe,CAAA;AAAE,GACxC;AACA,EAAA,KAAA,MAAW,CAAC,UAAA,EAAY,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,uBAAuB,CAAA,EAAG;AAE1E,IAAA,MAAM,eAAA,GACJ,OAAO,KAAA,IACP,CAAC,GAAG,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,MAC7B,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,MAAA,CAAO,KAAA,CAAO,QAAA,CAAS,CAAA,CAAE,IAAI,CAAC,CAAA,IAAK;AAAA,KACnE;AAEF,IAAA,MAAM,uBAAA,GACJ,MAAA,CAAO,aAAA,EAAe,IAAA,CAAK,CAAA,EAAA,KAAM,SAAS,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAC,CAAA,IAAK,KAAA;AAChE,IAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,uBAAA,EAAyB;AAChD,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,mBAAA,EAAsB,UAAU,CAAA,CAAE,CAAA;AAAA,IAClD;AAAA,EACF;AAKA,EAAA,IAAI,CAAC,SAAS,aAAA,IAAiB,CAAC,SAAS,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5D,IAAA,QAAA,CAAS,KAAK,sCAAsC,CAAA;AACpD,IAAA,QAAA,CAAS,KAAK,qDAAqD,CAAA;AACnE,IAAA,QAAA,CAAS,KAAK,qDAAqD,CAAA;AACnE,IAAA,QAAA,CAAS,KAAK,8CAA8C,CAAA;AAC5D,IAAA,QAAA,CAAS,KAAK,+DAA+D,CAAA;AAC7E,IAAA,QAAA,CAAS,KAAK,yCAAyC,CAAA;AAAA,EACzD,CAAA,MAAA,IAAW,CAAC,QAAA,CAAS,aAAA,IAAiB,SAAS,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AAClE,IAAA,QAAA,CAAS,KAAK,sCAAsC,CAAA;AACpD,IAAA,QAAA,CAAS,KAAK,qDAAqD,CAAA;AACnE,IAAA,QAAA,CAAS,KAAK,qDAAqD,CAAA;AACnE,IAAA,QAAA,CAAS,KAAK,8CAA8C,CAAA;AAC5D,IAAA,QAAA,CAAS,KAAK,+DAA+D,CAAA;AAC7E,IAAA,QAAA,CAAS,KAAK,yCAAyC,CAAA;AACvD,IAAA,QAAA,CAAS,KAAK,uDAAuD,CAAA;AAAA,EACvE,WAAW,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACzC,IAAA,QAAA,CAAS,KAAK,+DAA+D,CAAA;AAAA,EAC/E;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AACpC,IAAA,QAAA,CAAS,KAAK,4CAA4C,CAAA;AAE1D,IAAA,QAAA,CAAS,KAAK,uCAAuC,CAAA;AACrD,IAAA,QAAA,CAAS,KAAK,kCAAkC,CAAA;AAChD,IAAA,QAAA,CAAS,KAAK,iDAAiD,CAAA;AAC/D,IAAA,QAAA,CAAS,KAAK,yDAAyD,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,kBAAkB,QAAA,EAAoC;AACpE,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,8BAAA;AAAA,IACA,2BAAA;AAAA,IACA,2BAAA;AAAA,IACA,mCAAA;AAAA,IACA,yBAAA;AAAA,IACA,0BAAA;AAAA,IACA,+BAAA;AAAA,IACA,6BAAA;AAAA,IACA,6BAAA;AAAA,IACA,gCAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,oBAAA;AAAA,MACA,sCAAA;AAAA,MACA,gCAAA;AAAA,MACA,uBAAA;AAAA,MACA,8CAAA;AAAA,MACA,qDAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAS,SAAA,IAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACvD,IAAA,KAAA,CAAM,KAAK,mBAAmB,CAAA;AAC9B,IAAA,KAAA,CAAM,KAAK,+BAA+B,CAAA;AAC1C,IAAA,KAAA,CAAM,KAAK,iCAAiC,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,SAAS,SAAA,IAAa,CAAC,SAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACxD,IAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,SAAS,SAAA,IAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAEvD,IAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,CAAC,SAAS,aAAA,EAAe;AAC3B,IAAA,KAAA,CAAM,KAAK,+BAA+B,CAAA;AAC1C,IAAA,KAAA,CAAM,KAAK,0BAA0B,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,IAAI,OAAO,CAAA,IAAK,SAAS,aAAA,EAAe;AAC5D,IAAA,KAAA,CAAM,KAAK,0BAA0B,CAAA;AAAA,EACvC;AAGA,EAAA,KAAA,CAAM,KAAK,uBAAuB,CAAA;AAElC,EAAA,OAAO,KAAA;AACT;;;AC9OO,SAAS,sBAAsB,QAAA,EAAkC;AACtE,EAAA,MAAM,OAAA,GAAoB;AAAA,IACxB,CAAA,+CAAA,CAAA;AAAA,IACA,CAAA,6DAAA;AAAA,GACF;AAEA,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,cAAwB,EAAC;AAE/B,EAAA,MAAM,gBAAgB,CAAC,GAAG,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA;AAEpD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAElC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,CAAA,IAAK,aAAA,EAAe;AAC5C,IAAA,MAAM,SAAA,GAAY,UAAU,IAAI,CAAA,CAAA;AAEhC,IAAA,IAAI,QAAA,CAAS,OAAO,MAAA,EAAQ;AAC1B,MAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,GACxD,QAAA,CAAS,MAAA,CAAO,MAAA,GAChB,CAAC,QAAA,CAAS,OAAO,MAAM,CAAA;AAC3B,MAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,QAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAW,GAAI,KAAA;AACnC,QAAA,MAAM,YAAY,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,GACtC,CAAA,EAAG,IAAI,CAAA,EAAG,UAAA,CAAW,OAAO,CAAC,CAAA,CAAE,aAAa,CAAA,EAAG,WAAW,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAClE,UAAA;AACJ,QAAA,SAAA,CAAU,IAAI,SAAS,CAAA;AACvB,QAAA,MAAM,UAAA,GACJ,cAAc,UAAA,GACV,CAAA,SAAA,EAAY,UAAU,CAAA,WAAA,EAAc,SAAS,IAAI,UAAA,CAAW,OAAA,CAAQ,SAAS,EAAE,CAAC,MAChF,CAAA,SAAA,EAAY,UAAU,OAAO,SAAS,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,EAAI,UAAA,CAAW,OAAA;AAAA,UAC1E,OAAA;AAAA,UACA;AAAA,SACD,CAAA,CAAA,CAAA;AACP,QAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AACvB,QAAA,YAAA,CAAa,IAAA,CAAK,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,MACpD;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACzB,MAAA,KAAA,MAAW,KAAA,IAAS,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO;AACzC,QAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAW,GAAI,KAAA;AACnC,QAAA,MAAM,YAAY,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,GACtC,CAAA,EAAG,IAAI,CAAA,EAAG,UAAA,CAAW,OAAO,CAAC,CAAA,CAAE,aAAa,CAAA,EAAG,WAAW,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAClE,UAAA;AACJ,QAAA,SAAA,CAAU,IAAI,SAAS,CAAA;AACvB,QAAA,MAAM,UAAA,GACJ,cAAc,UAAA,GACV,CAAA,SAAA,EAAY,UAAU,CAAA,WAAA,EAAc,SAAS,IAAI,UAAA,CAAW,OAAA,CAAQ,SAAS,EAAE,CAAC,MAChF,CAAA,SAAA,EAAY,UAAU,OAAO,SAAS,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,EAAI,UAAA,CAAW,OAAA;AAAA,UAC1E,OAAA;AAAA,UACA;AAAA,SACD,CAAA,CAAA,CAAA;AACP,QAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AACvB,QAAA,WAAA,CAAY,IAAA,CAAK,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,MACnD;AAAA,IACF;AAAA,EAGF;AAEA,EAAA,IAAI,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AAEnC,EAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,EAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,EAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,EAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,EAAA,OAAA,IAAW,CAAA;;AAAA,CAAA;AAEX,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AAAA,EACvC,CAAA,MAAO;AACL,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,CAAA;;AAAA,CAAA;AAAA,EACb;AAEA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AAAA,EACtC,CAAA,MAAO;AACL,IAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AACX,IAAA,OAAA,IAAW,CAAA;;AAAA,CAAA;AAAA,EACb;AAEA,EAAA,OAAA,IAAW,CAAA;AAAA,CAAA;AAEX,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,oBAAoB,QAAA,EAA6C;AAC/E,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAElC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,QAAQ,CAAA,IAAK,SAAS,OAAA,EAAS;AAC/C,IAAA,IAAI,QAAA,CAAS,OAAO,UAAA,EAAY;AAC9B,MAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAU,GAAI,SAAS,MAAA,CAAO,UAAA;AAClD,MAAA,MAAM,YAAY,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,GACtC,CAAA,EAAG,IAAI,CAAA,EAAG,UAAA,CAAW,OAAO,CAAC,CAAA,CAAE,aAAa,CAAA,EAAG,WAAW,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAClE,UAAA;AACJ,MAAA,SAAA,CAAU,IAAI,SAAS,CAAA;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,SAAA,EAAW,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC1FA,SAAS,gBAAgB,OAAA,EAA2B;AAClD,EAAA,MAAM,EAAA,GAAK,gDAAA;AACX,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,CAAA;AACJ,EAAA,OAAA,CAAQ,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,OAAO,CAAA,MAAO,MAAM,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,CAAC,CAAC,CAAA;AACvD,EAAA,OAAO,KAAA;AACT;AAOA,SAAS,eAAA,CACP,OAAA,EACA,aAAA,EACA,OAAA,EACA,QAAQ,CAAA,EACE;AACV,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAAA,GAAS,kCAAA;AACf,EAAA,IAAI,CAAA;AACJ,EAAA,OAAA,CAAQ,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,MAAO,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAEzD,EAAA,IAAI,QAAQ,CAAA,EAAG;AAEb,IAAA,MAAM,QAAA,GAAW,mDAAA;AACjB,IAAA,OAAA,CAAQ,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAC5C,MAAA,MAAM,QAAQ,CAAA,CAAE,CAAC,EACd,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAA,EAAK,CAAE,MAAM,MAAM,CAAA,CAAE,CAAC,CAAC,CAAA,CAClC,OAAO,OAAO,CAAA;AACjB,MAAA,MAAM,UAAU,CAAA,CAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,SAAS,EAAE,CAAA;AAExC,MAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AAAA,QAAK,CAAA,CAAA,KAC3B,IAAI,MAAA,CAAO,CAAA,2BAAA,EAA8B,CAAC,CAAA,OAAA,CAAS,CAAA,CAAE,KAAK,OAAO;AAAA,OACnE;AACA,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,MAAM,MAAM,aAAA,CAAc,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AACjD,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,KAAA,MAAW,CAAA,IAAK,eAAA,CAAgB,GAAA,EAAK,aAAA,EAAe,OAAA,EAAS,QAAQ,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AAAA,MACrF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,IAAI,CAAA;AACjB;AAEO,SAAS,kBAAA,CACd,UACA,aAAA,EACQ;AACR,EAAA,MAAM,UAA2B,EAAC;AAClC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAElC,EAAA,MAAM,OAAA,GAAU,CACd,UAAA,EACA,QAAA,EACAA,IAAAA,KACG;AACH,IAAA,MAAM,GAAA,GAAO,QAAA,CAAS,MAAA,CAAmCA,IAAG,CAAA;AAC5D,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,GAAM,CAAC,GAAG,CAAA;AAC5C,IAAA,KAAA,MAAW,SAAS,IAAA,EAA2D;AAE7E,MAAA,MAAM,SAAA,GAAY,CAAA,OAAA,EAAU,UAAU,CAAA,CAAA,EAAI,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAC,CAAA,CAAA;AACpG,MAAA,IAAI,SAAA,GAAY,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,GAC1C,CAAA,EAAG,SAAA,CACA,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,EAAI,CACJ,OAAA;AAAA,QAAQ,WAAA;AAAA,QAAa,CAAC,CAAA,EAAG,CAAA,KACxB,CAAA,CAAE,WAAA;AAAY,OACf,CAAA,EAAG,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,MAAM,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,KAC1E,KAAA,CAAM,UAAA;AACV,MAAA,OAAO,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA,EAAG,SAAA,IAAa,GAAA;AAC9C,MAAA,SAAA,CAAU,IAAI,SAAS,CAAA;AAEvB,MAAA,MAAM,OAAA,GAAU,cAAc,SAAS,CAAA;AACvC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,SAAA,GAAY,gBAAgB,OAAO,CAAA;AACzC,MAAA,MAAM,QAAA,GAAW,eAAA;AAAA,QACf,OAAA;AAAA,QACA,aAAA;AAAA,QACA,SAAA,CAAU,MAAM,GAAG,CAAA,CAAE,MAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG;AAAA,OAC5C;AACA,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,OAAA,CAAQ,KAAK,EAAE,SAAA,EAAW,SAAA,EAAW,QAAA,EAAU,UAAU,CAAA;AAAA,MAC3D;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,MAAW,CAAC,UAAA,EAAY,QAAQ,CAAA,IAAK,CAAC,GAAG,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,CAAA,EAAG;AACpE,IAAA,OAAA,CAAQ,UAAA,EAAY,UAAmB,QAAQ,CAAA;AAC/C,IAAA,OAAA,CAAQ,UAAA,EAAY,UAAmB,OAAO,CAAA;AAAA,EAChD;AAGA,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAGxB;AACF,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,GAAA,KAAQ;AAC1B,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,QAAA,EAAU;AAC5B,MAAA,MAAM,IAAA,GAAO,aAAA,CAAc,GAAA,CAAI,GAAG,KAAK,EAAC;AACxC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,SAAA,EAAW,CAAA,CAAE,SAAA,EAAW,QAAA,EAAU,CAAA,CAAE,QAAA,EAAU,SAAA,EAAW,CAAA,CAAE,SAAA,EAAW,GAAA,EAAK,CAAA;AACvF,MAAA,aAAA,CAAc,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoB,CAAC,GAAG,aAAA,CAAc,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAA,MAAA,KAAU,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAEtF,EAAA,MAAM,OAAA,GAAoB;AAAA,IACxB,CAAA,gCAAA,CAAA;AAAA,IACA,GAAI,iBAAA,GAAoB,CAAC,CAAA,6CAAA,CAA+C,IAAI;AAAC,GAC/E;AACA,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,OAAA,CAAQ,KAAK,CAAA,cAAA,EAAiB,CAAA,CAAE,QAAQ,CAAA,WAAA,EAAc,CAAA,CAAE,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,IAAA,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,CAAE,SAAS,SAAS,CAAC,CAAA,MAAA,EAAS,CAAA,CAAE,QAAQ,CAAA,eAAA,CAAiB,CAAA;AAAA,EACnF,CAAC,CAAA;AAED,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,MAAM,GAAA,GAAM,CAAC,GAAA,KAAiB,wBAAA,CAAyB,KAAK,GAAG,CAAA,GAAI,GAAA,GAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAA;AAEhF,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAiB,wBAAA,CAAyB,IAAA,CAAK,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,CAAA;AAC1F,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,CAAA,IAAK,aAAA,EAAe;AAEzC,IAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,GAAA,GAAM,EAAE,GAAG,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,SAAS,CAAA,MAAA,EAAS,CAAA,CAAE,GAAG,CAAA,EAAG,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AACzE,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,IAAA,CAAK,WAAW,CAAA,GACZ,CAAA,MAAA,EAAS,IAAI,GAAG,CAAC,KAAK,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,CAAA,GAC7B,CAAA,MAAA,EAAS,IAAI,GAAG,CAAC,qBAAqB,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA;AAAA,KAC3D;AAAA,EACF;AAEA,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAWP,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAYlB,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA;AAAA,EAIlB,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAOpB;;;ACjMO,SAAS,kBAAA,CACd,UACA,gBAAA,EACQ;AACR,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,CAAC,UAAU,CAAA,IAAK,CAAC,GAAG,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,CAAA,EAAG;AAC1D,IAAA,IAAI,gBAAA,CAAiB,UAAA,EAAY,QAAQ,CAAA,EAAG;AAC1C,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAA0B,UAAU,CAAA,KAAA,CAAO,CAAA;AAAA,IAC1D;AAAA,EACF;AAEA,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAQP,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AAEpB;;;ACtBO,SAAS,mBAAA,CACd,UACA,gBAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,SAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,IAAK,gBAAA,CAAiB,SAAS,cAAc,CAAA;AAE1F,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;AAAA,EAiBT;AAEA,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAiCT;;;ACvDA,IAAM,YAAA,GAA4F;AAAA,EAChG,EAAE,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,OAAO,QAAA,EAAS;AAAA,EAC3D,EAAE,IAAA,EAAM,iBAAA,EAAmB,SAAA,EAAW,iBAAA,EAAmB,OAAO,UAAA,EAAW;AAAA,EAC3E;AAAA,IACE,IAAA,EAAM,mBAAA;AAAA,IACN,SAAA,EAAW,mBAAA;AAAA,IACX,KAAA,EAAO,cAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EACA,EAAE,IAAA,EAAM,YAAA,EAAc,SAAA,EAAW,YAAA,EAAc,OAAO,SAAA;AACxD,CAAA;AAEO,SAAS,gBAAA,CACd,UACA,cAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,eAAe,QAAQ,CAAA;AACrC,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAEhD,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,IAAI,KAAK,CAAC,cAAA,CAAe,CAAA,CAAE,IAAI,CAAA,EAAG;AACvD,IAAA,OAAA,CAAQ,KAAK,CAAA,SAAA,EAAY,CAAA,CAAE,SAAS,CAAA,iBAAA,EAAoB,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAA;AACjE,IAAA,OAAA,CAAQ,KAAK,CAAA,GAAA,EAAM,CAAA,CAAE,KAAK,CAAA,GAAA,EAAM,CAAA,CAAE,SAAS,CAAA,CAAA,CAAG,CAAA;AAC9C,IAAA,IAAI,EAAE,OAAA,EAAS;AACb,MAAA,QAAA,CAAS,KAAK,CAAA,aAAA,EAAgB,CAAA,CAAE,OAAO,CAAA,cAAA,EAAiB,CAAA,CAAE,SAAS,CAAA,GAAA,CAAK,CAAA;AAAA,IAC1E;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAA,KAAW,CAAA;AAEnC,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,EAUP,OAAA,GACI;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA,GASA;AAAA,EACJ,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA,EAGlB,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA,EAIlB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAYrB,CAAA,CAAA;AACA;;;ACrFA,IAAM,YAAA,GAAe,QAAA;AAErB,IAAM,QAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,aAAA;AAAA,EACV,gBAAA,EAAkB,MAAA;AAAA,EAClB,aAAA,EAAe,MAAA;AAAA,EACf,eAAA,EAAiB,UAAA;AAAA,EACjB,WAAA,EAAa,SAAA;AAAA,EACb,cAAA,EAAgB,MAAA;AAAA,EAChB,UAAA,EAAY,QAAA;AAAA,EACZ,WAAA,EAAa,QAAA;AAAA,EACb,sBAAA,EAAwB,MAAA;AAAA,EACxB,gBAAA,EAAkB,SAAA;AAAA,EAClB,UAAA,EAAY,MAAA;AAAA,EACZ,WAAA,EAAa,MAAA;AAAA,EACb,aAAA,EAAe,iBAAA;AAAA,EACf,YAAA,EAAc,UAAA;AAAA,EACd,QAAA,EAAU,cAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AAEO,SAAS,yBAAyB,QAAA,EAAkC;AACzE,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,KAAA,CAAM,QAAA,CAAS,GAAG,CAAC,CAAA;AACzE,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAE3C,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,IAAK,YAAA;AACpC,IAAA,MAAM,KAAA,GACJ,IAAA,CAAK,IAAA,KAAS,UAAA,GACV,UACA,IAAA,CAAK,IAAA,KAAS,kBAAA,GACd,eAAA,GACA,KAAK,IAAA,KAAS,eAAA,GACd,WAAA,GACA,IAAA,CAAK,SAAS,aAAA,GACd,SAAA,GACA,IAAA,CAAK,IAAA,KAAS,mBACd,YAAA,GACA,IAAA,CAAK,IAAA,KAAS,YAAA,GACd,WACA,IAAA,CAAK,IAAA,KAAS,aAAA,GACd,SAAA,GACA,KAAK,IAAA,KAAS,wBAAA,GACd,WAAA,GACA,IAAA,CAAK,SAAS,YAAA,GACd,QAAA,GACA,IAAA,CAAK,IAAA,KAAS,gBACd,SAAA,GACA,IAAA,CAAK,IAAA,KAAS,eAAA,GACd,cACA,IAAA,CAAK,IAAA,KAAS,cAAA,GACd,UAAA,GACA,KAAK,IAAA,KAAS,UAAA,GACd,MAAA,GACA,IAAA,CAAK,SAAS,YAAA,GACd,QAAA,GACA,IAAA,CAAK,KAAA,CAAM,QAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GACpD,IAAA,CAAK,MAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA;AAC3C,IAAA,QAAA,CAAS,IAAA,CAAK,iBAAiB,KAAK,CAAA,UAAA,EAAa,IAAI,CAAA,UAAA,EAAa,IAAA,CAAK,KAAK,CAAA,IAAA,CAAM,CAAA;AAAA,EACpF;AAEA,EAAA,MAAM,aAAa,OAAA,GAAU;AAAA,kDAAA,CAAA,GAAyD,EAAA;AAEtF,EAAA,MAAM,cAAc,OAAA,GAChB;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,GA2CA;AAAA;AAAA;AAAA;AAAA,CAAA;AAMJ,EAAA,OAAO,CAAA,gBAAA,EAAmB,OAAA,GAAU,QAAA,GAAW,EAAE,CAAA;AAAA,+CAAA,EACF,UAAU;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASzD,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA2Db;;;ACvLO,SAAS,sBAAsB,QAAA,EAAkC;AACtE,EAAA,MAAM,KAAA,GAAQ,eAAe,QAAQ,CAAA;AAErC,EAAA,MAAM,QAAQ,KAAA,CACX,GAAA;AAAA,IACC,CAAA,CAAA,KACE,CAAA,uBAAA,EAA0B,CAAA,CAAE,IAAI,CAAA;AAAA,EAAA,EACpC,CAAA,CAAE,IAAI,CAAA,0BAAA,EAA6B,CAAA,CAAE,KAAK,WAAA,EAAa,CAAA,OAAA,EAAU,CAAA,CAAE,IAAI,CAAA;AAAA,GAAA;AAAA,GAEvE,CACC,KAAK,QAAQ,CAAA;AAEhB,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA,EAAA,EAKL,KAAK;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA2CT;;;AC5DA,IAAM,SAAA,GAAoC;AAAA,EACxC,QAAA,EAAU,OAAA;AAAA,EACV,gBAAA,EAAkB,eAAA;AAAA,EAClB,aAAA,EAAe,WAAA;AAAA,EACf,WAAA,EAAa,SAAA;AAAA,EACb,cAAA,EAAgB,YAAA;AAAA,EAChB,UAAA,EAAY,QAAA;AAAA,EACZ,WAAA,EAAa,SAAA;AAAA,EACb,sBAAA,EAAwB,WAAA;AAAA,EACxB,UAAA,EAAY,QAAA;AAAA,EACZ,WAAA,EAAa,SAAA;AAAA,EACb,aAAA,EAAe,WAAA;AAAA,EACf,YAAA,EAAc,UAAA;AAAA,EACd,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY;AACd,CAAA;AAEO,SAAS,6BAA6B,QAAA,EAAkC;AAC7E,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,KAAA,CAAM,QAAA,CAAS,GAAG,CAAC,CAAA;AACzE,EAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AAEzB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAgBT;AAEA,EAAA,MAAM,UAAA,GAAa,UAAU,SAAA,CAAU,IAAI,KAAK,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAEjF,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,0BAAA,EAkBmB,UAAU,CAAA,+BAAA,EAAkC,SAAA,CAAU,KAAK,CAAA;AAAA;AAAA;AAAA,6BAAA,EAGxD,UAAU,CAAA;AAAA;AAAA;AAAA,CAAA;AAIzC;;;AChEO,SAAS,iBAAiB,QAAA,EAAyC;AACxE,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,EAAU,OAAO,IAAA;AAE/B,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,QAAQ,CAAA,IAAK,EAAC;AAC1C,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAG/B,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AAChD,EAAA,MAAM,iBAAiB,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,QAAQ,CAAA;AAGpD,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,CAAA,yEAAA,CAAA;AAAA,IACA,CAAA,qCAAA,CAAA;AAAA,IACA,CAAA,yCAAA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,OAAA,CAAQ,KAAK,CAAA,SAAA,EAAY,IAAA,CAAK,IAAI,CAAA,iBAAA,EAAoB,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACpE;AAGA,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,UAAA,GAAa,gBAAA,GAAmB,EAAA;AAC/D,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAA0B,aAAa,CAAA,sBAAA,CAAwB,CAAA;AAG5E,EAAA,MAAM,yBAAyB,cAAA,CAAe,GAAA;AAAA,IAC5C,OAAK,CAAA,iCAAA,EAAoC,CAAA,CAAE,KAAK,CAAA,YAAA,EAAe,EAAE,IAAI,CAAA,OAAA;AAAA,GACvE;AAEA,EAAA,MAAM,wBAAwB,cAAA,CAAe,MAAA,GAAS,IAAI,cAAA,CAAe,CAAC,EAAE,KAAA,GAAQ,GAAA;AAEpF,EAAA,MAAM,cAAA,GAAiB,SAAS,UAAA,GAAa;AAAA,wBAAA,CAAA,GAA+B,EAAA;AAE5E,EAAA,MAAM,mBAAmB,WAAA,CAAY,GAAA;AAAA,IACnC,OAAK,CAAA,uBAAA,EAA0B,CAAA,CAAE,KAAK,CAAA,YAAA,EAAe,EAAE,IAAI,CAAA,OAAA;AAAA,GAC7D;AAEA,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAa5B,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2DAAA,EAOgC,qBAAqB,CAAA;AAAA,EAChF,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,EAOhB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAMjC;AAMO,SAAS,6BAA6B,QAAA,EAAyC;AACpF,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,EAAU,OAAO,IAAA;AAE/B,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,uCAAA,CAAA;AAAA,IACA,CAAA,uCAAA,CAAA;AAAA,IACA,CAAA,yCAAA,CAAA;AAAA,IACA,CAAA,+CAAA,CAAA;AAAA,IACA,CAAA,iDAAA;AAAA,GACF;AAEA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,KAAA,CAAM,KAAK,CAAA,6CAAA,CAA+C,CAAA;AAAA,EAC5D;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,kFAAA,CAAoF,CAAA;AAE/F,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC5B;AAMO,SAAS,uBAAuB,QAAA,EAAyC;AAC9E,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,EAAU,OAAO,IAAA;AAE/B,EAAA,MAAM,aAAA,GAAgB,SAAS,UAAA,GAC3B,CAAA;AAAA,CAAA,GACA,EAAA;AACJ,EAAA,MAAM,iBAAA,GAAoB,SAAS,UAAA,GAC/B,CAAA;;AAAA,CAAA,GACA,EAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,SAAS,UAAA,GAC5B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,GAMA,CAAA,oCAAA,CAAA;AAEJ,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,EAUP,aAAa,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,EA2Bb,iBAAiB,CAAA;AAAA;AAAA,EAEjB,cAAc,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAkBhB;;;ACjLO,SAAS,uBAAuB,QAAA,EAAkC;AACvE,EAAA,MAAM,KAAA,GAAQ,iBAAiB,QAAQ,CAAA;AAEvC,EAAA,MAAM,UAAU,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,iBAAA,EAAoB,CAAC,CAAA,CAAA,CAAG,CAAA;AAEvD,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC9B;;;ACVA,IAAM,mBAAA,GAAsB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AA2Q5B,IAAM,aAAA,GAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","file":"index.js","sourcesContent":["import { existsSync, readdirSync, statSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { pathToFileURL } from 'node:url'\n\nexport interface ModuleManifest {\n name: string\n description: string\n category: 'core' | 'communication' | 'business' | 'system'\n dependsOn: string[]\n routes: {\n client?:\n | { importPath: string; exportName: string }\n | { importPath: string; exportName: string }[]\n admin?: { importPath: string; exportName: string }[]\n standalone?: { importPath: string; exportName: string; mountPath: string }\n }\n sharedSchemas?: { path: string; additionalPaths?: string[] }\n clientPages?: { name: string; route: string }[]\n adminPages?: {\n name: string\n route: string\n isPublic?: boolean\n requiredPermission?: string\n }[]\n dbSchemas?: {\n files: string[]\n hasSeed: boolean\n seed?: { serviceFile: string; functionName: string }\n }\n dependencies?: Record<string, string>\n clientStores?: string[]\n providesMiddleware?: {\n name: string\n importPath: string\n appliesTo: string\n }[]\n hasSSE?: boolean\n hasWebSocket?: boolean\n cliModule?: { dir: string; registerFunction: string }\n}\n\nexport interface TemplatePreset {\n id: string\n name: string\n description: string\n modules: string[]\n}\n\nexport interface ResolvedPreset {\n preset: TemplatePreset\n modules: Map<string, ModuleManifest>\n hasAdmin: boolean\n hasClient: boolean\n hasCli: boolean\n hasSSE: boolean\n hasWebSocket: boolean\n hasPermission: boolean\n hasCaptcha: boolean\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TsImportFn = (id: string, opts: { parentURL: string }) => Promise<any>\n\nlet tsImportFn: TsImportFn | undefined\n\nasync function getTsImport(): Promise<TsImportFn> {\n if (tsImportFn) return tsImportFn\n const { tsImport } = await import('tsx/esm/api')\n tsImportFn = tsImport\n return tsImportFn\n}\n\nexport async function loadManifests(templateDir: string): Promise<Map<string, ModuleManifest>> {\n const tsImport = await getTsImport()\n const serverDir = join(templateDir, 'src', 'server')\n const modules = new Map<string, ModuleManifest>()\n\n const entries = readdirSync(serverDir)\n const moduleDirs = entries.filter(\n e => e.startsWith('module-') && statSync(join(serverDir, e)).isDirectory()\n )\n\n const parentURL = pathToFileURL(join(serverDir, 'dummy.ts')).href\n\n for (const dir of moduleDirs) {\n const manifestPath = join(serverDir, dir, 'module.ts')\n if (!existsSync(manifestPath)) continue\n\n try {\n const mod = await tsImport(manifestPath, { parentURL })\n const manifest: ModuleManifest = mod.default\n if (!manifest || !manifest.name) {\n console.error(`❌ Invalid manifest in ${dir}: missing name`)\n continue\n }\n modules.set(manifest.name, manifest)\n } catch (err) {\n console.error(`❌ Failed to load manifest from ${dir}:`, err)\n }\n }\n\n return modules\n}\n\nexport async function loadPresets(templateDir: string): Promise<TemplatePreset[]> {\n const configPath = join(templateDir, 'modules.config.ts')\n if (!existsSync(configPath)) {\n return [getDefaultPreset()]\n }\n\n try {\n const tsImport = await getTsImport()\n const parentURL = pathToFileURL(configPath).href\n const mod = await tsImport(configPath, { parentURL })\n if (mod.TEMPLATE_PRESETS) {\n return mod.TEMPLATE_PRESETS\n }\n } catch (err) {\n console.error('❌ Failed to load presets:', err)\n }\n\n return [getDefaultPreset()]\n}\n\nfunction getDefaultPreset(): TemplatePreset {\n return {\n id: 'fullstack-admin',\n name: 'Full Admin',\n description: 'All modules included',\n modules: [\n 'todos',\n 'chat',\n 'notifications',\n 'file',\n 'captcha',\n 'permission',\n 'admin',\n 'order',\n 'ticket',\n 'dispute',\n 'content',\n ],\n }\n}\n\nexport function resolvePreset(\n preset: TemplatePreset,\n allManifests: Map<string, ModuleManifest>\n): ResolvedPreset {\n const modules = new Map<string, ModuleManifest>()\n\n const toProcess = [...preset.modules]\n const processed = new Set<string>()\n\n while (toProcess.length > 0) {\n const name = toProcess.shift()!\n if (processed.has(name)) continue\n processed.add(name)\n\n const manifest = allManifests.get(name)\n if (manifest) {\n modules.set(name, manifest)\n for (const dep of manifest.dependsOn) {\n if (!processed.has(dep)) {\n toProcess.push(dep)\n }\n }\n }\n }\n\n let hasSSE = false\n let hasWebSocket = false\n let hasAdmin = false\n\n for (const manifest of modules.values()) {\n if (manifest.hasSSE) hasSSE = true\n if (manifest.hasWebSocket) hasWebSocket = true\n if (manifest.adminPages && manifest.adminPages.length > 0) hasAdmin = true\n if (manifest.routes.admin && manifest.routes.admin.length > 0) hasAdmin = true\n }\n\n const isCliOnly = preset.id === 'cli-only'\n\n return {\n preset,\n modules,\n hasAdmin,\n hasClient: !isCliOnly,\n hasCli: true,\n hasSSE,\n hasWebSocket,\n hasPermission: modules.has('permission'),\n hasCaptcha: modules.has('captcha'),\n }\n}\n\nexport function getModuleDirectories(resolved: ResolvedPreset): string[] {\n const dirs: string[] = []\n for (const [name] of resolved.modules) {\n dirs.push(`module-${name}`)\n }\n return dirs\n}\n\nexport function getSharedModuleDirs(resolved: ResolvedPreset): string[] {\n const dirs: string[] = []\n for (const [, manifest] of resolved.modules) {\n if (manifest.sharedSchemas) {\n dirs.push(manifest.sharedSchemas.path)\n }\n }\n return dirs\n}\n\nexport function getDbSchemaFiles(resolved: ResolvedPreset): string[] {\n const files: string[] = []\n for (const [, manifest] of resolved.modules) {\n if (manifest.dbSchemas) {\n files.push(...manifest.dbSchemas.files)\n }\n }\n return files\n}\n\nexport function getClientPages(resolved: ResolvedPreset): { name: string; route: string }[] {\n const pages: { name: string; route: string }[] = []\n for (const [, manifest] of resolved.modules) {\n if (manifest.clientPages) {\n pages.push(...manifest.clientPages)\n }\n }\n return pages\n}\n\nexport function getAdminPages(resolved: ResolvedPreset): ModuleManifest['adminPages'] {\n const pages: ModuleManifest['adminPages'] = []\n for (const [, manifest] of resolved.modules) {\n if (manifest.adminPages) {\n pages.push(...manifest.adminPages)\n }\n }\n return pages\n}\n\nexport function getClientStores(resolved: ResolvedPreset): string[] {\n const stores: string[] = []\n for (const [, manifest] of resolved.modules) {\n if (manifest.clientStores) {\n stores.push(...manifest.clientStores)\n }\n }\n return stores\n}\n\nexport function getDefaultRoute(resolved: ResolvedPreset): string {\n const pages = getClientPages(resolved)\n if (pages.length > 0) {\n return pages[0].route\n }\n return '/'\n}\n","import type { ModuleManifest } from './template-generator'\nimport type { ResolvedPreset } from './template-generator'\n\nexport interface FileFilterRule {\n pattern: string\n action: 'include' | 'exclude'\n condition: string\n}\n\nexport function getExcludePatterns(\n resolved: ResolvedPreset,\n allManifests: Map<string, ModuleManifest>\n): string[] {\n const excludes: string[] = []\n\n // 无 client 的 preset(cli-only):排除仅服务客户端的框架件,\n // 否则 tsc/build 因 react、@client/entry-server、playwright 等悬空引用失败\n if (!resolved.hasClient) {\n excludes.push(\n 'playwright.config.ts',\n 'src/shared/hooks',\n 'src/server/entries/cloudflare.ts',\n 'tests/e2e'\n )\n }\n\n // TS2589 哨兵只属于框架仓库:它 import 全部模块,进小 preset 会编译失败。\n // 生成的 app 由 rpc-surface.ts 本身提供等价的按模块实例化覆盖。\n excludes.push('src/server/rpc-type-canary.ts')\n\n for (const [name, manifest] of allManifests) {\n if (resolved.modules.has(name)) continue\n\n excludes.push(`src/server/module-${name}`)\n\n if (manifest.sharedSchemas) {\n excludes.push(`src/shared/modules/${manifest.sharedSchemas.path}`)\n if (manifest.sharedSchemas.additionalPaths) {\n for (const extra of manifest.sharedSchemas.additionalPaths) {\n excludes.push(`src/shared/modules/${extra}`)\n }\n }\n }\n\n if (manifest.dbSchemas) {\n for (const file of manifest.dbSchemas.files) {\n excludes.push(`src/server/db/schema/${file}.ts`)\n }\n }\n\n if (manifest.clientPages) {\n for (const page of manifest.clientPages) {\n excludes.push(`src/client/pages/${page.name}.tsx`)\n excludes.push(`src/client/pages/__tests__/${page.name}.test.tsx`)\n }\n }\n\n if (manifest.clientStores) {\n for (const store of manifest.clientStores) {\n excludes.push(`src/client/stores/${store}.ts`)\n excludes.push(`src/client/stores/__tests__/${store}.test.ts`)\n }\n }\n\n if (manifest.adminPages) {\n for (const page of manifest.adminPages) {\n excludes.push(`src/admin/pages/${page.name}.tsx`)\n excludes.push(`src/admin/pages/__tests__/${page.name}.test.tsx`)\n }\n }\n\n if (manifest.providesMiddleware) {\n for (const mw of manifest.providesMiddleware) {\n excludes.push(`src/server/middleware/${mw.name}.ts`)\n excludes.push(`src/server/middleware/__tests__/${mw.name}.test.ts`)\n }\n }\n\n if (name === 'todos') {\n excludes.push('src/server/__tests__/integration/todos-api.test.ts')\n }\n\n // Exclude CLI module dir when the server module is not in the preset\n if (manifest.cliModule) {\n excludes.push(`src/cli/modules/${manifest.cliModule.dir}`)\n }\n }\n\n if (!resolved.modules.has('admin')) {\n excludes.push('src/admin')\n excludes.push('admin.html')\n excludes.push('auth-inject.html')\n }\n\n // tenant/merchant directories: tenant needs tenant dir, merchant needs merchant dir\n if (!resolved.modules.has('tenant')) {\n excludes.push('src/tenant')\n excludes.push('tenant.html')\n excludes.push('src/server/middleware/tenant-isolation.ts')\n excludes.push('src/server/middleware/__tests__/tenant-isolation.test.ts')\n }\n if (!resolved.modules.has('merchant')) {\n excludes.push('src/merchant')\n excludes.push('merchant.html')\n }\n\n if (!resolved.hasClient) {\n excludes.push('src/client')\n excludes.push('index.html')\n excludes.push('admin.html')\n excludes.push('auth-inject.html')\n excludes.push('src/admin')\n excludes.push('vite.config.ts')\n excludes.push('postcss.config.js')\n excludes.push('tailwind.config.js')\n }\n\n if (!resolved.hasClient) {\n excludes.push('src/client/components/AuthButton.tsx')\n excludes.push('src/client/components/__tests__/AuthButton.test.tsx')\n } else if (!resolved.modules.has('admin') && !resolved.modules.has('auth')) {\n excludes.push('src/client/components/AuthButton.tsx')\n excludes.push('src/client/components/__tests__/AuthButton.test.tsx')\n excludes.push('src/server/utils/auth.ts')\n }\n\n excludes.push('src/client/preset-ui-config.ts')\n\n // Exclude standalone shared modules (cart, community, dashboard) that are not needed\n // by the current preset. These have no server module manifest of their own, but are\n // declared as clientPages by other modules or imported by server routes.\n // Include when:\n // 1. A module in the preset declares the relevant client page, OR\n // 2. A server module that imports their schemas is present (e.g., content needs community).\n const standaloneSharedModules: Record<string, { pages?: string[]; serverModules?: string[] }> = {\n cart: { pages: ['CartPage'] },\n community: { pages: ['TopicsPage', 'ProfilePage'], serverModules: ['content'] },\n dashboard: { pages: ['DashboardPage'] },\n }\n for (const [moduleName, config] of Object.entries(standaloneSharedModules)) {\n // Check if any module's clientPages includes a relevant page\n const hasRelevantPage =\n config.pages &&\n [...resolved.modules.values()].some(\n m => m.clientPages?.some(p => config.pages!.includes(p.name)) ?? false\n )\n // Check if any required server module is included\n const hasRelevantServerModule =\n config.serverModules?.some(sm => resolved.modules.has(sm)) ?? false\n if (!hasRelevantPage && !hasRelevantServerModule) {\n excludes.push(`src/shared/modules/${moduleName}`)\n }\n }\n\n // LoginPage/RegisterPage are excluded via the for loop above (auth clientPages)\n // when auth module is not in the preset\n\n if (!resolved.hasPermission && !resolved.modules.has('auth')) {\n excludes.push('src/server/utils/permission-utils.ts')\n excludes.push('src/server/utils/__tests__/permission-utils.test.ts')\n excludes.push('src/server/middleware/__tests__/auth-simple.test.ts')\n excludes.push('src/server/middleware/__tests__/auth.test.ts')\n excludes.push('src/server/middleware/__tests__/error-response-format.test.ts')\n excludes.push('src/server/utils/__tests__/auth.test.ts')\n } else if (!resolved.hasPermission && resolved.modules.has('auth')) {\n excludes.push('src/server/utils/permission-utils.ts')\n excludes.push('src/server/utils/__tests__/permission-utils.test.ts')\n excludes.push('src/server/middleware/__tests__/auth-simple.test.ts')\n excludes.push('src/server/middleware/__tests__/auth.test.ts')\n excludes.push('src/server/middleware/__tests__/error-response-format.test.ts')\n excludes.push('src/server/utils/__tests__/auth.test.ts')\n excludes.push('src/server/module-auth/__tests__/auth-service.test.ts')\n } else if (!resolved.modules.has('admin')) {\n excludes.push('src/server/middleware/__tests__/error-response-format.test.ts')\n }\n\n if (!resolved.modules.has('captcha')) {\n excludes.push('src/server/utils/__tests__/captcha.test.ts')\n // CaptchaModal component depends on captcha module (store, API, types)\n excludes.push('src/admin/components/CaptchaModal.tsx')\n excludes.push('src/admin/stores/captchaStore.ts')\n excludes.push('src/admin/stores/__tests__/captchaStore.test.ts')\n excludes.push('src/admin/stores/__tests__/captchaStoreBranches.test.ts')\n }\n\n return excludes\n}\n\nexport function getGeneratedFiles(resolved: ResolvedPreset): string[] {\n const files: string[] = [\n 'src/server/route-registry.ts',\n 'src/server/rpc-surface.ts',\n 'src/server/isr-modules.ts',\n 'src/client/stores/entry-stores.ts',\n 'src/client/ssr-pages.ts',\n 'src/server/ssr-bridge.ts',\n 'src/server/db/schema/index.ts',\n 'src/shared/modules/index.ts',\n 'src/shared/schemas/index.ts',\n 'src/server/middleware/index.ts',\n 'src/server/app.ts',\n 'src/cli/modules/index.ts',\n ]\n\n if (resolved.hasClient) {\n files.push(\n 'src/client/App.tsx',\n 'src/client/components/Navigation.tsx',\n 'src/client/components/index.ts',\n 'src/client/Layout.tsx',\n 'src/client/components/__tests__/App.test.tsx',\n 'src/client/components/__tests__/Navigation.test.tsx',\n 'src/client/main.tsx',\n 'src/client/preset-ui-config.ts'\n )\n }\n\n if (resolved.hasClient && resolved.modules.has('admin')) {\n files.push('src/admin/App.tsx')\n files.push('src/admin/components/index.ts')\n files.push('src/admin/services/apiClient.ts')\n }\n\n if (resolved.hasClient && !resolved.modules.has('admin')) {\n files.push('vite.config.ts')\n }\n\n if (resolved.hasClient && resolved.modules.has('admin')) {\n // admin preset needs generated vite.config.ts to filter tenant/merchant entries\n files.push('vite.config.ts')\n }\n\n if (!resolved.hasPermission) {\n files.push('src/server/middleware/auth.ts')\n files.push('src/server/utils/auth.ts')\n }\n\n if (!resolved.modules.has('admin') && resolved.hasPermission) {\n files.push('src/server/utils/auth.ts')\n }\n\n // Always generate init.ts — every preset has different seed combinations\n files.push('src/server/db/init.ts')\n\n return files\n}\n","import type { ResolvedPreset } from './template-generator'\n\nexport interface StandaloneRoute {\n localName: string\n mountPath: string\n}\n\nexport function generateRouteRegistry(resolved: ResolvedPreset): string {\n const imports: string[] = [\n `import { OpenAPIHono } from '@hono/zod-openapi'`,\n `import { rateLimitMiddleware } from './middleware/rate-limit'`,\n ]\n\n const clientRoutes: string[] = []\n const adminRoutes: string[] = []\n\n const moduleEntries = [...resolved.modules.entries()]\n\n const usedNames = new Set<string>()\n\n for (const [name, manifest] of moduleEntries) {\n const moduleDir = `module-${name}`\n\n if (manifest.routes.client) {\n const clientRouteList = Array.isArray(manifest.routes.client)\n ? manifest.routes.client\n : [manifest.routes.client]\n for (const route of clientRouteList) {\n const { importPath, exportName } = route\n const localName = usedNames.has(exportName)\n ? `${name}${exportName.charAt(0).toUpperCase()}${exportName.slice(1)}`\n : exportName\n usedNames.add(localName)\n const importStmt =\n localName === exportName\n ? `import { ${exportName} } from './${moduleDir}/${importPath.replace(/^\\.\\//, '')}'`\n : `import { ${exportName} as ${localName} } from './${moduleDir}/${importPath.replace(\n /^\\.\\//,\n ''\n )}'`\n imports.push(importStmt)\n clientRoutes.push(` .route('/api', ${localName})`)\n }\n }\n\n if (manifest.routes.admin) {\n for (const route of manifest.routes.admin) {\n const { importPath, exportName } = route\n const localName = usedNames.has(exportName)\n ? `${name}${exportName.charAt(0).toUpperCase()}${exportName.slice(1)}`\n : exportName\n usedNames.add(localName)\n const importStmt =\n localName === exportName\n ? `import { ${exportName} } from './${moduleDir}/${importPath.replace(/^\\.\\//, '')}'`\n : `import { ${exportName} as ${localName} } from './${moduleDir}/${importPath.replace(\n /^\\.\\//,\n ''\n )}'`\n imports.push(importStmt)\n adminRoutes.push(` .route('/api', ${localName})`)\n }\n }\n // Note: standalone routes are NOT included in route-registry.\n // They are imported and mounted directly by server-app.ts generator.\n }\n\n let content = imports.join('\\n') + '\\n\\n'\n\n content += `const apiRateLimit = rateLimitMiddleware({\\n`\n content += ` windowMs: 60_000,\\n`\n content += ` max: 100,\\n`\n content += ` message: 'Too many requests, please try again later',\\n`\n content += `})\\n\\n`\n\n if (clientRoutes.length > 0) {\n content += `// client API routes\\n`\n content += `export const clientApiRoutes = new OpenAPIHono()\\n`\n content += ` .use('*', apiRateLimit)\\n`\n content += clientRoutes.join('\\n') + '\\n\\n'\n } else {\n content += `// No client modules selected\\n`\n content += `export const clientApiRoutes = new OpenAPIHono()\\n\\n`\n }\n\n if (adminRoutes.length > 0) {\n content += `// admin API routes\\n`\n content += `export const adminApiRoutes = new OpenAPIHono()\\n`\n content += adminRoutes.join('\\n') + '\\n\\n'\n } else {\n content += `// No admin modules selected\\n`\n content += `export const adminApiRoutes = new OpenAPIHono()\\n\\n`\n }\n\n content += `// 类型出口已移除:巨型 merge 类型是 TS2589 根源,客户端改用 rpc-surface.ts 门面\\n`\n\n return content\n}\n\n/**\n * Get standalone route info from resolved preset manifests.\n * Used by server-app.ts generator to mount standalone routes.\n */\nexport function getStandaloneRoutes(resolved: ResolvedPreset): StandaloneRoute[] {\n const routes: StandaloneRoute[] = []\n const usedNames = new Set<string>()\n\n for (const [name, manifest] of resolved.modules) {\n if (manifest.routes.standalone) {\n const { exportName, mountPath } = manifest.routes.standalone\n const localName = usedNames.has(exportName)\n ? `${name}${exportName.charAt(0).toUpperCase()}${exportName.slice(1)}`\n : exportName\n usedNames.add(localName)\n routes.push({ localName, mountPath })\n }\n }\n\n return routes\n}\n","import type { ResolvedPreset } from './template-generator'\n\n/**\n * 生成按模块拆分的 RPC 门面(src/server/rpc-surface.ts)。\n *\n * 这是 TS2589 治理的生成侧:preset 决定包含哪些模块,本生成器扫描\n * 所选模块路由文件的 `export type XxxApiType`(模块级窄类型)与路径段\n * (`path: '/<segment>'`,含嵌套 .route 挂载的递归扫描),生成\n * createApiFacade() 工厂。客户端/admin/测试/CLI 都通过该工厂获得\n * 与旧 mega-merge 类型同形的调用面。\n *\n * 约束(由 eslint 规则 no-merged-api-type-export 强制):\n * 生成物不得导出 `typeof <链式merge实例>` 或 `ReturnType<typeof <app工厂>>`。\n */\n\ninterface RouteFileInfo {\n /** 模块内路由文件相对路径(相对 src/server/),如 module-todos/routes/todos-routes */\n routePath: string\n /** import 时的本地变量前缀(去重后) */\n localName: string\n}\n\ninterface SegmentSource extends RouteFileInfo {\n /** 路由文件里导出的窄类型名,如 TodosApiType */\n typeName: string\n segments: string[]\n}\n\n/** 从路由文件文本提取 `export type XxxApiType = typeof yyy` */\nfunction extractApiTypes(content: string): string[] {\n const re = /export type (\\w+ApiType)\\s*=\\s*typeof\\s+(\\w+)/g\n const names: string[] = []\n let m: RegExpExecArray | null\n while ((m = re.exec(content)) !== null) names.push(m[1])\n return names\n}\n\n/**\n * 提取路径首段('todos'、'orders-mock')。\n * 递归扫描嵌套挂载:admin-routes 这类通过 .route('/', subApp) 组合的文件,\n * 其路径在子路由文件里声明。\n */\nfunction extractSegments(\n content: string,\n readRouteFile: (p: string) => string | null,\n baseDir: string,\n depth = 0\n): string[] {\n const segs = new Set<string>()\n const pathRe = /path:\\s*'\\/([a-zA-Z][a-zA-Z-]*)/g\n let m: RegExpExecArray | null\n while ((m = pathRe.exec(content)) !== null) segs.add(m[1])\n\n if (depth < 3) {\n // 嵌套挂载: import { X } from './sub' + .route('/', X)\n const importRe = /import\\s*\\{([^}]+)\\}\\s*from\\s*'(\\.\\/[a-zA-Z-]+)'/g\n while ((m = importRe.exec(content)) !== null) {\n const names = m[1]\n .split(',')\n .map(s => s.trim().split(' as ')[0])\n .filter(Boolean)\n const subPath = m[2].replace(/^\\.\\//, '')\n // 仅当导入的名字确实被 .route('/', name) 挂载时才递归\n const isMounted = names.some(n =>\n new RegExp(`\\\\.route\\\\(\\\\s*'/'\\\\s*,\\\\s*${n}\\\\s*\\\\)`).test(content)\n )\n if (!isMounted) continue\n const sub = readRouteFile(`${baseDir}/${subPath}`)\n if (sub) {\n for (const s of extractSegments(sub, readRouteFile, baseDir, depth + 1)) segs.add(s)\n }\n }\n }\n return [...segs]\n}\n\nexport function generateRpcSurface(\n resolved: ResolvedPreset,\n readRouteFile: (p: string) => string | null\n): string {\n const sources: SegmentSource[] = []\n const usedNames = new Set<string>()\n\n const collect = (\n moduleName: string,\n manifest: { routes: { client?: unknown; admin?: unknown } & Record<string, unknown> },\n key: 'client' | 'admin'\n ) => {\n const raw = (manifest.routes as Record<string, unknown>)[key]\n if (!raw) return\n const list = Array.isArray(raw) ? raw : [raw]\n for (const entry of list as Array<{ importPath: string; exportName: string }>) {\n // importPath 相对模块目录('./routes/todos-routes'),补上 module-<name>/ 前缀\n const routePath = `module-${moduleName}/${entry.importPath.replace(/^\\.\\//, '').replace(/\\.ts$/, '')}`\n let localName = usedNames.has(entry.exportName)\n ? `${routePath\n .split('/')\n .pop()!\n .replace(/-([a-z])/g, (_, c: string) =>\n c.toUpperCase()\n )}${entry.exportName.charAt(0).toUpperCase()}${entry.exportName.slice(1)}`\n : entry.exportName\n while (usedNames.has(localName)) localName += 'X'\n usedNames.add(localName)\n\n const content = readRouteFile(routePath)\n if (!content) continue\n const typeNames = extractApiTypes(content)\n const segments = extractSegments(\n content,\n readRouteFile,\n routePath.split('/').slice(0, -1).join('/')\n )\n for (const typeName of typeNames) {\n sources.push({ routePath, localName, typeName, segments })\n }\n }\n }\n\n for (const [moduleName, manifest] of [...resolved.modules.entries()]) {\n collect(moduleName, manifest as never, 'client')\n collect(moduleName, manifest as never, 'admin')\n }\n\n // 段 → 多来源(同段跨模块时生成 mergeRpcObjects)\n const segmentOwners = new Map<\n string,\n Array<{ localName: string; typeName: string; routePath: string; idx: number }>\n >()\n sources.forEach((s, idx) => {\n for (const seg of s.segments) {\n const list = segmentOwners.get(seg) ?? []\n list.push({ localName: s.localName, typeName: s.typeName, routePath: s.routePath, idx })\n segmentOwners.set(seg, list)\n }\n })\n\n const hasMergedSegments = [...segmentOwners.values()].some(owners => owners.length > 1)\n\n const imports: string[] = [\n `import { hc } from 'hono/client'`,\n ...(hasMergedSegments ? [`import { mergeRpcObjects } from './rpc-merge'`] : []),\n ]\n for (const s of sources) {\n imports.push(`import type { ${s.typeName} } from './${s.routePath}'`)\n }\n\n const clients: string[] = []\n sources.forEach((s, i) => {\n clients.push(` const ${s.localName}Client${i} = hc<${s.typeName}>(api, options)`)\n })\n\n const entries: string[] = []\n // 对象字面量键位:合法标识符直接写,否则引号字符串\n const key = (seg: string) => (/^[a-zA-Z][a-zA-Z0-9]*$/.test(seg) ? seg : `'${seg}'`)\n // 属性访问位:非标识符段必须用方括号(client.'x-y' 是语法错误)\n const access = (seg: string) => (/^[a-zA-Z][a-zA-Z0-9]*$/.test(seg) ? `.${seg}` : `['${seg}']`)\n for (const [seg, owners] of segmentOwners) {\n // 同段多来源:与运行时挂载顺序一致(先注册者优先)\n owners.sort((a, b) => a.idx - b.idx)\n const refs = owners.map(o => `${o.localName}Client${o.idx}${access(seg)}`)\n entries.push(\n refs.length === 1\n ? ` ${key(seg)}: ${refs[0]},`\n : ` ${key(seg)}: mergeRpcObjects(${refs.join(', ')}),`\n )\n }\n\n return `/**\n * @framework-baseline rpc-surface-v1\n *\n * 按模块拆分的类型安全 RPC 门面(本文件由 CLI 生成,勿手改)。\n * 生成器: src/generators/rpc-surface.ts\n *\n * 每个模块单独实例化窄客户端(深度 = 1 个模块),组装成与旧\n * \\`hc<MergedApiType>\\` 完全同形的门面。禁止导出链式 merge 类型\n * (eslint: no-merged-api-type-export)。\n */\n\n${imports.join('\\n')}\n\n/** hono hc 的选项类型(fetch / webSocket / sse / headers 等) */\nexport type RpcClientOptions = NonNullable<Parameters<typeof hc>[1]>\n\n/**\n * 创建按模块拆分的 RPC 门面。\n * 调用形态与旧 mega 客户端兼容:facade.api.todos.$get()。\n */\nexport function createApiFacade(baseUrl: string, options: RpcClientOptions = {}) {\n const api = \\`\\${baseUrl.replace(/\\\\/$/, '')}/api\\`\n\n${clients.join('\\n')}\n\n return {\n api: {\n${entries.join('\\n')}\n },\n }\n}\n\nexport type ApiFacade = ReturnType<typeof createApiFacade>\n`\n}\n","import type { ResolvedPreset } from './template-generator'\n\n/**\n * 生成 src/server/isr-modules.ts:按 preset 汇总各模块的 ISR 注册副作用导入。\n *\n * 背景:entries/cloudflare.ts 曾静态 import '@server/module-todos/isr' 与\n * '@server/module-content/isr',preset 裁掉 content 后 CF 构建(esbuild)与\n * tsc 均因悬空导入失败。生成器只为\"选中且存在 isr.ts 的模块\"生成导入。\n */\nexport function generateIsrModules(\n resolved: ResolvedPreset,\n moduleFileExists: (moduleName: string, relPath: string) => boolean\n): string {\n const imports: string[] = []\n\n for (const [moduleName] of [...resolved.modules.entries()]) {\n if (moduleFileExists(moduleName, 'isr.ts')) {\n imports.push(`import '@server/module-${moduleName}/isr'`)\n }\n }\n\n return `/**\n * ISR 模块注册汇总(本文件由 CLI 生成,勿手改)。\n * 生成器: src/generators/isr-modules.ts\n *\n * 按 preset 只导入选中模块的 ISR 注册副作用;未被裁剪风险的单一入口\n * 由 entries/cloudflare.ts import 本文件。\n */\n\n${imports.join('\\n')}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\n\n/**\n * 生成 src/client/entry-stores.ts:entry-server 的 store 种子逻辑。\n *\n * 背景:entry-server.tsx 曾硬编码 import todoStore 并预填充,preset 裁掉\n * todos 模块后(forum 等)构建因悬空导入失败。生成器只在选中 todo 模块\n * 时生成 todoStore 种子实现,否则生成空实现。\n */\nexport function generateEntryStores(\n resolved: ResolvedPreset,\n moduleFileExists: (moduleName: string, relPath: string) => boolean\n): string {\n const hasTodos = resolved.modules.has('todos') && moduleFileExists('todos', 'todoStore.ts')\n\n if (!hasTodos) {\n return `/**\n * Entry SSR store 种子(本文件由 CLI 生成,勿手改)。\n * 当前 preset 不含 todo 模块:无 store 需要预填充,全部为空实现。\n */\n\nexport interface SSRData {\n [key: string]: unknown\n}\n\nexport function snapshotEntryStores(): Record<string, unknown> {\n return {}\n}\n\nexport function seedEntryStores(_data: SSRData): void {}\n\nexport function restoreEntryStores(_snapshot: Record<string, unknown>): void {}\n`\n }\n\n return `/**\n * Entry SSR store 种子(本文件由 CLI 生成,勿手改)。\n * todo 模块在选中列表中:预填充 todoStore 供 ISR 渲染真实内容。\n */\n\nimport { useTodoStore } from './todoStore'\nimport type { Todo } from '@shared/schemas'\n\nexport interface SSRData {\n todos?: Todo[]\n [key: string]: unknown\n}\n\nexport interface EntryStoreSnapshot {\n todos: Todo[]\n loading: boolean\n}\n\nexport function snapshotEntryStores(): EntryStoreSnapshot {\n const state = useTodoStore.getState()\n return { todos: state.todos, loading: state.loading }\n}\n\nexport function seedEntryStores(data: SSRData): void {\n if (data.todos) {\n useTodoStore.setState({ todos: data.todos, loading: false })\n }\n}\n\nexport function restoreEntryStores(snapshot: EntryStoreSnapshot): void {\n useTodoStore.setState({ todos: snapshot.todos, loading: snapshot.loading })\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\nimport { getClientPages } from './template-generator'\n\n/**\n * 生成 src/client/ssr-pages.ts:按 preset 实际包含的页面生成静态导入注册表。\n *\n * 背景:entry-server 的页面级 SSR 需要静态 import(renderToString 解析\n * 不了 React.lazy)。模板全量版静态导入全部 ISR 页面,但小 preset 会裁掉\n * 部分页面(如 todo-app 无 TopicsPage)——悬空导入令生成 app 的 tsc 失败。\n * 因此本文件必须由 CLI 按 preset 生成,只导入该 preset 真实存在的页面。\n */\n\n/** 页面文件名 → ssr-pages 的组件名与 ISR 路由(顺序即注册表顺序) */\nconst SSR_PAGE_MAP: Array<{ file: string; component: string; route: string; pattern?: string }> = [\n { file: 'TodoPage', component: 'TodoPage', route: '/todos' },\n { file: 'ContentListPage', component: 'ContentListPage', route: '/content' },\n {\n file: 'ContentDetailPage',\n component: 'ContentDetailPage',\n route: '/content/:id',\n pattern: '/content/',\n },\n { file: 'TopicsPage', component: 'TopicsPage', route: '/topics' },\n]\n\nexport function generateSsrPages(\n resolved: ResolvedPreset,\n pageFileExists: (name: string) => boolean\n): string {\n const pages = getClientPages(resolved)\n const available = new Set(pages.map(p => p.name))\n\n const imports: string[] = []\n const entries: string[] = []\n const patterns: string[] = []\n\n for (const m of SSR_PAGE_MAP) {\n if (!available.has(m.file) && !pageFileExists(m.file)) continue\n imports.push(`import { ${m.component} } from './pages/${m.file}'`)\n entries.push(` '${m.route}': ${m.component},`)\n if (m.pattern) {\n patterns.push(` { prefix: '${m.pattern}', component: ${m.component} },`)\n }\n }\n\n const noPages = imports.length === 0\n\n return `/**\n * SSR 静态页面注册表(本文件由 CLI 生成,勿手改)。\n * 生成器: src/generators/ssr-pages.ts\n *\n * renderToString 解析不了 React.lazy——ISR 路由的页面级 SSR 依赖这里的\n * 静态同构组件。只导入本 preset 实际包含的页面(模板全量版会被覆盖)。\n */\n\nimport type { ComponentType } from 'react'\n${\n noPages\n ? `\n// 本 preset 没有关联的 ISR 页面——SSR 输出布局壳 + meta(合理:\n// 该 preset 的页面无需 SEO 或均为管理/工具型)\nexport const SSR_PAGES: Record<string, ComponentType> = {}\n\nexport function getSsrPage(_pathname: string): ComponentType | null {\n return null\n}\n`\n : `\n${imports.join('\\n')}\n\nexport const SSR_PAGES: Record<string, ComponentType> = {\n${entries.join('\\n')}\n}\n\nconst SSR_PATTERNS: Array<{ prefix: string; component: ComponentType }> = [\n${patterns.join('\\n')}\n]\n\n/** ISR 路径是否有关联静态组件(决定 body 渲染真实内容还是仅 meta) */\nexport function getSsrPage(pathname: string): ComponentType | null {\n if (SSR_PAGES[pathname]) return SSR_PAGES[pathname]\n for (const p of SSR_PATTERNS) {\n if (pathname.startsWith(p.prefix)) return p.component\n }\n return null\n}\n`\n}`\n}\n","import type { ResolvedPreset } from './template-generator'\nimport { getClientPages } from './template-generator'\n\nconst DEFAULT_ICON = 'Circle'\n\nconst ICON_MAP: Record<string, string> = {\n TodoPage: 'CheckCircle',\n NotificationPage: 'Bell',\n WebSocketPage: 'Plug',\n ContentListPage: 'FileText',\n PluginsPage: 'Package',\n CategoriesPage: 'Grid',\n SearchPage: 'Search',\n PublishPage: 'Upload',\n DeveloperDashboardPage: 'Code',\n PluginDetailPage: 'Package',\n TopicsPage: 'Hash',\n ProfilePage: 'User',\n DashboardPage: 'LayoutDashboard',\n SettingsPage: 'Settings',\n CartPage: 'ShoppingCart',\n OrdersPage: 'Package',\n}\n\nexport function generateClientNavigation(resolved: ResolvedPreset): string {\n const pages = getClientPages(resolved).filter(p => !p.route.includes(':'))\n const hasAuth = resolved.modules.has('auth')\n\n const navItems: string[] = []\n for (const page of pages) {\n const icon = ICON_MAP[page.name] || DEFAULT_ICON\n const label =\n page.name === 'TodoPage'\n ? 'Todos'\n : page.name === 'NotificationPage'\n ? 'Notifications'\n : page.name === 'WebSocketPage'\n ? 'WebSocket'\n : page.name === 'PluginsPage'\n ? 'Plugins'\n : page.name === 'CategoriesPage'\n ? 'Categories'\n : page.name === 'SearchPage'\n ? 'Search'\n : page.name === 'PublishPage'\n ? 'Publish'\n : page.name === 'DeveloperDashboardPage'\n ? 'Developer'\n : page.name === 'TopicsPage'\n ? 'Topics'\n : page.name === 'ProfilePage'\n ? 'Profile'\n : page.name === 'DashboardPage'\n ? 'Dashboard'\n : page.name === 'SettingsPage'\n ? 'Settings'\n : page.name === 'CartPage'\n ? 'Cart'\n : page.name === 'OrdersPage'\n ? 'Orders'\n : page.route.replace(/^\\//, '').charAt(0).toUpperCase() +\n page.route.replace(/^\\//, '').slice(1)\n navItems.push(` { label: '${label}', icon: '${icon}', path: '${page.route}' },`)\n }\n\n const authImport = hasAuth ? `\\nimport { useAuthStore } from '../stores/authStore'` : ''\n\n const authSection = hasAuth\n ? `\nfunction AuthSection({ style }: { style: string }) {\n const isAuthenticated = useAuthStore((state: any) => state.isAuthenticated)\n const user = useAuthStore((state: any) => state.user)\n const logout = useAuthStore((state: any) => state.logout)\n\n if (style === 'none') return null\n\n if (isAuthenticated) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-gray-600\">{user?.username}</span>\n <button onClick={logout} className=\"text-xs text-gray-400 hover:text-red-500\">Sign Out</button>\n </div>\n )\n }\n\n if (style === 'buttons') {\n return (\n <div className=\"flex items-center gap-2\">\n <Link\n to=\"/login\"\n className=\"px-3 py-1 text-sm bg-blue-500 text-white rounded hover:bg-blue-600\"\n >\n Sign In\n </Link>\n <Link\n to=\"/register\"\n className=\"px-3 py-1 text-sm border border-gray-300 text-gray-700 rounded hover:bg-gray-50\"\n >\n Sign Up\n </Link>\n </div>\n )\n }\n\n return (\n <Link to=\"/login\" className=\"text-sm text-gray-500 hover:text-gray-900\">\n Login\n </Link>\n )\n}\n`\n : `\nfunction AuthSection(_style: { style: string }) {\n return null\n}\n`\n\n return `import { NavLink${hasAuth ? ', Link' : ''} } from 'react-router-dom'\nimport { Rocket, Sparkles } from 'lucide-react'${authImport}\nimport type { PresetTheme, NavigationConfig, ClientNavItem } from '../preset-ui-config'\n\ninterface NavigationProps {\n preset?: string\n items?: ClientNavItem[]\n theme?: PresetTheme\n navigation?: NavigationConfig\n}\n${authSection}\nexport const Navigation: React.FC<NavigationProps> = ({\n items,\n theme,\n navigation,\n}) => {\n const navItems = navigation?.navItems === 'none' ? [] : (items ?? [])\n const primaryColor = theme?.primaryColor ?? '#6366f1'\n const logoText = theme?.logoText ?? 'Biomimic'\n const showLogo = navigation?.showLogo !== false\n const authStyle = navigation?.authStyle ?? 'none'\n\n return (\n <nav className=\"hidden md:block bg-white/80 backdrop-blur-md border-b border-gray-200 sticky top-0 z-50\" data-testid=\"app-nav\">\n <div className=\"max-w-7xl mx-auto px-4 h-16 flex items-center justify-between gap-3\">\n {showLogo && (\n <NavLink to=\"/\" className=\"flex items-center gap-2 group shrink-0\" data-testid=\"app-title\">\n <div\n className=\"w-8 h-8 rounded-lg flex items-center justify-center shadow-sm group-hover:shadow-md transition-shadow\"\n style={{ backgroundColor: primaryColor }}\n >\n <Rocket className=\"w-4 h-4 text-white\" />\n </div>\n <span className=\"text-lg font-semibold text-gray-900 tracking-tight whitespace-nowrap\">\n {logoText}\n </span>\n <Sparkles className=\"w-3.5 h-3.5 shrink-0\" style={{ color: primaryColor }} />\n </NavLink>\n )}\n\n <div className=\"flex items-center gap-0.5 overflow-x-auto flex-1 min-w-0 scrollbar-hide\">\n {navItems.map(item => (\n <NavLink\n key={item.path}\n to={item.path}\n data-testid={\\`nav-\\${item.label.toLowerCase().replace(/\\\\s+/g, '-')}-button\\`}\n className={({ isActive }: { isActive: boolean }) =>\n \\`px-3 py-1.5 rounded-lg text-sm font-medium transition-all duration-200 shrink-0 whitespace-nowrap \\${\n isActive ? 'text-white' : 'text-gray-500 hover:text-gray-900 hover:bg-gray-50'\n }\\`\n }\n style={\n (({ isActive }: { isActive: boolean }) =>\n isActive\n ? { backgroundColor: \\`\\${primaryColor}15\\`, color: primaryColor }\n : undefined) as never\n }\n >\n {item.label}\n </NavLink>\n ))}\n </div>\n\n <AuthSection style={authStyle} />\n </div>\n </nav>\n )\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\nimport { getClientPages } from './template-generator'\n\nexport function generateClientAppTest(resolved: ResolvedPreset): string {\n const pages = getClientPages(resolved)\n\n const mocks = pages\n .map(\n p =>\n `vi.mock('@client/pages/${p.name}', () => ({\n ${p.name}: () => <div data-testid=\"${p.name.toLowerCase()}-page\">${p.name}</div>,\n}))`\n )\n .join('\\n\\n ')\n\n return `import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'\nimport { render, screen, cleanup } from '@testing-library/react'\nimport '@testing-library/jest-dom'\nimport { App } from '@client/App'\n\n ${mocks}\n\ndescribe('App Component', () => {\n beforeEach(() => {\n vi.clearAllMocks()\n })\n\n afterEach(() => {\n cleanup()\n })\n\n describe('Initial Render', () => {\n it('should render navigation', () => {\n render(<App />)\n // 布局感知:top-nav 有 app-nav;sidebar 布局没有顶栏(有 app-container/app-main)\n expect(\n document.querySelector('[data-testid=\"app-nav\"], [data-testid=\"app-container\"]')\n ).toBeTruthy()\n })\n\n it('should render main content area', () => {\n render(<App />)\n expect(screen.getByTestId('app-main')).toBeInTheDocument()\n })\n\n it('should render container', () => {\n render(<App />)\n expect(screen.getByTestId('app-container')).toBeInTheDocument()\n })\n })\n\n describe('Navigation Links', () => {\n it('should render footer', () => {\n render(<App />)\n // 页脚仅 top-nav 布局渲染(Layout: showFooter = layout === 'top-nav')\n expect(\n document.querySelector('[data-testid=\"app-footer\"]') ||\n document.querySelector('[data-testid=\"app-container\"]')\n ).toBeTruthy()\n })\n })\n})\n`\n}\n","import type { ResolvedPreset } from './template-generator'\nimport { getClientPages } from './template-generator'\n\nconst LABEL_MAP: Record<string, string> = {\n TodoPage: 'Todos',\n NotificationPage: 'Notifications',\n WebSocketPage: 'WebSocket',\n PluginsPage: 'Plugins',\n CategoriesPage: 'Categories',\n SearchPage: 'Search',\n PublishPage: 'Publish',\n DeveloperDashboardPage: 'Developer',\n TopicsPage: 'Topics',\n ProfilePage: 'Profile',\n DashboardPage: 'Dashboard',\n SettingsPage: 'Settings',\n CartPage: 'Cart',\n OrdersPage: 'Orders',\n}\n\nexport function generateClientNavigationTest(resolved: ResolvedPreset): string {\n const pages = getClientPages(resolved).filter(p => !p.route.includes(':'))\n const firstPage = pages[0]\n\n if (!firstPage) {\n return `import { describe, it, expect } from 'vitest'\nimport { render, screen } from '@testing-library/react'\nimport { BrowserRouter } from 'react-router-dom'\nimport { Navigation } from '../Navigation'\n\nconst renderWithRouter = (component: React.ReactNode) => {\n return render(<BrowserRouter>{component}</BrowserRouter>)\n}\n\ndescribe('Navigation', () => {\n it('should render navigation', () => {\n renderWithRouter(<Navigation />)\n expect(screen.getByTestId('app-nav')).toBeInTheDocument()\n })\n})\n`\n }\n\n const firstLabel = LABEL_MAP[firstPage.name] || firstPage.name.replace('Page', '')\n\n return `import { describe, it, expect } from 'vitest'\nimport { render, screen } from '@testing-library/react'\nimport { BrowserRouter } from 'react-router-dom'\nimport { Navigation } from '../Navigation'\n\nconst renderWithRouter = (component: React.ReactNode) => {\n return render(<BrowserRouter>{component}</BrowserRouter>)\n}\n\ndescribe('Navigation', () => {\n it('should render navigation', () => {\n renderWithRouter(<Navigation />)\n expect(screen.getByTestId('app-nav')).toBeInTheDocument()\n })\n\n it('should render nav items', () => {\n renderWithRouter(\n <Navigation\n items={[{ label: '${firstLabel}', icon: 'CheckSquare', path: '${firstPage.route}' }]}\n />\n )\n expect(screen.getByText('${firstLabel}')).toBeInTheDocument()\n })\n})\n`\n}\n","/**\n * Generates admin/App.tsx content based on resolved preset\n */\nimport type { ResolvedPreset } from './template-generator'\nimport { getAdminPages } from './template-generator'\n\nexport function generateAdminApp(resolved: ResolvedPreset): string | null {\n if (!resolved.hasAdmin) return null\n\n const pages = getAdminPages(resolved) ?? []\n if (pages.length === 0) return null\n\n // Separate public and protected pages\n const publicPages = pages.filter(p => p.isPublic)\n const protectedPages = pages.filter(p => !p.isPublic)\n\n // Build imports\n const imports = [\n `import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'`,\n `import { ConfigProvider } from 'antd'`,\n `import { Layout } from './layouts/Layout'`,\n ]\n\n for (const page of pages) {\n imports.push(`import { ${page.name} } from './pages/${page.name}'`)\n }\n\n // CaptchaModal only if captcha module is included\n const captchaImport = resolved.hasCaptcha ? ', CaptchaModal' : ''\n imports.push(`import { ProtectedRoute${captchaImport} } from './components'`)\n\n // Build protected route elements\n const protectedRouteElements = protectedPages.map(\n p => ` <Route path=\"${p.route}\" element={<${p.name} />} />`\n )\n\n const defaultProtectedRoute = protectedPages.length > 0 ? protectedPages[0].route : '/'\n\n const captchaElement = resolved.hasCaptcha ? `\\n <CaptchaModal />` : ''\n\n const publicRouteLines = publicPages.map(\n p => ` <Route path=\"${p.route}\" element={<${p.name} />} />`\n )\n\n return `${imports.join('\\n')}\n\nexport const App: React.FC<{ basePath?: string }> = ({ basePath = '/admin' }) => {\n return (\n <ConfigProvider\n theme={{\n token: {\n colorPrimary: '#1890ff',\n },\n }}\n >\n <BrowserRouter basename={basePath}>\n <Routes>\n${publicRouteLines.join('\\n')}\n <Route\n path=\"/*\"\n element={\n <ProtectedRoute>\n <Layout>\n <Routes>\n <Route path=\"/\" element={<Navigate to=\"${defaultProtectedRoute}\" replace />} />\n${protectedRouteElements.join('\\n')}\n <Route path=\"/system/monitor\" element={<div className=\"p-6\"><h2 className=\"text-xl font-semibold\">System Monitor</h2><p className=\"text-gray-500 mt-2\">Coming soon...</p></div>} />\n </Routes>\n </Layout>\n </ProtectedRoute>\n }\n />\n </Routes>${captchaElement}\n </BrowserRouter>\n </ConfigProvider>\n )\n}\n`\n}\n\n/**\n * Generates admin/components/index.ts content based on resolved preset.\n * Conditionally includes CaptchaModal only when captcha module is present.\n */\nexport function generateAdminComponentsIndex(resolved: ResolvedPreset): string | null {\n if (!resolved.hasAdmin) return null\n\n const lines = [\n `export { UserTable } from './UserTable'`,\n `export { StatsCard } from './StatsCard'`,\n `export { PageHeader } from './PageHeader'`,\n `export { UserFormModal } from './UserFormModal'`,\n `export { ProtectedRoute } from './ProtectedRoute'`,\n ]\n\n if (resolved.hasCaptcha) {\n lines.push(`export { CaptchaModal } from './CaptchaModal'`)\n }\n\n lines.push(`export { PermissionGuard, PermissionButton, Can, Cannot } from './PermissionGuard'`)\n\n return lines.join('\\n') + '\\n'\n}\n\n/**\n * Generates admin/services/apiClient.ts content based on resolved preset.\n * Conditionally imports captchaStore only when captcha module is present.\n */\nexport function generateAdminApiClient(resolved: ResolvedPreset): string | null {\n if (!resolved.hasAdmin) return null\n\n const captchaImport = resolved.hasCaptcha\n ? `import { useCaptchaStore } from '../stores/captchaStore'\\n`\n : ''\n const captchaFetchSetup = resolved.hasCaptcha\n ? ` const showCaptcha = useCaptchaStore.getState().show\\n\\n`\n : ''\n const captchaHandler = resolved.hasCaptcha\n ? ` onShowCaptcha: async config => {\n return showCaptcha({\n type: config.type,\n captchaUrl: config.captchaUrl,\n })\n },`\n : ` onShowCaptcha: async () => true,`\n\n return `/**\n * @framework-baseline ab16e97716a7556e\n * @framework-modify\n * @reason Conditional captcha support based on preset modules\n * @impact Captcha module excluded = no captchaStore import\n */\n\nimport { WSClientImpl } from '@shared/core/ws-client'\nimport { SSEClientImpl } from '@shared/core/sse-client'\nimport { createRequestInterceptor } from './requestInterceptor'\n${captchaImport}import { createApiFacade } from '@server/rpc-surface'\n\nconst baseUrl = import.meta.env.API_BASE_URL || window.location.origin\n\nconst TOKEN_KEY = 'admin-storage'\n\nfunction clearAuthAndRedirect(): void {\n localStorage.removeItem(TOKEN_KEY)\n if (window.location.pathname !== '/admin/login') {\n window.location.href = '/admin/login'\n }\n}\n\nfunction getAuthToken(): string | null {\n try {\n const stored = localStorage.getItem(TOKEN_KEY)\n if (stored) {\n const parsed = JSON.parse(stored)\n return parsed.state?.token || null\n }\n } catch {\n return null\n }\n return null\n}\n\nfunction createCustomFetch() {\n${captchaFetchSetup} return createRequestInterceptor({\n onShowLogin: clearAuthAndRedirect,\n${captchaHandler} })\n}\n\nexport const apiClient = createApiFacade(baseUrl, {\n fetch: createCustomFetch() as typeof fetch,\n webSocket: url => new WSClientImpl(url) as unknown as WebSocket,\n sse: url => {\n const token = getAuthToken()\n const headers: Record<string, string> = {}\n if (token) {\n headers['Authorization'] = \\`Bearer \\${token}\\`\n }\n return new SSEClientImpl(url, headers)\n },\n})\n\nexport { api } from '@shared/core/api-request'\n`\n}\n","/**\n * Generates server/db/schema/index.ts barrel file based on resolved preset\n */\nimport type { ResolvedPreset } from './template-generator'\nimport { getDbSchemaFiles } from './template-generator'\n\nexport function generateDbSchemaBarrel(resolved: ResolvedPreset): string {\n const files = getDbSchemaFiles(resolved)\n\n const exports = files.map(f => `export * from './${f}'`)\n\n return exports.join('\\n') + '\\n'\n}\n","import type { ResolvedPreset } from './template-generator'\n\nconst INITIAL_PERMISSIONS = `const initialPermissions = [\n {\n id: 'perm_user_view',\n code: 'user:view',\n name: '查看用户',\n label: '查看用户',\n category: 'user',\n sortOrder: 1,\n },\n {\n id: 'perm_user_create',\n code: 'user:create',\n name: '创建用户',\n label: '创建用户',\n category: 'user',\n sortOrder: 2,\n },\n {\n id: 'perm_user_edit',\n code: 'user:edit',\n name: '编辑用户',\n label: '编辑用户',\n category: 'user',\n sortOrder: 3,\n },\n {\n id: 'perm_user_delete',\n code: 'user:delete',\n name: '删除用户',\n label: '删除用户',\n category: 'user',\n sortOrder: 4,\n },\n {\n id: 'perm_content_view',\n code: 'content:view',\n name: '查看内容',\n label: '查看内容',\n category: 'content',\n sortOrder: 1,\n },\n {\n id: 'perm_content_create',\n code: 'content:create',\n name: '创建内容',\n label: '创建内容',\n category: 'content',\n sortOrder: 2,\n },\n {\n id: 'perm_content_edit',\n code: 'content:edit',\n name: '编辑内容',\n label: '编辑内容',\n category: 'content',\n sortOrder: 3,\n },\n {\n id: 'perm_content_delete',\n code: 'content:delete',\n name: '删除内容',\n label: '删除内容',\n category: 'content',\n sortOrder: 4,\n },\n {\n id: 'perm_system_settings',\n code: 'system:settings',\n name: '系统设置',\n label: '系统设置',\n category: 'system',\n sortOrder: 1,\n },\n {\n id: 'perm_system_logs',\n code: 'system:logs',\n name: '系统日志',\n label: '系统日志',\n category: 'system',\n sortOrder: 2,\n },\n {\n id: 'perm_system_monitor',\n code: 'system:monitor',\n name: '系统监控',\n label: '系统监控',\n category: 'system',\n sortOrder: 3,\n },\n {\n id: 'perm_data_export',\n code: 'data:export',\n name: '数据导出',\n label: '数据导出',\n category: 'data',\n sortOrder: 1,\n },\n {\n id: 'perm_data_import',\n code: 'data:import',\n name: '数据导入',\n label: '数据导入',\n category: 'data',\n sortOrder: 2,\n },\n {\n id: 'perm_order_view',\n code: 'order:view',\n name: '查看订单',\n label: '查看订单',\n category: 'order',\n sortOrder: 1,\n },\n {\n id: 'perm_order_create',\n code: 'order:create',\n name: '创建订单',\n label: '创建订单',\n category: 'order',\n sortOrder: 2,\n },\n {\n id: 'perm_order_edit',\n code: 'order:edit',\n name: '编辑订单',\n label: '编辑订单',\n category: 'order',\n sortOrder: 3,\n },\n {\n id: 'perm_order_delete',\n code: 'order:delete',\n name: '删除订单',\n label: '删除订单',\n category: 'order',\n sortOrder: 4,\n },\n {\n id: 'perm_order_process',\n code: 'order:process',\n name: '处理订单',\n label: '处理订单',\n category: 'order',\n sortOrder: 5,\n },\n {\n id: 'perm_ticket_view',\n code: 'ticket:view',\n name: '查看工单',\n label: '查看工单',\n category: 'ticket',\n sortOrder: 1,\n },\n {\n id: 'perm_ticket_create',\n code: 'ticket:create',\n name: '创建工单',\n label: '创建工单',\n category: 'ticket',\n sortOrder: 2,\n },\n {\n id: 'perm_ticket_edit',\n code: 'ticket:edit',\n name: '编辑工单',\n label: '编辑工单',\n category: 'ticket',\n sortOrder: 3,\n },\n {\n id: 'perm_ticket_delete',\n code: 'ticket:delete',\n name: '删除工单',\n label: '删除工单',\n category: 'ticket',\n sortOrder: 4,\n },\n {\n id: 'perm_ticket_reply',\n code: 'ticket:reply',\n name: '回复工单',\n label: '回复工单',\n category: 'ticket',\n sortOrder: 5,\n },\n {\n id: 'perm_ticket_close',\n code: 'ticket:close',\n name: '关闭工单',\n label: '关闭工单',\n category: 'ticket',\n sortOrder: 6,\n },\n {\n id: 'perm_dispute_view',\n code: 'dispute:view',\n name: '查看争议',\n label: '查看争议',\n category: 'dispute',\n sortOrder: 1,\n },\n {\n id: 'perm_dispute_create',\n code: 'dispute:create',\n name: '创建争议',\n label: '创建争议',\n category: 'dispute',\n sortOrder: 2,\n },\n {\n id: 'perm_dispute_edit',\n code: 'dispute:edit',\n name: '编辑争议',\n label: '编辑争议',\n category: 'dispute',\n sortOrder: 3,\n },\n {\n id: 'perm_dispute_delete',\n code: 'dispute:delete',\n name: '删除争议',\n label: '删除争议',\n category: 'dispute',\n sortOrder: 4,\n },\n {\n id: 'perm_dispute_resolve',\n code: 'dispute:resolve',\n name: '解决争议',\n label: '解决争议',\n category: 'dispute',\n sortOrder: 5,\n },\n {\n id: 'perm_role_view',\n code: 'role:view',\n name: '查看角色',\n label: '查看角色',\n category: 'role',\n sortOrder: 1,\n },\n {\n id: 'perm_role_create',\n code: 'role:create',\n name: '创建角色',\n label: '创建角色',\n category: 'role',\n sortOrder: 2,\n },\n {\n id: 'perm_role_edit',\n code: 'role:edit',\n name: '编辑角色',\n label: '编辑角色',\n category: 'role',\n sortOrder: 3,\n },\n {\n id: 'perm_role_delete',\n code: 'role:delete',\n name: '删除角色',\n label: '删除角色',\n category: 'role',\n sortOrder: 4,\n },\n]`\n\nconst INITIAL_ROLES = `const initialRoles = [\n {\n id: 'role_super_admin',\n code: 'super_admin',\n name: '超级管理员',\n label: '超级管理员',\n isSystem: true,\n sortOrder: 1,\n },\n {\n id: 'role_customer_service',\n code: 'customer_service',\n name: '客服人员',\n label: '客服人员',\n isSystem: true,\n sortOrder: 2,\n },\n {\n id: 'role_user',\n code: 'user',\n name: '普通用户',\n label: '普通用户',\n isSystem: true,\n sortOrder: 3,\n },\n]`\n\nconst INITIAL_ROLE_PERMISSIONS = `const initialRolePermissions = [\n { roleId: 'role_super_admin', permissionId: 'perm_user_view' },\n { roleId: 'role_super_admin', permissionId: 'perm_user_create' },\n { roleId: 'role_super_admin', permissionId: 'perm_user_edit' },\n { roleId: 'role_super_admin', permissionId: 'perm_user_delete' },\n { roleId: 'role_super_admin', permissionId: 'perm_content_view' },\n { roleId: 'role_super_admin', permissionId: 'perm_content_create' },\n { roleId: 'role_super_admin', permissionId: 'perm_content_edit' },\n { roleId: 'role_super_admin', permissionId: 'perm_content_delete' },\n { roleId: 'role_super_admin', permissionId: 'perm_system_settings' },\n { roleId: 'role_super_admin', permissionId: 'perm_system_logs' },\n { roleId: 'role_super_admin', permissionId: 'perm_system_monitor' },\n { roleId: 'role_super_admin', permissionId: 'perm_data_export' },\n { roleId: 'role_super_admin', permissionId: 'perm_data_import' },\n { roleId: 'role_super_admin', permissionId: 'perm_order_view' },\n { roleId: 'role_super_admin', permissionId: 'perm_order_create' },\n { roleId: 'role_super_admin', permissionId: 'perm_order_edit' },\n { roleId: 'role_super_admin', permissionId: 'perm_order_delete' },\n { roleId: 'role_super_admin', permissionId: 'perm_order_process' },\n { roleId: 'role_super_admin', permissionId: 'perm_ticket_view' },\n { roleId: 'role_super_admin', permissionId: 'perm_ticket_create' },\n { roleId: 'role_super_admin', permissionId: 'perm_ticket_edit' },\n { roleId: 'role_super_admin', permissionId: 'perm_ticket_delete' },\n { roleId: 'role_super_admin', permissionId: 'perm_ticket_reply' },\n { roleId: 'role_super_admin', permissionId: 'perm_ticket_close' },\n { roleId: 'role_super_admin', permissionId: 'perm_dispute_view' },\n { roleId: 'role_super_admin', permissionId: 'perm_dispute_create' },\n { roleId: 'role_super_admin', permissionId: 'perm_dispute_edit' },\n { roleId: 'role_super_admin', permissionId: 'perm_dispute_delete' },\n { roleId: 'role_super_admin', permissionId: 'perm_dispute_resolve' },\n { roleId: 'role_customer_service', permissionId: 'perm_content_view' },\n { roleId: 'role_customer_service', permissionId: 'perm_order_view' },\n { roleId: 'role_customer_service', permissionId: 'perm_order_create' },\n { roleId: 'role_customer_service', permissionId: 'perm_order_edit' },\n { roleId: 'role_customer_service', permissionId: 'perm_order_delete' },\n { roleId: 'role_customer_service', permissionId: 'perm_order_process' },\n { roleId: 'role_customer_service', permissionId: 'perm_ticket_view' },\n { roleId: 'role_customer_service', permissionId: 'perm_ticket_create' },\n { roleId: 'role_customer_service', permissionId: 'perm_ticket_edit' },\n { roleId: 'role_customer_service', permissionId: 'perm_ticket_delete' },\n { roleId: 'role_customer_service', permissionId: 'perm_ticket_reply' },\n { roleId: 'role_customer_service', permissionId: 'perm_ticket_close' },\n { roleId: 'role_customer_service', permissionId: 'perm_dispute_view' },\n { roleId: 'role_customer_service', permissionId: 'perm_dispute_create' },\n { roleId: 'role_customer_service', permissionId: 'perm_dispute_edit' },\n { roleId: 'role_customer_service', permissionId: 'perm_dispute_delete' },\n { roleId: 'role_customer_service', permissionId: 'perm_dispute_resolve' },\n { roleId: 'role_customer_service', permissionId: 'perm_data_export' },\n { roleId: 'role_customer_service', permissionId: 'perm_system_logs' },\n { roleId: 'role_user', permissionId: 'perm_content_view' },\n { roleId: 'role_user', permissionId: 'perm_order_view' },\n]`\n\nexport function generateDbInit(resolved: ResolvedPreset): string {\n // Collect seed info from manifests dynamically\n const activeSeeds: { moduleDir: string; serviceFile: string; functionName: string }[] = []\n for (const [name, manifest] of resolved.modules) {\n if (manifest.dbSchemas?.hasSeed && manifest.dbSchemas.seed) {\n activeSeeds.push({\n moduleDir: `module-${name}`,\n serviceFile: manifest.dbSchemas.seed.serviceFile,\n functionName: manifest.dbSchemas.seed.functionName,\n })\n }\n }\n\n if (!resolved.hasPermission) {\n return generateMinimalDbInit(activeSeeds)\n }\n\n return generateFullDbInit(activeSeeds)\n}\n\nfunction generateMinimalDbInit(\n activeSeeds: { moduleDir: string; serviceFile: string; functionName: string }[]\n): string {\n const seedCalls = activeSeeds\n .map(s => ` import('../${s.moduleDir}/services/${s.serviceFile}').then(m => m.${s.functionName}()),`)\n .join('\\n')\n\n const seedBlock =\n activeSeeds.length > 0\n ? `\n log.info({}, 'Seeding module data...')\n await Promise.all([\n${seedCalls}\n ])\n log.info({}, 'Module data seeding complete!')`\n : ''\n\n return `import { getDb } from './driver'\nimport { logger } from '../utils/logger'\n\nconst log = logger.db()\n\nexport async function initializeDatabase() {\n await getDb()\n\n log.info({}, 'Initializing database...')\n\n log.info({}, 'Database initialization complete!')${seedBlock}\n}\n`\n}\n\nfunction generateFullDbInit(\n activeSeeds: { moduleDir: string; serviceFile: string; functionName: string }[]\n): string {\n const seedCalls = activeSeeds\n .map(s => ` import('../${s.moduleDir}/services/${s.serviceFile}').then(m => m.${s.functionName}()),`)\n .join('\\n')\n\n const seedBlock =\n activeSeeds.length > 0\n ? `\n log.info({}, 'Seeding module data...')\n await Promise.all([\n${seedCalls}\n ])\n log.info({}, 'Module data seeding complete!')`\n : ''\n\n return `import { getDb } from './driver'\nimport { permissions, roles, rolePermissions } from './schema'\nimport { logger } from '../utils/logger'\n\nconst log = logger.db()\n\n${INITIAL_PERMISSIONS}\n\n${INITIAL_ROLES}\n\n${INITIAL_ROLE_PERMISSIONS}\n\nexport async function initializeDatabase() {\n const db = await getDb()\n\n log.info({}, 'Initializing database...')\n\n const existingPermissions = await db.select().from(permissions)\n if (existingPermissions.length === 0) {\n log.info({}, 'Inserting initial permissions...')\n await db.insert(permissions).values(\n initialPermissions.map(p => ({\n ...p,\n description: null,\n isActive: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n }))\n )\n }\n\n const existingRoles = await db.select().from(roles)\n if (existingRoles.length === 0) {\n log.info({}, 'Inserting initial roles...')\n await db.insert(roles).values(\n initialRoles.map(r => ({\n ...r,\n description: null,\n isActive: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n }))\n )\n }\n\n const existingRolePermissions = await db.select().from(rolePermissions)\n if (existingRolePermissions.length === 0) {\n log.info({}, 'Inserting initial role permissions...')\n await db.insert(rolePermissions).values(\n initialRolePermissions.map(rp => ({\n ...rp,\n createdAt: new Date(),\n }))\n )\n }\n\n log.info({}, 'Database initialization complete!')${seedBlock}\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\nimport { getStandaloneRoutes } from './route-registry'\n\nexport function generateServerApp(resolved: ResolvedPreset): string {\n const useRealtime = resolved.hasSSE || resolved.hasWebSocket\n const useAuditLog = resolved.hasPermission\n const useCaptcha = resolved.hasCaptcha\n const standaloneRoutes = getStandaloneRoutes(resolved)\n\n const imports: string[] = [\n `import { OpenAPIHono } from '@hono/zod-openapi'`,\n ``,\n `import { HTTPException } from 'hono/http-exception'`,\n `import type { ContentfulStatusCode } from 'hono/utils/http-status'`,\n `import { ZodError } from 'zod'`,\n `import type { AppBindings, CreateAppOptions } from './types/bindings'`,\n `import { AppError } from './utils/app-error'`,\n `import { autoRegisterRealtime } from './core/realtime-scanner'`,\n `import { corsMiddleware, loggerMiddleware, errorHandlerMiddleware } from './middleware'`,\n ]\n\n if (useRealtime) {\n imports.push(`import { realtimeEnvMiddleware } from './middleware/realtime-env'`)\n }\n if (useAuditLog) {\n imports.push(`import { auditLogMiddleware } from './middleware/audit-log'`)\n }\n if (useCaptcha) {\n imports.push(`import { captchaMiddleware } from './middleware/captcha'`)\n }\n\n imports.push(\n `import { createModuleLoggerSync } from './utils/logger'`,\n `import { adminApiRoutes, clientApiRoutes } from './route-registry'`\n )\n\n // Import standalone routes from their source modules (already imported via route-registry)\n // But standalone routes are NOT part of the aggregated clientApiRoutes/adminApiRoutes,\n // so we import them directly for mounting at their custom paths.\n const standaloneImportSet = new Set<string>()\n for (const [name, manifest] of resolved.modules) {\n if (manifest.routes.standalone) {\n const { importPath, exportName } = manifest.routes.standalone\n const moduleDir = `module-${name}`\n const relPath = importPath.replace(/^\\.\\//, '')\n // Check if this import is already in the route-registry (which re-exports aren't — we import directly)\n const stmt = `import { ${exportName} } from './${moduleDir}/${relPath}'`\n if (!standaloneImportSet.has(stmt)) {\n standaloneImportSet.add(stmt)\n imports.push(stmt)\n }\n }\n }\n\n const middlewareChain: string[] = [\n `.use('*', errorHandlerMiddleware())`,\n `.use('*', loggerMiddleware())`,\n `.use('*', corsMiddleware())`,\n ]\n\n if (useRealtime) {\n middlewareChain.push(`.use('*', realtimeEnvMiddleware())`)\n }\n if (useAuditLog) {\n middlewareChain.push(`.use('/api/*', auditLogMiddleware())`)\n }\n if (useCaptcha) {\n middlewareChain.push(\n `.use(\\n '/api/admin/*',\\n captchaMiddleware({\\n maxRequests: 20,\\n windowMs: 60000,\\n })\\n )`\n )\n }\n\n const routes: string[] = [`.route('/', clientApiRoutes)`, `.route('/', adminApiRoutes)`]\n\n // Dynamically mount standalone routes at their custom paths\n for (const sr of standaloneRoutes) {\n routes.push(`.route('${sr.mountPath}', ${sr.localName})`)\n }\n\n const indent = ' '\n const chain = [...middlewareChain, ...routes].join(`\\n${indent}`)\n\n return `${imports.join('\\n')}\n\nexport { type AppBindings, type CreateAppOptions } from './types/bindings'\n\nexport function createApp<T extends AppBindings = AppBindings>(_options: CreateAppOptions = {}) {\n const app = new OpenAPIHono<{ Bindings: T }>()\n ${chain}\n .get('/health', async c => {\n try {\n const { getDb } = await import('./db')\n await getDb()\n return c.json({ status: 'ok', timestamp: new Date().toISOString(), db: 'connected' })\n } catch {\n return c.json({ status: 'ok', timestamp: new Date().toISOString(), db: 'not configured' })\n }\n })\n // 测试辅助端点:仅开发/测试环境注册(Cloudflare 构建时 NODE_ENV 被替换为\n // \"production\",此端点不会出现在生产 bundle 中)\n if (process.env.NODE_ENV !== 'production') {\n app.post('/api/__test__/cleanup', async c => {\n try {\n const { cleanupTestDatabase } = await import('./db/test-setup')\n await cleanupTestDatabase()\n return c.json({ success: true as const, message: 'Database cleaned up' })\n } catch (error) {\n console.error('Error during database cleanup:', error)\n return c.json({ success: false as const, message: 'Failed to cleanup database' }, 500)\n }\n })\n }\n\n autoRegisterRealtime(app as unknown as Parameters<typeof autoRegisterRealtime>[0])\n\n app.onError((err, c) => {\n const log = createModuleLoggerSync('api')\n c.res.headers.set('Content-Type', 'application/json')\n\n if (AppError.isAppError(err)) {\n return c.json(\n {\n success: false as const,\n error: err.message,\n status: err.statusCode,\n details: err.details,\n },\n err.statusCode as ContentfulStatusCode\n )\n }\n\n if (err instanceof HTTPException) {\n return c.json(\n { success: false as const, error: err.message, status: err.status },\n err.status as ContentfulStatusCode\n )\n }\n\n if (err instanceof ZodError) {\n const details = err.issues.map(issue => ({\n field: issue.path.join('.'),\n message: issue.message,\n }))\n return c.json(\n { success: false as const, error: 'Validation failed', status: 400, details },\n 400\n )\n }\n\n log.error({ err, path: c.req.path }, 'Unhandled error')\n return c.json(\n { success: false as const, error: err.message || 'Internal server error', status: 500 },\n 500\n )\n })\n\n return app\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\n\nconst MODULE_EXPORTS: Record<string, { namedExports: string[]; hasTypeOnly?: boolean }> = {\n chat: {\n namedExports: ['ChatProtocolSchema', 'type ChatProtocol'],\n },\n todos: {\n namedExports: [\n 'TodoSchema',\n 'TodoStatusSchema',\n 'CreateTodoSchema',\n 'UpdateTodoSchema',\n 'TodoIdSchema',\n 'type Todo',\n 'type TodoStatus',\n 'type CreateTodoInput',\n 'type UpdateTodoInput',\n ],\n },\n files: {\n namedExports: [\n 'FileDownloadSchema',\n 'PrivateFileQuerySchema',\n 'PublicFileUrlSchema',\n 'PrivateFileUrlSchema',\n 'GenerateUrlRequestSchema',\n 'FileUrlResponseSchema',\n 'EmptySchema',\n ],\n },\n notifications: {\n namedExports: [\n 'NotificationSchema',\n 'NotificationTypeSchema',\n 'CreateNotificationSchema',\n 'NotificationListQuerySchema',\n 'SSEEventSchema',\n 'AppSSEProtocolSchema',\n 'type AppNotification',\n 'type NotificationType',\n 'type CreateNotificationInput',\n 'type NotificationListQuery',\n 'type SSEEvent',\n 'type AppSSEProtocol',\n ],\n },\n admin: {\n namedExports: [\n 'SystemStatsSchema',\n 'HealthCheckSchema',\n 'RecentActivityItemSchema',\n 'RecentActivitySchema',\n 'AuthUserSchema',\n 'ClearTodosResultSchema',\n 'type SystemStats',\n 'type HealthCheck',\n 'type RecentActivityItem',\n 'type AuthUserResponse',\n 'type ClearTodosResult',\n ],\n },\n permission: {\n namedExports: [\n 'RoleEnum',\n 'RoleInfoSchema',\n 'PermissionInfoSchema',\n 'UserPermissionsSchema',\n 'RoleListSchema',\n 'PermissionListSchema',\n 'Role',\n 'Permission',\n 'ROLE_PERMISSIONS',\n 'ROLE_LABELS',\n 'PERMISSION_LABELS',\n 'PERMISSION_CATEGORIES',\n 'getPermissionsByRole',\n 'hasPermission',\n 'hasAnyPermission',\n 'hasAllPermissions',\n 'type PermissionRoleType',\n 'type RoleInfo',\n 'type PermissionInfo',\n 'type UserPermissions',\n ],\n },\n auth: {\n namedExports: [\n 'DeveloperProfileSchema',\n 'LoginSchema',\n 'RegisterSchema',\n 'TokenResponseSchema',\n 'type DeveloperProfile',\n 'type LoginInput',\n 'type RegisterInput',\n 'type TokenResponse',\n ],\n },\n plugin: {\n namedExports: [\n 'PluginSchema',\n 'PluginStatusSchema',\n 'CreatePluginSchema',\n 'UpdatePluginSchema',\n 'PluginVersionStatusSchema',\n 'VersionSchema',\n 'CategorySchema',\n 'ReviewSchema',\n 'CreateReviewSchema',\n 'MarketplaceStatsSchema',\n 'PluginListResponseSchema',\n 'AdminPluginSchema',\n 'AdminDashboardStatsSchema',\n 'PluginListQuerySchema',\n 'PluginSlugSchema',\n 'type Plugin',\n 'type PluginStatus',\n 'type CreatePluginInput',\n 'type UpdatePluginInput',\n 'type PluginVersionStatus',\n 'type Version',\n 'type Category',\n 'type Review',\n 'type CreateReviewInput',\n 'type MarketplaceStats',\n 'type PluginListResponse',\n 'type AdminPlugin',\n 'type AdminDashboardStats',\n 'type PluginListQuery',\n ],\n },\n plugins: {\n namedExports: [\n 'PluginSchema',\n 'PluginStatusSchema',\n 'CreatePluginSchema',\n 'UpdatePluginSchema',\n 'PluginVersionStatusSchema',\n 'VersionSchema',\n 'CategorySchema',\n 'ReviewSchema',\n 'CreateReviewSchema',\n 'MarketplaceStatsSchema',\n 'PluginListResponseSchema',\n 'AdminPluginSchema',\n 'AdminDashboardStatsSchema',\n 'PluginListQuerySchema',\n 'PluginSlugSchema',\n 'type Plugin',\n 'type PluginStatus',\n 'type CreatePluginInput',\n 'type UpdatePluginInput',\n 'type PluginVersionStatus',\n 'type Version',\n 'type Category',\n 'type Review',\n 'type CreateReviewInput',\n 'type MarketplaceStats',\n 'type PluginListResponse',\n 'type AdminPlugin',\n 'type AdminDashboardStats',\n 'type PluginListQuery',\n ],\n },\n merchant: {\n namedExports: [\n 'ProductSchema',\n 'CreateProductSchema',\n 'UpdateProductSchema',\n 'ProductListSchema',\n 'type Product',\n 'type CreateProductInput',\n 'type UpdateProductInput',\n ],\n },\n tenant: {\n namedExports: [\n 'TenantSchema',\n 'TenantStatusSchema',\n 'TenantPlanSchema',\n 'TenantSettingsSchema',\n 'CreateTenantSchema',\n 'UpdateTenantSchema',\n 'TenantIdSchema',\n 'TenantSlugSchema',\n 'TenantListResponseSchema',\n 'TenantQuerySchema',\n 'TenantIdResponseSchema',\n 'type Tenant',\n 'type TenantStatus',\n 'type TenantPlan',\n 'type TenantSettings',\n 'type CreateTenantInput',\n 'type UpdateTenantInput',\n 'type TenantId',\n 'type TenantSlug',\n 'type TenantListResponse',\n 'type TenantQuery',\n 'type TenantIdResponse',\n ],\n },\n order: {\n namedExports: [\n 'OrderStatusSchema',\n 'OrderSchema',\n 'CreateOrderSchema',\n 'UpdateOrderSchema',\n 'OrderListSchema',\n 'OrderQuerySchema',\n 'OrderDeleteResultSchema',\n 'ProcessOrderSchema',\n 'CancelOrderSchema',\n 'RemoveCartItemResponseSchema',\n 'ECommerceProductSchema',\n 'ECommerceOrderStatusSchema',\n 'ECommerceOrderSchema',\n 'ECommerceOrderListSchema',\n 'type OrderStatus',\n 'type Order',\n 'type CreateOrderInput',\n 'type UpdateOrderInput',\n 'type OrderDeleteResult',\n 'type ProcessOrderInput',\n 'type CancelOrderInput',\n 'type OrderQueryInput',\n 'type RemoveCartItemResponse',\n 'type ECommerceProduct',\n 'type ECommerceOrderStatus',\n 'type ECommerceOrder',\n ],\n },\n ticket: {\n namedExports: [\n 'TicketStatusSchema',\n 'TicketPrioritySchema',\n 'TicketCategorySchema',\n 'TicketReplySchema',\n 'TicketSchema',\n 'CreateTicketSchema',\n 'UpdateTicketSchema',\n 'ReplyTicketSchema',\n 'TicketListSchema',\n 'TicketDeleteResultSchema',\n 'type TicketStatus',\n 'type TicketPriority',\n 'type TicketCategory',\n 'type TicketReply',\n 'type Ticket',\n 'type CreateTicketInput',\n 'type UpdateTicketInput',\n 'type ReplyTicketInput',\n 'type TicketDeleteResult',\n ],\n },\n dispute: {\n namedExports: [\n 'DisputeTypeSchema',\n 'DisputeStatusSchema',\n 'DisputeSchema',\n 'CreateDisputeSchema',\n 'UpdateDisputeSchema',\n 'ResolveDisputeSchema',\n 'DisputeListSchema',\n 'DisputeDeleteResultSchema',\n 'type DisputeType',\n 'type DisputeStatus',\n 'type Dispute',\n 'type CreateDisputeInput',\n 'type UpdateDisputeInput',\n 'type ResolveDisputeInput',\n 'type DisputeDeleteResult',\n ],\n },\n content: {\n namedExports: [\n 'ContentCategorySchema',\n 'ContentStatusSchema',\n 'ContentSchema',\n 'CreateContentSchema',\n 'UpdateContentSchema',\n 'ContentListSchema',\n 'ContentDeleteResultSchema',\n 'type ContentCategory',\n 'type ContentStatus',\n 'type Content',\n 'type CreateContentInput',\n 'type UpdateContentInput',\n 'type ContentDeleteResult',\n ],\n },\n captcha: {\n namedExports: [\n 'CaptchaResponseSchema',\n 'VerifyCaptchaRequestSchema',\n 'CaptchaVerifyResponseSchema',\n 'type CaptchaResponse',\n 'type VerifyCaptchaRequest',\n 'type CaptchaVerifyResponse',\n ],\n },\n dashboard: {\n namedExports: [\n 'DashboardStatSchema',\n 'RevenueDataSchema',\n 'ActivityStatusSchema',\n 'ActivitySchema',\n 'DashboardResponseSchema',\n 'type DashboardStat',\n 'type RevenueData',\n 'type ActivityStatus',\n 'type Activity',\n 'type DashboardResponse',\n ],\n },\n cart: {\n namedExports: [\n 'CartItemSchema',\n 'CartSummarySchema',\n 'CartResponseSchema',\n 'AddCartItemSchema',\n 'CartItemIdSchema',\n 'type CartItem',\n 'type CartSummary',\n 'type CartResponse',\n 'type AddCartItemInput',\n ],\n },\n community: {\n namedExports: [\n 'TopicStatusSchema',\n 'TopicTagSchema',\n 'TopicAuthorSchema',\n 'TopicSchema',\n 'TopicsResponseSchema',\n 'ProfileStatsSchema',\n 'ActivityTypeSchema',\n 'ProfileActivitySchema',\n 'ProfileResponseSchema',\n 'type TopicStatus',\n 'type TopicTag',\n 'type TopicAuthor',\n 'type Topic',\n 'type ProfileStats',\n 'type ActivityType',\n 'type ProfileActivity',\n 'type ProfileResponse',\n ],\n },\n audit: {\n namedExports: ['ResourceTypeSchema', 'ActionTypeSchema', 'AuditLogSchema', 'type AuditLogType'],\n },\n role: {\n namedExports: [\n 'RoleSchema',\n 'CreateRoleSchema',\n 'UpdateRoleSchema',\n 'UpdateRolePermissionsSchema',\n 'RoleSuccessSchema',\n 'type RoleDataType',\n 'type CreateRoleType',\n 'type UpdateRoleType',\n ],\n },\n}\n\nexport function generateSharedModulesIndex(resolved: ResolvedPreset): string {\n const lines: string[] = []\n\n const moduleOrder = [\n 'chat',\n 'todos',\n 'file',\n 'notifications',\n 'admin',\n 'permission',\n 'auth',\n 'plugin',\n 'plugins',\n 'merchant',\n 'tenant',\n 'order',\n 'ticket',\n 'dispute',\n 'content',\n 'captcha',\n ]\n\n // Standalone shared modules: include when preset has pages or server modules that use them\n const STANDALONE_SHARED_MODULES: Record<string, { pages?: string[]; serverModules?: string[] }> =\n {\n cart: { pages: ['CartPage.tsx'] },\n community: { pages: ['TopicsPage.tsx', 'ProfilePage.tsx'], serverModules: ['content'] },\n dashboard: { pages: ['DashboardPage.tsx'] },\n }\n\n for (const moduleName of moduleOrder) {\n if (!resolved.modules.has(moduleName)) continue\n\n const manifest = resolved.modules.get(moduleName)!\n const exportKey = manifest.sharedSchemas?.path ?? moduleName\n const exports = MODULE_EXPORTS[exportKey]\n if (!exports) continue\n\n lines.push(`export {\\n ${exports.namedExports.join(',\\n ')},\\n} from './${exportKey}'`)\n }\n\n // Export additional paths from manifests (e.g., 'role', 'audit' from permission module)\n const additionalExported = new Set<string>()\n for (const moduleName of moduleOrder) {\n if (!resolved.modules.has(moduleName)) continue\n\n const manifest = resolved.modules.get(moduleName)!\n if (manifest.sharedSchemas?.additionalPaths) {\n for (const extra of manifest.sharedSchemas.additionalPaths) {\n if (additionalExported.has(extra)) continue\n additionalExported.add(extra)\n\n const exports = MODULE_EXPORTS[extra]\n if (!exports) continue\n\n lines.push(`export {\\n ${exports.namedExports.join(',\\n ')},\\n} from './${extra}'`)\n }\n }\n }\n\n // Standalone modules: include when preset has pages or server modules that use them\n for (const [moduleName, config] of Object.entries(STANDALONE_SHARED_MODULES)) {\n // Check if any module's clientPages includes a relevant page\n const hasRelevantPage =\n config.pages &&\n [...resolved.modules.values()].some(\n m => m.clientPages?.some(p => config.pages!.includes(p.name + '.tsx')) ?? false\n )\n // Check if any required server module is included\n const hasRelevantServerModule =\n config.serverModules?.some(sm => resolved.modules.has(sm)) ?? false\n if (!hasRelevantPage && !hasRelevantServerModule) continue\n\n const exports = MODULE_EXPORTS[moduleName]\n if (!exports) continue\n\n lines.push(`export {\\n ${exports.namedExports.join(',\\n ')},\\n} from './${moduleName}'`)\n }\n\n return lines.join('\\n') + '\\n'\n}\n","import type { ResolvedPreset } from './template-generator'\n\nconst MODULE_EXPORTS: Record<string, { namedExports: string[] }> = {\n chat: {\n namedExports: [\n 'ChatProtocolSchema',\n 'WebSocketStatusSchema',\n 'type ChatProtocol',\n 'type WebSocketStatus',\n ],\n },\n file: {\n namedExports: [\n 'FileDownloadSchema',\n 'PrivateFileQuerySchema',\n 'PublicFileUrlSchema',\n 'PrivateFileUrlSchema',\n 'GenerateUrlRequestSchema',\n 'FileUrlResponseSchema',\n 'EmptySchema',\n 'UploadResultSchema',\n 'UploadFileBodySchema',\n ],\n },\n todos: {\n namedExports: [\n 'TodoSchema',\n 'TodoStatusSchema',\n 'CreateTodoSchema',\n 'UpdateTodoSchema',\n 'TodoIdSchema',\n 'TodoIdResponseSchema',\n 'TodoAttachmentSchema',\n 'TodoAttachmentListSchema',\n 'TodoWithAttachmentsSchema',\n 'UploadFileSchema',\n 'AttachmentIdResponseSchema',\n 'TodoListResponseSchema',\n 'TodoListQuerySchema',\n 'type TodoListResponse',\n 'type TodoListQuery',\n 'type Todo',\n 'type TodoStatus',\n 'type CreateTodoInput',\n 'type UpdateTodoInput',\n 'type TodoIdResponse',\n 'type TodoAttachment',\n 'type TodoWithAttachments',\n ],\n },\n notifications: {\n namedExports: [\n 'NotificationSchema',\n 'NotificationTypeSchema',\n 'CreateNotificationSchema',\n 'NotificationListQuerySchema',\n 'SSEEventSchema',\n 'AppSSEProtocolSchema',\n 'UnreadCountSchema',\n 'NotificationIdSchema',\n 'UnreadCountEventSchema',\n 'type AppNotification',\n 'type NotificationType',\n 'type CreateNotificationInput',\n 'type NotificationListQuery',\n 'type SSEEvent',\n 'type AppSSEProtocol',\n 'type UnreadCount',\n 'type NotificationId',\n 'type UnreadCountEvent',\n ],\n },\n auth: {\n namedExports: [\n 'DeveloperProfileSchema',\n 'LoginSchema',\n 'RegisterSchema',\n 'TokenResponseSchema',\n 'ProfileSchema',\n 'type DeveloperProfile',\n 'type LoginInput',\n 'type RegisterInput',\n 'type TokenResponse',\n 'type Profile',\n ],\n },\n plugin: {\n namedExports: [\n 'PluginSchema',\n 'PluginStatusSchema',\n 'CreatePluginSchema',\n 'UpdatePluginSchema',\n 'PluginVersionStatusSchema',\n 'VersionSchema',\n 'CategorySchema',\n 'ReviewSchema',\n 'CreateReviewSchema',\n 'MarketplaceStatsSchema',\n 'PluginListResponseSchema',\n 'AdminPluginSchema',\n 'AdminDashboardStatsSchema',\n 'PluginListQuerySchema',\n 'PluginSlugSchema',\n 'PluginSearchQuerySchema',\n 'PluginDeleteResponseSchema',\n 'ReviewIdParamsSchema',\n 'ReviewDeleteResponseSchema',\n 'CategorySlugParamsSchema',\n 'CategoryPluginsQuerySchema',\n 'PluginListAdminSchema',\n 'AdminListQuerySchema',\n 'AdminListAllQuerySchema',\n 'RejectPluginBodySchema',\n 'BulkApproveBodySchema',\n 'BulkRejectBodySchema',\n 'BulkResponseSchema',\n 'CreateCategoryBodySchema',\n 'UpdateCategoryBodySchema',\n 'CategoryIdParamsSchema',\n 'CategoryIdResponseSchema',\n 'type Plugin',\n 'type PluginStatus',\n 'type CreatePluginInput',\n 'type UpdatePluginInput',\n 'type PluginVersionStatus',\n 'type Version',\n 'type Category',\n 'type Review',\n 'type CreateReviewInput',\n 'type MarketplaceStats',\n 'type PluginListResponse',\n 'type AdminPlugin',\n 'type AdminDashboardStats',\n 'type PluginListQuery',\n ],\n },\n plugins: {\n namedExports: [\n 'PluginSchema',\n 'PluginStatusSchema',\n 'CreatePluginSchema',\n 'UpdatePluginSchema',\n 'PluginVersionStatusSchema',\n 'VersionSchema',\n 'CategorySchema',\n 'ReviewSchema',\n 'CreateReviewSchema',\n 'MarketplaceStatsSchema',\n 'PluginListResponseSchema',\n 'AdminPluginSchema',\n 'AdminDashboardStatsSchema',\n 'PluginListQuerySchema',\n 'PluginSlugSchema',\n 'PluginSearchQuerySchema',\n 'PluginDeleteResponseSchema',\n 'ReviewIdParamsSchema',\n 'ReviewDeleteResponseSchema',\n 'CategorySlugParamsSchema',\n 'CategoryPluginsQuerySchema',\n 'PluginListAdminSchema',\n 'AdminListQuerySchema',\n 'AdminListAllQuerySchema',\n 'RejectPluginBodySchema',\n 'BulkApproveBodySchema',\n 'BulkRejectBodySchema',\n 'BulkResponseSchema',\n 'CreateCategoryBodySchema',\n 'UpdateCategoryBodySchema',\n 'CategoryIdParamsSchema',\n 'CategoryIdResponseSchema',\n 'type Plugin',\n 'type PluginStatus',\n 'type CreatePluginInput',\n 'type UpdatePluginInput',\n 'type PluginVersionStatus',\n 'type Version',\n 'type Category',\n 'type Review',\n 'type CreateReviewInput',\n 'type MarketplaceStats',\n 'type PluginListResponse',\n 'type AdminPlugin',\n 'type AdminDashboardStats',\n 'type PluginListQuery',\n ],\n },\n admin: {\n namedExports: [\n 'SystemStatsSchema',\n 'HealthCheckSchema',\n 'RecentActivityItemSchema',\n 'RecentActivitySchema',\n 'AuthUserSchema',\n 'LoginRequestSchema',\n 'LoginResponseSchema',\n 'RegisterRequestSchema',\n 'UserSchema',\n 'UserListSchema',\n 'UpdateUserRequestSchema',\n 'CreateUserRequestSchema',\n 'ClearTodosResultSchema',\n 'AdminSuccessSchema',\n 'DownloadTokenSchema',\n 'type SystemStats',\n 'type HealthCheck',\n 'type RecentActivityItem',\n 'type AuthUserResponse',\n 'type CreateUserRequest',\n 'type LoginRequest',\n 'type LoginResponse',\n 'type RegisterRequest',\n 'type User',\n 'type UpdateUserRequest',\n 'type ClearTodosResult',\n ],\n },\n audit: {\n namedExports: ['ResourceTypeSchema', 'ActionTypeSchema', 'AuditLogSchema', 'type AuditLogType'],\n },\n captcha: {\n namedExports: [\n 'CaptchaResponseSchema',\n 'VerifyCaptchaRequestSchema',\n 'CaptchaVerifyResponseSchema',\n 'type CaptchaResponse',\n 'type VerifyCaptchaRequest',\n 'type CaptchaVerifyResponse',\n ],\n },\n cart: {\n namedExports: [\n 'CartItemSchema',\n 'CartSummarySchema',\n 'CartResponseSchema',\n 'AddCartItemSchema',\n 'CartItemIdSchema',\n 'type CartItem',\n 'type CartSummary',\n 'type CartResponse',\n 'type AddCartItemInput',\n ],\n },\n community: {\n namedExports: [\n 'TopicStatusSchema',\n 'TopicTagSchema',\n 'TopicAuthorSchema',\n 'TopicSchema',\n 'TopicsResponseSchema',\n 'ProfileStatsSchema',\n 'ActivityTypeSchema',\n 'ProfileActivitySchema',\n 'ProfileResponseSchema',\n 'type TopicStatus',\n 'type TopicTag',\n 'type TopicAuthor',\n 'type Topic',\n 'type ProfileStats',\n 'type ActivityType',\n 'type ProfileActivity',\n 'type ProfileResponse',\n ],\n },\n content: {\n namedExports: [\n 'ContentCategorySchema',\n 'ContentStatusSchema',\n 'ContentSchema',\n 'CreateContentSchema',\n 'UpdateContentSchema',\n 'ContentListSchema',\n 'ContentDeleteResultSchema',\n 'type ContentCategory',\n 'type ContentStatus',\n 'type Content',\n 'type CreateContentInput',\n 'type UpdateContentInput',\n 'type ContentDeleteResult',\n ],\n },\n dashboard: {\n namedExports: [\n 'DashboardStatSchema',\n 'RevenueDataSchema',\n 'ActivityStatusSchema',\n 'ActivitySchema',\n 'DashboardResponseSchema',\n 'type DashboardStat',\n 'type RevenueData',\n 'type ActivityStatus',\n 'type Activity',\n 'type DashboardResponse',\n ],\n },\n merchant: {\n namedExports: [\n 'MerchantSchema',\n 'MerchantLoginSchema',\n 'MerchantLoginResponseSchema',\n 'MerchantStatsSchema',\n 'ProductSchema',\n 'CreateProductSchema',\n 'UpdateProductSchema',\n 'ProductListSchema',\n 'ProductListResponseSchema',\n 'ProductQuerySchema',\n 'type Merchant',\n 'type MerchantLoginInput',\n 'type MerchantLoginResponse',\n 'type MerchantStats',\n 'type Product',\n 'type CreateProductInput',\n 'type UpdateProductInput',\n 'type ProductListResponse',\n 'type ProductQuery',\n ],\n },\n tenant: {\n namedExports: [\n 'TenantSchema',\n 'TenantStatusSchema',\n 'TenantPlanSchema',\n 'TenantSettingsSchema',\n 'CreateTenantSchema',\n 'UpdateTenantSchema',\n 'TenantIdSchema',\n 'TenantSlugSchema',\n 'TenantListResponseSchema',\n 'TenantQuerySchema',\n 'TenantIdResponseSchema',\n 'type Tenant',\n 'type TenantStatus',\n 'type TenantPlan',\n 'type TenantSettings',\n 'type CreateTenantInput',\n 'type UpdateTenantInput',\n 'type TenantId',\n 'type TenantSlug',\n 'type TenantListResponse',\n 'type TenantQuery',\n 'type TenantIdResponse',\n ],\n },\n dispute: {\n namedExports: [\n 'DisputeTypeSchema',\n 'DisputeStatusSchema',\n 'DisputeSchema',\n 'CreateDisputeSchema',\n 'UpdateDisputeSchema',\n 'ResolveDisputeSchema',\n 'DisputeListSchema',\n 'DisputeDeleteResultSchema',\n 'type DisputeType',\n 'type DisputeStatus',\n 'type Dispute',\n 'type CreateDisputeInput',\n 'type UpdateDisputeInput',\n 'type ResolveDisputeInput',\n 'type DisputeDeleteResult',\n ],\n },\n order: {\n namedExports: [\n 'OrderStatusSchema',\n 'OrderSchema',\n 'CreateOrderSchema',\n 'UpdateOrderSchema',\n 'OrderListSchema',\n 'OrderQuerySchema',\n 'OrderDeleteResultSchema',\n 'ProcessOrderSchema',\n 'CancelOrderSchema',\n 'RemoveCartItemResponseSchema',\n 'ECommerceProductSchema',\n 'ECommerceOrderStatusSchema',\n 'ECommerceOrderSchema',\n 'ECommerceOrderListSchema',\n 'type OrderStatus',\n 'type Order',\n 'type CreateOrderInput',\n 'type UpdateOrderInput',\n 'type OrderDeleteResult',\n 'type ProcessOrderInput',\n 'type CancelOrderInput',\n 'type OrderQueryInput',\n 'type RemoveCartItemResponse',\n 'type ECommerceProduct',\n 'type ECommerceOrderStatus',\n 'type ECommerceOrder',\n ],\n },\n permission: {\n namedExports: [\n 'RoleEnum',\n 'PermissionEnum',\n 'RoleInfoSchema',\n 'PermissionInfoSchema',\n 'UserPermissionsSchema',\n 'MenuItemSchema',\n 'PageActionSchema',\n 'PagePermissionConfigSchema',\n 'PermissionCategorySchema',\n 'RoleListSchema',\n 'PermissionListSchema',\n 'MenuConfigSchema',\n 'PagePermissionsSchema',\n 'PermissionCategoriesSchema',\n 'RoleLabelsSchema',\n 'PermissionLabelsSchema',\n 'PermissionInitSchema',\n 'type PermissionRoleType',\n 'type PermissionType',\n 'type RoleInfo',\n 'type PermissionInfo',\n 'type UserPermissions',\n 'type MenuItem',\n 'type PageAction',\n 'type PagePermissionConfig',\n 'type PermissionCategory',\n 'type PermissionInit',\n 'Role',\n 'Permission',\n 'ROLE_PERMISSIONS',\n 'ROLE_LABELS',\n 'PERMISSION_LABELS',\n 'PERMISSION_CATEGORIES',\n 'getPermissionsByRole',\n 'hasPermission',\n 'hasAnyPermission',\n 'hasAllPermissions',\n ],\n },\n role: {\n namedExports: [\n 'RoleSchema',\n 'CreateRoleSchema',\n 'UpdateRoleSchema',\n 'UpdateRolePermissionsSchema',\n 'RoleSuccessSchema',\n 'type RoleDataType',\n 'type CreateRoleType',\n 'type UpdateRoleType',\n ],\n },\n ticket: {\n namedExports: [\n 'TicketStatusSchema',\n 'TicketPrioritySchema',\n 'TicketCategorySchema',\n 'TicketReplySchema',\n 'TicketSchema',\n 'CreateTicketSchema',\n 'UpdateTicketSchema',\n 'ReplyTicketSchema',\n 'TicketListSchema',\n 'TicketDeleteResultSchema',\n 'type TicketStatus',\n 'type TicketPriority',\n 'type TicketCategory',\n 'type TicketReply',\n 'type Ticket',\n 'type CreateTicketInput',\n 'type UpdateTicketInput',\n 'type ReplyTicketInput',\n 'type TicketDeleteResult',\n ],\n },\n}\n\nconst ADDITIONAL_PATHS_MAP: Record<string, string[]> = {\n permission: ['role', 'audit'],\n}\n\n// Standalone shared modules that have no server module manifest but are used by client pages\n// or server routes. Include when:\n// 1. The preset has client pages that import their schemas, OR\n// 2. The preset has server modules whose routes import their schemas.\nconst STANDALONE_SHARED_MODULES: Record<string, { pages?: string[]; serverModules?: string[] }> = {\n cart: { pages: ['CartPage.tsx'] },\n community: { pages: ['TopicsPage.tsx', 'ProfilePage.tsx'], serverModules: ['content'] },\n dashboard: { pages: ['DashboardPage.tsx'] },\n}\n\nconst moduleOrder = [\n 'chat',\n 'file',\n 'todos',\n 'notifications',\n 'auth',\n 'plugin',\n 'plugins',\n 'admin',\n 'audit',\n 'captcha',\n 'cart',\n 'community',\n 'content',\n 'dashboard',\n 'dispute',\n 'merchant',\n 'order',\n 'permission',\n 'role',\n 'tenant',\n 'ticket',\n]\n\nexport function generateSharedSchemasIndex(resolved: ResolvedPreset): string {\n const header = `// Re-export interfaces from implementation files\nexport type { WSClient, WSProtocol, WSStatus } from '../core/ws-client'\nexport type { SSEClient, SSEProtocol } from '../core/sse-client'\n\n// Re-export core\nexport {\n ApiSuccessSchema,\n ApiErrorSchema,\n ApiResponseSchema,\n type ApiSuccess,\n type ApiError,\n type ApiResponse,\n type RpcMethod,\n type EventName,\n type RpcInput,\n type RpcOutput,\n type EventPayload,\n createWSClient,\n createSSEClient,\n} from '../core'\n\n// Re-export modules\n`\n\n const moduleLines: string[] = []\n const exportedNames = new Set<string>()\n const firstSeenModule = new Map<string, string>()\n const droppedExports: { name: string; moduleName: string; originalModule: string }[] = []\n\n for (const moduleName of moduleOrder) {\n const exports = MODULE_EXPORTS[moduleName]\n if (!exports) continue\n\n const shouldInclude = shouldIncludeModule(moduleName, resolved)\n if (!shouldInclude) continue\n\n const uniqueExports = exports.namedExports.filter(name => {\n if (exportedNames.has(name)) {\n const originalModule = firstSeenModule.get(name) ?? 'unknown'\n droppedExports.push({ name, moduleName, originalModule })\n return false\n }\n exportedNames.add(name)\n firstSeenModule.set(name, moduleName)\n return true\n })\n\n if (uniqueExports.length === 0) continue\n\n const importPath = getImportPath(moduleName, resolved)\n\n moduleLines.push(\n `export {\\n ${uniqueExports.join(',\\n ')},\\n} from '../modules/${importPath}'`\n )\n }\n\n for (const { name, moduleName, originalModule } of droppedExports) {\n console.warn(\n `⚠️ Schema collision: \"${name}\" defined in both ${originalModule} and ${moduleName}. Using ${originalModule}'s version. Rename to avoid ambiguity.`\n )\n }\n\n return header + moduleLines.join('\\n') + '\\n'\n}\n\nfunction shouldIncludeModule(moduleName: string, resolved: ResolvedPreset): boolean {\n if (resolved.modules.has(moduleName)) return true\n\n // Standalone shared modules: include when a module in the preset\n // declares client pages that use their schemas OR server modules that import them\n const standalone = STANDALONE_SHARED_MODULES[moduleName]\n if (standalone) {\n // Check if any module's clientPages includes a relevant page\n const hasRelevantPage =\n standalone.pages &&\n [...resolved.modules.values()].some(\n m => m.clientPages?.some(p => standalone.pages!.includes(p.name + '.tsx')) ?? false\n )\n // Check if any required server module is included\n const hasRelevantServerModule =\n standalone.serverModules?.some(sm => resolved.modules.has(sm)) ?? false\n return !!(hasRelevantPage || hasRelevantServerModule)\n }\n\n for (const [parentModule, additionalPaths] of Object.entries(ADDITIONAL_PATHS_MAP)) {\n if (additionalPaths.includes(moduleName) && resolved.modules.has(parentModule)) {\n return true\n }\n }\n\n return false\n}\n\nfunction getImportPath(moduleName: string, resolved: ResolvedPreset): string {\n const manifest = resolved.modules.get(moduleName)\n if (manifest?.sharedSchemas?.path) {\n return manifest.sharedSchemas.path\n }\n return moduleName\n}\n","import type { ResolvedPreset } from './template-generator'\n\nexport function generateMiddlewareIndex(resolved: ResolvedPreset): string {\n const lines: string[] = []\n const hasAuthOrPermission = resolved.modules.has('auth') || resolved.hasPermission\n\n lines.push(`export { corsMiddleware, createCorsMiddleware, type CorsOptions } from './cors'`)\n lines.push(\n `export { loggerMiddleware, createLoggerMiddleware, type LoggerOptions } from './logger'`\n )\n lines.push(\n `export {\\n errorHandlerMiddleware,\\n createErrorHandlerMiddleware,\\n type ErrorHandlerOptions,\\n} from './error-handler'`\n )\n\n if (hasAuthOrPermission) {\n lines.push(\n `export {\\n authMiddleware,\\n requireSuperAdminMiddleware,\\n requireCustomerServiceMiddleware,\\n requirePermissionsMiddleware,\\n type AuthUser,\\n type AuthMiddlewareOptions,\\n} from './auth'`\n )\n }\n\n if (resolved.hasCaptcha) {\n lines.push(\n `export {\\n captchaMiddleware,\\n markCaptchaVerifiedMiddleware,\\n clearCaptchaSessionMiddleware,\\n type CaptchaConfig,\\n} from './captcha'`\n )\n }\n\n if (resolved.hasPermission) {\n lines.push(`export { permissionMiddleware } from './permission'`)\n }\n\n lines.push(`export { rateLimitMiddleware, type RateLimitOptions } from './rate-limit'`)\n\n if (hasAuthOrPermission) {\n lines.push(`export { getAuthUser } from '../utils/auth'`)\n }\n\n return lines.join('\\n') + '\\n'\n}\n","import type { ResolvedPreset } from './template-generator'\n\nexport function generateAuthMiddleware(resolved: ResolvedPreset): string {\n if (resolved.modules.has('auth') && !resolved.hasPermission) {\n return generateSimplifiedAuthMiddleware()\n }\n\n return generateNoopAuthMiddleware()\n}\n\nfunction generateSimplifiedAuthMiddleware(): string {\n return `import type { MiddlewareHandler } from 'hono'\nimport { createModuleLoggerSync } from '../utils/logger'\n\nexport type UserRole = 'user' | 'admin'\n\nexport interface AuthUser {\n id: string\n username: string\n email: string\n role: UserRole\n avatar?: string\n}\n\nexport interface AuthMiddlewareOptions {\n requiredRole?: UserRole\n}\n\ndeclare module 'hono' {\n interface ContextVariableMap {\n authUser: AuthUser\n }\n}\n\nfunction extractToken(authHeader: string | undefined): string | null {\n if (!authHeader) return null\n if (!authHeader.startsWith('Bearer ')) return null\n return authHeader.slice(7)\n}\n\n// dev tokens:与模板完整版 auth.ts 语义一致(开发/测试便利后门,production 默认禁用)\nfunction isDevTokensEnabled(): boolean {\n if (process.env.ENABLE_DEV_TOKENS === 'true') return true\n if (process.env.ENABLE_DEV_TOKENS === 'false') return false\n if (process.env.NODE_ENV === 'production') return false\n return true\n}\n\nfunction verifyDevToken(token: string): AuthUser | null {\n if (token === 'admin-token' || token === 'super-admin-token') {\n return {\n id: 'super-admin-1',\n username: 'superadmin',\n email: 'superadmin@example.com',\n role: 'admin',\n }\n }\n if (token === 'user-token') {\n return {\n id: 'user-1',\n username: 'Demo User',\n email: 'demo@example.com',\n role: 'user',\n }\n }\n return null\n}\n\nexport function authMiddleware(_options: AuthMiddlewareOptions = {}): MiddlewareHandler {\n const log = createModuleLoggerSync('auth')\n\n return async (c, next) => {\n const token = extractToken(c.req.header('Authorization'))\n\n if (!token) {\n log.warn({ path: c.req.path, method: c.req.method }, 'Missing auth token')\n return c.json({ success: false, error: 'Authentication required', status: 401 }, 401)\n }\n\n if (isDevTokensEnabled()) {\n const devUser = verifyDevToken(token)\n if (devUser) {\n c.set('authUser', devUser)\n log.warn({ module: 'auth' }, 'DEV TOKEN USED - This should not appear in production!')\n await next()\n return\n }\n }\n\n try {\n const jwt = await import('jsonwebtoken')\n const secretKey = process.env.AUTH_SECRET_KEY || 'dev-secret-key-change-in-production'\n const decoded = jwt.verify(token, secretKey) as {\n userId: string\n username: string\n email: string\n role: string\n }\n\n const user: AuthUser = {\n id: decoded.userId,\n username: decoded.username,\n email: decoded.email,\n role: decoded.role as UserRole,\n }\n\n c.set('authUser', user)\n log.info({ userId: user.id, path: c.req.path }, 'User authenticated')\n await next()\n } catch {\n log.warn({ path: c.req.path, method: c.req.method }, 'Invalid auth token')\n return c.json({ success: false, error: 'Invalid or expired token', status: 401 }, 401)\n }\n }\n}\n\nexport function requireSuperAdminMiddleware(): MiddlewareHandler {\n return authMiddleware()\n}\n\nexport function requireCustomerServiceMiddleware(): MiddlewareHandler {\n return authMiddleware()\n}\n\nexport function requirePermissionsMiddleware(): MiddlewareHandler {\n return authMiddleware()\n}\n`\n}\n\nfunction generateNoopAuthMiddleware(): string {\n return `import type { MiddlewareHandler } from 'hono'\nimport { createModuleLoggerSync } from '../utils/logger'\n\nexport type UserRole = 'user' | 'admin'\n\nexport interface AuthUser {\n id: string\n username: string\n email: string\n role: UserRole\n avatar?: string\n}\n\nexport interface AuthMiddlewareOptions {\n requiredRole?: UserRole\n}\n\ndeclare module 'hono' {\n interface ContextVariableMap {\n authUser: AuthUser\n }\n}\n\nconst DEV_USER: AuthUser = {\n id: 'dev-user-1',\n username: 'devuser',\n email: 'dev@example.com',\n role: 'admin',\n avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=dev',\n}\n\nfunction extractToken(authHeader: string | undefined): string | null {\n if (!authHeader) return null\n if (!authHeader.startsWith('Bearer ')) return null\n return authHeader.slice(7)\n}\n\nexport function authMiddleware(_options: AuthMiddlewareOptions = {}): MiddlewareHandler {\n const log = createModuleLoggerSync('auth')\n\n return async (c, next) => {\n const token = extractToken(c.req.header('Authorization'))\n\n if (!token) {\n c.set('authUser', { ...DEV_USER, id: 'anonymous' })\n log.info({ path: c.req.path }, 'Anonymous access')\n await next()\n return\n }\n\n c.set('authUser', DEV_USER)\n log.info({ userId: DEV_USER.id, path: c.req.path }, 'Dev user authenticated')\n await next()\n }\n}\n\nexport function requireSuperAdminMiddleware(): MiddlewareHandler {\n return authMiddleware()\n}\n\nexport function requireCustomerServiceMiddleware(): MiddlewareHandler {\n return authMiddleware()\n}\n\nexport function requirePermissionsMiddleware(): MiddlewareHandler {\n return authMiddleware()\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\n\nexport function generateAuthUtils(resolved: ResolvedPreset): string {\n const hasAuthOrPermission = resolved.modules.has('auth') || resolved.hasPermission\n\n if (!hasAuthOrPermission) {\n return `import type { Context } from 'hono'\nimport type { AuthUser } from '../middleware/auth'\n\nexport function getAuthUser(c: Context): AuthUser {\n return c.get('authUser')\n}\n`\n }\n\n if (resolved.modules.has('auth') && !resolved.hasPermission) {\n return `import type { Context } from 'hono'\nimport type { AuthUser } from '../middleware/auth'\n\nexport function getAuthUser(c: Context): AuthUser {\n return c.get('authUser')\n}\n\nexport function getOptionalAuthUser(c: Context): AuthUser | null {\n try {\n return c.get('authUser')\n } catch {\n return null\n }\n}\n`\n }\n\n return `import type { Context } from 'hono'\nimport type { AuthUser } from '../middleware/auth'\nimport { Role } from '@shared/modules/permission'\n\ninterface MockUser {\n id: string\n username: string\n email: string\n role: string\n status: string\n avatar: string\n createdAt: string\n updatedAt: string\n}\n\nconst mockUsers: MockUser[] = [\n {\n id: '1',\n username: 'superadmin',\n email: 'superadmin@example.com',\n role: Role.SUPER_ADMIN,\n status: 'active',\n avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=superadmin',\n createdAt: '2024-01-01T00:00:00Z',\n updatedAt: '2024-01-01T00:00:00Z',\n },\n {\n id: '2',\n username: 'customerservice',\n email: 'customerservice@example.com',\n role: Role.CUSTOMER_SERVICE,\n status: 'active',\n avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=customerservice',\n createdAt: '2024-01-02T00:00:00Z',\n updatedAt: '2024-01-02T00:00:00Z',\n },\n {\n id: '3',\n username: 'user1',\n email: 'user1@example.com',\n role: Role.USER,\n status: 'active',\n avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=user1',\n createdAt: '2024-01-03T00:00:00Z',\n updatedAt: '2024-01-03T00:00:00Z',\n },\n]\n\nconst mockTokens: Map<string, string> = new Map([\n ['super-admin-token', '1'],\n ['customer-service-token', '2'],\n ['user-token', '3'],\n])\n\nexport function getAuthUser(c: Context): AuthUser {\n return c.get('authUser')\n}\n\nexport function verifyToken(token: string): MockUser | null {\n const userId = mockTokens.get(token)\n\n if (!userId) {\n return null\n }\n\n return mockUsers.find(u => u.id === userId) || null\n}\n\nexport function getMockUsers(): MockUser[] {\n return mockUsers\n}\n\nexport function getMockTokens(): Map<string, string> {\n return mockTokens\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\n\nexport function generateClientComponentsIndex(resolved: ResolvedPreset): string {\n const lines: string[] = []\n\n lines.push(`export { StatusBadge, type ColorScheme } from './StatusBadge'`)\n lines.push(`export { LoadingSpinner } from './LoadingSpinner'`)\n lines.push(`export { EmptyState } from './EmptyState'`)\n\n if (resolved.modules.has('chat') || resolved.modules.has('notifications')) {\n lines.push(`export { ConnectionStatus } from './ConnectionStatus'`)\n }\n\n if (resolved.modules.has('chat')) {\n lines.push(`export { MessageCard } from './MessageCard'`)\n }\n\n if (resolved.modules.has('admin') || resolved.modules.has('auth')) {\n lines.push(`export { AuthButton } from './AuthButton'`)\n }\n\n return lines.join('\\n') + '\\n'\n}\n","import type { ResolvedPreset } from './template-generator'\n\n/**\n * CLI module registry: auto-discovers CLI modules from manifest declarations.\n * When a server module with `cliModule` field is included in a preset,\n * its CLI commands are auto-registered.\n *\n * To add CLI support for a new module:\n * 1. Create the CLI module at template/src/cli/modules/{dir}/index.ts\n * 2. Export a `register{Name}Commands(site: SiteInstance)` function\n * 3. Add `cliModule: { dir: '...', registerFunction: '...' }` to the module's module.ts manifest\n */\n\n// Config module is always included (manages base URL, status, etc.)\nconst ALWAYS_INCLUDED = {\n dir: 'config',\n registerFunction: 'registerConfigCommands',\n}\n\nexport function generateCliModulesIndex(resolved: ResolvedPreset): string {\n const modules: string[] = []\n const registrations: string[] = []\n\n // Auto-register CLI modules based on manifest cliModule declarations\n for (const [, manifest] of resolved.modules) {\n if (manifest.cliModule) {\n const { dir, registerFunction } = manifest.cliModule\n modules.push(`import { ${registerFunction} } from './${dir}'`)\n registrations.push(`${registerFunction}(site)`)\n }\n }\n\n // Always include config module\n modules.push(`import { ${ALWAYS_INCLUDED.registerFunction} } from './${ALWAYS_INCLUDED.dir}'`)\n registrations.push(`${ALWAYS_INCLUDED.registerFunction}(site)`)\n\n const exports = modules\n .map(m => {\n const match = m.match(/\\{ (\\w+) \\}/)\n return match ? match[1] : ''\n })\n .filter(Boolean)\n\n return `import type { Core } from '@dyyz1993/xcli-core'\n${modules.join('\\n')}\n\n/**\n * Register all builtin CLI commands to xcli-core.\n * Each register function receives a SiteInstance for command registration.\n */\nexport function registerBuiltinCommands(app: Core) {\n const api = app.loader.getAPI()\n\n const site = api.createSite({\n name: 'local-server',\n url: 'http://localhost:3010',\n })\n\n${registrations.map(r => ` ${r}`).join('\\n')}\n}\n\nexport { ${exports.join(', ')} }\n`\n}\n","/**\n * Filters package.json dependencies based on the resolved preset.\n * Removes module-specific packages that aren't needed.\n */\nimport type { ResolvedPreset } from './template-generator'\n\n/** Packages only needed by specific modules */\nconst MODULE_PACKAGES: Record<string, string[]> = {\n admin: ['bcryptjs'],\n auth: ['bcryptjs'],\n}\n\n/** Packages needed by the admin panel UI */\nconst ADMIN_PANEL_PACKAGES = ['antd', '@ant-design/icons']\n\n/** Packages needed by the CLI app (xcli-core based) */\nconst CLI_PACKAGES = ['commander'] // legacy, removed from template\n\n/** Packages that are never imported (unused) */\nconst UNUSED_PACKAGES = ['lodash-es', 'chalk', 'mysql2']\n\n/** Packages only needed by the web client (React frontend) */\nconst CLIENT_PACKAGES = [\n 'react',\n 'react-dom',\n 'react-helmet-async',\n 'react-router-dom',\n 'lucide-react',\n 'zustand',\n]\n\n/** Dev packages only needed when a web client is present */\nconst CLIENT_DEV_PACKAGES = [\n '@vitejs/plugin-react',\n '@testing-library/react',\n '@testing-library/jest-dom',\n '@testing-library/dom',\n 'vite',\n 'jsdom',\n 'tailwindcss',\n '@tailwindcss/postcss',\n 'postcss',\n 'autoprefixer',\n '@playwright/test',\n 'playwright',\n 'eventsource',\n]\n\n/** Type packages only needed when a web client is present */\nconst CLIENT_TYPE_PACKAGES = ['@types/react', '@types/react-dom']\n\n/**\n * Filter package.json dependencies for the given preset\n * Returns a new package.json object with filtered deps\n */\nexport function filterPackageJson(\n pkg: Record<string, unknown>,\n resolved: ResolvedPreset\n): Record<string, unknown> {\n const result = { ...pkg }\n\n // Collect packages to remove\n const packagesToRemove = new Set<string>(UNUSED_PACKAGES)\n\n // Remove module-specific packages only if ALL modules requiring it are absent\n const packageToModules: Record<string, string[]> = {}\n for (const [module, packages] of Object.entries(MODULE_PACKAGES)) {\n for (const pkg of packages) {\n if (!packageToModules[pkg]) packageToModules[pkg] = []\n packageToModules[pkg].push(module)\n }\n }\n\n for (const [pkg, modules] of Object.entries(packageToModules)) {\n if (!modules.some(m => resolved.modules.has(m))) {\n packagesToRemove.add(pkg)\n }\n }\n\n // Remove admin panel packages if no admin/tenant/merchant module uses them\n // (antd is used by admin, tenant, and merchant pages)\n const hasAntdConsumer =\n resolved.modules.has('admin') ||\n resolved.modules.has('tenant') ||\n resolved.modules.has('merchant')\n if (!hasAntdConsumer) {\n for (const pkg of ADMIN_PANEL_PACKAGES) {\n packagesToRemove.add(pkg)\n }\n }\n\n // Remove CLI legacy packages (commander was replaced by xcli-core)\n // commander is no longer in template dependencies, but guard against it\n for (const pkg of CLI_PACKAGES) {\n packagesToRemove.add(pkg)\n }\n\n // Remove client packages if no web client\n if (!resolved.hasClient) {\n for (const pkg of CLIENT_PACKAGES) {\n packagesToRemove.add(pkg)\n }\n }\n\n // Filter dependencies\n if (result.dependencies && typeof result.dependencies === 'object') {\n const deps = { ...(result.dependencies as Record<string, string>) }\n for (const pkg of packagesToRemove) {\n delete deps[pkg]\n }\n result.dependencies = deps\n }\n\n // Filter devDependencies — remove admin-only test packages\n if (result.devDependencies && typeof result.devDependencies === 'object') {\n const devDeps = { ...(result.devDependencies as Record<string, string>) }\n if (!resolved.modules.has('admin')) {\n delete devDeps['@testing-library/user-event']\n }\n if (!resolved.hasClient) {\n for (const pkg of CLIENT_DEV_PACKAGES) {\n delete devDeps[pkg]\n }\n for (const pkg of CLIENT_TYPE_PACKAGES) {\n delete devDeps[pkg]\n }\n }\n result.devDependencies = devDeps\n }\n\n // Adjust scripts for cli-only preset\n if (!resolved.hasClient && result.scripts && typeof result.scripts === 'object') {\n const scripts = { ...(result.scripts as Record<string, string>) }\n\n // Override dev to start server directly instead of vite\n scripts['dev'] = 'NODE_ENV=development node --import tsx src/server/entries/node.ts'\n scripts['build'] = 'npm run build:server && npm run build:cli'\n scripts['build:all'] = 'npm run build:server && npm run build:cli'\n delete scripts['build:client']\n delete scripts['build:cloudflare']\n delete scripts['preview']\n delete scripts['dev:todo']\n delete scripts['dev:plugin']\n delete scripts['dev:ecommerce']\n delete scripts['dev:community']\n delete scripts['dev:forum']\n delete scripts['dev:saas']\n delete scripts['dev:cf']\n delete scripts['deploy:cf']\n delete scripts['test:e2e']\n delete scripts['test:e2e:ui']\n delete scripts['test:e2e:debug']\n delete scripts['test:full']\n\n result.scripts = scripts\n }\n\n return result\n}\n","import { readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport type { ResolvedPreset } from './template-generator'\n\nexport function generateViteConfig(resolved: ResolvedPreset, templateDir: string): string {\n const originalPath = join(templateDir, 'vite.config.ts')\n let content = readFileSync(originalPath, 'utf-8')\n\n const entriesToRemove: string[] = []\n const aliasesToRemove: string[] = []\n\n if (!resolved.modules.has('admin')) {\n entriesToRemove.push('admin')\n aliasesToRemove.push('@admin')\n }\n if (!resolved.modules.has('tenant')) {\n entriesToRemove.push('tenant')\n aliasesToRemove.push('@tenant')\n }\n if (!resolved.modules.has('merchant')) {\n entriesToRemove.push('merchant')\n aliasesToRemove.push('@merchant')\n }\n\n // antd is used by admin, tenant, and merchant pages — must match package-json.ts logic\n const hasAntdConsumer =\n resolved.modules.has('admin') ||\n resolved.modules.has('tenant') ||\n resolved.modules.has('merchant')\n\n // Remove rollupOptions input entries: \" name: path.resolve(__dirname, 'name.html'),\"\n for (const name of entriesToRemove) {\n const re = new RegExp(\n `^\\\\s*${name}:\\\\s*path\\\\.resolve\\\\(__dirname,\\\\s*['\"]${name}\\\\.html['\"]\\\\),\\\\s*$\\\\n?`,\n 'gm'\n )\n content = content.replace(re, '')\n }\n\n // Remove path aliases: \" '@name': path.resolve(__dirname, 'src/name'),\"\n for (const alias of aliasesToRemove) {\n const escapedAlias = alias.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const dirName = alias.replace('@', '')\n const re = new RegExp(\n `^\\\\s*'${escapedAlias}':\\\\s*path\\\\.resolve\\\\(__dirname,\\\\s*['\"]src\\\\/${dirName}['\"]\\\\),\\\\s*$\\\\n?`,\n 'gm'\n )\n content = content.replace(re, '')\n }\n\n // Remove antd-related chunks and warnings when no antd consumer exists\n if (!hasAntdConsumer) {\n const antdChunkRe = /^(\\s*'vendor-antd':\\s*\\['antd',\\s*'@ant-design\\/icons'\\],\\s*\\n)/gm\n content = content.replace(antdChunkRe, '')\n\n const onwarnRe =\n /^\\s*\\/\\/ Suppress antd \"use client\" directive warnings[^\\n]*\\n\\s*if \\(warning\\.code === 'MODULE_LEVEL_DIRECTIVE'\\) return\\n/gm\n content = content.replace(onwarnRe, '')\n }\n\n return content\n}\n","import type { ResolvedPreset } from './template-generator'\n\nfunction getPresetType(presetId: string): string {\n const map: Record<string, string> = {\n 'todo-app': 'todo',\n 'xbrowser-marketplace': 'plugin',\n ecommerce: 'ecommerce',\n 'fullstack-admin': 'saas',\n forum: 'community',\n minimal: 'todo',\n }\n return map[presetId] || 'todo'\n}\n\nfunction getThemeForPresetType(presetType: string): { constName: string; theme: string } {\n const themes: Record<string, { constName: string; theme: string }> = {\n todo: {\n constName: 'TODO_THEME',\n theme: `{\n primaryColor: '#6366f1',\n primaryHover: '#4f46e5',\n bgColor: '#ffffff',\n textColor: '#111827',\n secondaryBg: '#f9fafb',\n borderColor: '#e5e7eb',\n borderRadius: '12px',\n logoText: 'Biomimic',\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n}`,\n },\n plugin: {\n constName: 'PLUGIN_MARKET_THEME',\n theme: `{\n primaryColor: '#3b82f6',\n primaryHover: '#2563eb',\n bgColor: '#ffffff',\n textColor: '#111827',\n secondaryBg: '#f0f9ff',\n borderColor: '#bae6fd',\n borderRadius: '12px',\n logoText: 'PluginHub',\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n}`,\n },\n ecommerce: {\n constName: 'ECOMMERCE_THEME',\n theme: `{\n primaryColor: '#f59e0b',\n primaryHover: '#d97706',\n bgColor: '#ffffff',\n textColor: '#111827',\n secondaryBg: '#fffbeb',\n borderColor: '#fde68a',\n borderRadius: '12px',\n logoText: 'ShopMart',\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n}`,\n },\n saas: {\n constName: 'SAAS_ADMIN_THEME',\n theme: `{\n primaryColor: '#1f2937',\n primaryHover: '#374151',\n bgColor: '#f9fafb',\n textColor: '#111827',\n secondaryBg: '#f3f4f6',\n borderColor: '#e5e7eb',\n borderRadius: '8px',\n logoText: 'AdminPanel',\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n}`,\n },\n community: {\n constName: 'COMMUNITY_THEME',\n theme: `{\n primaryColor: '#f97316',\n primaryHover: '#ea580c',\n bgColor: '#ffffff',\n textColor: '#111827',\n secondaryBg: '#fff7ed',\n borderColor: '#fed7aa',\n borderRadius: '12px',\n logoText: 'CommunityHub',\n fontFamily: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n}`,\n },\n }\n return themes[presetType] || themes.todo\n}\n\ninterface LazyRoute {\n path: string\n importPath: string\n componentName: string\n label: string\n}\n\nfunction getRoutesForPreset(presetType: string, resolved: ResolvedPreset): LazyRoute[] {\n const hasModule = (m: string) => resolved.modules.has(m)\n\n const loginRoute = {\n path: '/login',\n importPath: './pages/LoginPage',\n componentName: 'LoginPage',\n label: 'Login',\n }\n const registerRoute = {\n path: '/register',\n importPath: './pages/RegisterPage',\n componentName: 'RegisterPage',\n label: 'Register',\n }\n const maybeAuthRoutes = hasModule('auth')\n ? [\n loginRoute,\n registerRoute,\n {\n path: '/profile',\n importPath: './pages/ProfilePage',\n componentName: 'ProfilePage',\n label: 'Profile',\n },\n ]\n : []\n\n switch (presetType) {\n case 'todo': {\n const routes: LazyRoute[] = [\n ...maybeAuthRoutes,\n {\n path: '/todos',\n importPath: './pages/TodoPage',\n componentName: 'TodoPage',\n label: 'Todos',\n },\n ]\n if (hasModule('notifications')) {\n routes.push({\n path: '/notifications',\n importPath: './pages/NotificationPage',\n componentName: 'NotificationPage',\n label: 'Notifications',\n })\n }\n if (hasModule('chat')) {\n routes.push({\n path: '/websocket',\n importPath: './pages/WebSocketPage',\n componentName: 'WebSocketPage',\n label: 'WebSocket',\n })\n }\n return routes\n }\n\n case 'plugin': {\n const routes: LazyRoute[] = []\n if (hasModule('plugin')) {\n routes.push(\n {\n path: '/',\n importPath: './pages/PluginsPage',\n componentName: 'PluginsPage',\n label: 'Home',\n },\n {\n path: '/plugins',\n importPath: './pages/PluginsPage',\n componentName: 'PluginsPage',\n label: 'Plugins',\n },\n {\n path: '/plugins/:slug',\n importPath: './pages/PluginDetailPage',\n componentName: 'PluginDetailPage',\n label: 'Plugin Detail',\n },\n {\n path: '/categories',\n importPath: './pages/CategoriesPage',\n componentName: 'CategoriesPage',\n label: 'Categories',\n },\n {\n path: '/search',\n importPath: './pages/SearchPage',\n componentName: 'SearchPage',\n label: 'Search',\n },\n {\n path: '/publish',\n importPath: './pages/PublishPage',\n componentName: 'PublishPage',\n label: 'Publish',\n },\n {\n path: '/developer',\n importPath: './pages/DeveloperDashboardPage',\n componentName: 'DeveloperDashboardPage',\n label: 'Developer',\n }\n )\n }\n routes.push(...maybeAuthRoutes)\n if (hasModule('notifications')) {\n routes.push({\n path: '/notifications',\n importPath: './pages/NotificationPage',\n componentName: 'NotificationPage',\n label: 'Notifications',\n })\n }\n return routes\n }\n\n case 'ecommerce': {\n const routes: LazyRoute[] = []\n if (hasModule('content')) {\n routes.push(\n {\n path: '/',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Home',\n },\n {\n path: '/products',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Products',\n },\n {\n path: '/products/:id',\n importPath: './pages/ContentDetailPage',\n componentName: 'ContentDetailPage',\n label: 'Product Detail',\n },\n {\n path: '/content',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Content',\n },\n {\n path: '/content/:id',\n importPath: './pages/ContentDetailPage',\n componentName: 'ContentDetailPage',\n label: 'Content Detail',\n }\n )\n }\n if (hasModule('order')) {\n routes.push(\n {\n path: '/cart',\n importPath: './pages/CartPage',\n componentName: 'CartPage',\n label: 'Cart',\n },\n {\n path: '/orders',\n importPath: './pages/OrdersPage',\n componentName: 'OrdersPage',\n label: 'Orders',\n }\n )\n }\n routes.push(...maybeAuthRoutes)\n return routes\n }\n\n case 'saas': {\n const routes: LazyRoute[] = []\n if (hasModule('admin')) {\n routes.push(\n {\n path: '/dashboard',\n importPath: './pages/DashboardPage',\n componentName: 'DashboardPage',\n label: 'Dashboard',\n },\n {\n path: '/settings',\n importPath: './pages/SettingsPage',\n componentName: 'SettingsPage',\n label: 'Settings',\n }\n )\n }\n routes.push(...maybeAuthRoutes)\n return routes\n }\n\n case 'community': {\n const routes: LazyRoute[] = []\n if (hasModule('content')) {\n routes.push(\n {\n path: '/',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Home',\n },\n {\n path: '/topics',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Topics',\n },\n {\n path: '/topics/:id',\n importPath: './pages/ContentDetailPage',\n componentName: 'ContentDetailPage',\n label: 'Topic Detail',\n },\n {\n path: '/popular',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Popular',\n },\n {\n path: '/content',\n importPath: './pages/ContentListPage',\n componentName: 'ContentListPage',\n label: 'Content',\n },\n {\n path: '/content/:id',\n importPath: './pages/ContentDetailPage',\n componentName: 'ContentDetailPage',\n label: 'Content Detail',\n }\n )\n }\n if (hasModule('chat')) {\n routes.push({\n path: '/websocket',\n importPath: './pages/WebSocketPage',\n componentName: 'WebSocketPage',\n label: 'WebSocket',\n })\n }\n if (hasModule('notifications')) {\n routes.push({\n path: '/notifications',\n importPath: './pages/NotificationPage',\n componentName: 'NotificationPage',\n label: 'Notifications',\n })\n }\n routes.push(...maybeAuthRoutes)\n return routes\n }\n\n default:\n return [...maybeAuthRoutes]\n }\n}\n\nfunction getNavConfigForPreset(\n presetType: string,\n hasAuth: boolean\n): {\n desktopNav: string[]\n mobileTabs: string[]\n defaultRoute: string\n name: string\n appType: string\n layout: string\n navigationObj: string\n} {\n switch (presetType) {\n case 'todo':\n return {\n name: 'Todo App',\n appType: 'client',\n layout: 'top-nav',\n navigationObj: hasAuth\n ? \"{ visible: true, showLogo: true, showSearch: false, showCart: false, authStyle: 'buttons', navItems: 'desktop' }\"\n : \"{ visible: true, showLogo: true, showSearch: false, showCart: false, authStyle: 'none', navItems: 'desktop' }\",\n desktopNav: [\n \"{ label: 'Todos', icon: 'CheckSquare', path: '/todos' }\",\n \"{ label: 'SSE Demo', icon: 'Bell', path: '/notifications' }\",\n \"{ label: 'WebSocket', icon: 'Zap', path: '/websocket' }\",\n ],\n mobileTabs: [\n \"{ label: 'Todos', icon: 'CheckSquare', path: '/todos' }\",\n \"{ label: 'SSE', icon: 'Bell', path: '/notifications' }\",\n \"{ label: 'WS', icon: 'Zap', path: '/websocket' }\",\n ],\n defaultRoute: '/todos',\n }\n\n case 'plugin':\n return {\n name: 'Plugin Market',\n appType: 'client',\n layout: 'top-nav',\n navigationObj:\n \"{ visible: true, showLogo: true, showSearch: true, showCart: false, authStyle: 'text-link', navItems: 'desktop' }\",\n desktopNav: [\n \"{ label: 'Discover', icon: 'Compass', path: '/plugins' }\",\n \"{ label: 'Plugins', icon: 'Puzzle', path: '/plugins/list' }\",\n \"{ label: 'Categories', icon: 'Tags', path: '/categories' }\",\n \"{ label: 'Search', icon: 'Search', path: '/search' }\",\n \"{ label: 'Publish', icon: 'PlusCircle', path: '/publish' }\",\n \"{ label: 'Developer', icon: 'Code', path: '/developer' }\",\n ],\n mobileTabs: [\n \"{ label: 'Discover', icon: 'Compass', path: '/plugins' }\",\n \"{ label: 'Plugins', icon: 'Puzzle', path: '/plugins/list' }\",\n \"{ label: 'Categories', icon: 'Tags', path: '/categories' }\",\n \"{ label: 'Search', icon: 'Search', path: '/search' }\",\n \"{ label: 'My', icon: 'User', path: '/developer' }\",\n ],\n defaultRoute: '/plugins',\n }\n\n case 'ecommerce':\n return {\n name: 'E-Commerce',\n appType: 'client',\n layout: 'top-nav',\n navigationObj:\n \"{ visible: true, showLogo: true, showSearch: true, showCart: true, authStyle: 'icon', navItems: 'desktop' }\",\n desktopNav: [\n \"{ label: 'Home', icon: 'Home', path: '/' }\",\n \"{ label: 'Products', icon: 'ShoppingBag', path: '/products' }\",\n \"{ label: 'Cart', icon: 'ShoppingCart', path: '/cart' }\",\n \"{ label: 'Orders', icon: 'Package', path: '/orders' }\",\n \"{ label: 'Account', icon: 'User', path: '/content' }\",\n ],\n mobileTabs: [\n \"{ label: 'Home', icon: 'Home', path: '/' }\",\n \"{ label: 'Products', icon: 'ShoppingBag', path: '/products' }\",\n \"{ label: 'Cart', icon: 'ShoppingCart', path: '/cart' }\",\n \"{ label: 'Orders', icon: 'Package', path: '/orders' }\",\n \"{ label: 'Me', icon: 'User', path: '/content' }\",\n ],\n defaultRoute: '/',\n }\n\n case 'saas':\n return {\n name: 'SaaS Admin',\n appType: 'admin',\n layout: 'minimal',\n navigationObj:\n \"{ visible: false, showLogo: false, showSearch: false, showCart: false, authStyle: 'none', navItems: 'none' }\",\n desktopNav: [\n \"{ label: 'Dashboard', icon: 'LayoutDashboard', path: '/dashboard' }\",\n \"{ label: 'Settings', icon: 'Settings', path: '/settings' }\",\n ],\n mobileTabs: [\n \"{ label: 'Dashboard', icon: 'LayoutDashboard', path: '/dashboard' }\",\n \"{ label: 'Settings', icon: 'Settings', path: '/settings' }\",\n ],\n defaultRoute: '/dashboard',\n }\n\n case 'community':\n return {\n name: 'Community Forum',\n appType: 'client',\n layout: 'top-nav',\n navigationObj:\n \"{ visible: true, showLogo: true, showSearch: true, showCart: false, authStyle: 'text-link', navItems: 'desktop' }\",\n desktopNav: [\n \"{ label: 'Home', icon: 'Home', path: '/' }\",\n \"{ label: 'Topics', icon: 'MessageSquare', path: '/topics' }\",\n \"{ label: 'Popular', icon: 'Flame', path: '/popular' }\",\n \"{ label: 'Profile', icon: 'User', path: '/profile' }\",\n \"{ label: 'Chat', icon: 'MessageCircle', path: '/websocket' }\",\n ],\n mobileTabs: [\n \"{ label: 'Home', icon: 'Home', path: '/' }\",\n \"{ label: 'Topics', icon: 'MessageSquare', path: '/topics' }\",\n \"{ label: 'Popular', icon: 'Flame', path: '/popular' }\",\n \"{ label: 'Profile', icon: 'User', path: '/profile' }\",\n \"{ label: 'Chat', icon: 'MessageCircle', path: '/websocket' }\",\n ],\n defaultRoute: '/',\n }\n\n default:\n return {\n name: 'App',\n appType: 'client',\n layout: 'top-nav',\n navigationObj:\n \"{ visible: true, showLogo: true, showSearch: false, showCart: false, authStyle: 'none', navItems: 'desktop' }\",\n desktopNav: [\"{ label: 'Home', icon: 'Home', path: '/' }\"],\n mobileTabs: [\"{ label: 'Home', icon: 'Home', path: '/' }\"],\n defaultRoute: '/',\n }\n }\n}\n\nfunction filterNavByModules(navItems: string[], resolved: ResolvedPreset): string[] {\n const hasModule = (path: string) => {\n if (path === '/todos') return resolved.modules.has('todos')\n if (path === '/notifications') return resolved.modules.has('notifications')\n if (path === '/websocket') return resolved.modules.has('chat')\n if (\n path.startsWith('/plugins') ||\n path === '/categories' ||\n path === '/search' ||\n path === '/publish' ||\n path === '/developer'\n )\n return resolved.modules.has('plugin')\n if (path === '/cart' || path === '/orders') return resolved.modules.has('order')\n if (path.startsWith('/content') || path === '/products' || path === '/')\n return resolved.modules.has('content')\n if (path === '/topics' || path === '/popular' || path === '/profile')\n return resolved.modules.has('content')\n if (path === '/dashboard' || path === '/settings') return resolved.modules.has('admin')\n return true\n }\n return navItems.filter(item => {\n const pathMatch = item.match(/path:\\s*'([^']+)'/)\n if (!pathMatch) return true\n return hasModule(pathMatch[1])\n })\n}\n\nexport function generatePresetUIConfig(resolved: ResolvedPreset, presetId: string): string {\n const presetType = getPresetType(presetId)\n const { constName, theme } = getThemeForPresetType(presetType)\n const hasAuth = resolved.modules.has('auth')\n const navConfig = getNavConfigForPreset(presetType, hasAuth)\n const routes = getRoutesForPreset(presetType, resolved)\n\n // Build aliases: presetId → presetType (only if they differ)\n const aliases: Record<string, string> = {}\n if (presetId !== presetType) {\n aliases[presetId] = presetType\n }\n // Also add common aliases for convenience (e.g., 'fullstack-admin' → 'saas')\n const allAliases: Record<string, string> = {\n 'todo-app': 'todo',\n 'xbrowser-marketplace': 'plugin',\n ecommerce: 'ecommerce',\n 'fullstack-admin': 'saas',\n forum: 'community',\n minimal: 'todo',\n saas: 'saas',\n }\n // Include all aliases that point to the same preset type\n for (const [alias, type] of Object.entries(allAliases)) {\n if (type === presetType && alias !== presetType) {\n aliases[alias] = presetType\n }\n }\n\n const desktopNav = filterNavByModules(navConfig.desktopNav, resolved)\n const mobileTabs = filterNavByModules(navConfig.mobileTabs, resolved)\n\n const routeDefs = routes.map(r => {\n return ` {\n path: '${r.path}',\n component: lazy(() => import('${r.importPath}').then(m => ({ default: m.${r.componentName} }))),\n label: '${r.label}',\n }`\n })\n\n return `import { lazy, type ComponentType } from 'react'\n\nexport type PresetType = '${presetType}'\n\nexport type AppType = 'client' | 'admin'\nexport type LayoutType = 'top-nav' | 'minimal'\nexport type AuthStyle = 'buttons' | 'text-link' | 'icon' | 'avatar' | 'none'\n\n// ClientNavItem is intentionally simpler than admin MenuItem (no permissions/children needed for client nav)\n// eslint-disable-next-line local-rules/prefer-shared-types\nexport interface ClientNavItem {\n label: string\n icon: string\n path: string\n}\n\nexport type TabItem = ClientNavItem\n\nexport interface NavigationConfig {\n visible: boolean\n showLogo: boolean\n showSearch: boolean\n showCart: boolean\n authStyle: AuthStyle\n navItems: 'desktop' | 'none'\n}\n\nexport interface PresetTheme {\n primaryColor: string\n primaryHover: string\n bgColor: string\n textColor: string\n secondaryBg: string\n borderColor: string\n borderRadius: string\n logoText: string\n fontFamily: string\n}\n\nexport interface RouteDef {\n path: string\n component: ComponentType<Record<string, unknown>> | null\n label: string\n}\n\nexport interface PresetUIConfig {\n id: PresetType\n name: string\n appType: AppType\n layout: LayoutType\n theme: PresetTheme\n navigation: NavigationConfig\n desktopNav: ClientNavItem[]\n mobileTabs: ClientNavItem[]\n routes: RouteDef[]\n defaultRoute: string\n}\n\nconst ${constName}: PresetTheme = ${theme}\n\n// Preset ID aliases: allows dev:xxx scripts and VITE_PRESET to use config IDs\nconst PRESET_ALIASES: Record<string, '${presetType}'> = {\n${Object.entries(aliases)\n .map(([k, v]) => ` '${k}': '${v}',`)\n .join('\\n')}\n}\n\nexport const PRESET_UI_CONFIGS: Record<PresetType, PresetUIConfig> = {\n ${presetType}: {\n id: '${presetType}',\n name: '${navConfig.name}',\n appType: '${navConfig.appType}',\n layout: '${navConfig.layout}',\n theme: ${constName},\n navigation: ${navConfig.navigationObj},\n desktopNav: [\n${desktopNav.map(i => ` ${i}`).join(',\\n')}\n ],\n mobileTabs: [\n${mobileTabs.map(i => ` ${i}`).join(',\\n')}\n ],\n defaultRoute: '${navConfig.defaultRoute}',\n routes: [\n${routeDefs.join(',\\n')}\n ],\n },\n}\n\nexport function getPresetUIConfig(id: string): PresetUIConfig {\n const resolvedId = PRESET_ALIASES[id] ?? (id as PresetType)\n return PRESET_UI_CONFIGS[resolvedId] ?? PRESET_UI_CONFIGS['${presetType}']\n}\n\nexport function getPresetUIConfigs(): Record<PresetType, PresetUIConfig> {\n return PRESET_UI_CONFIGS\n}\n`\n}\n","import type { ResolvedPreset } from './template-generator'\n\nfunction getPresetType(presetId: string): string {\n const map: Record<string, string> = {\n 'todo-app': 'todo',\n 'xbrowser-marketplace': 'plugin',\n ecommerce: 'ecommerce',\n 'fullstack-admin': 'saas',\n forum: 'community',\n minimal: 'todo',\n }\n return map[presetId] || 'todo'\n}\n\nexport function generateClientMain(resolved: ResolvedPreset, presetId: string): string {\n const presetType = getPresetType(presetId)\n const isSaas = presetType === 'saas'\n\n const authTokenBlock = isSaas\n ? ''\n : `\nif (preset !== 'saas') {\n try {\n const raw = localStorage.getItem('auth-token')\n const parsed = raw ? JSON.parse(raw) : null\n if (!parsed?.state?.token) {\n localStorage.setItem('auth-token', JSON.stringify({\n state: {\n token: 'user-token',\n isAuthenticated: true,\n user: { id: 'user-1', username: 'Demo User', role: 'USER' },\n loading: false,\n error: null,\n },\n version: 0,\n }))\n }\n } catch {\n localStorage.setItem('auth-token', JSON.stringify({\n state: { token: 'user-token', isAuthenticated: true, user: { id: 'user-1', username: 'Demo User', role: 'USER' }, loading: false, error: null },\n version: 0,\n }))\n }\n}\n`\n\n if (isSaas) {\n return `import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport './index.css'\n\nconst AdminApp = React.lazy(() => import('@admin/App').then(m => ({ default: m.App })))\n\nconst RootApp = () => {\n return (\n <React.Suspense fallback={<div className=\"flex items-center justify-center h-screen text-gray-400\">Loading...</div>}>\n <AdminApp basePath=\"/\" />\n </React.Suspense>\n )\n}\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <RootApp />\n </React.StrictMode>,\n)\n`\n }\n\n return `import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport { HelmetProvider } from 'react-helmet-async'\nimport { App as ClientApp } from './App'\nimport './index.css'\n\nconst preset = import.meta.env.VITE_PRESET || '${presetType}'\n${authTokenBlock}\nconst RootApp = () => {\n return (\n <HelmetProvider>\n <ClientApp presetId={preset} />\n </HelmetProvider>\n )\n}\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <RootApp />\n </React.StrictMode>,\n)\n`\n}\n","import path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport fs from 'fs-extra'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport {\n loadManifests,\n loadPresets,\n resolvePreset,\n type ResolvedPreset,\n} from '../generators/template-generator'\nimport { getExcludePatterns, getGeneratedFiles } from '../generators/file-filter'\nimport { generateRouteRegistry } from '../generators/route-registry'\nimport { generateRpcSurface } from '../generators/rpc-surface'\nimport { generateIsrModules } from '../generators/isr-modules'\nimport { generateEntryStores } from '../generators/entry-stores'\nimport { generateSsrPages } from '../generators/ssr-pages'\nimport { generateClientNavigation } from '../generators/client-navigation'\nimport { generateClientAppTest } from '../generators/client-app-test'\nimport { generateClientNavigationTest } from '../generators/client-navigation-test'\nimport {\n generateAdminApp,\n generateAdminComponentsIndex,\n generateAdminApiClient,\n} from '../generators/admin-app'\nimport { generateDbSchemaBarrel } from '../generators/db-schema-barrel'\nimport { generateDbInit } from '../generators/db-init'\nimport { generateServerApp } from '../generators/server-app'\nimport { generateSharedModulesIndex } from '../generators/shared-modules-index'\nimport { generateSharedSchemasIndex } from '../generators/shared-schemas-index'\nimport { generateMiddlewareIndex } from '../generators/middleware-index'\nimport { generateAuthMiddleware } from '../generators/auth-middleware'\nimport { generateAuthUtils } from '../generators/auth-utils'\nimport { generateClientComponentsIndex } from '../generators/client-components-index'\nimport { generateCliModulesIndex } from '../generators/cli-modules-index'\nimport { filterPackageJson } from '../generators/package-json'\nimport { generateViteConfig } from '../generators/vite-config'\nimport { generatePresetUIConfig } from '../generators/client-preset-ui-config'\nimport { generateClientMain } from '../generators/client-main'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\nconst TEMPLATE_PROJECT_NAME = 'biomimic-todo-app'\nconst TEMPLATE_DB_NAME = 'biomimic-todo-db'\n\nexport class ScaffoldError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ScaffoldError'\n }\n}\n\nfunction validateProjectName(name: string): void {\n if (!name || name.trim().length === 0) {\n throw new ScaffoldError('Project name cannot be empty')\n }\n const validNameRegex = /^(@[a-z0-9-~][a-z0-9-._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*$/\n if (!validNameRegex.test(name)) {\n throw new ScaffoldError(\n `Invalid project name \"${name}\". Use lowercase letters, numbers, hyphens, and underscores only.`\n )\n }\n if (name.length > 214) {\n throw new ScaffoldError('Project name must be 214 characters or less')\n }\n if (name.includes('..') || name.includes('/') || name.includes('\\\\')) {\n throw new ScaffoldError('Project name cannot contain path separators')\n }\n}\n\nfunction parseGitignore(content: string): string[] {\n const negatePatterns: string[] = []\n const includePatterns = content\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line && !line.startsWith('#'))\n .map(line => {\n if (line.startsWith('!')) {\n negatePatterns.push(line.slice(1))\n return null\n }\n return line\n })\n .filter((line): line is string => line !== null)\n .map(pattern => pattern.replace(/\\/$/, ''))\n .map(pattern => pattern.replace(/^\\*\\./, ''))\n .map(pattern => pattern.replace(/^\\/+/, ''))\n .filter(pattern => !pattern.includes('*'))\n return [...includePatterns, ...negatePatterns.map(p => `!${p}`)]\n}\n\nfunction generateDbName(projectName: string): string {\n const sanitized = projectName\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n return `${sanitized}-db`\n}\n\nasync function updateWranglerToml(targetDir: string, projectName: string): Promise<void> {\n const wranglerPath = path.join(targetDir, 'wrangler.toml')\n if (!(await fs.pathExists(wranglerPath))) {\n return\n }\n\n let content = await fs.readFile(wranglerPath, 'utf-8')\n const dbName = generateDbName(projectName)\n\n content = content.replace(\n new RegExp(`^name = \"${TEMPLATE_PROJECT_NAME}\"`, 'm'),\n `name = \"${projectName}\"`\n )\n\n content = content.replace(\n new RegExp(`database_name = \"${TEMPLATE_DB_NAME}\"`, 'g'),\n `database_name = \"${dbName}\"`\n )\n\n content = content.replace(\n /database_id = \"[^\"]+\"/,\n `database_id = \"\" # TODO: Run 'wrangler d1 create ${dbName}' and paste the ID here`\n )\n\n await fs.writeFile(wranglerPath, content)\n}\n\nasync function updatePackageJson(\n targetDir: string,\n projectName: string,\n resolved: ResolvedPreset\n): Promise<void> {\n const pkgJsonPath = path.join(targetDir, 'package.json')\n if (!(await fs.pathExists(pkgJsonPath))) {\n return\n }\n\n let pkgJson = await fs.readJson(pkgJsonPath)\n\n pkgJson = filterPackageJson(pkgJson, resolved)\n\n pkgJson.name = projectName\n\n if (pkgJson.bin) {\n delete pkgJson.bin\n }\n\n await fs.writeJson(pkgJsonPath, pkgJson, { spaces: 2 })\n}\n\nasync function updatePackageLockJson(targetDir: string, projectName: string): Promise<void> {\n const lockFilePath = path.join(targetDir, 'package-lock.json')\n if (!(await fs.pathExists(lockFilePath))) {\n return\n }\n\n const lockFile = await fs.readJson(lockFilePath)\n\n if (lockFile.name === TEMPLATE_PROJECT_NAME) {\n lockFile.name = projectName\n }\n\n if (lockFile.packages?.['']?.name === TEMPLATE_PROJECT_NAME) {\n lockFile.packages[''].name = projectName\n }\n\n await fs.writeJson(lockFilePath, lockFile, { spaces: 2 })\n}\n\nasync function updateReadme(targetDir: string, projectName: string): Promise<void> {\n const readmePath = path.join(targetDir, 'README.md')\n if (!(await fs.pathExists(readmePath))) {\n return\n }\n\n let content = await fs.readFile(readmePath, 'utf-8')\n\n content = content.replace(/^# (.+)$/m, `# ${projectName}`)\n\n await fs.writeFile(readmePath, content)\n}\n\nexport interface CreateOptions {\n projectName: string\n currentDir: boolean\n preset?: string\n outputDir?: string\n dryRun?: boolean\n install?: boolean\n}\n\nexport async function createProject(options: CreateOptions): Promise<void>\nexport async function createProject(\n projectName: string,\n useCurrentDir?: boolean,\n preset?: string\n): Promise<void>\nexport async function createProject(\n projectNameOrOptions: string | CreateOptions,\n useCurrentDir: boolean = false,\n preset?: string\n): Promise<void> {\n let projectName: string\n let currentDir: boolean\n let presetId: string | undefined\n let outputDir: string | undefined\n let dryRun: boolean\n let install: boolean\n\n if (typeof projectNameOrOptions === 'string') {\n projectName = projectNameOrOptions\n currentDir = useCurrentDir\n presetId = preset\n dryRun = false\n install = true\n } else {\n projectName = projectNameOrOptions.projectName\n currentDir = projectNameOrOptions.currentDir\n presetId = projectNameOrOptions.preset\n outputDir = projectNameOrOptions.outputDir\n dryRun = projectNameOrOptions.dryRun ?? false\n install = projectNameOrOptions.install ?? true\n }\n\n if (!currentDir) {\n validateProjectName(projectName)\n }\n\n const templateDir = path.join(__dirname, '../../template')\n let targetDir: string\n\n if (currentDir) {\n targetDir = process.cwd()\n projectName = path.basename(targetDir)\n } else if (outputDir) {\n targetDir = path.resolve(outputDir)\n if (await fs.pathExists(targetDir)) {\n throw new ScaffoldError(`Directory ${outputDir} already exists`)\n }\n } else {\n targetDir = path.resolve(process.cwd(), projectName)\n if (await fs.pathExists(targetDir)) {\n throw new ScaffoldError(`Directory ${projectName} already exists`)\n }\n }\n\n try {\n const manifestSpinner = ora('Loading module manifests...').start()\n const allManifests = await loadManifests(templateDir)\n const presets = await loadPresets(templateDir)\n\n const selectedPresetId = presetId || 'fullstack-admin'\n const selectedPreset = presets.find(p => p.id === selectedPresetId)\n if (!selectedPreset) {\n throw new ScaffoldError(\n `Unknown preset: ${selectedPresetId}. Available: ${presets.map(p => p.id).join(', ')}`\n )\n }\n\n const resolved = resolvePreset(selectedPreset, allManifests)\n manifestSpinner.succeed(\n chalk.green(`Using preset: ${selectedPreset.name} (${resolved.modules.size} modules)`)\n )\n\n if (dryRun) {\n const resolvedModuleNames = [...resolved.modules.keys()]\n const generatedFiles = getGeneratedFiles(resolved)\n\n console.log('')\n console.log(chalk.blue('📋 Dry Run - Files that would be generated:\\n'))\n for (const file of generatedFiles) {\n console.log(` ${chalk.green('✓')} ${file}`)\n }\n\n const gitignorePath = path.join(templateDir, '.gitignore')\n let ignorePatterns: string[] = []\n if (await fs.pathExists(gitignorePath)) {\n const gitignoreContent = await fs.readFile(gitignorePath, 'utf-8')\n ignorePatterns = parseGitignore(gitignoreContent)\n }\n ignorePatterns.push('node_modules', '.wrangler')\n const excludePatterns = getExcludePatterns(resolved, allManifests)\n\n let templateFileCount = 0\n const templateFiles = await fs.readdir(templateDir, { recursive: true })\n for (const file of templateFiles) {\n const relative = String(file)\n if (!relative) continue\n const negated = ignorePatterns.filter((p: string) => p.startsWith('!'))\n const gitIgnored = ignorePatterns.filter(\n (p: string) => !p.startsWith('!') && relative.startsWith(p)\n )\n if (gitIgnored.length > 0) {\n const allowed = negated.some((p: string) => relative === p.slice(1))\n if (!allowed) continue\n }\n const normalizedRelative = relative.replace(/\\\\/g, '/')\n let excluded = false\n for (const pattern of excludePatterns) {\n const normalizedPattern = pattern.replace(/\\\\/g, '/')\n if (\n normalizedRelative === normalizedPattern ||\n normalizedRelative.startsWith(normalizedPattern + '/')\n ) {\n excluded = true\n break\n }\n }\n if (!excluded) templateFileCount++\n }\n\n console.log('')\n console.log(chalk.blue('📁 Template files that would be copied:\\n'))\n console.log(` ${chalk.green('✓')} ${templateFileCount} template files`)\n console.log('')\n console.log(chalk.yellow(` Total generated files: ${generatedFiles.length}`))\n console.log(chalk.yellow(` Preset: ${selectedPreset.name}`))\n console.log(chalk.yellow(` Modules: ${resolvedModuleNames.join(', ')}`))\n console.log('')\n return\n }\n\n if (!currentDir) {\n const dirSpinner = ora('Creating project directory...').start()\n await fs.ensureDir(targetDir)\n dirSpinner.succeed(chalk.green('Project directory created'))\n }\n\n const copySpinner = ora('Copying template files...').start()\n const gitignorePath = path.join(templateDir, '.gitignore')\n let ignorePatterns: string[] = []\n if (await fs.pathExists(gitignorePath)) {\n const gitignoreContent = await fs.readFile(gitignorePath, 'utf-8')\n ignorePatterns = parseGitignore(gitignoreContent)\n }\n ignorePatterns.push('node_modules', '.wrangler')\n\n const excludePatterns = getExcludePatterns(resolved, allManifests)\n\n await fs.copy(templateDir, targetDir, {\n filter: (src: string) => {\n const relative = path.relative(templateDir, src)\n if (relative === '') return true\n\n const negated = ignorePatterns.filter(p => p.startsWith('!'))\n const gitIgnored = ignorePatterns.filter(p => !p.startsWith('!') && relative.startsWith(p))\n if (gitIgnored.length > 0) {\n const allowed = negated.some(p => relative === p.slice(1))\n if (!allowed) return false\n }\n\n const normalizedRelative = relative.replace(/\\\\/g, '/')\n for (const pattern of excludePatterns) {\n const normalizedPattern = pattern.replace(/\\\\/g, '/')\n if (\n normalizedRelative === normalizedPattern ||\n normalizedRelative.startsWith(normalizedPattern + '/')\n ) {\n return false\n }\n }\n\n return true\n },\n dereference: false,\n })\n copySpinner.succeed(chalk.green('Template files copied'))\n\n const genSpinner = ora('Generating module-specific files...').start()\n\n const routeRegistryContent = generateRouteRegistry(resolved)\n await fs.writeFile(path.join(targetDir, 'src/server/route-registry.ts'), routeRegistryContent)\n\n // 按模块拆分的 RPC 门面(读取已复制的模块路由文件,提取窄类型与路径段)\n const rpcSurfaceContent = generateRpcSurface(resolved, relPath => {\n const full = path.join(targetDir, 'src/server', `${relPath}.ts`)\n return fs.existsSync(full) ? fs.readFileSync(full, 'utf-8') : null\n })\n await fs.writeFile(path.join(targetDir, 'src/server/rpc-surface.ts'), rpcSurfaceContent)\n\n // 按 preset 修正客户端默认值(模板全量版硬编码 'todo',小 preset 查不到配置)\n for (const [rel, from, to] of [\n ['src/client/App.tsx', \"presetId = 'todo'\", `presetId = '${selectedPreset.id}'`],\n [\n 'src/client/entry-server.tsx',\n \"const preset = 'todo'\",\n `const preset = '${selectedPreset.id}'`,\n ],\n ] as const) {\n const p = path.join(targetDir, rel)\n if (await fs.pathExists(p)) {\n let content = await fs.readFile(p, 'utf-8')\n content = content.split(from).join(to)\n await fs.writeFile(p, content)\n }\n }\n\n // 无 client 的 preset:剥掉 shared barrel 的 hooks 再导出(hooks 目录已被过滤)\n if (!resolved.hasClient) {\n const barrelPath = path.join(targetDir, 'src/shared/index.ts')\n if (await fs.pathExists(barrelPath)) {\n let barrel = await fs.readFile(barrelPath, 'utf-8')\n barrel = barrel.replaceAll(\"export * from './hooks'\\n\", '')\n await fs.writeFile(barrelPath, barrel)\n }\n }\n\n const isrModulesContent = generateIsrModules(resolved, (moduleName, relPath) =>\n fs.existsSync(path.join(targetDir, 'src/server', `module-${moduleName}`, relPath))\n )\n await fs.writeFile(path.join(targetDir, 'src/server/isr-modules.ts'), isrModulesContent)\n\n if (resolved.hasClient) {\n const entryStoresContent = generateEntryStores(resolved, (_moduleName, relPath) =>\n fs.existsSync(path.join(targetDir, 'src/client/stores', relPath))\n )\n await fs.ensureDir(path.join(targetDir, 'src/client/stores'))\n await fs.writeFile(\n path.join(targetDir, 'src/client/stores/entry-stores.ts'),\n entryStoresContent\n )\n\n // SSR 静态页面注册表:只导入本 preset 实际存在的页面\n //(模板全量版含全部导入,小 preset 裁页后会悬空)\n const ssrPagesContent = generateSsrPages(resolved, name =>\n fs.existsSync(path.join(targetDir, 'src/client/pages', `${name}.tsx`))\n )\n await fs.writeFile(path.join(targetDir, 'src/client/ssr-pages.ts'), ssrPagesContent)\n\n // SSR 渲染桥:有 client 转发 entry-server 的 renderSSR;无 client\n // (cli-only)导出 null——node 入口回退 SPA 壳而非悬空导入。\n // 两个文件都必须生成(不能留在 hasClient 块外让模板全量版漏进来)\n const ssrBridgePath = path.join(targetDir, 'src/server/ssr-bridge.ts')\n const hasClientDir = fs.existsSync(path.join(targetDir, 'src/client/entry-server.tsx'))\n const bridge = hasClientDir\n ? \"import { renderSSR as renderSSRImpl } from '@client/entry-server'\\n\\n// data 由 ISR registry fetch 提供,renderSSRImpl 内部自取所需字段\\nexport function renderSSR(pathname: string, data: unknown): { html: string } | null {\\n return renderSSRImpl(pathname, data as Parameters<typeof renderSSRImpl>[1])\\n}\\n\"\n : 'export function renderSSR(...args: unknown[]): { html: string } | null {\\n return null\\n}\\n'\n await fs.writeFile(ssrBridgePath, bridge)\n } else {\n // 无 client 的 preset(cli-only 等):SSR 桥与页面注册表都必须是\n // 空/ null 版本——模板全量版若漏进来会因 react 缺失/悬空导入炸 tsc\n // 返回类型必须与有 client 变体一致({ html } | null):node 入口\n // 对 ssr 做 !ssr 收窄,若声明为纯 null 会收窄成 never → tsc 报错\n await fs.writeFile(\n path.join(targetDir, 'src/server/ssr-bridge.ts'),\n 'export const renderSSR: ((pathname: string, data: unknown) => { html: string } | null) | null = null\\n'\n )\n // cli-only 模板的拷贝过滤掉了整个 src/client——目录必须先建出来,\n // 否则这里 writeFile ENOENT,生成中途崩掉(后续 barrel 等全部不落盘)\n await fs.ensureDir(path.join(targetDir, 'src/client'))\n await fs.writeFile(\n path.join(targetDir, 'src/client/ssr-pages.ts'),\n '// 本 preset 无 client 页面——SSR 输出布局壳 + meta\\nexport function getSsrPage(_pathname: string): null {\\n return null\\n}\\n'\n )\n }\n\n const dbSchemaContent = generateDbSchemaBarrel(resolved)\n await fs.writeFile(path.join(targetDir, 'src/server/db/schema/index.ts'), dbSchemaContent)\n\n if (resolved.hasClient) {\n const clientNavContent = generateClientNavigation(resolved)\n await fs.writeFile(\n path.join(targetDir, 'src/client/components/Navigation.tsx'),\n clientNavContent\n )\n\n const clientAppTestContent = generateClientAppTest(resolved)\n await fs.ensureDir(path.join(targetDir, 'src/client/components/__tests__'))\n await fs.writeFile(\n path.join(targetDir, 'src/client/components/__tests__/App.test.tsx'),\n clientAppTestContent\n )\n\n const clientNavTestContent = generateClientNavigationTest(resolved)\n await fs.writeFile(\n path.join(targetDir, 'src/client/components/__tests__/Navigation.test.tsx'),\n clientNavTestContent\n )\n\n const presetUIConfigContent = generatePresetUIConfig(resolved, selectedPreset.id)\n await fs.writeFile(\n path.join(targetDir, 'src/client/preset-ui-config.ts'),\n presetUIConfigContent\n )\n\n const clientMainContent = generateClientMain(resolved, selectedPreset.id)\n await fs.writeFile(path.join(targetDir, 'src/client/main.tsx'), clientMainContent)\n }\n\n if (resolved.hasClient && resolved.modules.has('admin')) {\n const adminAppContent = generateAdminApp(resolved)\n if (adminAppContent) {\n await fs.ensureDir(path.join(targetDir, 'src/admin'))\n await fs.writeFile(path.join(targetDir, 'src/admin/App.tsx'), adminAppContent)\n }\n // Generate admin/components/index.ts with conditional CaptchaModal export\n const adminComponentsIndex = generateAdminComponentsIndex(resolved)\n if (adminComponentsIndex) {\n await fs.ensureDir(path.join(targetDir, 'src/admin/components'))\n await fs.writeFile(\n path.join(targetDir, 'src/admin/components/index.ts'),\n adminComponentsIndex\n )\n }\n // Generate admin/services/apiClient.ts with conditional captcha support\n const adminApiClient = generateAdminApiClient(resolved)\n if (adminApiClient) {\n await fs.ensureDir(path.join(targetDir, 'src/admin/services'))\n await fs.writeFile(path.join(targetDir, 'src/admin/services/apiClient.ts'), adminApiClient)\n }\n }\n\n const serverAppContent = generateServerApp(resolved)\n await fs.writeFile(path.join(targetDir, 'src/server/app.ts'), serverAppContent)\n\n const generatedFiles = getGeneratedFiles(resolved)\n if (generatedFiles.includes('src/server/db/init.ts')) {\n const dbInitContent = generateDbInit(resolved)\n await fs.writeFile(path.join(targetDir, 'src/server/db/init.ts'), dbInitContent)\n }\n\n const sharedModulesContent = generateSharedModulesIndex(resolved)\n await fs.writeFile(path.join(targetDir, 'src/shared/modules/index.ts'), sharedModulesContent)\n\n const sharedSchemasContent = generateSharedSchemasIndex(resolved)\n await fs.writeFile(path.join(targetDir, 'src/shared/schemas/index.ts'), sharedSchemasContent)\n\n const middlewareIndexContent = generateMiddlewareIndex(resolved)\n await fs.writeFile(\n path.join(targetDir, 'src/server/middleware/index.ts'),\n middlewareIndexContent\n )\n\n if (generatedFiles.includes('src/server/middleware/auth.ts')) {\n const authMiddlewareContent = generateAuthMiddleware(resolved)\n await fs.writeFile(\n path.join(targetDir, 'src/server/middleware/auth.ts'),\n authMiddlewareContent\n )\n }\n\n if (generatedFiles.includes('src/server/utils/auth.ts')) {\n const authUtilsContent = generateAuthUtils(resolved)\n await fs.writeFile(path.join(targetDir, 'src/server/utils/auth.ts'), authUtilsContent)\n }\n\n if (resolved.hasClient) {\n const clientComponentsContent = generateClientComponentsIndex(resolved)\n await fs.writeFile(\n path.join(targetDir, 'src/client/components/index.ts'),\n clientComponentsContent\n )\n }\n\n // CLI modules index is always generated (CLI is independent of admin)\n const cliModulesContent = generateCliModulesIndex(resolved)\n await fs.writeFile(path.join(targetDir, 'src/cli/modules/index.ts'), cliModulesContent)\n\n if (resolved.hasClient && generatedFiles.includes('vite.config.ts')) {\n const viteConfigContent = generateViteConfig(resolved, templateDir)\n await fs.writeFile(path.join(targetDir, 'vite.config.ts'), viteConfigContent)\n }\n\n genSpinner.succeed(chalk.green('Module-specific files generated'))\n\n const pkgSpinner = ora('Configuring package.json...').start()\n await updatePackageJson(targetDir, projectName, resolved)\n pkgSpinner.succeed(chalk.green('package.json configured'))\n\n const lockSpinner = ora('Configuring package-lock.json...').start()\n await updatePackageLockJson(targetDir, projectName)\n lockSpinner.succeed(chalk.green('package-lock.json configured'))\n\n const wranglerSpinner = ora('Configuring wrangler.toml...').start()\n await updateWranglerToml(targetDir, projectName)\n wranglerSpinner.succeed(chalk.green('wrangler.toml configured'))\n\n const readmeSpinner = ora('Configuring README.md...').start()\n await updateReadme(targetDir, projectName)\n readmeSpinner.succeed(chalk.green('README.md configured'))\n\n let installSucceeded = false\n if (install && !dryRun) {\n const installSpinner = ora('Installing dependencies...').start()\n try {\n const { execSync } = await import('node:child_process')\n execSync('npm install --legacy-peer-deps', {\n env: { ...process.env, PUPPETEER_SKIP_DOWNLOAD: '1' },\n cwd: targetDir,\n stdio: 'pipe',\n timeout: 300000,\n })\n installSpinner.succeed(chalk.green('Dependencies installed'))\n installSucceeded = true\n } catch {\n installSpinner.warn(\n chalk.yellow('Dependency installation failed (you can run npm install manually)')\n )\n }\n }\n\n if (installSucceeded) {\n const patchesDir = path.join(targetDir, 'patches')\n if (await fs.pathExists(patchesDir)) {\n try {\n const { execSync } = await import('node:child_process')\n execSync('npx patch-package', {\n cwd: targetDir,\n stdio: 'pipe',\n timeout: 60000,\n })\n } catch {\n // patch-package may fail if patches don't apply, not critical\n }\n }\n }\n\n console.log('')\n console.log(chalk.green(' ✓ Project created successfully!'))\n console.log(chalk.gray(` Preset: ${selectedPreset.name}`))\n console.log(chalk.gray(` Modules: ${[...resolved.modules.keys()].join(', ')}`))\n console.log('')\n console.log(chalk.cyan(' Next steps:'))\n if (!currentDir && !outputDir) {\n console.log(chalk.white(` cd ${projectName}`))\n }\n if (!install || !installSucceeded) {\n console.log(chalk.white(' npm install'))\n }\n\n if (resolved.hasClient) {\n console.log(chalk.white(' npm run dev'))\n console.log('')\n console.log(chalk.yellow(' ⚠️ Cloudflare Setup:'))\n console.log(\n chalk.white(` 1. Create D1 database: wrangler d1 create ${generateDbName(projectName)}`)\n )\n console.log(chalk.white(' 2. Copy the database ID to wrangler.toml'))\n console.log(chalk.white(' 3. Deploy: npm run deploy:cf'))\n } else {\n console.log(chalk.white(' npm run build'))\n console.log(chalk.white(' npm start'))\n console.log('')\n console.log(chalk.cyan(' CLI usage:'))\n console.log(chalk.white(' node dist/cli/index.js config status'))\n console.log(chalk.white(' node dist/cli/index.js todo list'))\n console.log(chalk.white(' node dist/cli/index.js --help'))\n }\n console.log('')\n console.log(chalk.gray(' Happy coding! 🐟'))\n\n // agent 钩子环境提示:工作区 .zcode/ 已随模板生成(ZCode 打开即生效);\n // 全局级钩子按需用 hooks:sync 同步(幂等,支持 ZCode / Codex)\n const home = process.env.HOME || ''\n const agents: string[] = []\n if (home) {\n if (await fs.pathExists(path.join(home, '.zcode'))) agents.push('ZCode')\n if (await fs.pathExists(path.join(home, '.codex'))) agents.push('Codex')\n if (await fs.pathExists(path.join(home, '.claude'))) agents.push('Claude Code')\n if (await fs.pathExists(path.join(home, '.cursor'))) agents.push('Cursor')\n }\n if (agents.length > 0) {\n console.log('')\n console.log(chalk.cyan(` 🪝 Agent hooks (检测到 ${agents.join(' / ')}):`))\n console.log(\n chalk.gray(' 工作区钩子已生成(.zcode/,禁止 --no-verify 提交),ZCode 自动生效')\n )\n console.log(chalk.gray(' 同步到全局(Codex 等):npm run hooks:sync -- --global'))\n }\n console.log('')\n } catch (error) {\n if (error instanceof ScaffoldError) throw error\n throw new ScaffoldError(`Error creating project: ${error}`)\n }\n}\n","import { readFileSync } from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { Command } from 'commander'\nimport chalk from 'chalk'\nimport { select } from '@inquirer/prompts'\nimport { createProject, ScaffoldError } from './commands/create.js'\nimport { loadPresets } from './generators/template-generator.js'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\n// __dirname is:\n// - dev: .../create-biomimic-app/src\n// - built: .../create-biomimic-app/dist/cli\n// Both should resolve rootDir to the package root (where package.json + template/ live)\nconst rootDir = __dirname.endsWith(path.join('src'))\n ? path.resolve(__dirname, '..')\n : __dirname.endsWith(path.join('dist', 'cli'))\n ? path.resolve(__dirname, '..', '..')\n : path.resolve(__dirname, '..', '..')\n\nconst packageJson = JSON.parse(readFileSync(path.join(rootDir, 'package.json'), 'utf-8'))\n\nconst program = new Command()\n\nprogram\n .name('create-fullstack-scaffold')\n .description('Create a new full-stack scaffold app with Todo List example')\n .version(packageJson.version)\n .argument('[project-name]', 'Name of your project')\n .option('-c, --current-dir', 'Create project in current directory')\n .option(\n '-p, --preset <preset>',\n 'Template preset to use (fullstack-admin, todo-app, ecommerce, xbrowser-marketplace, forum, cli-only, minimal, saas)'\n )\n .option('-o, --output-dir <path>', 'Output directory (defaults to project name)')\n .option('--dry-run', 'Show what would be generated without creating files')\n .option('--no-install', 'Skip automatic dependency installation')\n .action(\n async (\n projectName = 'my-fullstack-app',\n options: {\n currentDir?: boolean\n preset?: string\n outputDir?: string\n dryRun?: boolean\n install?: boolean\n }\n ) => {\n console.log('')\n console.log(chalk.cyan.bold(' ╔══════════════════════════════════════════╗'))\n console.log(chalk.cyan.bold(' ║ Create Fullstack Scaffold App ║'))\n console.log(chalk.cyan.bold(' ║ React + Hono + Vite + Zustand + TS ║'))\n console.log(chalk.cyan.bold(' ╚══════════════════════════════════════════╝'))\n console.log('')\n\n let preset = options.preset\n\n if (!preset && process.stdin.isTTY) {\n const templateDir = path.join(rootDir, 'template')\n const presets = await loadPresets(templateDir)\n preset = await select({\n message: 'Choose a template preset:',\n choices: presets.map(p => ({\n value: p.id,\n name: `${p.name} — ${p.description}`,\n })),\n })\n }\n\n if (!preset) {\n preset = 'fullstack-admin'\n }\n\n try {\n await createProject({\n projectName,\n currentDir: options.currentDir ?? false,\n preset,\n outputDir: options.outputDir,\n dryRun: options.dryRun ?? false,\n install: options.install,\n })\n } catch (error) {\n if (error instanceof ScaffoldError) {\n console.error(chalk.red(` ✖ ${error.message}`))\n process.exit(1)\n }\n throw error\n }\n }\n )\n\nprogram\n .command('presets')\n .description('List available template presets')\n .action(async () => {\n const templateDir = path.join(rootDir, 'template')\n const presets = await loadPresets(templateDir)\n console.log(chalk.cyan('\\nAvailable presets:\\n'))\n for (const preset of presets) {\n console.log(` ${chalk.green(preset.id.padEnd(20))} ${preset.name}`)\n console.log(` ${' '.repeat(20)} ${preset.description}`)\n console.log(` ${' '.repeat(20)} Modules: ${preset.modules.join(', ')}`)\n console.log()\n }\n })\n\nprogram.parse()\n"]}
|