@salla.sa/twilight-theme-engine 1.0.151 → 1.0.152

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/dist/{AddToCartForm-O6TPONV2.js → AddToCartForm-HOBSTMWX.js} +3 -3
  2. package/dist/{AddToCartForm-O6TPONV2.js.map → AddToCartForm-HOBSTMWX.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-H6LRQ5YW.js → BlogAuthorPage-56OY5GCN.js} +16 -16
  4. package/dist/{BlogAuthorPage-H6LRQ5YW.js.map → BlogAuthorPage-56OY5GCN.js.map} +1 -1
  5. package/dist/{BlogCategoryPage-NORT43JE.js → BlogCategoryPage-HW7A6RNL.js} +16 -16
  6. package/dist/{BlogCategoryPage-NORT43JE.js.map → BlogCategoryPage-HW7A6RNL.js.map} +1 -1
  7. package/dist/{BlogPage-ZGTRTQT6.js → BlogPage-RRHKP3GP.js} +14 -14
  8. package/dist/{BlogPage-ZGTRTQT6.js.map → BlogPage-RRHKP3GP.js.map} +1 -1
  9. package/dist/{BlogSinglePage-G7TUMA4L.js → BlogSinglePage-STNMFQHX.js} +14 -14
  10. package/dist/{BlogSinglePage-G7TUMA4L.js.map → BlogSinglePage-STNMFQHX.js.map} +1 -1
  11. package/dist/{BlogTagPage-3LFUVXP3.js → BlogTagPage-YD3EPTQY.js} +16 -16
  12. package/dist/{BlogTagPage-3LFUVXP3.js.map → BlogTagPage-YD3EPTQY.js.map} +1 -1
  13. package/dist/{BrandsPage-NA5BVFVS.js → BrandsPage-KJFB4QBN.js} +15 -15
  14. package/dist/{BrandsPage-NA5BVFVS.js.map → BrandsPage-KJFB4QBN.js.map} +1 -1
  15. package/dist/{Breadcrumb-MNSFVYUT.js → Breadcrumb-QKHYTTFB.js} +14 -14
  16. package/dist/{Breadcrumb-MNSFVYUT.js.map → Breadcrumb-QKHYTTFB.js.map} +1 -1
  17. package/dist/{CartItem-N6OPII7B.js → CartItem-DCCYGMRI.js} +14 -14
  18. package/dist/{CartItem-N6OPII7B.js.map → CartItem-DCCYGMRI.js.map} +1 -1
  19. package/dist/{CartSummary-LGYAIG7C.js → CartSummary-DAAYDRFS.js} +14 -14
  20. package/dist/{CartSummary-LGYAIG7C.js.map → CartSummary-DAAYDRFS.js.map} +1 -1
  21. package/dist/{Copyright-YXWJNV5Q.js → Copyright-GL5Q4FTN.js} +3 -3
  22. package/dist/{Copyright-YXWJNV5Q.js.map → Copyright-GL5Q4FTN.js.map} +1 -1
  23. package/dist/{CustomerLayout-YU7TKV2Q.js → CustomerLayout-D7HC4G7V.js} +14 -14
  24. package/dist/{CustomerLayout-YU7TKV2Q.js.map → CustomerLayout-D7HC4G7V.js.map} +1 -1
  25. package/dist/{Footer-4QV4H67O.js → Footer-3NQWLPAA.js} +4 -4
  26. package/dist/{Footer-4QV4H67O.js.map → Footer-3NQWLPAA.js.map} +1 -1
  27. package/dist/{Header-DEUDDAWD.js → Header-SCR46P4B.js} +8 -8
  28. package/dist/{Header-DEUDDAWD.js.map → Header-SCR46P4B.js.map} +1 -1
  29. package/dist/{LatestProducts-KA54KWOQ.js → LatestProducts-4UML6BNG.js} +16 -16
  30. package/dist/{LatestProducts-KA54KWOQ.js.map → LatestProducts-4UML6BNG.js.map} +1 -1
  31. package/dist/{LoyaltyPage-7FJROQFU.js → LoyaltyPage-CQIUT7MD.js} +14 -14
  32. package/dist/{LoyaltyPage-7FJROQFU.js.map → LoyaltyPage-CQIUT7MD.js.map} +1 -1
  33. package/dist/{LoyaltyPointsPage-JXT65P5U.js → LoyaltyPointsPage-ZOZFDRZT.js} +6 -6
  34. package/dist/{LoyaltyPointsPage-JXT65P5U.js.map → LoyaltyPointsPage-ZOZFDRZT.js.map} +1 -1
  35. package/dist/{MainMenu-UOAPVNJH.js → MainMenu-YLCB4MT7.js} +5 -5
  36. package/dist/{MainMenu-UOAPVNJH.js.map → MainMenu-YLCB4MT7.js.map} +1 -1
  37. package/dist/{MasterLayout-Z45QJW3M.js → MasterLayout-BDDKPLS6.js} +14 -14
  38. package/dist/{MasterLayout-Z45QJW3M.js.map → MasterLayout-BDDKPLS6.js.map} +1 -1
  39. package/dist/{MobileMenu-A4QIBBYN.js → MobileMenu-S5LB622I.js} +15 -15
  40. package/dist/{MobileMenu-A4QIBBYN.js.map → MobileMenu-S5LB622I.js.map} +1 -1
  41. package/dist/{NotificationsPage-XU5IBNPR.js → NotificationsPage-FPF7UU3Q.js} +14 -14
  42. package/dist/{NotificationsPage-XU5IBNPR.js.map → NotificationsPage-FPF7UU3Q.js.map} +1 -1
  43. package/dist/{OrderSinglePage-5ANTMCBP.js → OrderSinglePage-M37ROUBX.js} +15 -15
  44. package/dist/{OrderSinglePage-5ANTMCBP.js.map → OrderSinglePage-M37ROUBX.js.map} +1 -1
  45. package/dist/{OrdersPage-LZLPSDZR.js → OrdersPage-GIZFTPQ7.js} +14 -14
  46. package/dist/{OrdersPage-LZLPSDZR.js.map → OrdersPage-GIZFTPQ7.js.map} +1 -1
  47. package/dist/{PageSingle-PMLCSRMC.js → PageSingle-EQD5Y3L5.js} +3 -3
  48. package/dist/{PageSingle-PMLCSRMC.js.map → PageSingle-EQD5Y3L5.js.map} +1 -1
  49. package/dist/{ProductDetails-ECPCGZLO.js → ProductDetails-53BXVF37.js} +4 -4
  50. package/dist/{ProductDetails-ECPCGZLO.js.map → ProductDetails-53BXVF37.js.map} +1 -1
  51. package/dist/{ProfilePage-XVWB4ZOO.js → ProfilePage-6GJXTBFN.js} +14 -14
  52. package/dist/{ProfilePage-XVWB4ZOO.js.map → ProfilePage-6GJXTBFN.js.map} +1 -1
  53. package/dist/{ReviewsPage-6EOSOIU4.js → ReviewsPage-SCHVMKXV.js} +3 -3
  54. package/dist/{ReviewsPage-6EOSOIU4.js.map → ReviewsPage-SCHVMKXV.js.map} +1 -1
  55. package/dist/{SeoCartWidget-TYNXS4UD.js → SeoCartWidget-IUXLYOTC.js} +14 -14
  56. package/dist/{SeoCartWidget-TYNXS4UD.js.map → SeoCartWidget-IUXLYOTC.js.map} +1 -1
  57. package/dist/{SettingsPage-BHW3CJC6.js → SettingsPage-2TKL2COF.js} +14 -14
  58. package/dist/{SettingsPage-BHW3CJC6.js.map → SettingsPage-2TKL2COF.js.map} +1 -1
  59. package/dist/{StoreClosedNotification-7YHL4XTT.js → StoreClosedNotification-HHOQXT6N.js} +15 -15
  60. package/dist/{StoreClosedNotification-7YHL4XTT.js.map → StoreClosedNotification-HHOQXT6N.js.map} +1 -1
  61. package/dist/{TestimonialsPage-ZY2U4QDN.js → TestimonialsPage-GJJT7F5G.js} +3 -3
  62. package/dist/{TestimonialsPage-ZY2U4QDN.js.map → TestimonialsPage-GJJT7F5G.js.map} +1 -1
  63. package/dist/{ThankYouPage-MINROTEH.js → ThankYouPage-ZAEZWSUK.js} +14 -14
  64. package/dist/{ThankYouPage-MINROTEH.js.map → ThankYouPage-ZAEZWSUK.js.map} +1 -1
  65. package/dist/{WalletPage-4VFAGWIE.js → WalletPage-74LAUONG.js} +15 -15
  66. package/dist/{WalletPage-4VFAGWIE.js.map → WalletPage-74LAUONG.js.map} +1 -1
  67. package/dist/{WebMcpTools-F42SFWVP.js → WebMcpTools-J6HCO5B6.js} +5 -5
  68. package/dist/{WebMcpTools-F42SFWVP.js.map → WebMcpTools-J6HCO5B6.js.map} +1 -1
  69. package/dist/{WishlistPage-VMM4YDMX.js → WishlistPage-SV55V5CP.js} +16 -16
  70. package/dist/{WishlistPage-VMM4YDMX.js.map → WishlistPage-SV55V5CP.js.map} +1 -1
  71. package/dist/api/advertisement.js +2 -2
  72. package/dist/api/apps.js +2 -2
  73. package/dist/api/blog.js +3 -3
  74. package/dist/api/brands.js +3 -3
  75. package/dist/api/cart.js +3 -3
  76. package/dist/api/category.js +3 -3
  77. package/dist/api/client.js +1 -1
  78. package/dist/api/home.js +2 -2
  79. package/dist/api/loyalty.js +3 -3
  80. package/dist/api/menu.js +2 -2
  81. package/dist/api/notification.js +2 -2
  82. package/dist/api/order.js +3 -3
  83. package/dist/api/page.js +3 -3
  84. package/dist/api/product.js +3 -3
  85. package/dist/api/profile.js +1 -1
  86. package/dist/api/store.js +2 -2
  87. package/dist/api/translations.js +2 -2
  88. package/dist/api/user.js +2 -2
  89. package/dist/api/wallet.js +2 -2
  90. package/dist/api/wishlist.js +4 -4
  91. package/dist/{chunk-WZAJS44F.js → chunk-4SZNUX4K.js} +11 -11
  92. package/dist/{chunk-WZAJS44F.js.map → chunk-4SZNUX4K.js.map} +1 -1
  93. package/dist/{chunk-N2Y5VSHM.js → chunk-5VTVPQQB.js} +4 -4
  94. package/dist/{chunk-N2Y5VSHM.js.map → chunk-5VTVPQQB.js.map} +1 -1
  95. package/dist/{chunk-DGPSZUI3.js → chunk-64RDACOS.js} +4 -4
  96. package/dist/{chunk-DGPSZUI3.js.map → chunk-64RDACOS.js.map} +1 -1
  97. package/dist/{chunk-R6Z6JQIB.js → chunk-677OXNGV.js} +3 -3
  98. package/dist/{chunk-R6Z6JQIB.js.map → chunk-677OXNGV.js.map} +1 -1
  99. package/dist/{chunk-OGEG4QHV.js → chunk-A2SS3TNE.js} +3 -3
  100. package/dist/{chunk-OGEG4QHV.js.map → chunk-A2SS3TNE.js.map} +1 -1
  101. package/dist/{chunk-R4QBCQ4K.js → chunk-AFFBCOH6.js} +3 -3
  102. package/dist/{chunk-R4QBCQ4K.js.map → chunk-AFFBCOH6.js.map} +1 -1
  103. package/dist/{chunk-SF2POPJW.js → chunk-AU2XMLTH.js} +3 -3
  104. package/dist/{chunk-SF2POPJW.js.map → chunk-AU2XMLTH.js.map} +1 -1
  105. package/dist/{chunk-F6MYOPZB.js → chunk-BIVBSVWR.js} +4 -4
  106. package/dist/{chunk-F6MYOPZB.js.map → chunk-BIVBSVWR.js.map} +1 -1
  107. package/dist/{chunk-CEIXIUJ7.js → chunk-BWKHA4ZD.js} +4 -4
  108. package/dist/{chunk-CEIXIUJ7.js.map → chunk-BWKHA4ZD.js.map} +1 -1
  109. package/dist/{chunk-DXQUURZX.js → chunk-BY4DQTOG.js} +7 -7
  110. package/dist/{chunk-DXQUURZX.js.map → chunk-BY4DQTOG.js.map} +1 -1
  111. package/dist/{chunk-6R2AUQMP.js → chunk-CV32FSEL.js} +3 -3
  112. package/dist/{chunk-6R2AUQMP.js.map → chunk-CV32FSEL.js.map} +1 -1
  113. package/dist/{chunk-77SZTUQE.js → chunk-EAQAPYYU.js} +7 -7
  114. package/dist/{chunk-77SZTUQE.js.map → chunk-EAQAPYYU.js.map} +1 -1
  115. package/dist/{chunk-PHWFTUTE.js → chunk-EFKVEYML.js} +5 -5
  116. package/dist/{chunk-PHWFTUTE.js.map → chunk-EFKVEYML.js.map} +1 -1
  117. package/dist/{chunk-A7E6XFZC.js → chunk-F5RU2UCE.js} +15 -15
  118. package/dist/{chunk-A7E6XFZC.js.map → chunk-F5RU2UCE.js.map} +1 -1
  119. package/dist/{chunk-YQ365K65.js → chunk-FCFIG4M3.js} +3 -3
  120. package/dist/{chunk-YQ365K65.js.map → chunk-FCFIG4M3.js.map} +1 -1
  121. package/dist/{chunk-MQU6G2ZE.js → chunk-HSJCVD3P.js} +4 -4
  122. package/dist/{chunk-MQU6G2ZE.js.map → chunk-HSJCVD3P.js.map} +1 -1
  123. package/dist/{chunk-DKIU6ZOP.js → chunk-I3KAWUPG.js} +4 -4
  124. package/dist/{chunk-DKIU6ZOP.js.map → chunk-I3KAWUPG.js.map} +1 -1
  125. package/dist/{chunk-QNGA2NAC.js → chunk-I5GFTVR2.js} +4 -4
  126. package/dist/{chunk-QNGA2NAC.js.map → chunk-I5GFTVR2.js.map} +1 -1
  127. package/dist/{chunk-KBWIXAHN.js → chunk-IO4CVUL5.js} +3 -3
  128. package/dist/{chunk-KBWIXAHN.js.map → chunk-IO4CVUL5.js.map} +1 -1
  129. package/dist/{chunk-MVSOSNNB.js → chunk-JWYZLXJZ.js} +5 -5
  130. package/dist/{chunk-MVSOSNNB.js.map → chunk-JWYZLXJZ.js.map} +1 -1
  131. package/dist/{chunk-ULGRYCUV.js → chunk-KNY2ZZ5M.js} +3 -3
  132. package/dist/{chunk-ULGRYCUV.js.map → chunk-KNY2ZZ5M.js.map} +1 -1
  133. package/dist/{chunk-LRQ75MWP.js → chunk-LAO3MSKN.js} +7 -7
  134. package/dist/{chunk-LRQ75MWP.js.map → chunk-LAO3MSKN.js.map} +1 -1
  135. package/dist/{chunk-K577255O.js → chunk-LJXWCGBH.js} +7 -7
  136. package/dist/{chunk-K577255O.js.map → chunk-LJXWCGBH.js.map} +1 -1
  137. package/dist/{chunk-O7PJBTH3.js → chunk-LPF6YURL.js} +3 -3
  138. package/dist/{chunk-O7PJBTH3.js.map → chunk-LPF6YURL.js.map} +1 -1
  139. package/dist/{chunk-CATEET2N.js → chunk-MJQ3HFLJ.js} +3 -3
  140. package/dist/{chunk-CATEET2N.js.map → chunk-MJQ3HFLJ.js.map} +1 -1
  141. package/dist/{chunk-3JJQCRXD.js → chunk-N2RAPPQ3.js} +4 -4
  142. package/dist/{chunk-3JJQCRXD.js.map → chunk-N2RAPPQ3.js.map} +1 -1
  143. package/dist/{chunk-Q76O67KK.js → chunk-O76H6TDP.js} +3 -3
  144. package/dist/{chunk-Q76O67KK.js.map → chunk-O76H6TDP.js.map} +1 -1
  145. package/dist/{chunk-DKPM4T4C.js → chunk-OZRGUVHQ.js} +4 -4
  146. package/dist/{chunk-DKPM4T4C.js.map → chunk-OZRGUVHQ.js.map} +1 -1
  147. package/dist/{chunk-GZUBV5S3.js → chunk-R4LA6IMS.js} +3 -3
  148. package/dist/{chunk-GZUBV5S3.js.map → chunk-R4LA6IMS.js.map} +1 -1
  149. package/dist/{chunk-OJ4PJK27.js → chunk-S5KE6KPV.js} +4 -4
  150. package/dist/{chunk-OJ4PJK27.js.map → chunk-S5KE6KPV.js.map} +1 -1
  151. package/dist/{chunk-3ULBL56H.js → chunk-SIYINCXL.js} +3 -3
  152. package/dist/{chunk-3ULBL56H.js.map → chunk-SIYINCXL.js.map} +1 -1
  153. package/dist/{chunk-SBZWX6II.js → chunk-SXJEZEGN.js} +3 -3
  154. package/dist/{chunk-SBZWX6II.js.map → chunk-SXJEZEGN.js.map} +1 -1
  155. package/dist/{chunk-T7H5KE5Y.js → chunk-UBRG55VM.js} +4 -4
  156. package/dist/{chunk-T7H5KE5Y.js.map → chunk-UBRG55VM.js.map} +1 -1
  157. package/dist/{chunk-5CXBBDJB.js → chunk-UG44HSCN.js} +4 -4
  158. package/dist/{chunk-5CXBBDJB.js.map → chunk-UG44HSCN.js.map} +1 -1
  159. package/dist/{chunk-LDXVGQA2.js → chunk-UL2DRYH3.js} +3 -3
  160. package/dist/{chunk-LDXVGQA2.js.map → chunk-UL2DRYH3.js.map} +1 -1
  161. package/dist/{chunk-Z4BOATCC.js → chunk-URBOD4MX.js} +3 -3
  162. package/dist/{chunk-Z4BOATCC.js.map → chunk-URBOD4MX.js.map} +1 -1
  163. package/dist/{chunk-CH6BNMS6.js → chunk-VBAFSMNX.js} +3 -3
  164. package/dist/{chunk-CH6BNMS6.js.map → chunk-VBAFSMNX.js.map} +1 -1
  165. package/dist/{chunk-RRDKYXHU.js → chunk-XEHOZTER.js} +3 -3
  166. package/dist/{chunk-RRDKYXHU.js.map → chunk-XEHOZTER.js.map} +1 -1
  167. package/dist/{chunk-GYJJX4EI.js → chunk-XTBFIIAR.js} +4 -4
  168. package/dist/{chunk-GYJJX4EI.js.map → chunk-XTBFIIAR.js.map} +1 -1
  169. package/dist/{chunk-H7A7LOQJ.js → chunk-ZBGMIDDO.js} +3 -3
  170. package/dist/{chunk-H7A7LOQJ.js.map → chunk-ZBGMIDDO.js.map} +1 -1
  171. package/dist/{chunk-WJCDY35D.js → chunk-ZC4O472R.js} +5 -5
  172. package/dist/{chunk-WJCDY35D.js.map → chunk-ZC4O472R.js.map} +1 -1
  173. package/dist/components/cart/index.js +1 -1
  174. package/dist/components/common/index.js +1 -1
  175. package/dist/components/drawer/index.js +12 -12
  176. package/dist/components/home/index.js +17 -17
  177. package/dist/components/layout/index.js +4 -4
  178. package/dist/components/product/index.js +14 -14
  179. package/dist/components/store/index.js +13 -13
  180. package/dist/dev/editor/index.js +1 -1
  181. package/dist/dev/index.js +1 -1
  182. package/dist/{document-class-QZXX5ZEE.js → document-class-XYBFXCE7.js} +12 -12
  183. package/dist/{document-class-QZXX5ZEE.js.map → document-class-XYBFXCE7.js.map} +1 -1
  184. package/dist/hooks/index.js +12 -12
  185. package/dist/hooks/useGtm.js +12 -12
  186. package/dist/hooks/useMoney.js +12 -12
  187. package/dist/hooks/useStore.js +12 -12
  188. package/dist/hooks/useUser.js +3 -3
  189. package/dist/index.js +12 -12
  190. package/dist/{navigation-FKU75TCE.js → navigation-QDTYXINL.js} +4 -4
  191. package/dist/{navigation-FKU75TCE.js.map → navigation-QDTYXINL.js.map} +1 -1
  192. package/dist/{navigation-DF4JEVKE.js → navigation-SHFUWYCA.js} +5 -5
  193. package/dist/{navigation-DF4JEVKE.js.map → navigation-SHFUWYCA.js.map} +1 -1
  194. package/dist/{not-found-E72Z34CJ.js → not-found-IFD562WC.js} +15 -15
  195. package/dist/{not-found-E72Z34CJ.js.map → not-found-IFD562WC.js.map} +1 -1
  196. package/dist/providers/index.js +12 -12
  197. package/dist/routes/account/orders.js +4 -4
  198. package/dist/routes/account.js +13 -13
  199. package/dist/routes/blog.js +8 -8
  200. package/dist/routes/brands.js +4 -4
  201. package/dist/routes/cart.js +21 -21
  202. package/dist/routes/home.js +18 -18
  203. package/dist/routes/index.js +3 -3
  204. package/dist/routes/loyalty.js +5 -5
  205. package/dist/routes/page/loader.d.ts.map +1 -1
  206. package/dist/routes/page.js +5 -4
  207. package/dist/routes/page.js.map +1 -1
  208. package/dist/routes/product/loader.d.ts.map +1 -1
  209. package/dist/routes/product-listing.js +22 -22
  210. package/dist/routes/product.js +18 -17
  211. package/dist/routes/product.js.map +1 -1
  212. package/dist/routes/seo-redirects.js +3 -3
  213. package/dist/routes/testimonials.js +2 -2
  214. package/dist/routes/thank-you.js +4 -4
  215. package/dist/skeleton.js +18 -18
  216. package/dist/{store-lookup-LPXG5JSB.js → store-lookup-AJT3ZHTS.js} +8 -8
  217. package/dist/{store-lookup-LPXG5JSB.js.map → store-lookup-AJT3ZHTS.js.map} +1 -1
  218. package/dist/tanstack/templates/locale-wrapper.d.ts +3 -1
  219. package/dist/tanstack/templates/locale-wrapper.d.ts.map +1 -1
  220. package/dist/tanstack.js +12 -12
  221. package/dist/utils/index.js +2 -2
  222. package/dist/vite/index.js +29 -11
  223. package/dist/vite/index.js.map +1 -1
  224. package/package.json +1 -1
  225. package/tailwind/routes/page/loader.ts.txt +4 -0
  226. package/tailwind/routes/product/loader.ts.txt +5 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/vite/plugins/assets-base.plugin.ts","../../src/vite/plugins/salla-hydration.plugin.ts","../../src/vite/plugins/theme-translations.plugin.ts","../../src/vite/plugins/twilight-schema.ts","../../src/vite/plugins/twilight-schema.plugin.ts","../../src/vite/plugins/best-practices/rules/no-deep-component-import.ts","../../src/vite/plugins/best-practices/rules/no-window-location-reload.ts","../../src/vite/plugins/best-practices/rules/no-manual-dom.ts","../../src/vite/plugins/best-practices/rules/no-img-without-dimensions.ts","../../src/vite/plugins/best-practices/rules/no-direct-product-card-import.ts","../../src/vite/plugins/best-practices/hooks-registry.ts","../../src/vite/plugins/best-practices/rules/require-page-hooks.ts","../../src/vite/plugins/best-practices/rules/index.ts","../../src/vite/plugins/best-practices/reporter.ts","../../src/vite/plugins/best-practices/best-practices.plugin.ts","../../src/vite/plugins/package-aliases.plugin.ts","../../src/vite/plugins/component-deps.ts","../../src/vite/plugins/worker-config.ts","../../src/tanstack/templates/locale-wrapper.ts","../../src/tanstack/templates/redirect.ts","../../src/tanstack/templates/account-layout.ts","../../src/vite/adapters/tanstack.adapter.ts","../../src/vite/adapters/nextjs.adapter.ts","../../src/vite/adapters/index.ts","../../src/vite/twilight-react.ts"],"names":["VIRTUAL_ID","RESOLVED_ID","readFile","resolve","dirname","createHash","existsSync","join","readFileSync","fileURLToPath","basename","loaderCall","componentFn","returnType","relative","mkdirSync","writeFileSync"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @fileoverview Where a built theme's client files are served from.\n *\n * A deployed theme is a worker, and the worker carries its client bundle as its\n * own static assets — so by default every script, stylesheet and font a page\n * asks for is answered by the storefront's hostname\n * (`https://<store>/assets/app-abc.js`). The platform can put those same bytes\n * on a CDN instead, and when it does it tells the build where, through\n * {@link ASSETS_BASE_URL_ENV}.\n *\n * The whole mechanism is Vite's `base`, set to an absolute URL, and that is\n * enough on its own because every emitter of an asset URL already reads it:\n *\n * - Vite writes it into the client bundle — the dynamic-import preload helper\n * and every `url(...)` in the emitted CSS;\n * - TanStack Start builds its manifest from it, so the `<script>`, `<link>` and\n * `modulepreload` tags in the server-rendered HTML carry it too.\n *\n * And it moves nothing that must stay on the storefront. Start resolves an\n * absolute `base` to a router basepath of `/` and keeps `/_serverFn` relative to\n * that, so routing and server functions still answer on the store's own host.\n * (`normalizePublicBase` / `deriveRouterBasepath` in `@tanstack/start-plugin-core`.)\n *\n * Build only. `vite dev` serves modules from its own origin, and a dev server\n * that tried to load them from a CDN would load nothing.\n */\nimport type { Plugin } from 'vite';\n\n/**\n * Set by the build service on `pnpm build`, never by a theme.\n *\n * An environment variable rather than a plugin option, because the value is\n * the platform's decision about where it hosts files, not the theme's: a theme's\n * `vite.config.ts` is partner code, and the one input the platform controls at\n * build time is the environment the command runs in.\n */\nexport const ASSETS_BASE_URL_ENV = 'TWILIGHT_ASSETS_BASE_URL';\n\n/**\n * The value as a Vite `base`: absolute, no query or fragment, ending in `/`.\n *\n * `undefined` for unset or blank, which leaves `base` exactly as the theme has\n * it. Anything else that is not a usable URL **throws** rather than being\n * ignored. The variable is only ever set by the platform, so a malformed one is\n * the platform's bug, and ignoring it would produce the worst version of that\n * bug: a build that succeeds, deploys, and serves every asset from the wrong\n * place with nothing in the log to say so.\n *\n * The trailing slash is added, not required. Vite joins `base` and a file name\n * by concatenation, so `https://cdn/x` + `assets/a.js` is `https://cdn/xassets/a.js`.\n */\nexport function resolveAssetsBaseUrl(raw: string | undefined): string | undefined {\n const value = raw?.trim();\n if (!value) return undefined;\n\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(`[twilight-react] ${ASSETS_BASE_URL_ENV} is not an absolute URL: ${value}`);\n }\n\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n throw new Error(\n `[twilight-react] ${ASSETS_BASE_URL_ENV} must be an http(s) URL, got ${url.protocol}`\n );\n }\n // Each of these would ride along into every asset URL the build emits — a\n // `?v=1` becomes `https://cdn/?v=1assets/a.js` — so none of them has a\n // meaning here that is not a mistake.\n if (url.search || url.hash || url.username || url.password) {\n throw new Error(\n `[twilight-react] ${ASSETS_BASE_URL_ENV} must be a plain base URL with no query, ` +\n `fragment or credentials: ${value}`\n );\n }\n\n const path = url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`;\n return `${url.origin}${path}`;\n}\n\n/**\n * Sets Vite's `base` from {@link ASSETS_BASE_URL_ENV} on a build.\n *\n * `enforce: 'pre'` and registered ahead of `tanstackStart`, and both halves are\n * needed. Vite runs `config` hooks in order and merges each result before\n * calling the next, and Start's own config hook — also `pre` — reads `base` once\n * to build its manifest. Registered after it, Vite would emit CDN URLs into the\n * bundle while Start wrote root-relative ones into the HTML, and a page would\n * load its entry from one place and its chunks from another.\n *\n * It overrides a `base` the theme set itself, on purpose: when the platform has\n * uploaded the files to a CDN, that is where they are.\n */\nexport function assetsBasePlugin(env: NodeJS.ProcessEnv = process.env): Plugin {\n return {\n name: 'twilight:assets-base',\n enforce: 'pre',\n config(_config, { command }) {\n if (command !== 'build') return undefined;\n\n const base = resolveAssetsBaseUrl(env[ASSETS_BASE_URL_ENV]);\n return base ? { base } : undefined;\n },\n };\n}\n","import type { Plugin } from 'vite';\n\n// Regex to match opening tags of salla-* or custom-* web components\nconst TAG_START_RE = /<(?:salla|custom)-[a-z][a-z0-9-]*/g;\n\n/**\n * Vite plugin that automatically adds `suppressHydrationWarning` to all Salla\n * web components (`salla-*` and `custom-*`) in JSX/TSX source files.\n *\n * All Salla web components are built with Stencil.js, which adds\n * `class=\"hydrated\"` and may inject light DOM content after the browser parses\n * the SSR HTML but before React's `hydrateRoot` runs. Without suppression,\n * React throws a hydration mismatch and regenerates the entire subtree.\n */\nexport function webHydrationPlugin(): Plugin {\n return {\n name: 'twilight:web-hydration',\n enforce: 'pre',\n transform(code, id) {\n if (!/\\.[jt]sx$/.test(id)) return null;\n if (!/<(?:salla|custom)-[a-z]/.test(code)) return null;\n\n let result = '';\n let lastIndex = 0;\n\n TAG_START_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = TAG_START_RE.exec(code)) !== null) {\n const tagStart = match.index;\n const afterTag = tagStart + match[0].length;\n\n // Walk forward from after the tag name, skipping JSX expression\n // braces { } so we don't mistake `>` inside `() =>` or generics\n // for the tag's closing bracket.\n let i = afterTag;\n let braceDepth = 0;\n let closingPos = -1;\n let isSelfClosing = false;\n\n while (i < code.length) {\n const ch = code[i];\n if (ch === '{') {\n braceDepth++;\n } else if (ch === '}') {\n braceDepth--;\n } else if (braceDepth === 0 && ch === '>') {\n isSelfClosing = i > 0 && code[i - 1] === '/';\n closingPos = i;\n break;\n }\n i++;\n }\n\n if (closingPos === -1) break; // malformed, bail out\n\n const propsSlice = code.slice(afterTag, isSelfClosing ? closingPos - 1 : closingPos);\n\n if (propsSlice.includes('suppressHydrationWarning')) {\n // Already present — skip past this tag\n TAG_START_RE.lastIndex = closingPos + 1;\n continue;\n }\n\n // Insert suppressHydrationWarning before the closing > or />\n const insertPos = isSelfClosing ? closingPos - 1 : closingPos;\n result += code.slice(lastIndex, insertPos) + ' suppressHydrationWarning';\n lastIndex = insertPos;\n TAG_START_RE.lastIndex = closingPos + 1;\n }\n\n if (lastIndex === 0) return null; // nothing changed\n result += code.slice(lastIndex);\n return { code: result };\n },\n };\n}\n","/**\n * Vite plugin that exposes a `virtual:twilight/theme-translations` module\n * built from all `*.json` files found in the configured `localesDir`.\n *\n * The virtual module exports a `TranslationMessages` object keyed by\n * `{locale}.trans` so it maps directly into the i18next `theme` namespace.\n *\n * @example\n * // vite.config.ts\n * twilightReact({ localesDir: './locales' })\n *\n * // virtual module output (auto-generated, never written to disk):\n * export default {\n * 'ar.trans': { \"key\": \"قيمة\" },\n * 'en.trans': { \"key\": \"value\" },\n * };\n */\n\nimport type { Plugin } from 'vite';\nimport { readdir, readFile } from 'fs/promises';\nimport { join, basename, resolve } from 'path';\n\nconst VIRTUAL_ID = 'virtual:twilight/theme-translations';\nconst RESOLVED_ID = '\\0' + VIRTUAL_ID;\n\nexport function themeTranslationsPlugin(localesDir?: string): Plugin {\n let resolvedLocalesDir: string | undefined;\n\n return {\n name: 'twilight:translations',\n\n configResolved(config) {\n if (localesDir) {\n resolvedLocalesDir = resolve(config.root, localesDir);\n }\n },\n\n resolveId(id) {\n if (id === VIRTUAL_ID) return RESOLVED_ID;\n },\n\n async load(id) {\n if (id !== RESOLVED_ID) return;\n if (!resolvedLocalesDir) return 'export default {};';\n\n try {\n const files = await readdir(resolvedLocalesDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n if (jsonFiles.length === 0) return 'export default {};';\n\n const entries: string[] = [];\n for (const file of jsonFiles) {\n const locale = basename(file, '.json');\n const content = await readFile(join(resolvedLocalesDir, file), 'utf-8');\n const data = JSON.parse(content);\n entries.push(` '${locale}.trans': ${JSON.stringify(data)}`);\n }\n\n return `export default {\\n${entries.join(',\\n')}\\n};\\n`;\n } catch {\n return 'export default {};';\n }\n },\n\n configureServer(server) {\n if (!resolvedLocalesDir) return;\n\n server.watcher.add(join(resolvedLocalesDir, '*.json'));\n\n server.watcher.on('change', (file) => {\n if (file.startsWith(resolvedLocalesDir!) && file.endsWith('.json')) {\n const mod = server.moduleGraph.getModuleById(RESOLVED_ID);\n if (mod) server.moduleGraph.invalidateModule(mod);\n }\n });\n\n server.watcher.on('add', (file) => {\n if (file.startsWith(resolvedLocalesDir!) && file.endsWith('.json')) {\n const mod = server.moduleGraph.getModuleById(RESOLVED_ID);\n if (mod) server.moduleGraph.invalidateModule(mod);\n }\n });\n },\n };\n}\n","/**\n * Pure transform: twilight.json → {@link DevSchema}. Runs in Node (dev-server\n * build step), so it must stay dependency-free and defensive about shape — a\n * hand-edited twilight.json can have missing/renamed keys.\n *\n * twilight.json quirks this handles (see raed/twilight.json):\n * - A setting/field has BOTH a semantic `type` (boolean|items|static|string|\n * collection) and a widget `format` (switch|dropdown-list|text|...).\n * - Boolean/string defaults live in `value`; single-select defaults live in\n * `selected` (settings list) OR `value` (component fields) — we read either.\n * - `static` entries are presentational (HTML) and are skipped.\n * - `collection` entries nest their item `fields`, whose ids carry the\n * collection's id as a prefix (`slides.image`).\n * - `variable-list` and remote-source items (products, brands, categories)\n * need a live store to pick from, so they are surfaced as `readonly`.\n * - Collection rows key their values `<collection>.<field>` in twilight.json,\n * but the API hands a block plain `<field>` keys, so `blockDefaults` strips\n * the prefix.\n */\n\nimport type {\n DevFieldCondition,\n DevSchema,\n DevSchemaComponent,\n DevSchemaField,\n DevSchemaOption,\n} from '../../dev/schema-types';\n\ninterface RawEntry {\n id?: string;\n type?: string;\n format?: string;\n label?: string | null;\n value?: unknown;\n selected?: unknown;\n options?: unknown;\n source?: string;\n fields?: RawEntry[];\n description?: unknown;\n placeholder?: unknown;\n minimum?: unknown;\n maximum?: unknown;\n minLength?: unknown;\n maxLength?: unknown;\n item_label?: unknown;\n multichoice?: unknown;\n sources?: unknown;\n conditions?: unknown;\n}\n\ninterface RawComponent {\n image?: unknown;\n icon?: unknown;\n path?: string;\n key?: string;\n title?: unknown;\n fields?: RawEntry[];\n}\n\n/** `string` formats edited as one line of text. `color`, `url` and friends included. */\nconst TEXT_FORMATS = new Set(['text', 'icon', 'line', 'hidden', 'url', 'email', 'color']);\n\nfunction text(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value : undefined;\n}\n\nfunction num(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\n/** twilight.json `conditions`, keeping only entries that name a field. */\nfunction toConditions(raw: unknown): DevFieldCondition[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const conditions = raw.flatMap((c): DevFieldCondition[] => {\n const obj = (c ?? {}) as Record<string, unknown>;\n if (typeof obj.id !== 'string' || !obj.id) return [];\n const operation = typeof obj.operation === 'string' && obj.operation ? obj.operation : '=';\n return [{ id: obj.id, operation, value: obj.value }];\n });\n return conditions.length ? conditions : undefined;\n}\n\n/** The optional bits every kind of field can carry, left out when absent. */\nfunction extras(entry: RawEntry): Partial<DevSchemaField> {\n const out: Partial<DevSchemaField> = {};\n const description = text(entry.description);\n const placeholder = text(entry.placeholder);\n const conditions = toConditions(entry.conditions);\n if (description) out.description = description;\n if (placeholder) out.placeholder = placeholder;\n if (conditions) out.conditions = conditions;\n return out;\n}\n\nfunction labelOf(entry: RawEntry, fallback: string): string {\n return typeof entry.label === 'string' && entry.label.trim() ? entry.label : fallback;\n}\n\nfunction titleOf(component: RawComponent): string {\n const t = component.title;\n const fallback = component.path ?? component.key ?? 'component';\n if (t && typeof t === 'object') {\n const obj = t as Record<string, unknown>;\n const en = typeof obj.en === 'string' ? obj.en : undefined;\n const ar = typeof obj.ar === 'string' ? obj.ar : undefined;\n return en || ar || fallback;\n }\n return typeof t === 'string' && t ? t : fallback;\n}\n\nfunction toOptions(raw: unknown): DevSchemaOption[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const opts = raw\n .map((o): DevSchemaOption => {\n const obj = (o ?? {}) as Record<string, unknown>;\n const value = obj.value ?? obj.key ?? '';\n const label = obj.label ?? obj.value ?? obj.key ?? '';\n return { label: String(label), value: String(value) };\n })\n .filter((o) => o.value !== '');\n return opts.length ? opts : undefined;\n}\n\n/** Extract a scalar default from a `value`/`selected` field that may be an\n * array of chosen option objects, an array of scalars, or a bare scalar. */\nfunction firstScalar(v: unknown): unknown {\n if (Array.isArray(v)) {\n const first = v[0];\n if (first && typeof first === 'object') {\n const obj = first as Record<string, unknown>;\n return obj.value ?? obj.key ?? undefined;\n }\n return first;\n }\n return v;\n}\n\nconst ENTITY_SOURCES = [\n 'products',\n 'categories',\n 'brands',\n 'blog_articles',\n 'blog_categories',\n] as const;\n\nfunction isEntitySource(source: unknown): source is (typeof ENTITY_SOURCES)[number] {\n return (ENTITY_SOURCES as readonly unknown[]).includes(source);\n}\n\nfunction classifyString(entry: RawEntry, id: string, label: string): DevSchemaField | null {\n const { format } = entry;\n const value = typeof entry.value === 'string' ? entry.value : '';\n const base = { id, label, default: value, ...extras(entry) };\n if (format === 'textarea') return { ...base, kind: 'textarea' };\n if (format === 'image') return { ...base, kind: 'image' };\n if (typeof format === 'string' && TEXT_FORMATS.has(format)) return { ...base, kind: 'text' };\n return null;\n}\n\nfunction classifyCollection(entry: RawEntry, id: string, label: string): DevSchemaField {\n const prefix = `${id}.`;\n const fields: DevSchemaField[] = [];\n for (const sub of Array.isArray(entry.fields) ? entry.fields : []) {\n const subId =\n typeof sub.id === 'string' && sub.id.startsWith(prefix)\n ? sub.id.slice(prefix.length)\n : sub.id;\n const field = classify({ ...sub, id: subId });\n if (!field) continue;\n // Conditions name their sibling the way twilight.json does (`slides.x`); a row\n // holds it without the prefix, like the field ids above.\n field.conditions = field.conditions?.map((c) =>\n c.id.startsWith(prefix) ? { ...c, id: c.id.slice(prefix.length) } : c\n );\n if (!field.conditions) delete field.conditions;\n fields.push(field);\n }\n const min = num(entry.minLength);\n const max = num(entry.maxLength);\n const itemLabel = text(entry.item_label);\n return {\n id,\n label,\n kind: 'collection',\n default: collectionRows(entry),\n fields,\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n ...(itemLabel ? { itemLabel } : {}),\n ...extras(entry),\n };\n}\n\nfunction classify(entry: RawEntry): DevSchemaField | null {\n const id = typeof entry.id === 'string' ? entry.id : '';\n if (!id) return null;\n\n const { type, format } = entry;\n const label = labelOf(entry, id);\n\n // Presentational dividers / titles — nothing to edit.\n if (type === 'static') return null;\n\n if (type === 'boolean') {\n return {\n id,\n label,\n kind: 'toggle',\n default: typeof entry.value === 'boolean' ? entry.value : false,\n ...extras(entry),\n };\n }\n\n if (type === 'items' && format === 'dropdown-list') {\n const options = toOptions(entry.options);\n // Remote-source items (products, brands, categories, blog) have no inline options:\n // the editor picks them from the store, or from samples.\n if (!options && isEntitySource(entry.source)) {\n const min = num(entry.minLength);\n const max = num(entry.maxLength);\n return {\n id,\n label,\n kind: 'entities',\n source: entry.source,\n multiple: entry.multichoice === true,\n default: Array.isArray(entry.value) ? entry.value : [],\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n ...extras(entry),\n };\n }\n if (!options) {\n return {\n id,\n label,\n kind: 'readonly',\n default: null,\n note: `remote (${entry.source ?? 'dynamic'})`,\n ...extras(entry),\n };\n }\n const fallback = options[0]?.value;\n const def = firstScalar(entry.value) ?? firstScalar(entry.selected) ?? fallback;\n return { id, label, kind: 'select', default: def ?? '', options, ...extras(entry) };\n }\n\n if (type === 'string') {\n const field = classifyString(entry, id, label);\n if (field) return field;\n }\n\n if (type === 'number') {\n const min = num(entry.minimum);\n const max = num(entry.maximum);\n return {\n id,\n label,\n kind: 'number',\n default: num(entry.value) ?? null,\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n ...extras(entry),\n };\n }\n\n if (type === 'collection') return classifyCollection(entry, id, label);\n\n if (type === 'items' && format === 'variable-list') {\n const linkSources = toOptions(entry.sources);\n return {\n id,\n label,\n kind: 'link',\n default: typeof entry.value === 'string' ? entry.value : '',\n ...(linkSources ? { linkSources } : {}),\n ...extras(entry),\n };\n }\n\n // variable-list and anything unrecognised: show but don't edit.\n return {\n id,\n label,\n kind: 'readonly',\n default: null,\n note: `${type ?? 'unknown'}/${format ?? '?'}`,\n ...extras(entry),\n };\n}\n\n/** A collection's rows as the API delivers them: `slides.image` → `image`. */\nfunction collectionRows(entry: RawEntry): Record<string, unknown>[] {\n if (!Array.isArray(entry.value)) return [];\n const prefix = `${entry.id}.`;\n return entry.value\n .filter((row): row is Record<string, unknown> => !!row && typeof row === 'object')\n .map((row) =>\n Object.fromEntries(\n Object.entries(row).map(([key, value]) => [\n key.startsWith(prefix) ? key.slice(prefix.length) : key,\n value,\n ])\n )\n );\n}\n\n/**\n * What a newly added block starts with, readonly fields included, so it renders\n * like a configured block instead of crashing on a missing list. Remote lists\n * (products, brands, categories) start empty: they need a live store to resolve.\n */\nfunction blockDefaultsFor(\n fieldsRaw: RawEntry[],\n fields: DevSchemaField[]\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const entry of fieldsRaw) {\n if (typeof entry.id !== 'string' || !entry.id || entry.type === 'static') continue;\n if (entry.type === 'collection') out[entry.id] = collectionRows(entry);\n else if (entry.type === 'items' && entry.format === 'variable-list')\n out[entry.id] = typeof entry.value === 'string' ? entry.value : '';\n else if (entry.type === 'items' && !toOptions(entry.options)) out[entry.id] = [];\n else if (entry.value !== undefined) out[entry.id] = entry.value;\n }\n return { ...out, ...defaultsFor(fields) };\n}\n\nfunction defaultsFor(fields: DevSchemaField[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const f of fields) {\n if (f.kind !== 'readonly') out[f.id] = f.default;\n }\n return out;\n}\n\nfunction localizedOf(name: unknown): Record<string, string> | undefined {\n if (typeof name === 'string' && name) return { ar: name, en: name };\n if (!name || typeof name !== 'object') return undefined;\n const entries = Object.entries(name).filter(\n (entry): entry is [string, string] => typeof entry[1] === 'string' && entry[1] !== ''\n );\n return entries.length ? Object.fromEntries(entries) : undefined;\n}\n\n/** Build the browser-shipped schema from a parsed twilight.json object. */\nexport function buildTwilightSchema(raw: unknown): DevSchema {\n const root = (raw ?? {}) as { name?: unknown; settings?: unknown; components?: unknown };\n\n const settingsRaw: RawEntry[] = Array.isArray(root.settings) ? (root.settings as RawEntry[]) : [];\n const settings: DevSchemaField[] = [];\n for (const s of settingsRaw) {\n const field = classify(s);\n if (field) settings.push(field);\n }\n\n const componentsRaw: RawComponent[] = Array.isArray(root.components)\n ? (root.components as RawComponent[])\n : [];\n const components: DevSchemaComponent[] = [];\n const componentDefaults: Record<string, Record<string, unknown>> = {};\n const blockDefaults: Record<string, Record<string, unknown>> = {};\n for (const c of componentsRaw) {\n const path =\n (typeof c.path === 'string' && c.path) || (typeof c.key === 'string' && c.key) || '';\n if (!path) continue;\n const fieldsRaw = Array.isArray(c.fields) ? c.fields : [];\n const fields: DevSchemaField[] = [];\n for (const fr of fieldsRaw) {\n const field = classify(fr);\n if (field) fields.push(field);\n }\n const key = typeof c.key === 'string' && c.key ? c.key : undefined;\n const titles = c.title && typeof c.title === 'object' ? localizedOf(c.title) : undefined;\n components.push({\n path,\n ...(key ? { key } : {}),\n title: titleOf(c),\n ...(titles ? { titles } : {}),\n ...(text(c.image) ? { image: text(c.image) } : {}),\n ...(typeof c.icon === 'string' && /^sicon-[a-z0-9-]+$/.test(c.icon) ? { icon: c.icon } : {}),\n fields,\n });\n componentDefaults[path] = defaultsFor(fields);\n blockDefaults[path] = blockDefaultsFor(fieldsRaw, fields);\n }\n\n const themeName = localizedOf(root.name);\n return {\n ...(themeName ? { themeName } : {}),\n settings,\n components,\n settingsDefaults: defaultsFor(settings),\n componentDefaults,\n blockDefaults,\n };\n}\n","/**\n * Dev-only Vite plugin that exposes `virtual:twilight/schema` built from the\n * theme's local `twilight.json`. Mirrors `theme-translations.plugin.ts`.\n *\n * The virtual module default-exports a {@link DevSchema} (settings + components\n * + computed defaults) that the `DevSettingsWidget` renders and edits. It is\n * populated ONLY in the dev server; a production build ships an empty schema so\n * no theme manifest leaks into the bundle and the widget tree-shakes away.\n *\n * The module also carries the editor's saved state, `twilight.preview.json`\n * (see {@link DevPreviewState}), and puts it on `globalThis` as it loads. The\n * root route imports this module on the server and in the browser before\n * anything renders, so both renders start from the same saved values and the\n * page hydrates without a flash. The editor saves through `POST\n * /__twilight/preview`; a save re-runs the server's modules so the next render\n * reads it, and a hand edit of the file reloads the open tabs.\n *\n * It also serves the theme editor at `/__twilight/editor`: a page of its own\n * whose entry (`virtual:twilight/editor`) mounts the engine's `ThemeEditor`\n * around the storefront in a frame.\n *\n * It also owns the dev-time check of the manifest's `\"type\": \"react\"` marker\n * (see `twilight-manifest.ts`) — this is the only place the engine reads\n * twilight.json, so it is where a wrong or missing `type` is caught.\n *\n * @example\n * // vite.config.ts\n * twilightReact() // reads ./twilight.json by default\n *\n * // __root.tsx\n * import devSchema from 'virtual:twilight/schema';\n * {import.meta.env.DEV && <DevSettingsWidget schema={devSchema} />}\n */\n\nimport type { Plugin, ViteDevServer } from 'vite';\nimport type { IncomingMessage, ServerResponse } from 'http';\nimport { createHash } from 'crypto';\nimport { mkdir, readFile, writeFile } from 'fs/promises';\nimport { dirname, resolve } from 'path';\nimport { buildTwilightSchema } from './twilight-schema';\nimport { validateTwilightManifest } from './twilight-manifest';\nimport {\n DEV_EDITOR_PATH,\n DEV_PREVIEW_ENDPOINT,\n DEV_PREVIEW_EVENT,\n DEV_PREVIEW_GLOBAL,\n DEV_PREVIEW_IMAGE_ENDPOINT,\n DEV_PREVIEW_IMAGE_MAX_BYTES,\n EMPTY_DEV_SCHEMA,\n normalizePreviewState,\n type DevPreviewState,\n} from '../../dev/schema-types';\n\nconst VIRTUAL_ID = 'virtual:twilight/schema';\nconst RESOLVED_ID = '\\0' + VIRTUAL_ID;\nconst EDITOR_ENTRY_ID = 'virtual:twilight/editor';\nconst RESOLVED_EDITOR_ENTRY_ID = '\\0' + EDITOR_ENTRY_ID;\n\n/** What the editor page runs: the schema (with the saved state) handed to the engine's editor. */\nconst EDITOR_ENTRY = [\n `import schema from '${VIRTUAL_ID}';`,\n `import { mountThemeEditor } from '@salla.sa/twilight-theme-engine/dev/editor';`,\n `mountThemeEditor(document.getElementById('root'), schema);`,\n].join('\\n');\n\n/**\n * The editor page. Vite serves a virtual module at `/@id/__x00__<id>`; going\n * through `transformIndexHtml` adds the Vite client and React's refresh preamble.\n */\n// nosemgrep: interpolates module-level constants only, never request data\nconst EDITOR_HTML = `<!doctype html>\n<html lang=\"ar\" dir=\"rtl\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Theme editor</title>\n <link rel=\"stylesheet\" href=\"https://cdn.salla.network/fonts/pingarlt.css\" />\n <link rel=\"stylesheet\" href=\"https://cdn.salla.network/fonts/sallaicons.css\" />\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/@id/__x00__${EDITOR_ENTRY_ID}\"></script>\n </body>\n</html>\n`;\n\n/** Serve the editor page on GET; anything else under the path is Vite's. */\nfunction serveEditorPage(server: ViteDevServer, onShown: () => void): void {\n server.middlewares.use(DEV_EDITOR_PATH, (req, res, next) => {\n // Connect strips the mount path: `/` (or `/?path=…`) is the page itself.\n const rest = (req.url ?? '/').split('?')[0];\n if (req.method !== 'GET' || (rest !== '/' && rest !== '')) {\n next();\n return;\n }\n onShown();\n server\n .transformIndexHtml(req.originalUrl ?? DEV_EDITOR_PATH, EDITOR_HTML)\n .then((html) => {\n res.statusCode = 200;\n res.setHeader('content-type', 'text/html; charset=utf-8');\n res.end(html);\n })\n .catch(next);\n });\n}\n\n/** `?editor=off` shows the storefront page instead of opening the editor. */\nconst EDITOR_OPT_OUT = /(?:^|&)editor=off(?:&|$)/;\n\n/** Vite's own files and the dev server's endpoints: never a storefront page. */\nfunction isStorefrontPage(path: string): boolean {\n if (/^\\/(?:@|__|node_modules\\/|_serverFn)/.test(path)) return false;\n const last = path.split('/').pop() ?? '';\n return !last.includes('.');\n}\n\n/**\n * Opens the theme editor when a browser tab first loads the storefront after\n * the dev server starts: `salla theme dev` opens a storefront address\n * (`/ar?storeId=…`, or `/`), and the editor is where a developer starts. That\n * page is opened inside the editor, query and all. Once the editor has been\n * shown, storefront pages load as themselves (a new tab, a typed `/ar`), and\n * `/` keeps opening the editor. `?editor=off` skips it.\n *\n * Only a top-level page load is sent there (`Sec-Fetch-Dest: document`): the\n * editor's own frame, fetches, and tools without the header (the CLI's\n * warm-up, curl) get the storefront as before.\n */\nfunction openEditorFirst(server: ViteDevServer, editorShown: () => boolean): void {\n server.middlewares.use((req, res, next) => {\n const url = req.url ?? '/';\n const [path, query = ''] = url.split('?');\n const opens =\n req.method === 'GET' &&\n req.headers['sec-fetch-dest'] === 'document' &&\n !EDITOR_OPT_OUT.test(query) &&\n isStorefrontPage(path) &&\n (path === '/' || !editorShown());\n if (!opens) {\n next();\n return;\n }\n const location =\n url === '/' ? DEV_EDITOR_PATH : `${DEV_EDITOR_PATH}?path=${encodeURIComponent(url)}`;\n res.statusCode = 302;\n res.setHeader('location', location);\n res.end();\n });\n}\n\n/** The editor page, and the storefront loads that open it. */\nfunction serveEditor(server: ViteDevServer): void {\n let shown = false;\n serveEditorPage(server, () => {\n shown = true;\n });\n openEditorFirst(server, () => shown);\n}\n\nconst EMPTY_MODULE = `export default ${JSON.stringify(EMPTY_DEV_SCHEMA)};`;\nconst LOG_PREFIX = '[twilight-react:schema]';\n/** Lines printed per check, so a bad file does not flood the terminal. */\nconst MAX_REPORTED = 8;\n/**\n * The editor's saved state, next to twilight.json and gitignored. Not under\n * `.twilight/`: the route generator writes there and the router plugin scans it.\n */\nexport const DEV_PREVIEW_FILE = 'twilight.preview.json';\n/** A layout of a few dozen blocks is tens of KB; anything near this is not one. */\nconst MAX_PREVIEW_BYTES = 2 * 1024 * 1024;\n\nasync function readPreview(path: string): Promise<DevPreviewState | null> {\n try {\n // nosemgrep: `path` is the fixed preview file this plugin resolved\n return normalizePreviewState(JSON.parse(await readFile(path, 'utf-8')));\n } catch {\n return null; // No file yet, or not JSON: start from the store.\n }\n}\n\nfunction readBody(req: IncomingMessage, limit: number): Promise<Buffer> {\n return new Promise((resolveBody, reject) => {\n let size = 0;\n const chunks: Buffer[] = [];\n req.on('data', (chunk: Buffer) => {\n size += chunk.length;\n if (size > limit) {\n reject(new Error('request too large'));\n req.destroy();\n return;\n }\n chunks.push(chunk);\n });\n req.on('end', () => resolveBody(Buffer.concat(chunks)));\n req.on('error', reject);\n });\n}\n\n/**\n * Whether a write came from a page on this dev server. A browser sends `Origin`\n * on every POST, and `Sec-Fetch-Site` too; another site's page fails both.\n * Tools with neither (curl) are the developer's own.\n */\nexport function isSameOrigin(req: IncomingMessage): boolean {\n const { origin, host } = req.headers;\n const site = req.headers['sec-fetch-site'];\n if (site !== undefined && site !== 'same-origin' && site !== 'none') return false;\n if (origin === undefined) return true;\n try {\n return new URL(origin).host === host;\n } catch {\n return false;\n }\n}\n\n/** Image types the editor accepts, by MIME type. SVG is left out: it can carry script. */\nconst IMAGE_EXTENSIONS: Record<string, string> = {\n 'image/png': 'png',\n 'image/jpeg': 'jpg',\n 'image/webp': 'webp',\n 'image/gif': 'gif',\n 'image/avif': 'avif',\n};\nconst IMAGE_TYPES = Object.fromEntries(\n Object.entries(IMAGE_EXTENSIONS).map(([type, ext]) => [ext, type])\n);\n/** A stored image's name: a content hash and a known extension, nothing else. */\nconst IMAGE_NAME = /^[a-f0-9]{16}\\.(png|jpg|webp|gif|avif)$/;\n/** Picked images live here, next to twilight.preview.json. Gitignored. */\nexport const DEV_PREVIEW_ASSETS_DIR = 'twilight-preview-assets';\n\nfunction send(res: ServerResponse, status: number, body?: string, type = 'text/plain'): void {\n res.statusCode = status;\n if (body !== undefined) res.setHeader('content-type', type);\n res.end(body);\n}\n\n/**\n * Drop the cached virtual module everywhere, and make every server-side module\n * runner start over so its next render imports the fresh copy. `full-reload` on\n * a runner clears what it has evaluated; it does not touch the browser.\n */\nfunction refreshServerModules(server: ViteDevServer, resolvedId: string): void {\n const environments = Object.values(server.environments ?? {});\n if (!environments.length) {\n const mod = server.moduleGraph.getModuleById(resolvedId);\n if (mod) server.moduleGraph.invalidateModule(mod);\n return;\n }\n for (const environment of environments) {\n const mod = environment.moduleGraph.getModuleById(resolvedId);\n if (mod) environment.moduleGraph.invalidateModule(mod);\n if (environment.name !== 'client') environment.hot.send({ type: 'full-reload' });\n }\n}\n\n/** Picked images: stored under a content hash in `assets`, and served back from there. */\nfunction imageRoutes(assets: string) {\n const saveImage = async (req: IncomingMessage, res: ServerResponse) => {\n const ext = IMAGE_EXTENSIONS[String(req.headers['content-type']).split(';')[0].trim()];\n if (!ext) {\n send(res, 415, 'expected a png, jpeg, webp, gif or avif image');\n return;\n }\n const bytes = await readBody(req, DEV_PREVIEW_IMAGE_MAX_BYTES);\n const name = `${createHash('sha256').update(bytes).digest('hex').slice(0, 16)}.${ext}`;\n await mkdir(assets, { recursive: true });\n await writeFile(resolve(assets, name), bytes); // nosemgrep: name is a hash + known extension\n send(\n res,\n 201,\n JSON.stringify({ url: `${DEV_PREVIEW_IMAGE_ENDPOINT}/${name}` }),\n 'application/json'\n );\n };\n\n const serveImage = async (name: string, res: ServerResponse) => {\n if (!IMAGE_NAME.test(name)) {\n send(res, 404);\n return;\n }\n try {\n const bytes = await readFile(resolve(assets, name)); // nosemgrep: name checked against IMAGE_NAME\n res.statusCode = 200;\n res.setHeader('x-content-type-options', 'nosniff');\n res.setHeader('content-type', IMAGE_TYPES[name.slice(name.lastIndexOf('.') + 1)]);\n res.end(bytes);\n } catch {\n send(res, 404);\n }\n };\n\n return { saveImage, serveImage };\n}\n\n/**\n * Watch `twilight.preview.json` and serve the editor's saves to it. A hand\n * edit (or a deleted file) reloads everything. The editor's own saves land in\n * the watcher too; those were already applied in the tab that made them and\n * pushed to the others, so they only refresh the server.\n */\nfunction servePreviewFile(server: ViteDevServer, preview: string): void {\n /** What this server last wrote, to tell its own saves from hand edits. */\n let lastWritten: string | undefined;\n /** Saves are written one after another, in the order they arrived. */\n let writes: Promise<void> = Promise.resolve();\n const { saveImage, serveImage } = imageRoutes(resolve(dirname(preview), DEV_PREVIEW_ASSETS_DIR));\n server.watcher.add(preview);\n\n const onPreviewFile = async (file: string) => {\n if (file !== preview) return;\n let content: string | undefined;\n try {\n content = await readFile(preview, 'utf-8'); // nosemgrep: fixed path built by this plugin\n } catch {\n content = undefined;\n }\n if (content !== undefined && content === lastWritten) return;\n refreshServerModules(server, RESOLVED_ID);\n server.ws.send({ type: 'full-reload' });\n };\n server.watcher.on('change', (file) => void onPreviewFile(file));\n server.watcher.on('add', (file) => void onPreviewFile(file));\n server.watcher.on('unlink', (file) => void onPreviewFile(file));\n\n const saveState = async (req: IncomingMessage, res: ServerResponse) => {\n if (!String(req.headers['content-type']).startsWith('application/json')) {\n send(res, 415, 'expected application/json');\n return;\n }\n const body = JSON.parse((await readBody(req, MAX_PREVIEW_BYTES)).toString('utf-8')) as {\n state?: unknown;\n from?: unknown;\n };\n const state = normalizePreviewState(body.state);\n if (!state) throw new Error('not a preview state');\n const content = `${JSON.stringify(state, null, 2)}\\n`;\n const write = writes.then(async () => {\n lastWritten = content;\n await writeFile(preview, content); // nosemgrep: fixed path built by this plugin\n });\n writes = write.catch(() => {});\n await write;\n refreshServerModules(server, RESOLVED_ID);\n server.ws.send({\n type: 'custom',\n event: DEV_PREVIEW_EVENT,\n data: { state, from: typeof body.from === 'string' ? body.from : null },\n });\n send(res, 204);\n };\n\n // Connect strips the mount path: `/` is the state, `/image` and `/image/<name>` the pictures.\n server.middlewares.use(DEV_PREVIEW_ENDPOINT, (req, res) => {\n const route = (req.url ?? '/').split('?')[0];\n if (req.method === 'GET' && route.startsWith('/image/')) {\n void serveImage(route.slice('/image/'.length), res);\n return;\n }\n if (req.method !== 'POST' || (route !== '/' && route !== '' && route !== '/image')) {\n send(res, 405);\n return;\n }\n if (!isSameOrigin(req)) {\n send(res, 403, 'cross-origin write refused');\n return;\n }\n (route === '/image' ? saveImage(req, res) : saveState(req, res)).catch((error: unknown) =>\n send(res, 400, error instanceof Error ? error.message : 'bad request')\n );\n });\n}\n\nexport function twilightSchemaPlugin(twilightJsonPath = 'twilight.json'): Plugin {\n let filePath: string | undefined;\n let previewPath: string | undefined;\n let isDevServer = false;\n\n /**\n * Dev-only manifest check. A missing twilight.json stays silent — there is no\n * manifest to fix, and the CLI falls back to sniffing the engine dependency —\n * but a manifest that is present and wrong is worth one line.\n */\n async function checkManifest(): Promise<void> {\n if (!isDevServer || !filePath) return;\n\n let raw: string;\n try {\n raw = await readFile(filePath, 'utf-8');\n } catch {\n return; // No manifest yet.\n }\n\n try {\n // Errors only. Warnings are for `pnpm check:manifest`, so a normal start stays quiet.\n const { errors: issues } = validateTwilightManifest(JSON.parse(raw), twilightJsonPath);\n for (const issue of issues.slice(0, MAX_REPORTED)) {\n const where = issue.path ? `${twilightJsonPath} ${issue.path}: ` : '';\n console.warn(`${LOG_PREFIX} ${where}${issue.message}`);\n }\n if (issues.length > MAX_REPORTED) {\n console.warn(\n `${LOG_PREFIX} ...and ${issues.length - MAX_REPORTED} more. Run \\`pnpm check:manifest\\` for the full list.`\n );\n }\n } catch {\n console.warn(\n `${LOG_PREFIX} ${twilightJsonPath} is not valid JSON — theme settings and the dev widget will be empty.`\n );\n }\n }\n\n return {\n name: 'twilight:schema',\n\n configResolved(config) {\n isDevServer = config.command === 'serve';\n filePath = resolve(config.root, twilightJsonPath);\n previewPath = resolve(config.root, DEV_PREVIEW_FILE); // nosemgrep: constant file name\n },\n\n buildStart() {\n return checkManifest();\n },\n\n resolveId(id) {\n if (id === VIRTUAL_ID) return RESOLVED_ID;\n if (id === EDITOR_ENTRY_ID && isDevServer) return RESOLVED_EDITOR_ENTRY_ID;\n },\n\n async load(id) {\n if (id === RESOLVED_EDITOR_ENTRY_ID) return EDITOR_ENTRY;\n if (id !== RESOLVED_ID) return;\n // Dev-only: production builds get an empty schema.\n if (!isDevServer || !filePath) return EMPTY_MODULE;\n\n const preview = previewPath ? await readPreview(previewPath) : null;\n let schema = EMPTY_DEV_SCHEMA;\n try {\n schema = buildTwilightSchema(JSON.parse(await readFile(filePath, 'utf-8')));\n } catch {\n // Missing or malformed twilight.json — fail soft, no widget content.\n }\n return [\n `const schema = ${JSON.stringify({ ...schema, preview })};`,\n `globalThis[${JSON.stringify(DEV_PREVIEW_GLOBAL)}] = schema.preview;`,\n 'export default schema;',\n ].join('\\n');\n },\n\n configureServer(server) {\n if (!filePath) return;\n const target = filePath;\n server.watcher.add(target);\n\n const invalidate = (file: string) => {\n if (file !== target) return;\n void checkManifest();\n const mod = server.moduleGraph.getModuleById(RESOLVED_ID);\n if (mod) {\n server.moduleGraph.invalidateModule(mod);\n server.ws.send({ type: 'full-reload' });\n }\n };\n\n server.watcher.on('change', invalidate);\n server.watcher.on('add', invalidate);\n\n if (previewPath) servePreviewFile(server, previewPath);\n serveEditor(server);\n },\n };\n}\n","import type { Rule, RuleContext, Violation } from '../types';\n\nconst COMPONENT_FOLDERS = [\n 'common',\n 'cart',\n 'product',\n 'layout',\n 'home',\n 'modal',\n 'drawer',\n 'dropdown',\n 'collapse',\n 'toast',\n 'navigation',\n];\n\n/**\n * Matches: import { X } from '../common/Link'\n * import { X } from '../../layout/Header'\n * import { X } from '../../../cart/CartItem'\n * Captures: (1) the folder name, (2) the deep path after it\n *\n * Allows: import { X } from '../common' (no trailing slash/file)\n */\nconst FOLDERS_PATTERN = COMPONENT_FOLDERS.join('|');\n\nconst DEEP_IMPORT_RE = new RegExp(\n `(?:import|from)\\\\s+.*['\"](?:\\\\.\\\\.\\\\/)+(${FOLDERS_PATTERN})\\\\/([^'\"]+)['\"]`,\n 'g'\n);\n\nexport const noDeepComponentImport: Rule = {\n name: 'no-deep-component-import',\n description: 'Enforce imports from barrel exports (index.ts) to preserve lazy loading.',\n severity: 'warn',\n\n check(context: RuleContext): Violation[] {\n const violations: Violation[] = [];\n const lines = context.code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Quick guard — skip lines without import-like syntax\n if (!line.includes('import') && !line.includes('from')) continue;\n\n DEEP_IMPORT_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = DEEP_IMPORT_RE.exec(line)) !== null) {\n const folder = match[1];\n violations.push({\n rule: 'no-deep-component-import',\n message: `Deep import into '${folder}/' bypasses the barrel export and breaks lazy loading.`,\n line: i + 1,\n recommendation: `Import from '../${folder}' (barrel export) instead of '../${folder}/${match[2]}'.`,\n });\n }\n }\n\n return violations;\n },\n};\n","import type { Rule, RuleContext, Violation } from '../types';\n\nconst RELOAD_RE = /window\\s*\\.\\s*location\\s*\\.\\s*reload\\s*\\(/g;\n\nexport const noWindowLocationReload: Rule = {\n name: 'no-window-location-reload',\n description: 'Disallow window.location.reload() in React components.',\n severity: 'error',\n\n check(context: RuleContext): Violation[] {\n const violations: Violation[] = [];\n const lines = context.code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n RELOAD_RE.lastIndex = 0;\n if (RELOAD_RE.test(line)) {\n violations.push({\n rule: 'no-window-location-reload',\n message: 'window.location.reload() forces a full page reload, discarding React state.',\n line: i + 1,\n recommendation:\n 'Use React state for empty-state handling, React key prop to remount components, or router.invalidate() to refetch loaders.',\n });\n }\n }\n\n return violations;\n },\n};\n","import type { Rule, RuleContext, Violation } from '../types';\n\nconst DOM_METHODS = [\n { pattern: /document\\s*\\.\\s*querySelector\\s*\\(/g, name: 'document.querySelector()' },\n { pattern: /document\\s*\\.\\s*querySelectorAll\\s*\\(/g, name: 'document.querySelectorAll()' },\n { pattern: /document\\s*\\.\\s*getElementById\\s*\\(/g, name: 'document.getElementById()' },\n {\n pattern: /document\\s*\\.\\s*getElementsByClassName\\s*\\(/g,\n name: 'document.getElementsByClassName()',\n },\n { pattern: /\\.classList\\s*\\.\\s*(?:add|remove|toggle)\\s*\\(/g, name: 'classList manipulation' },\n];\n\nexport const noManualDom: Rule = {\n name: 'no-manual-dom',\n description: 'Disallow direct DOM manipulation in React components.',\n severity: 'warn',\n\n check(context: RuleContext): Violation[] {\n const violations: Violation[] = [];\n const lines = context.code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Quick guard\n if (!line.includes('document') && !line.includes('classList')) continue;\n\n for (const method of DOM_METHODS) {\n method.pattern.lastIndex = 0;\n if (method.pattern.test(line)) {\n violations.push({\n rule: 'no-manual-dom',\n message: `${method.name} performs direct DOM manipulation outside React's control.`,\n line: i + 1,\n recommendation:\n 'Use useRef() for element access and React state/clsx() for class toggling.',\n });\n }\n }\n }\n\n return violations;\n },\n};\n","import type { Rule, RuleContext, Violation } from '../types';\n\n/**\n * Matches <img ... > or <img ... /> tags (single line).\n * Captures the attributes portion to check for width/height.\n */\nconst IMG_TAG_RE = /<img\\s([^>]*?)\\/?>/gi;\n\nexport const noImgWithoutDimensions: Rule = {\n name: 'no-img-without-dimensions',\n description: 'Require width and height on <img> elements to prevent layout shifts (CLS).',\n severity: 'info',\n\n check(context: RuleContext): Violation[] {\n // Only check JSX/TSX files\n if (!/\\.[jt]sx$/.test(context.id)) return [];\n\n const violations: Violation[] = [];\n const lines = context.code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line.includes('<img')) continue;\n\n IMG_TAG_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = IMG_TAG_RE.exec(line)) !== null) {\n const attrs = match[1];\n const hasWidth = /\\bwidth\\s*[={]/.test(attrs);\n const hasHeight = /\\bheight\\s*[={]/.test(attrs);\n\n if (!hasWidth || !hasHeight) {\n violations.push({\n rule: 'no-img-without-dimensions',\n message: '<img> without explicit width/height causes layout shifts (CLS).',\n line: i + 1,\n recommendation:\n 'Add width and height attributes, or use the <Image> component which handles this automatically.',\n });\n }\n }\n }\n\n return violations;\n },\n};\n","import type { Rule, RuleContext, Violation } from '../types';\n\n/**\n * Matches direct ProductCard imports from deep paths:\n * - import { ProductCard } from '../product/ProductCard'\n * - import ProductCard from '../../components/product/ProductCard'\n *\n * Allows:\n * - import { ProductCard } from '../product' (barrel export)\n * - import { ProductCard } from '@salla.sa/twilight-theme-engine/components/product'\n * - Files in test directories (tests/**)\n * - ProductCard.tsx itself\n */\nconst DIRECT_PRODUCT_CARD_IMPORT_RE =\n /(?:import|from)\\s+.*['\"](?:\\.\\.\\/)+product\\/ProductCard['\"]/g;\n\nconst ALLOWED_PATHS = ['/ProductCard.tsx', '/ProductCard.test.tsx', '.test.', '.spec.'];\n\nexport const noDirectProductCardImport: Rule = {\n name: 'no-direct-product-card-import',\n description: 'Prevent direct imports of ProductCard to ensure registry override works correctly.',\n severity: 'error',\n\n check(context: RuleContext): Violation[] {\n const violations: Violation[] = [];\n\n // Allow imports in test files and ProductCard itself\n if (ALLOWED_PATHS.some((path) => context.relativeId.includes(path))) {\n return violations;\n }\n\n const lines = context.code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line.includes('import') && !line.includes('from')) continue;\n\n DIRECT_PRODUCT_CARD_IMPORT_RE.lastIndex = 0;\n if (DIRECT_PRODUCT_CARD_IMPORT_RE.test(line)) {\n violations.push({\n rule: 'no-direct-product-card-import',\n message: `Direct import of ProductCard bypasses the registry override mechanism.`,\n line: i + 1,\n recommendation: `Import ProductCard from barrel export '../product' or use registry override to customize.`,\n });\n }\n }\n\n return violations;\n },\n};\n","/**\n * Hook expectations registry for the require-page-hooks rule.\n *\n * Maps route file patterns to their expected HookSlot/hookRegistry entries.\n * Used by the Vite best-practices plugin to validate that theme developers\n * preserve customization points when overriding route pages.\n */\n\nexport interface ExpectedHook {\n hook: string;\n severity: 'error' | 'warn' | 'info';\n}\n\nexport interface RouteHookEntry {\n pattern: RegExp;\n routeType: string;\n expectedHooks: ExpectedHook[];\n}\n\n/**\n * Registry of expected hooks per route type.\n * Each entry maps a file path pattern to the hooks that should be present.\n */\nexport const ROUTE_HOOK_MAP: RouteHookEntry[] = [\n // Product Page\n {\n pattern: /ProductPage|product\\.tsx$/,\n routeType: 'product',\n expectedHooks: [\n { hook: 'product:start', severity: 'warn' },\n { hook: 'product:details.start', severity: 'warn' },\n { hook: 'product:details.end', severity: 'warn' },\n { hook: 'product:single.description.start', severity: 'warn' },\n { hook: 'product:single.description', severity: 'warn' },\n { hook: 'product:single.description.end', severity: 'warn' },\n { hook: 'product:single.form.start', severity: 'warn' },\n { hook: 'product:single.form.end', severity: 'warn' },\n { hook: 'product:related.start', severity: 'warn' },\n { hook: 'product:related.end', severity: 'warn' },\n { hook: 'product:end', severity: 'warn' },\n ],\n },\n // Cart Page\n {\n pattern: /CartPage|cart\\.tsx$/,\n routeType: 'cart',\n expectedHooks: [\n { hook: 'cart:start', severity: 'warn' },\n { hook: 'cart:items.start', severity: 'warn' },\n { hook: 'cart:items.end', severity: 'warn' },\n { hook: 'cart:summary.start', severity: 'warn' },\n { hook: 'cart:summary.end', severity: 'warn' },\n { hook: 'cart:submit.start', severity: 'warn' },\n { hook: 'cart:submit.end', severity: 'warn' },\n { hook: 'cart:end', severity: 'warn' },\n ],\n },\n // Home Page\n {\n pattern: /routes\\/home\\/HomePage\\.tsx$/,\n routeType: 'home',\n expectedHooks: [\n { hook: 'home:start', severity: 'warn' },\n { hook: 'home:content', severity: 'warn' },\n { hook: 'home:end', severity: 'warn' },\n ],\n },\n // Blog Index\n {\n pattern: /BlogPage|blog\\.tsx$/,\n routeType: 'blog',\n expectedHooks: [\n { hook: 'blog:start', severity: 'warn' },\n { hook: 'blog:items.start', severity: 'warn' },\n { hook: 'blog:items.end', severity: 'warn' },\n { hook: 'blog:end', severity: 'warn' },\n ],\n },\n // Blog Single\n {\n pattern: /BlogSinglePage/,\n routeType: 'blog-single',\n expectedHooks: [\n { hook: 'blog:single.start', severity: 'warn' },\n { hook: 'blog:single.end', severity: 'warn' },\n { hook: 'blog:single.related.start', severity: 'warn' },\n { hook: 'blog:single.related.end', severity: 'warn' },\n ],\n },\n // Blog Category\n {\n pattern: /BlogCategoryPage/,\n routeType: 'blog-category',\n expectedHooks: [\n { hook: 'blog:category.start', severity: 'warn' },\n { hook: 'blog:category.end', severity: 'warn' },\n ],\n },\n // Blog Tag\n {\n pattern: /BlogTagPage/,\n routeType: 'blog-tag',\n expectedHooks: [\n { hook: 'blog:tag.start', severity: 'warn' },\n { hook: 'blog:tag.end', severity: 'warn' },\n ],\n },\n // Blog Author\n {\n pattern: /BlogAuthorPage/,\n routeType: 'blog-author',\n expectedHooks: [\n { hook: 'blog:author.start', severity: 'warn' },\n { hook: 'blog:author.end', severity: 'warn' },\n ],\n },\n // Product Listing\n {\n pattern: /ProductListPage\\.tsx$/,\n routeType: 'product-listing',\n expectedHooks: [\n { hook: 'product:list.start', severity: 'warn' },\n { hook: 'product:list.items.start', severity: 'warn' },\n { hook: 'product:list.items.end', severity: 'warn' },\n { hook: 'product:list.end', severity: 'warn' },\n ],\n },\n // Brands\n {\n pattern: /BrandsPage\\.tsx$/,\n routeType: 'brands',\n expectedHooks: [\n { hook: 'brands:index.items.start', severity: 'warn' },\n { hook: 'brands:index.items.end', severity: 'warn' },\n ],\n },\n // Thank You\n {\n pattern: /ThankYouPage\\.tsx$/,\n routeType: 'thank-you',\n expectedHooks: [\n { hook: 'thank-you:start', severity: 'warn' },\n { hook: 'thank-you:items.start', severity: 'warn' },\n { hook: 'thank-you:items.end', severity: 'warn' },\n { hook: 'thank-you:payment.end', severity: 'warn' },\n { hook: 'thank-you:end', severity: 'warn' },\n ],\n },\n // Loyalty\n {\n pattern: /LoyaltyPage|loyalty\\.tsx$/,\n routeType: 'loyalty',\n expectedHooks: [\n { hook: 'loyalty:start', severity: 'warn' },\n { hook: 'loyalty:end', severity: 'warn' },\n ],\n },\n // Not Found\n {\n pattern: /not-found/,\n routeType: 'not-found',\n expectedHooks: [\n { hook: 'notfound:start', severity: 'warn' },\n { hook: 'notfound:content', severity: 'warn' },\n { hook: 'notfound:end', severity: 'warn' },\n ],\n },\n // Account - Profile\n {\n pattern: /ProfilePage\\.tsx$/,\n routeType: 'customer-profile',\n expectedHooks: [\n { hook: 'customer:profile.start', severity: 'warn' },\n { hook: 'customer:profile.form.start', severity: 'warn' },\n { hook: 'customer:profile.form.end', severity: 'warn' },\n { hook: 'customer:profile.end', severity: 'warn' },\n ],\n },\n // Account - Orders\n {\n pattern: /OrdersPage\\.tsx$/,\n routeType: 'customer-orders',\n expectedHooks: [\n { hook: 'customer:orders.index.items.start', severity: 'warn' },\n { hook: 'customer:orders.index.items.end', severity: 'warn' },\n ],\n },\n // Account - Order Single\n {\n pattern: /OrderSinglePage\\.tsx$/,\n routeType: 'customer-order-single',\n expectedHooks: [\n { hook: 'customer:orders.single.details.start', severity: 'warn' },\n { hook: 'customer:orders.single.details.end', severity: 'warn' },\n ],\n },\n // Account - Notifications\n {\n pattern: /NotificationsPage\\.tsx$/,\n routeType: 'customer-notifications',\n expectedHooks: [\n { hook: 'customer:notifications.items.start', severity: 'warn' },\n { hook: 'customer:notifications.items.end', severity: 'warn' },\n ],\n },\n // Account - Wallet\n {\n pattern: /WalletPage\\.tsx$/,\n routeType: 'customer-wallet',\n expectedHooks: [\n { hook: 'customer:wallet.transactions.start', severity: 'warn' },\n { hook: 'customer:wallet.transactions.end', severity: 'warn' },\n ],\n },\n // Account - Settings\n {\n pattern: /SettingsPage\\.tsx$/,\n routeType: 'customer-settings',\n expectedHooks: [\n { hook: 'customer:settings.start', severity: 'warn' },\n { hook: 'customer:settings.end', severity: 'warn' },\n ],\n },\n // Account - Wishlist\n {\n pattern: /WishlistPage\\.tsx$/,\n routeType: 'customer-wishlist',\n expectedHooks: [\n { hook: 'customer:wishlist.items.start', severity: 'warn' },\n { hook: 'customer:wishlist.items.end', severity: 'warn' },\n ],\n },\n];\n\n/**\n * Get expected hooks for a given file path.\n * Returns null if the file doesn't match any route pattern.\n */\nexport function getExpectedHooks(filePath: string): ExpectedHook[] | null {\n for (const entry of ROUTE_HOOK_MAP) {\n if (entry.pattern.test(filePath)) {\n return entry.expectedHooks;\n }\n }\n return null;\n}\n","/**\n * require-page-hooks rule for the best-practices Vite plugin.\n *\n * Validates that route files include expected HookSlot components or\n * hookRegistry.register() calls to preserve SDK customization points.\n *\n * Uses oxc-parser for AST-based detection to avoid false-positives\n * from comments and string literals.\n */\n\nimport { parseSync } from 'oxc-parser';\nimport { resolve, dirname } from 'path';\nimport { existsSync, readFileSync, statSync } from 'fs';\nimport type { Rule, RuleContext, Violation } from '../types';\nimport { getExpectedHooks } from '../hooks-registry';\n\n/** Map HookName enum constants to their string values */\nconst HOOK_NAME_ENUM_TO_STRING: Record<string, string> = {\n BODY_START: 'body:start',\n BODY_END: 'body:end',\n BODY_INNER: 'body:inner',\n HEAD_START: 'head:start',\n HEAD_END: 'head:end',\n HEAD_INNER: 'head:inner',\n HEADER_START: 'header:start',\n HEADER_END: 'header:end',\n FOOTER_START: 'footer:start',\n FOOTER_END: 'footer:end',\n PRODUCT_DESCRIPTION_START: 'product:single.description.start',\n PRODUCT_DESCRIPTION: 'product:single.description',\n PRODUCT_DESCRIPTION_END: 'product:single.description.end',\n PRODUCT_FORM_START: 'product:single.form.start',\n PRODUCT_FORM_END: 'product:single.form.end',\n CART_ITEMS_START: 'cart:items.start',\n CART_ITEMS_END: 'cart:items.end',\n CART_SUMMARY_START: 'cart:summary.start',\n CART_SUMMARY_END: 'cart:summary.end',\n SEARCH_START: 'search:start',\n SEARCH_ITEMS_START: 'search:items.start',\n SEARCH_ITEMS_END: 'search:items.end',\n SEARCH_END: 'search:end',\n HOMEPAGE_SLIDER: 'homepage:slider',\n HOMEPAGE_BANNERS: 'homepage:banners',\n HOMEPAGE_FEATURED: 'homepage:featured',\n};\n\n/** Check if path is in node_modules */\nfunction isNodeModules(path: string): boolean {\n return path.includes('node_modules');\n}\n\n/** Check if import is local (relative path) */\nfunction isLocalImport(importPath: string): boolean {\n return importPath.startsWith('.') || importPath.startsWith('/');\n}\n\n/** Check if file imports route components from theme-engine package */\nfunction importsThemeEngineRoutes(code: string): boolean {\n // Match imports like: import { Cart } from '@salla.sa/twilight-theme-engine/routes/cart'\n const importRegex =\n /import\\s+.*\\s+from\\s+['\"]@salla\\.sa\\/twilight-theme-engine\\/routes\\/[^'\"]+['\"]/;\n return importRegex.test(code);\n}\n\n/** Resolve import path to absolute file path */\nfunction resolveImportPath(importer: string, importPath: string): string | null {\n const dir = dirname(importer);\n const resolved = resolve(dir, importPath);\n\n // Try exact path first (must be a file, not a directory)\n if (existsSync(resolved)) {\n try {\n if (statSync(resolved).isFile()) {\n return resolved;\n }\n } catch {\n // Ignore stat errors\n }\n }\n\n // Try with extensions\n for (const ext of ['.ts', '.tsx', '.js', '.jsx']) {\n const withExt = resolved + ext;\n if (existsSync(withExt)) return withExt;\n }\n\n // Try index files\n for (const index of ['index.ts', 'index.tsx', 'index.js', 'index.jsx']) {\n const indexPath = resolve(resolved, index);\n if (existsSync(indexPath)) return indexPath;\n }\n\n return null;\n}\n\n/** Extract hook name from JSX attribute value */\nfunction extractHookNameFromAttrValue(attrValue: unknown): string | null {\n if (!attrValue || typeof attrValue !== 'object') return null;\n\n const value = attrValue as Record<string, unknown>;\n\n // String literal: name=\"product:start\" (oxc uses 'Literal' type)\n if (\n (value.type === 'Literal' || value.type === 'StringLiteral') &&\n typeof value.value === 'string'\n ) {\n return value.value;\n }\n\n // JSX expression container: name={HookName.BODY_END}\n if (value.type === 'JSXExpressionContainer') {\n const expr = value.expression as Record<string, unknown>;\n if (expr?.type === 'MemberExpression') {\n const object = expr.object as Record<string, unknown>;\n const property = expr.property as Record<string, unknown>;\n if (\n object?.type === 'Identifier' &&\n object.name === 'HookName' &&\n property?.type === 'Identifier' &&\n typeof property.name === 'string'\n ) {\n return HOOK_NAME_ENUM_TO_STRING[property.name] || null;\n }\n }\n }\n\n return null;\n}\n\n/** Extract hooks from AST node recursively */\nexport function extractHooksFromAst(node: unknown, hooks: Set<string>): void {\n if (!node || typeof node !== 'object') return;\n\n const obj = node as Record<string, unknown>;\n\n // Check for JSXElement with HookSlot\n if (obj.type === 'JSXElement') {\n const opening = obj.openingElement as Record<string, unknown>;\n if (opening && typeof opening === 'object') {\n const name = opening.name as Record<string, unknown>;\n if (name?.type === 'JSXIdentifier' && name.name === 'HookSlot') {\n const attributes = opening.attributes as unknown[];\n if (Array.isArray(attributes)) {\n for (const attr of attributes) {\n if (attr && typeof attr === 'object') {\n const attrObj = attr as Record<string, unknown>;\n if (attrObj.type === 'JSXAttribute') {\n const attrName = attrObj.name as Record<string, unknown>;\n if (attrName?.type === 'JSXIdentifier' && attrName.name === 'name') {\n const hookName = extractHookNameFromAttrValue(attrObj.value);\n if (hookName) hooks.add(hookName);\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Check for hookRegistry.register() calls\n if (obj.type === 'CallExpression') {\n const callee = obj.callee as Record<string, unknown>;\n if (callee?.type === 'MemberExpression') {\n const object = callee.object as Record<string, unknown>;\n const property = callee.property as Record<string, unknown>;\n if (\n object?.type === 'Identifier' &&\n object.name === 'hookRegistry' &&\n property?.type === 'Identifier' &&\n property.name === 'register'\n ) {\n const args = obj.arguments as unknown[];\n if (Array.isArray(args) && args.length > 0) {\n const firstArg = args[0] as Record<string, unknown>;\n // Handle both direct expression and wrapped argument\n const expr = (firstArg.expression || firstArg) as Record<string, unknown>;\n if (\n (expr?.type === 'Literal' || expr?.type === 'StringLiteral') &&\n typeof expr.value === 'string'\n ) {\n hooks.add(expr.value);\n } else if (expr?.type === 'MemberExpression') {\n const argObject = expr.object as Record<string, unknown>;\n const argProperty = expr.property as Record<string, unknown>;\n if (\n argObject?.type === 'Identifier' &&\n argObject.name === 'HookName' &&\n argProperty?.type === 'Identifier' &&\n typeof argProperty.name === 'string'\n ) {\n const hookName = HOOK_NAME_ENUM_TO_STRING[argProperty.name];\n if (hookName) hooks.add(hookName);\n }\n }\n }\n }\n }\n }\n\n // Recurse into children\n for (const key of Object.keys(obj)) {\n if (key === 'loc' || key === 'range' || key === 'start' || key === 'end') continue;\n const child = obj[key];\n if (Array.isArray(child)) {\n for (const item of child) {\n extractHooksFromAst(item, hooks);\n }\n } else if (typeof child === 'object' && child !== null) {\n extractHooksFromAst(child, hooks);\n }\n }\n}\n\n/** Recursively find dynamic import() calls in AST node */\nfunction findDynamicImportsInNode(\n node: unknown,\n filePath: string,\n visited: Set<string>,\n hooks: Set<string>\n): void {\n if (!node || typeof node !== 'object') return;\n\n const obj = node as Record<string, unknown>;\n\n // Check for ImportExpression (oxc-parser uses this for dynamic import())\n if (obj.type === 'ImportExpression') {\n const source = obj.source as Record<string, unknown>;\n if (\n (source?.type === 'Literal' || source?.type === 'StringLiteral') &&\n typeof source.value === 'string'\n ) {\n const importPath = source.value;\n if (isLocalImport(importPath)) {\n const resolved = resolveImportPath(filePath, importPath);\n if (resolved) {\n const nestedHooks = findHooksInFile(resolved, visited);\n for (const hook of nestedHooks) {\n hooks.add(hook);\n }\n }\n }\n }\n }\n\n // Recurse into children (skip location metadata)\n for (const key of Object.keys(obj)) {\n if (key === 'loc' || key === 'range' || key === 'start' || key === 'end') continue;\n const child = obj[key];\n if (Array.isArray(child)) {\n for (const item of child) {\n findDynamicImportsInNode(item, filePath, visited, hooks);\n }\n } else if (typeof child === 'object' && child !== null) {\n findDynamicImportsInNode(child, filePath, visited, hooks);\n }\n }\n}\n\n/** Find all hooks in a file using oxc-parser, tracing local imports */\nexport function findHooksInFile(filePath: string, visited: Set<string> = new Set()): Set<string> {\n if (visited.has(filePath)) return new Set();\n if (isNodeModules(filePath)) return new Set();\n\n visited.add(filePath);\n const hooks = new Set<string>();\n\n try {\n const code = readFileSync(filePath, 'utf-8');\n const ast = parseSync(filePath, code, {\n sourceType: 'module',\n preserveParens: false,\n });\n\n // Extract hooks from this file\n extractHooksFromAst(ast.program, hooks);\n\n // Trace local imports (static and dynamic)\n const body = (ast.program as unknown as Record<string, unknown>)?.body;\n if (Array.isArray(body)) {\n for (const stmt of body) {\n if (stmt && typeof stmt === 'object') {\n const stmtObj = stmt as Record<string, unknown>;\n\n // Handle static imports: import X from './file'\n if (stmtObj.type === 'ImportDeclaration') {\n const source = stmtObj.source as Record<string, unknown>;\n if (\n (source?.type === 'Literal' || source?.type === 'StringLiteral') &&\n typeof source.value === 'string'\n ) {\n const importPath = source.value;\n if (isLocalImport(importPath)) {\n const resolved = resolveImportPath(filePath, importPath);\n if (resolved) {\n const nestedHooks = findHooksInFile(resolved, visited);\n for (const hook of nestedHooks) {\n hooks.add(hook);\n }\n }\n }\n }\n }\n\n // Handle re-exports: export { X } from './file'\n if (stmtObj.type === 'ExportNamedDeclaration') {\n const source = stmtObj.source as Record<string, unknown>;\n if (\n source &&\n (source.type === 'Literal' || source.type === 'StringLiteral') &&\n typeof source.value === 'string'\n ) {\n const importPath = source.value;\n if (isLocalImport(importPath)) {\n const resolved = resolveImportPath(filePath, importPath);\n if (resolved) {\n const nestedHooks = findHooksInFile(resolved, visited);\n for (const hook of nestedHooks) {\n hooks.add(hook);\n }\n }\n }\n }\n }\n\n // Handle dynamic imports: lazy(() => import('./file'))\n // Walk the entire statement to find CallExpression with import()\n findDynamicImportsInNode(stmtObj, filePath, visited, hooks);\n }\n }\n }\n } catch {\n // Skip files that can't be parsed\n }\n\n return hooks;\n}\n\n/** Get line number for violation reporting */\nfunction getLineForHook(code: string, hookName: string): number {\n const lines = code.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].includes(hookName)) {\n return i + 1;\n }\n }\n return 1;\n}\n\nexport const requirePageHooks: Rule = {\n name: 'require-page-hooks',\n description:\n 'Ensure route files include expected HookSlot or hookRegistry entries for customization.',\n severity: 'warn',\n\n check(context: RuleContext): Violation[] {\n const violations: Violation[] = [];\n const expectedHooks = getExpectedHooks(context.relativeId);\n\n if (!expectedHooks) return violations;\n\n // Skip validation for theme-custom route files that import from theme-engine\n // These files use pre-built route components that already have hooks\n if (importsThemeEngineRoutes(context.code)) {\n return violations;\n }\n\n // Find all hooks in this file and its local imports\n // Try file-based detection first, fall back to code-based detection\n let foundHooks: Set<string>;\n try {\n foundHooks = findHooksInFile(context.id);\n } catch {\n foundHooks = new Set();\n }\n\n // If file-based detection found nothing, parse the code directly\n if (foundHooks.size === 0) {\n try {\n const ast = parseSync(context.id, context.code, {\n sourceType: 'module',\n preserveParens: false,\n });\n extractHooksFromAst(ast.program, foundHooks);\n } catch {\n // If parsing fails, continue with empty set\n }\n }\n\n // Check for missing hooks\n for (const expected of expectedHooks) {\n if (!foundHooks.has(expected.hook)) {\n violations.push({\n rule: 'require-page-hooks',\n message: `Missing expected hook '${expected.hook}' in ${context.relativeId}`,\n line: getLineForHook(context.code, 'HookSlot') || 1,\n recommendation: `Add <HookSlot name=\"${expected.hook}\" /> or hookRegistry.register('${expected.hook}', ...) to enable theme customization.`,\n });\n }\n }\n\n return violations;\n },\n};\n","import type { Rule } from '../types';\nimport { noDeepComponentImport } from './no-deep-component-import';\nimport { noWindowLocationReload } from './no-window-location-reload';\nimport { noManualDom } from './no-manual-dom';\nimport { noImgWithoutDimensions } from './no-img-without-dimensions';\nimport { noDirectProductCardImport } from './no-direct-product-card-import';\nimport { requirePageHooks } from './require-page-hooks';\n\n/** All built-in rules. Add new rules to this array. */\nexport const builtinRules: Rule[] = [\n noDeepComponentImport,\n noWindowLocationReload,\n noManualDom,\n noImgWithoutDimensions,\n noDirectProductCardImport,\n requirePageHooks,\n];\n","import type { Severity, Violation } from './types';\n\nconst COLORS = {\n reset: '\\x1b[0m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n dim: '\\x1b[2m',\n bold: '\\x1b[1m',\n green: '\\x1b[32m',\n};\n\nconst SEVERITY_LABEL: Record<Severity, string> = {\n error: `${COLORS.red}ERROR${COLORS.reset}`,\n warn: `${COLORS.yellow}WARN${COLORS.reset}`,\n info: `${COLORS.cyan}INFO${COLORS.reset}`,\n};\n\nconst SEVERITY_ICON: Record<Severity, string> = {\n error: `${COLORS.red}\\u2718${COLORS.reset}`,\n warn: `${COLORS.yellow}\\u26A0${COLORS.reset}`,\n info: `${COLORS.cyan}\\u2139${COLORS.reset}`,\n};\n\nexport function formatViolation(\n violation: Violation,\n severity: Severity,\n relativeId: string\n): string {\n const loc = `${COLORS.dim}${relativeId}:${violation.line}${COLORS.reset}`;\n const icon = SEVERITY_ICON[severity];\n const label = SEVERITY_LABEL[severity];\n const rule = `${COLORS.dim}(${violation.rule})${COLORS.reset}`;\n\n return [\n ` ${icon} ${label} ${rule}`,\n ` ${loc}`,\n ` ${violation.message}`,\n ` ${COLORS.green}\\u2192 ${violation.recommendation}${COLORS.reset}`,\n ].join('\\n');\n}\n\nexport function formatSummary(errors: number, warnings: number, infos: number): string {\n const parts: string[] = [];\n if (errors > 0) parts.push(`${COLORS.red}${errors} error(s)${COLORS.reset}`);\n if (warnings > 0) parts.push(`${COLORS.yellow}${warnings} warning(s)${COLORS.reset}`);\n if (infos > 0) parts.push(`${COLORS.cyan}${infos} info(s)${COLORS.reset}`);\n return `${COLORS.bold}[twilight:best-practices]${COLORS.reset} ${parts.join(', ')}`;\n}\n","import type { Plugin } from 'vite';\nimport type { BestPracticesOptions, Severity, Violation } from './types';\nimport { builtinRules } from './rules';\nimport { formatViolation, formatSummary } from './reporter';\nimport { createHash } from 'crypto';\nimport { relative } from 'path';\n\n/** Hash of the last-seen source per file — skip unchanged files. */\nconst fileHashCache = new Map<string, string>();\n\nfunction hash(content: string): string {\n return createHash('md5').update(content).digest('hex');\n}\n\nfunction matchesGlob(id: string, patterns: string[]): boolean {\n return patterns.some((p) => {\n if (/[\\\\^$|+?(){}[\\]\\\\\\\\]/.test(p)) return false;\n const regex = new RegExp(\n '^' +\n p\n .replace(/\\./g, '\\\\.')\n .replace(/\\*\\*/g, '\\0GLOBSTAR\\0')\n .replace(/\\*/g, '[^/]*')\n .replace(/\\0GLOBSTAR\\0/g, '.*') +\n '$'\n );\n return regex.test(id);\n });\n}\n\nexport function bestPracticesPlugin(options: BestPracticesOptions = {}): Plugin {\n const {\n include = ['**/*.ts', '**/*.tsx'],\n exclude = ['**/node_modules/**', '**/dist/**', '**/*.d.ts', '**/.twilight/**'],\n disabledRules = [],\n severityOverrides = {},\n browserConsole = false,\n } = options;\n\n const enabledRules = builtinRules.filter((r) => !disabledRules.includes(r.name));\n let projectRoot = '';\n\n return {\n name: 'twilight:best-practices',\n apply: 'build',\n enforce: 'pre',\n\n configResolved(config) {\n projectRoot = config.root;\n },\n\n transform(code, id) {\n if (!/\\.[jt]sx?$/.test(id)) return null;\n\n const relativeId = relative(projectRoot, id);\n\n // Include/exclude filtering\n if (!matchesGlob(relativeId, include)) return null;\n if (matchesGlob(relativeId, exclude)) return null;\n\n // Skip unchanged files\n const h = hash(code);\n if (fileHashCache.get(id) === h) return null;\n fileHashCache.set(id, h);\n\n const context = { code, id, relativeId };\n const allViolations: Array<{ violation: Violation; severity: Severity }> = [];\n\n for (const rule of enabledRules) {\n const severity = severityOverrides[rule.name] ?? rule.severity;\n const violations = rule.check(context);\n for (const v of violations) {\n allViolations.push({ violation: v, severity });\n }\n }\n\n if (allViolations.length === 0) return null;\n\n // Print to Vite terminal\n const counts = { error: 0, warn: 0, info: 0 };\n const lines: string[] = [];\n for (const { violation, severity } of allViolations) {\n counts[severity]++;\n lines.push(formatViolation(violation, severity, relativeId));\n }\n\n console.error('\\n' + lines.join('\\n'));\n console.error(formatSummary(counts.error, counts.warn, counts.info) + '\\n');\n\n // Optionally inject browser console warnings\n if (browserConsole && allViolations.length > 0) {\n const consoleStatements = allViolations\n .map(({ violation, severity }) => {\n const method = severity === 'error' ? 'error' : severity === 'warn' ? 'warn' : 'info';\n const msg = `[twilight:${violation.rule}] ${violation.message}\\\\n → ${violation.recommendation}\\\\n at ${relativeId}:${violation.line}`;\n return `console.${method}(${JSON.stringify(msg)});`;\n })\n .join('\\n');\n\n return {\n code: code + '\\n' + consoleStatements,\n map: null,\n };\n }\n\n return null;\n },\n };\n}\n","import type { Plugin, AliasOptions } from 'vite';\nimport { fileURLToPath } from 'url';\nimport { existsSync } from 'node:fs';\nimport { dirname } from 'path';\n\n// Only the monorepo checkout has src/ next to dist/ — a registry install ships\n// dist/ alone, and there the package.json exports map already resolves every\n// subpath, so no aliasing is needed (null disables the plugin).\nfunction findEngineSrc(startDir: string): string | null {\n let dir = startDir;\n for (let i = 0; i < 6; i++) {\n const candidate = `${dir}/src`;\n if (existsSync(`${candidate}/index.ts`)) return candidate;\n dir = dirname(dir);\n }\n return null;\n}\n\nconst engineSrc = findEngineSrc(dirname(fileURLToPath(import.meta.url)));\n\nconst PKG = '@salla.sa/twilight-theme-engine';\nconst ESCAPED_PKG = PKG.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst SAFE_SUBPATH = /^[a-zA-Z0-9/_-]+$/;\n\nfunction pkgPattern(subpath: string): RegExp {\n if (subpath && !SAFE_SUBPATH.test(subpath))\n throw new Error(`Invalid package subpath: ${subpath}`);\n return new RegExp(`^${ESCAPED_PKG}${subpath ? '/' + subpath : ''}$`);\n}\n\nconst ALIASES: AliasOptions = !engineSrc\n ? []\n : [\n { find: pkgPattern('i18n'), replacement: `${engineSrc}/providers/I18nProvider.tsx` },\n { find: pkgPattern('hooks'), replacement: `${engineSrc}/hooks/index.ts` },\n {\n find: pkgPattern('hooks/useAsyncFn'),\n replacement: `${engineSrc}/hooks/useAsyncFn.ts`,\n },\n { find: pkgPattern('hooks/useStore'), replacement: `${engineSrc}/hooks/useStore.ts` },\n { find: pkgPattern('hooks/useTheme'), replacement: `${engineSrc}/hooks/useTheme.ts` },\n { find: pkgPattern('hooks/useMoney'), replacement: `${engineSrc}/hooks/useMoney.tsx` },\n { find: pkgPattern('hooks/useAsset'), replacement: `${engineSrc}/hooks/useAsset.ts` },\n {\n find: pkgPattern('hooks/useProduct'),\n replacement: `${engineSrc}/hooks/useProduct.ts`,\n },\n {\n find: pkgPattern('hooks/useDocumentClass'),\n replacement: `${engineSrc}/hooks/useDocumentClass.ts`,\n },\n {\n find: pkgPattern('hooks/useHostAttributes'),\n replacement: `${engineSrc}/hooks/useHostAttributes.ts`,\n },\n {\n find: pkgPattern('hooks/useCoupon'),\n replacement: `${engineSrc}/hooks/useCoupon.ts`,\n },\n {\n find: pkgPattern('hooks/useWishlist'),\n replacement: `${engineSrc}/hooks/useWishlist.ts`,\n },\n {\n find: pkgPattern('hooks/useBlogLike'),\n replacement: `${engineSrc}/hooks/useBlogLike.ts`,\n },\n {\n find: pkgPattern('hooks/useComments'),\n replacement: `${engineSrc}/hooks/useComments.ts`,\n },\n {\n find: pkgPattern('hooks/HookRegistry'),\n replacement: `${engineSrc}/hooks/HookRegistry.ts`,\n },\n { find: pkgPattern('hooks/HookSlot'), replacement: `${engineSrc}/hooks/HookSlot.tsx` },\n { find: pkgPattern('hooks/useHook'), replacement: `${engineSrc}/hooks/useHook.ts` },\n { find: pkgPattern('hooks/useGtm'), replacement: `${engineSrc}/hooks/useGtm.ts` },\n { find: pkgPattern('contexts'), replacement: `${engineSrc}/contexts/index.ts` },\n { find: pkgPattern('utils'), replacement: `${engineSrc}/utils/index.ts` },\n { find: pkgPattern('utils/baseHead'), replacement: `${engineSrc}/utils/baseHead.ts` },\n { find: pkgPattern('utils/cdn-image'), replacement: `${engineSrc}/utils/cdn-image.ts` },\n { find: pkgPattern('utils/head'), replacement: `${engineSrc}/utils/head.ts` },\n { find: pkgPattern('types'), replacement: `${engineSrc}/types/index.ts` },\n { find: pkgPattern('types/hooks'), replacement: `${engineSrc}/types/hooks.ts` },\n { find: pkgPattern('eslint'), replacement: `${engineSrc}/eslint/index.ts` },\n { find: pkgPattern('vite'), replacement: `${engineSrc}/vite/index.ts` },\n { find: pkgPattern('routes'), replacement: `${engineSrc}/routes/index.ts` },\n { find: pkgPattern('routes/home'), replacement: `${engineSrc}/routes/home/index.tsx` },\n { find: pkgPattern('routes/cart'), replacement: `${engineSrc}/routes/cart/index.tsx` },\n {\n find: pkgPattern('routes/product'),\n replacement: `${engineSrc}/routes/product/index.tsx`,\n },\n {\n find: pkgPattern('routes/product-listing'),\n replacement: `${engineSrc}/routes/product-listing/index.tsx`,\n },\n { find: pkgPattern('routes/blog'), replacement: `${engineSrc}/routes/blog/index.tsx` },\n {\n find: pkgPattern('routes/brands'),\n replacement: `${engineSrc}/routes/brands/index.tsx`,\n },\n {\n find: pkgPattern('routes/account'),\n replacement: `${engineSrc}/routes/account/index.tsx`,\n },\n {\n find: pkgPattern('routes/account/orders'),\n replacement: `${engineSrc}/routes/account/orders/index.tsx`,\n },\n {\n find: pkgPattern('routes/loyalty'),\n replacement: `${engineSrc}/routes/loyalty/index.tsx`,\n },\n { find: pkgPattern('routes/page'), replacement: `${engineSrc}/routes/page/index.tsx` },\n {\n find: pkgPattern('routes/testimonials'),\n replacement: `${engineSrc}/routes/testimonials/index.tsx`,\n },\n {\n find: pkgPattern('routes/thank-you'),\n replacement: `${engineSrc}/routes/thank-you/index.tsx`,\n },\n {\n find: pkgPattern('routes/seo-redirects'),\n replacement: `${engineSrc}/routes/seo-redirects.ts`,\n },\n { find: pkgPattern('skeleton'), replacement: `${engineSrc}/skeleton.ts` },\n { find: pkgPattern('tanstack'), replacement: `${engineSrc}/tanstack/index.ts` },\n { find: pkgPattern('nextjs'), replacement: `${engineSrc}/nextjs/index.ts` },\n { find: pkgPattern('dom'), replacement: `${engineSrc}/dom/index.ts` },\n { find: pkgPattern('native-app'), replacement: `${engineSrc}/native-app/index.ts` },\n {\n find: pkgPattern('components/modal'),\n replacement: `${engineSrc}/components/modal/index.ts`,\n },\n {\n find: pkgPattern('components/drawer'),\n replacement: `${engineSrc}/components/drawer/index.ts`,\n },\n {\n find: pkgPattern('components/dropdown'),\n replacement: `${engineSrc}/components/dropdown/index.ts`,\n },\n {\n find: pkgPattern('components/collapse'),\n replacement: `${engineSrc}/components/collapse/index.ts`,\n },\n {\n find: pkgPattern('components/toast'),\n replacement: `${engineSrc}/components/toast/index.ts`,\n },\n {\n find: pkgPattern('components/cart'),\n replacement: `${engineSrc}/components/cart/index.ts`,\n },\n {\n find: pkgPattern('components/product'),\n replacement: `${engineSrc}/components/product/index.ts`,\n },\n {\n find: pkgPattern('components/layout'),\n replacement: `${engineSrc}/components/layout/index.ts`,\n },\n {\n find: pkgPattern('components/home'),\n replacement: `${engineSrc}/components/home/index.ts`,\n },\n {\n find: pkgPattern('components/common'),\n replacement: `${engineSrc}/components/common/index.ts`,\n },\n { find: pkgPattern('modal'), replacement: `${engineSrc}/components/modal/index.ts` },\n { find: pkgPattern('drawer'), replacement: `${engineSrc}/components/drawer/index.ts` },\n {\n find: pkgPattern('dropdown'),\n replacement: `${engineSrc}/components/dropdown/index.ts`,\n },\n {\n find: pkgPattern('collapse'),\n replacement: `${engineSrc}/components/collapse/index.ts`,\n },\n { find: pkgPattern('toast'), replacement: `${engineSrc}/components/toast/index.ts` },\n { find: pkgPattern('cart'), replacement: `${engineSrc}/components/cart/index.ts` },\n {\n find: pkgPattern('product'),\n replacement: `${engineSrc}/components/product/index.ts`,\n },\n { find: pkgPattern('layout'), replacement: `${engineSrc}/components/layout/index.ts` },\n { find: pkgPattern('home'), replacement: `${engineSrc}/components/home/index.ts` },\n { find: pkgPattern('common'), replacement: `${engineSrc}/components/common/index.ts` },\n { find: pkgPattern('providers'), replacement: `${engineSrc}/providers/index.ts` },\n { find: pkgPattern('api/types'), replacement: `${engineSrc}/api/types.ts` },\n { find: pkgPattern('api/client'), replacement: `${engineSrc}/api/client.ts` },\n { find: pkgPattern('api/store'), replacement: `${engineSrc}/api/store.ts` },\n {\n find: pkgPattern('api/translations'),\n replacement: `${engineSrc}/api/translations.ts`,\n },\n { find: pkgPattern('api/cart'), replacement: `${engineSrc}/api/cart.ts` },\n { find: pkgPattern('api/product'), replacement: `${engineSrc}/api/product.ts` },\n { find: pkgPattern('api/home'), replacement: `${engineSrc}/api/home.ts` },\n { find: pkgPattern('api/brands'), replacement: `${engineSrc}/api/brands.ts` },\n { find: pkgPattern('api/loyalty'), replacement: `${engineSrc}/api/loyalty.ts` },\n { find: pkgPattern('api/order'), replacement: `${engineSrc}/api/order.ts` },\n { find: pkgPattern('api/category'), replacement: `${engineSrc}/api/category.ts` },\n { find: pkgPattern('api/page'), replacement: `${engineSrc}/api/page.ts` },\n { find: pkgPattern('api/menu'), replacement: `${engineSrc}/api/menu.ts` },\n {\n find: pkgPattern('api/notification'),\n replacement: `${engineSrc}/api/notification.ts`,\n },\n { find: pkgPattern('api/wishlist'), replacement: `${engineSrc}/api/wishlist.ts` },\n { find: pkgPattern('api/profile'), replacement: `${engineSrc}/api/profile.ts` },\n {\n find: pkgPattern('tracking'),\n replacement: `${engineSrc}/components/tracking/index.ts`,\n },\n { find: pkgPattern('store'), replacement: `${engineSrc}/components/store/index.ts` },\n { find: pkgPattern(''), replacement: `${engineSrc}/index.ts` },\n ];\n\nexport function packageAliasesPlugin(): Plugin {\n return {\n name: 'twilight:package-aliases',\n enforce: 'pre',\n config() {\n return {\n resolve: {\n alias: ALIASES,\n },\n };\n },\n };\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst WRAPPER_IMPORT = /@salla\\.sa\\/twilight-components-react\\/([a-z0-9-]+(?:\\/[a-z0-9-]+)?)\\b/g;\nconst SOURCE_FILE = /\\.[cm]?[jt]sx?$/;\nconst SKIPPED_FILE = /\\.d\\.ts$|\\.(?:test|spec)\\.[cm]?[jt]sx?$/;\nconst SKIPPED_DIR = new Set([\n 'node_modules',\n 'tests',\n '__tests__',\n 'coverage',\n '.vite',\n '.wrangler',\n]);\n\n/** Every `@salla.sa/twilight-components-react/<subpath>` imported by the source files under `dirs`. */\nexport function collectComponentWrapperImports(dirs: string[]): string[] {\n const found = new Set<string>();\n const walk = (dir: string) => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const path = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!SKIPPED_DIR.has(entry.name)) walk(path);\n } else if (SOURCE_FILE.test(entry.name) && !SKIPPED_FILE.test(entry.name)) {\n for (const [specifier, subpath] of readFileSync(path, 'utf8').matchAll(WRAPPER_IMPORT)) {\n if (!subpath.startsWith('dist')) found.add(specifier);\n }\n }\n }\n };\n dirs.filter((dir) => existsSync(dir)).forEach(walk);\n return [...found].sort();\n}\n\n/** The engine's own code: `src/` in the monorepo, `dist/` in a registry install. */\nexport function engineSourceDir(startDir = dirname(fileURLToPath(import.meta.url))): string | null {\n let dir = startDir;\n for (let i = 0; i < 6; i++) {\n const pkg = join(dir, 'package.json');\n if (\n existsSync(pkg) &&\n JSON.parse(readFileSync(pkg, 'utf8')).name === '@salla.sa/twilight-theme-engine'\n ) {\n return existsSync(join(dir, 'src')) ? join(dir, 'src') : join(dir, 'dist');\n }\n dir = dirname(dir);\n }\n return null;\n}\n","/**\n * @fileoverview The workerd runtime config for a theme's SSR environment.\n *\n * A React theme renders server-side in `workerd`, which needs a wrangler config\n * to boot. Themes used to own that file and pass the runtime plugin themselves;\n * the engine now owns both, so a scaffolded theme carries no runtime\n * configuration of its own and `compatibility_date` / flags move forward for\n * every theme at once instead of drifting per repository.\n *\n * A theme that still ships its own wrangler config keeps it untouched — that is\n * how the internal reference themes pin store vars and an explicit worker name.\n * Deployment config is never read from here; the platform generates it at\n * publish time.\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\n\n/** Config filenames the runtime plugin discovers on its own, in its own order. */\nconst THEME_CONFIG_NAMES = ['wrangler.jsonc', 'wrangler.json', 'wrangler.toml'] as const;\n\n/** Bumped here, once, for every theme the engine builds. */\nexport const DEFAULT_COMPATIBILITY_DATE = '2026-03-03';\n\n/** The engine's SSR code paths (i18n, ALS request context) need node built-ins. */\nexport const DEFAULT_COMPATIBILITY_FLAGS = ['nodejs_compat'];\n\n/** TanStack Start owns the request handler; the worker only re-exports it. */\nconst SERVER_ENTRY = '@tanstack/react-start/server-entry';\n\n/** Generated under node_modules so it never shows up in a theme's own tree. */\nconst GENERATED_DIR = join('node_modules', '.twilight');\nconst GENERATED_NAME = 'wrangler.json';\n\nexport interface WorkerOptions {\n /**\n * Worker name for the local dev runtime. Defaults to the theme's package name\n * without its scope, suffixed `-dev`. Never used for deployment.\n */\n name?: string;\n /** Overrides {@link DEFAULT_COMPATIBILITY_DATE}. */\n compatibilityDate?: string;\n /** Overrides {@link DEFAULT_COMPATIBILITY_FLAGS} — replaces, does not merge. */\n compatibilityFlags?: string[];\n}\n\nexport interface GeneratedWorkerConfig {\n name: string;\n compatibility_date: string;\n compatibility_flags: string[];\n main: string;\n}\n\n/** Absolute path to a wrangler config the theme owns, if it has one. */\nexport function findThemeWorkerConfig(projectRoot: string): string | undefined {\n for (const name of THEME_CONFIG_NAMES) {\n const candidate = join(projectRoot, name);\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\n/**\n * `@salla.sa/theme-raed` → `theme-raed-dev`. Worker names accept only lowercase\n * alphanumerics and dashes, so every other character collapses to a dash.\n *\n * This is what preserves the scaffolded worker name across the CLI handoff:\n * `salla theme create` personalizes `package.json` to the theme's slug, so\n * deriving from it yields the same `<slug>-dev` the CLI used to write into the\n * theme's wrangler config directly. Its guarded write there is now a no-op.\n */\nexport function deriveWorkerName(projectRoot: string): string {\n let base = '';\n try {\n const pkg = JSON.parse(readFileSync(join(projectRoot, 'package.json'), 'utf-8')) as {\n name?: unknown;\n };\n if (typeof pkg.name === 'string') base = pkg.name.split('/').pop() ?? '';\n } catch {\n // Unreadable or absent package.json — the fallback name still boots dev.\n }\n\n const slug = base\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\n return `${slug || 'twilight-theme'}-dev`;\n}\n\nexport function buildWorkerConfig(\n projectRoot: string,\n options: WorkerOptions = {}\n): GeneratedWorkerConfig {\n return {\n name: options.name ?? deriveWorkerName(projectRoot),\n compatibility_date: options.compatibilityDate ?? DEFAULT_COMPATIBILITY_DATE,\n compatibility_flags: options.compatibilityFlags ?? DEFAULT_COMPATIBILITY_FLAGS,\n main: SERVER_ENTRY,\n };\n}\n\n/** Write the generated config and return its path. */\nexport function writeGeneratedWorkerConfig(\n projectRoot: string,\n options: WorkerOptions = {}\n): string {\n const filePath = join(projectRoot, GENERATED_DIR, GENERATED_NAME);\n const contents = `${JSON.stringify(buildWorkerConfig(projectRoot, options), null, 2)}\\n`;\n\n mkdirSync(join(projectRoot, GENERATED_DIR), { recursive: true });\n\n // Rewriting an identical file would churn the mtime that the dev runtime\n // watches, restarting the worker on every vite config reload.\n let current: string | undefined;\n try {\n current = readFileSync(filePath, 'utf-8');\n } catch {\n // Not written yet.\n }\n if (current !== contents) writeFileSync(filePath, contents);\n\n return filePath;\n}\n\n/**\n * `configPath` for the workerd runtime plugin — or `undefined` when the theme\n * ships its own config, which the plugin then discovers unchanged.\n */\nexport function resolveWorkerConfigPath(\n projectRoot: string,\n options: WorkerOptions = {}\n): string | undefined {\n if (findThemeWorkerConfig(projectRoot)) return undefined;\n return writeGeneratedWorkerConfig(projectRoot, options);\n}\n","/**\n * Template for $locale.tsx route file\n * Locale wrapper — validates optional locale prefix and gates on is_multilingual.\n *\n * Uses TanStack Router's optional path parameter syntax /{-$locale}:\n * - /{-$locale}/cart matches both /cart and /ar/cart\n *\n * beforeLoad: validates the locale format when present.\n * loader: checks store.settings.is_multilingual (and the number of languages) and redirects\n * accordingly. On a Salla shared host the address has no locale, so it redirects nothing.\n *\n * Note: loader and head are in __root.tsx for better SSR support.\n * Note: RouteDocumentSync is now in TwilightProvider for automatic route class syncing.\n */\nexport function getLocaleWrapperTemplate(baseRoutesImport: string): string {\n const mainPkg = baseRoutesImport.replace(/\\/routes$/, '');\n return `// @auto-generated\n// @ts-nocheck — params types are generated by TanStack Router on pnpm dev\nimport { createFileRoute, notFound, Outlet, redirect } from '@tanstack/react-router';\nimport { FALLBACK_LOCALE, isLocale } from '${baseRoutesImport}';\nimport { store } from '${mainPkg}/api/store';\n\nexport const Route = createFileRoute('/{-$locale}')({\n beforeLoad: ({ params, location }) => {\n const { locale } = params;\n if (!locale) return;\n if (!isLocale(locale)) {\n throw redirect({\n to: \\`/\\${FALLBACK_LOCALE}\\${location.pathname}\\`,\n search: location.search,\n replace: true,\n });\n }\n },\n loader: async ({ params, context, location }) => {\n // On a Salla shared host the address never carries a language: the router adds a virtual\n // one on the way in and strips it on the way out, and \\`rootBeforeLoad\\` settles which\n // language the store shows (\\`?lang=\\`, the \\`s-lang\\` cookie, the store's default). A redirect\n // here between locale-less and locale-bearing paths would come back as the same URL.\n if (context.storeBaseFollowsLocale) return;\n\n const settings = await context.queryClient.ensureQueryData(store.queries.settings());\n // Single-language when the merchant says so, or when the store lists fewer than two\n // languages. A page with no locale is read as FALLBACK_LOCALE (\\`rootBeforeLoad\\`), so a\n // single-language store in another language keeps its segment instead: it is what the\n // page is addressed and read by. Without it an English-only store would render in Arabic.\n const listed = settings?.languages;\n const soleEntry = listed?.length === 1 ? listed[0] : undefined;\n const soleLang = soleEntry ? (soleEntry.iso_code ?? soleEntry.code)?.toLowerCase() : undefined;\n const single =\n settings?.store?.settings?.is_multilingual === false || (listed != null && listed.length < 2);\n const segment = single && isLocale(soleLang) && soleLang !== FALLBACK_LOCALE ? soleLang : null;\n const isMultilingual = !single;\n const pathWithoutLocale = params.locale\n ? location.pathname.slice(params.locale.length + 1) || '/'\n : location.pathname;\n\n if (!isMultilingual && !segment && params.locale) {\n throw redirect({\n to: pathWithoutLocale,\n search: location.search,\n replace: true,\n });\n }\n if (!isMultilingual && segment && params.locale !== segment) {\n // The store's one language, wherever the path pointed: the right page, and the one\n // every other rule sends this visitor to.\n throw redirect({\n to: \\`/\\${segment}\\${pathWithoutLocale === '/' ? '' : pathWithoutLocale}\\`,\n search: location.search,\n replace: true,\n });\n }\n if (!isMultilingual && segment && !params.locale) {\n throw redirect({\n to: \\`/\\${segment}\\${location.pathname === '/' ? '' : location.pathname}\\`,\n search: location.search,\n replace: true,\n });\n }\n if (isMultilingual && !params.locale) {\n // A leading locale bound to a child param (/ar/p1 as slug 'ar'): Twig has no such page.\n if (isLocale(location.pathname.split('/')[1])) throw notFound();\n throw redirect({\n to: \\`/\\${FALLBACK_LOCALE}\\${location.pathname}\\`,\n search: location.search,\n replace: true,\n });\n }\n // The localization modal asks for another language with \\`?lang=\\`, and only\n // rewrites the locale segment when a slash follows it (\\`/ar?scope=1\\` keeps \\`/ar\\`).\n const { lang, ...search } = location.search;\n const offered = settings?.languages?.some(\n (language) => (language.iso_code ?? language.code)?.toLowerCase() === lang\n );\n if (params.locale && lang !== params.locale && isLocale(lang) && offered) {\n throw redirect({\n to: \\`/\\${lang}\\${location.pathname.slice(params.locale.length + 1)}\\`,\n search,\n replace: true,\n });\n }\n },\n component: () => <Outlet />,\n});\n`;\n}\n","/**\n * Template for redirect.$type.$id.tsx route file (/{-$locale}/redirect/$type/$id)\n * Handles custom link redirects from backend. Works with and without locale prefix.\n */\nexport function getRedirectTemplate(baseRoutesImport: string): string {\n return `// @auto-generated\n// @ts-nocheck — params types are generated by TanStack Router on pnpm dev\nimport { createFileRoute, redirect } from '@tanstack/react-router';\nimport { FALLBACK_LOCALE } from '${baseRoutesImport}';\n\ntype RedirectType =\n | 'products'\n | 'categories'\n | 'brands'\n | 'pages'\n | 'blog_articles'\n | 'blog_categories'\n | 'products_tags'\n | 'reviews_link'\n | 'book_now';\n\nexport const Route = createFileRoute('/{-$locale}/redirect/$type/$id')({\n loader: async ({ params }) => {\n const { type, id } = params;\n const locale = params.locale || FALLBACK_LOCALE;\n\n let redirectPath: string;\n const slug = '-';\n\n switch (type as RedirectType) {\n case 'products':\n redirectPath = \\`/\\${locale}/\\${slug}/p\\${id}\\`;\n break;\n case 'categories':\n redirectPath = \\`/\\${locale}/\\${slug}/c\\${id}\\`;\n break;\n case 'brands':\n redirectPath = \\`/\\${locale}/brands/\\${id}\\`;\n break;\n case 'pages':\n redirectPath = \\`/\\${locale}/\\${slug}/page-\\${id}\\`;\n break;\n case 'blog_articles':\n redirectPath = \\`/\\${locale}/blog/\\${slug}/a-\\${id}\\`;\n break;\n case 'blog_categories':\n redirectPath = \\`/\\${locale}/blog/\\${slug}/c-\\${id}\\`;\n break;\n case 'products_tags':\n redirectPath = \\`/\\${locale}/\\${slug}/tag-\\${id}\\`;\n break;\n case 'book_now':\n redirectPath = \\`/\\${locale}/landing/\\${id}\\`;\n break;\n case 'reviews_link':\n default:\n redirectPath = \\`/\\${locale}\\`;\n }\n\n throw redirect({ to: redirectPath });\n },\n});\n`;\n}\n","/**\n * Template for account.tsx layout route file (/{-$locale}/account)\n * Renders CustomerLayout with sidebar, breadcrumb, and user menu.\n * Child account routes render their content via <Outlet />.\n * The `page` data is read from the active child route's loader data.\n */\nexport function getAccountLayoutTemplate(baseRoutesImport: string): string {\n const mainPkg = baseRoutesImport.replace(/\\/routes$/, '');\n return `// @auto-generated\n// @ts-nocheck — params types are generated by TanStack Router on pnpm dev\nimport { createFileRoute, Outlet, useMatches } from '@tanstack/react-router';\nimport { useComponent } from '${mainPkg}';\nimport { CustomerLayout } from '${mainPkg}/components/layout';\nimport { CustomerLayoutSkeleton } from '${mainPkg}/skeleton';\n\nconst ACCOUNT_LAYOUT_PENDING_KEY = 'account:layout-pending';\n\nfunction AccountLayoutComponent() {\n const matches = useMatches();\n const page = matches.reduceRight(\n (found, m) => found ?? (m.loaderData?.page ? m.loaderData.page : null),\n null,\n );\n\n return (\n <CustomerLayout page={page}>\n <Outlet />\n </CustomerLayout>\n );\n}\n\nfunction AccountLayoutPendingComponent() {\n const AccountLayoutPending = useComponent(ACCOUNT_LAYOUT_PENDING_KEY);\n return AccountLayoutPending ? <AccountLayoutPending /> : <CustomerLayoutSkeleton />;\n}\n\nexport const Route = createFileRoute('/{-$locale}/account')({\n component: AccountLayoutComponent,\n pendingComponent: AccountLayoutPendingComponent,\n});\n`;\n}\n","/**\n * @fileoverview TanStack Router framework adapter\n *\n * This adapter provides integration with TanStack Router and React.\n * It handles plugin injection, route file generation, and custom routes\n * loading for TanStack Router.\n *\n * The virtual route config is built inline from the resolved routes,\n * eliminating the need for a physical `app/routes.ts` file in the theme project.\n *\n * =============================================================================\n * PRETTIER FORMATTING RULES - DO NOT MODIFY WITHOUT TESTING\n * =============================================================================\n *\n * Generated route files MUST match Prettier output to avoid format conflicts.\n * The formatting is built into the templates below - no runtime Prettier is used.\n *\n * The project uses these Prettier settings (.prettierrc):\n * - printWidth: 100\n * - tabWidth: 2\n * - singleQuote: true\n * - trailingComma: 'es5'\n *\n * CRITICAL FORMATTING RULES (ENCODED IN TEMPLATES):\n *\n * 1. LOADER CALL FORMATTING:\n * - If the full loader line fits within printWidth (100 chars), use INLINE format:\n * `loader: ({ params }): Promise<Type> => Module.loader({ ... })`\n *\n * - If the line exceeds printWidth, use MULTI-LINE format with 4-space indent:\n * ```\n * loader: ({ params }): Promise<Type> =>\n * Module.loader({ ... })\n * ```\n * IMPORTANT: The 4-space indent is computed as: 2 (object property) + 2 (arrow continuation)\n *\n * 2. INDENTATION CALCULATION:\n * - Object property inside route config: 2 spaces\n * - Arrow function continuation: +2 spaces (total 4)\n * - Inside loader args object: +2 from continuation (total 6)\n *\n * 3. REDIRECT ROUTES:\n * - Same multi-line format with 4-space indent for arrow continuation\n *\n * WHEN MODIFYING THIS FILE:\n * 1. Run `pnpm build` after changes\n * 2. Run `pnpm dev` to regenerate routes\n * 3. Run `pnpm format` to verify no changes\n * 4. Check `git status` - should show no modifications to route files\n *\n * =============================================================================\n */\n\nimport type { Plugin, PluginOption } from 'vite';\nimport { assetsBasePlugin } from '../plugins/assets-base.plugin';\nimport { webHydrationPlugin } from '../plugins/salla-hydration.plugin';\nimport { themeTranslationsPlugin } from '../plugins/theme-translations.plugin';\nimport { twilightSchemaPlugin } from '../plugins/twilight-schema.plugin';\nimport { bestPracticesPlugin } from '../plugins/best-practices/best-practices.plugin';\nimport { packageAliasesPlugin } from '../plugins/package-aliases.plugin';\nimport { collectComponentWrapperImports, engineSourceDir } from '../plugins/component-deps';\nimport { resolveWorkerConfigPath } from '../plugins/worker-config';\nimport type {\n FrameworkAdapter,\n GenerateRoutesOptions,\n TwilightReactOptions,\n TwilightRoute,\n} from '../types';\nimport { RouteId } from '../../router/route-ids';\nimport { createRequire } from 'module';\nimport Module from 'module';\nimport { resolve, basename, dirname, join, relative, sep } from 'path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync } from 'fs';\nimport { transformSync } from 'esbuild';\nimport { fileURLToPath, pathToFileURL } from 'url';\nimport {\n getLocaleWrapperTemplate,\n getRedirectTemplate,\n getAccountLayoutTemplate,\n} from '../../tanstack/templates';\n\nconst DEFAULT_ROUTES_DIR = './app/routes';\nconst DEFAULT_ROUTES_FILE = './app/routes.ts';\nconst DEFAULT_ROOT_ROUTE = '__root.tsx';\n\nexport const DEFAULT_BASE_ROUTES: TwilightRoute[] = [\n // Core routes\n {\n path: '/',\n file: 'index.tsx',\n factory: 'createHomeRouteConfig',\n id: RouteId.INDEX,\n isIndex: true,\n },\n { path: '/cart', file: 'cart.tsx', factory: 'createCartRouteConfig', id: RouteId.CART },\n { path: '/search', file: 'search.tsx', factory: 'createSearchRouteConfig', id: RouteId.SEARCH },\n\n // Product listing routes\n {\n path: '/latest-products',\n file: 'latest-products.tsx',\n factory: 'createLatestProductsRouteConfig',\n id: RouteId.PRODUCT_INDEX_LATEST,\n },\n {\n path: '/most-sales-products',\n file: 'most-sales-products.tsx',\n factory: 'createMostSalesProductsRouteConfig',\n id: RouteId.PRODUCT_INDEX_SALES,\n },\n {\n path: '/offers',\n file: 'offers.tsx',\n factory: 'createOffersRouteConfig',\n id: RouteId.PRODUCT_INDEX_OFFERS,\n },\n {\n // Twig's products page, `?source=` picking the list (the home's \"order again\" links to `reorder`).\n path: '/products',\n file: 'products.tsx',\n factory: 'createProductsRouteConfig',\n id: RouteId.PRODUCT_INDEX,\n },\n\n // Blog routes\n { path: '/blog', file: 'blog.tsx', factory: 'createBlogRouteConfig', id: RouteId.BLOG_INDEX },\n {\n path: '/blog/author/$id',\n file: 'blog_.author.$id.tsx',\n factory: 'createBlogAuthorRouteConfig',\n id: RouteId.BLOG_INDEX_AUTHOR,\n },\n {\n path: '/blog/$slug/a-{$id}',\n file: 'blog_.$slug.a-$id.tsx',\n factory: 'createBlogSingleRouteConfig',\n id: RouteId.BLOG_SINGLE,\n },\n {\n path: '/blog/$slug/c-{$id}',\n file: 'blog_.$slug.c-$id.tsx',\n factory: 'createBlogCategoryRouteConfig',\n id: RouteId.BLOG_INDEX_CATEGORY,\n },\n {\n path: '/blog/$slug/tag-{$id}',\n file: 'blog_.$slug.tag-$id.tsx',\n factory: 'createBlogTagRouteConfig',\n id: RouteId.BLOG_INDEX_TAG,\n },\n\n // Brands routes\n {\n path: '/brands',\n file: 'brands.tsx',\n factory: 'createBrandsRouteConfig',\n id: RouteId.BRANDS_INDEX,\n },\n {\n path: '/brands/$id',\n file: 'brands.$id.tsx',\n factory: 'createBrandSingleRouteConfig',\n id: RouteId.BRANDS_SINGLE,\n },\n\n // Tag routes\n {\n path: '/tags/$id',\n file: 'tags.$id.tsx',\n factory: 'createTagRouteConfig',\n id: RouteId.PRODUCT_INDEX_TAG,\n },\n\n // Customer routes\n {\n path: '/account',\n file: 'account.tsx',\n factory: 'createAccountLayoutConfig',\n id: RouteId.CUSTOMER_LAYOUT,\n isLayout: true,\n },\n {\n path: '/account/profile',\n file: 'account.profile.tsx',\n factory: 'createProfileRouteConfig',\n id: RouteId.CUSTOMER_PROFILE,\n },\n {\n path: '/account/wishlist',\n file: 'account.wishlist.tsx',\n factory: 'createWishlistRouteConfig',\n id: RouteId.CUSTOMER_WISHLIST,\n },\n {\n path: '/account/wallet',\n file: 'account.wallet.tsx',\n factory: 'createWalletRouteConfig',\n id: RouteId.CUSTOMER_WALLET,\n },\n {\n path: '/account/notifications',\n file: 'account.notifications.tsx',\n factory: 'createNotificationsRouteConfig',\n id: RouteId.CUSTOMER_NOTIFICATIONS,\n },\n {\n path: '/account/settings',\n file: 'account.settings.tsx',\n factory: 'createSettingsRouteConfig',\n id: RouteId.CUSTOMER_SETTINGS,\n },\n {\n path: '/account/orders',\n file: 'account.orders.tsx',\n factory: 'createOrdersRouteConfig',\n id: RouteId.CUSTOMER_ORDERS_INDEX,\n },\n {\n path: '/account/orders/$id',\n file: 'account.orders.$id.tsx',\n factory: 'createOrderSingleRouteConfig',\n id: RouteId.CUSTOMER_ORDERS_SINGLE,\n },\n {\n path: '/pending-orders',\n file: 'pending-orders.tsx',\n factory: 'createPendingOrdersRedirectConfig',\n id: RouteId.CUSTOMER_ORDERS_INDEX_PENDING,\n },\n {\n // Where the SDK redirects after `salla.auth.logout()` (`salla.url.get('logout?from=…')`).\n path: '/logout',\n file: 'logout.tsx',\n factory: 'createLogoutRedirectConfig',\n id: RouteId.LOGOUT,\n },\n {\n // The URL the SDK's <salla-user-menu> links \"Pending orders\" to (`/account/{key}`).\n path: '/account/pending_orders',\n file: 'account.pending_orders.tsx',\n factory: 'createPendingOrdersRedirectConfig',\n id: RouteId.CUSTOMER_ORDERS_INDEX_PENDING,\n },\n {\n // Where the loyalty page's \"rate your orders\" point links (the API's `points[].url`).\n path: '/account/rating',\n file: 'account.rating.tsx',\n factory: 'createRatingRedirectConfig',\n id: RouteId.CUSTOMER_ORDERS_INDEX,\n },\n // Twig customer URLs, redirected to their `/account/…` page.\n {\n path: '/profile',\n file: 'profile.tsx',\n factory: 'createAccountRedirectConfig',\n id: RouteId.CUSTOMER_PROFILE,\n },\n {\n path: '/orders',\n file: 'orders.tsx',\n factory: 'createAccountRedirectConfig',\n id: RouteId.CUSTOMER_ORDERS_INDEX,\n },\n {\n path: '/wishlist',\n file: 'wishlist.tsx',\n factory: 'createAccountRedirectConfig',\n id: RouteId.CUSTOMER_WISHLIST,\n },\n {\n path: '/wallet',\n file: 'wallet.tsx',\n factory: 'createAccountRedirectConfig',\n id: RouteId.CUSTOMER_WALLET,\n },\n {\n path: '/notifications',\n file: 'notifications.tsx',\n factory: 'createAccountRedirectConfig',\n id: RouteId.CUSTOMER_NOTIFICATIONS,\n },\n\n // Other routes\n {\n path: '/loyalty',\n file: 'loyalty.tsx',\n factory: 'createLoyaltyRouteConfig',\n id: RouteId.LOYALTY,\n },\n {\n // Where the SDK's <salla-loyalty-program> links \"view points log\" (`salla.url.get('loyalty_points')`).\n path: '/loyalty_points',\n file: 'loyalty_points.tsx',\n factory: 'createLoyaltyPointsRouteConfig',\n id: RouteId.CUSTOMER_LOYALTY_POINTS,\n },\n {\n path: '/testimonials',\n file: 'testimonials.tsx',\n factory: 'createTestimonialsRouteConfig',\n id: RouteId.TESTIMONIALS,\n },\n {\n // Twig's product reviews page, which store menus link to.\n path: '/reviews',\n file: 'reviews.tsx',\n factory: 'createReviewsRouteConfig',\n id: RouteId.REVIEWS,\n },\n {\n // Salla's platform redirects post-payment to /{locale}/thankyou/{orderId} (legacy, no hyphen).\n path: '/thankyou/$orderId',\n file: 'thankyou.$orderId.tsx',\n factory: 'createThankYouRouteConfig',\n id: RouteId.THANK_YOU,\n },\n\n // SEO-friendly slug routes\n {\n path: '/$slug/c{$id}',\n file: '$slug.c$id.tsx',\n factory: 'createSlugCategoryRouteConfig',\n id: RouteId.PRODUCT_INDEX,\n },\n {\n path: '/$slug/p{$id}',\n file: '$slug.p$id.tsx',\n factory: 'createSlugProductRouteConfig',\n id: RouteId.PRODUCT_SINGLE,\n },\n {\n path: '/$slug/brand-{$id}',\n file: '$slug.brand-$id.tsx',\n factory: 'createSlugBrandRedirectConfig',\n id: RouteId.BRANDS_SINGLE,\n },\n {\n path: '/$slug/tag-{$id}',\n file: '$slug.tag-$id.tsx',\n factory: 'createSlugTagRouteConfig',\n id: RouteId.PRODUCT_INDEX_TAG,\n },\n {\n path: '/$slug/page-{$id}',\n file: '$slug.page-$id.tsx',\n factory: 'createSlugPageRouteConfig',\n id: RouteId.PAGE_SINGLE,\n },\n];\n\ninterface VirtualRouteNode {\n type: 'index' | 'route' | 'layout' | 'physical';\n file?: string;\n path?: string;\n}\n\n/**\n * Load the developer's `app/routes.ts` and read the exported `routes` array.\n */\nfunction loadRoutesFile(filePath: string): TwilightRoute[] {\n if (!existsSync(filePath)) return [];\n\n const raw = readFileSync(filePath, 'utf-8');\n\n let code: string;\n try {\n const result = transformSync(raw, {\n loader: 'ts',\n format: 'cjs',\n target: 'node18',\n });\n code = result.code;\n } catch (err) {\n console.warn(`[twilight-react:tanstack] Failed to transpile ${basename(filePath)}:`, err);\n return [];\n }\n\n const projectRequire = createRequire(resolve(process.cwd(), 'package.json'));\n\n let exported: { routes?: VirtualRouteNode[] };\n try {\n const m = new Module(filePath) as any;\n m.filename = filePath;\n m.paths = (Module as any)._nodeModulePaths(dirname(filePath));\n m.require = projectRequire;\n m._compile(code, filePath);\n exported = m.exports;\n } catch (err) {\n console.warn(`[twilight-react:tanstack] Failed to evaluate ${basename(filePath)}:`, err);\n return [];\n }\n\n if (!Array.isArray(exported.routes)) return [];\n\n const routes: TwilightRoute[] = [];\n for (const node of exported.routes) {\n if (!node || typeof node !== 'object' || !node.file) continue;\n\n if (node.type === 'index') {\n routes.push({\n path: '/',\n file: node.file,\n factory: `createCustomRoute_${node.file.replace(/[^a-zA-Z0-9]/g, '_')}`,\n isIndex: true,\n });\n } else if (node.type === 'route' && node.path) {\n routes.push({\n path: node.path,\n file: node.file,\n factory: `createCustomRoute_${node.file.replace(/[^a-zA-Z0-9]/g, '_')}`,\n });\n }\n }\n\n if (routes.length > 0) {\n console.log(\n `[twilight-react:tanstack] Loaded ${routes.length} custom route(s) from ${basename(filePath)}`\n );\n }\n\n return routes;\n}\n\nconst FACTORY_TO_MODULE: Record<string, string> = {\n createHomeRouteConfig: 'Home',\n createCartRouteConfig: 'Cart',\n // All product listing routes use the unified ProductListing module\n createSearchRouteConfig: 'ProductListing',\n createProductsRouteConfig: 'ProductListing',\n createSlugCategoryRouteConfig: 'ProductListing',\n createSlugTagRouteConfig: 'ProductListing',\n createTagRouteConfig: 'ProductListing',\n createBrandSingleRouteConfig: 'ProductListing',\n createBlogRouteConfig: 'Blog',\n createBlogSingleRouteConfig: 'BlogSingle',\n createBlogAuthorRouteConfig: 'BlogAuthorRoute',\n createBlogCategoryRouteConfig: 'BlogCategoryRoute',\n createBlogTagRouteConfig: 'BlogTagRoute',\n createBrandsRouteConfig: 'Brands',\n createProfileRouteConfig: 'Profile',\n createWishlistRouteConfig: 'Wishlist',\n createWalletRouteConfig: 'Wallet',\n createNotificationsRouteConfig: 'Notifications',\n createSettingsRouteConfig: 'Settings',\n createOrdersRouteConfig: 'Orders',\n createOrderSingleRouteConfig: 'OrderSingle',\n createAccountLayoutConfig: 'AccountLayout',\n createLoyaltyRouteConfig: 'Loyalty',\n createLoyaltyPointsRouteConfig: 'LoyaltyPoints',\n createTestimonialsRouteConfig: 'Testimonials',\n createReviewsRouteConfig: 'Reviews',\n createThankYouRouteConfig: 'ThankYou',\n // Other routes\n createSlugProductRouteConfig: 'Product',\n createSlugPageRouteConfig: 'PageSingle',\n // SEO slug redirect (redirect-only, no component)\n createSlugBrandRedirectConfig: 'slugBrandRedirect',\n // Pending orders redirect\n createPendingOrdersRedirectConfig: 'pendingOrdersRedirect',\n createRatingRedirectConfig: 'ratingRedirect',\n createAccountRedirectConfig: 'accountRedirect',\n // Twig listing URLs redirected to /products?source=\n createLatestProductsRouteConfig: 'productsSourceRedirect',\n createMostSalesProductsRouteConfig: 'productsSourceRedirect',\n createOffersRouteConfig: 'productsSourceRedirect',\n // Logout redirect\n createLogoutRedirectConfig: 'logoutRedirect',\n};\n\nconst REDIRECT_ONLY_MODULES = new Set([\n 'slugBrandRedirect',\n 'pendingOrdersRedirect',\n 'ratingRedirect',\n 'accountRedirect',\n 'productsSourceRedirect',\n 'logoutRedirect',\n]);\n\n/**\n * Maps module name → sub-path under the routes directory.\n * Used to generate granular imports instead of barrel imports.\n * e.g. 'Cart' → 'cart' → `import { Cart } from '…/routes/cart'`\n */\nconst MODULE_SUBPATH: Record<string, string> = {\n Home: 'home',\n Cart: 'cart',\n ProductListing: 'product-listing',\n Blog: 'blog',\n BlogSingle: 'blog',\n BlogAuthorRoute: 'blog',\n BlogCategoryRoute: 'blog',\n BlogTagRoute: 'blog',\n Brands: 'brands',\n BrandSingle: 'brands',\n Profile: 'account',\n Wishlist: 'account',\n Wallet: 'account',\n Notifications: 'account',\n Settings: 'account',\n Orders: 'account/orders',\n OrderSingle: 'account/orders',\n Loyalty: 'loyalty',\n LoyaltyPoints: 'loyalty',\n PageSingle: 'page',\n Testimonials: 'testimonials',\n Reviews: 'testimonials',\n ThankYou: 'thank-you',\n Product: 'product',\n slugBrandRedirect: 'seo-redirects',\n pendingOrdersRedirect: 'seo-redirects',\n ratingRedirect: 'seo-redirects',\n accountRedirect: 'seo-redirects',\n productsSourceRedirect: 'seo-redirects',\n logoutRedirect: 'seo-redirects',\n};\n\n/**\n * Maps module name → exported LoaderData type name from '@salla.sa/twilight-theme-engine/routes'.\n * Used to generate explicit type annotations in route files for better DX.\n */\nconst MODULE_LOADER_TYPE: Record<string, string> = {\n Home: 'HomeLoaderData',\n Cart: 'CartPageProps',\n ProductListing: 'ProductListLoaderData',\n Blog: 'BlogPageProps',\n BlogSingle: 'BlogSinglePageProps',\n BlogAuthorRoute: 'BlogAuthorLoaderData',\n BlogCategoryRoute: 'BlogCategoryLoaderData',\n BlogTagRoute: 'BlogTagLoaderData',\n Brands: 'BrandsPageProps',\n BrandSingle: 'ProductListLoaderData',\n Profile: 'ProfilePageProps',\n Wishlist: 'WishlistPageProps',\n Wallet: 'WalletPageProps',\n Notifications: 'NotificationsPageProps',\n Settings: 'SettingsPageProps',\n Orders: 'OrdersPageProps',\n OrderSingle: 'OrderSinglePageProps',\n Loyalty: 'LoyaltyPageProps',\n LoyaltyPoints: 'LoyaltyPointsPageProps',\n PageSingle: 'PageSingleProps',\n Testimonials: 'TestimonialsPageProps',\n Reviews: 'ReviewsPageProps',\n ThankYou: 'ThankYouPageProps',\n Product: 'ProductPageProps',\n};\n\n/**\n * Routes that support URL-based pagination via ?page= query param.\n * These routes get validateSearch + loaderDeps to forward the page param to the loader.\n */\nconst PAGINATED_MODULES = new Set(['Wishlist']);\n\n/**\n * Paginated routes that don't require locale in their loader context.\n */\nconst PAGINATED_NO_LOCALE = new Set(['Wallet']);\n\n/**\n * Routes that support both ?page= and ?sort= search params.\n * These routes get validateSearch + loaderDeps to forward both to the loader.\n */\nconst SORT_PAGINATED_MODULES = new Set(['ProductListing']);\n\n/**\n * Route factories that need sort pagination support.\n * Used when the module name doesn't match (e.g., Tag routes use ProductListing module).\n */\nconst SORT_PAGINATED_FACTORIES = new Set([\n 'createSearchRouteConfig',\n 'createSlugTagRouteConfig',\n 'createTagRouteConfig',\n 'createBrandSingleRouteConfig',\n]);\n\n/**\n * Routes that use deferred data loading.\n * These routes return promises that are resolved in the component via <Await>.\n * This allows the page to render immediately while data loads in background.\n */\nconst DEFERRED_ROUTES = new Set<string>();\n\n/**\n * Routes that support ?status= search param.\n * These routes get validateSearch + loaderDeps to forward status to the loader.\n */\nconst STATUS_FILTERED_MODULES = new Set(['Orders']);\n\n/**\n * Maps module name → skeleton component name from '@salla.sa/twilight-theme-engine/components'.\n * When present, the generated route file adds a `pendingComponent` that renders\n * the page-specific skeleton instead of the generic default.\n */\nconst MODULE_PENDING_SKELETON: Record<string, string> = {\n Home: 'HomeSkeleton',\n Product: 'ProductDetailSkeleton',\n Blog: 'BlogSkeleton',\n BlogSingle: 'BlogSkeleton',\n BlogAuthorRoute: 'BlogSkeleton',\n BlogCategoryRoute: 'BlogSkeleton',\n BlogTagRoute: 'BlogSkeleton',\n Cart: 'CartSkeleton',\n Profile: 'CustomerPageSkeleton',\n Wishlist: 'CustomerPageSkeleton',\n Wallet: 'CustomerPageSkeleton',\n Notifications: 'CustomerPageSkeleton',\n Settings: 'CustomerPageSkeleton',\n Orders: 'CustomerPageSkeleton',\n OrderSingle: 'CustomerPageSkeleton',\n LoyaltyPoints: 'CustomerLayoutSkeleton',\n};\n\n/**\n * Explicit mapping from factory → loader params.\n * Maps loader param names to URL param names (from TanStack route path).\n * Only needed for routes where URL params differ from loader params.\n * If a factory is not listed, all URL params are forwarded as-is.\n */\nconst FACTORY_LOADER_PARAMS: Record<string, Record<string, string>> = {\n // /$slug/c{$id} → category.loader({ id }) — slug is SEO-only, not used by loader\n createSlugCategoryRouteConfig: { id: 'id' },\n // /$slug/p{$id} → product.loader({ id })\n createSlugProductRouteConfig: { id: 'id' },\n // /$slug/tag-{$id} → productListLoader({ source: 'tags', id })\n createSlugTagRouteConfig: { id: 'id' },\n // /$slug/page-{$id} → pageSingle.loader({ id }) — slug is SEO-only, not used by loader\n createSlugPageRouteConfig: { id: 'id' },\n // /tags/$id → productListLoader({ source: 'tags', id })\n createTagRouteConfig: { id: 'id' },\n // /brands/$id → productListLoader({ source: 'brands', id })\n createBrandSingleRouteConfig: { id: 'id' },\n};\n\n/** Listings that show the filter column. */\nconst LISTINGS_WITH_FILTERS = new Set(['createSlugCategoryRouteConfig', 'createSearchRouteConfig']);\n\nfunction listingPending(factory: string): string {\n return LISTINGS_WITH_FILTERS.has(factory)\n ? 'ProductListing.Pending'\n : 'ProductListing.Pending hideFilters';\n}\n\nconst FACTORY_PRODUCTS_SOURCE: Record<string, string> = {\n createLatestProductsRouteConfig: 'latest',\n createMostSalesProductsRouteConfig: 'sales',\n createOffersRouteConfig: 'offers',\n};\n\nfunction getParamMapping(routePath: string, factory?: string): string {\n // Use explicit mapping if available\n if (factory && FACTORY_LOADER_PARAMS[factory]) {\n const mapping = FACTORY_LOADER_PARAMS[factory];\n const entries = Object.entries(mapping).map(\n ([loaderParam, urlParam]) => `${loaderParam}: params.${urlParam}`\n );\n // Add source param for tag routes\n if (factory === 'createTagRouteConfig' || factory === 'createSlugTagRouteConfig') {\n return `{ source: 'tags', ${entries.join(', ')} }`;\n }\n // Add source param for brand routes\n if (factory === 'createBrandSingleRouteConfig') {\n return `{ source: 'brands', ${entries.join(', ')} }`;\n }\n return `{ ${entries.join(', ')} }`;\n }\n\n // Default: forward all URL params as-is\n const paramMatches = routePath.match(/\\$([a-zA-Z]+)/g);\n if (!paramMatches || paramMatches.length === 0) return '';\n\n const params = paramMatches.map((match) => {\n const paramName = match.slice(1);\n return `${paramName}: params.${paramName}`;\n });\n\n return `{ ${params.join(', ')} }`;\n}\n\n/** Path shown in `createFileRoute(...)` — always includes the `/{-$locale}` optional prefix.\n * Index routes use trailing slash to indicate they're the index child of the locale layout.\n */\nfunction toTanstackRoutePath(route: TwilightRoute): string {\n if (route.isIndex) return '/{-$locale}/';\n return `/{-$locale}${route.path}`;\n}\n\nfunction generateRouteFileContent(route: TwilightRoute, baseImport: string): string {\n // `routePath` is the original engine path (e.g. '/cart', '/$slug/p{$id}').\n // Used only for param extraction / loader call generation — NOT for createFileRoute.\n const routePath = route.isIndex ? '/' : route.path;\n // `tanstackRoutePath` is the full path registered with TanStack Router.\n const tanstackRoutePath = toTanstackRoutePath(route);\n const moduleName = FACTORY_TO_MODULE[route.factory];\n\n if (moduleName) {\n const hasParams = routePath.includes('$');\n const paramMapping = getParamMapping(routePath, route.factory);\n const isRedirectOnly = REDIRECT_ONLY_MODULES.has(moduleName);\n\n // Granular import path: e.g. '@salla.sa/twilight-theme-engine/routes/cart'\n // Falls back to the barrel import if no subpath mapping exists.\n const subpath = MODULE_SUBPATH[moduleName];\n const moduleImport = subpath ? `${baseImport}/${subpath}` : baseImport;\n\n // Redirect-only routes using standalone loader functions\n if (route.factory === 'createSlugBrandRedirectConfig') {\n const loaderImport = 'slugBrandRedirectLoader';\n // Remove trailing space before } and add locale param\n const redirectParamMapping = paramMapping\n ? paramMapping.replace(/\\s*}$/, ', locale: params.locale }')\n : '{ locale: params.locale }';\n // Format loader call with 4-space indent for Prettier compatibility\n // 4 spaces = 2 (object property) + 2 (arrow continuation)\n const loaderCall = `({ params }) =>\n ${loaderImport}({\n params: ${redirectParamMapping},\n })`;\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${loaderImport} } from '${baseImport}/seo-redirects';\n\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: ${loaderCall},\n});\n`;\n }\n\n // Logout redirect route\n if (route.factory === 'createLogoutRedirectConfig') {\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { LogoutRedirect } from '${baseImport}/seo-redirects';\n\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n component: LogoutRedirect,\n});\n`;\n }\n\n // Pending orders / rating redirect routes\n if (\n route.factory === 'createPendingOrdersRedirectConfig' ||\n route.factory === 'createRatingRedirectConfig'\n ) {\n const loaderImport =\n route.factory === 'createRatingRedirectConfig'\n ? 'ratingRedirectLoader'\n : 'pendingOrdersRedirectLoader';\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${loaderImport} } from '${baseImport}/seo-redirects';\n\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: ({ params }) =>\n ${loaderImport}({\n params: { locale: params.locale },\n }),\n});\n`;\n }\n\n // Twig customer URL redirect route\n if (route.factory === 'createAccountRedirectConfig') {\n const loaderImport = 'accountRedirectLoader';\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${loaderImport} } from '${baseImport}/seo-redirects';\n\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: ({ params, location }) =>\n ${loaderImport}({\n params: { locale: params.locale },\n page: '${routePath.slice(1)}',\n search: location.searchStr,\n }),\n});\n`;\n }\n\n // Twig listing URL redirect route\n if (moduleName === 'productsSourceRedirect') {\n const loaderImport = 'productsSourceRedirectLoader';\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${loaderImport} } from '${baseImport}/seo-redirects';\n\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: ({ params, location }) =>\n ${loaderImport}({\n params: { locale: params.locale },\n source: '${FACTORY_PRODUCTS_SOURCE[route.factory]}',\n search: location.searchStr,\n }),\n});\n`;\n }\n\n // Resolve the LoaderData type for this module\n const loaderType = MODULE_LOADER_TYPE[moduleName];\n // Type imports come from the same granular module as the value import.\n // Import from main package entry to avoid barrel routes import.\n const typeImport = loaderType ? `\\nimport type { ${loaderType} } from '${moduleImport}';` : '';\n const extraTypeImport = '';\n\n // Standard module pattern (Module.loader, Module.Component, Module.head)\n const importName = moduleName;\n\n const loaderCall = hasParams\n ? `({ params }) => ${importName}.loader({ params: ${paramMapping}, locale: params.locale })`\n : `({ params }) => ${importName}.loader({ locale: params.locale })`;\n\n if (isRedirectOnly) {\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName} } from '${moduleImport}';\n\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: ${loaderCall},\n});\n`;\n }\n\n // Search route needs search params\n if (route.factory === 'createSearchRouteConfig') {\n const componentFn = loaderType\n ? `function ${importName}Component() {\\n const data: ${loaderType} = Route.useLoaderData();\\n return <${importName}.Component {...data} />;\\n}`\n : `function ${importName}Component() {\\n const data = Route.useLoaderData();\\n return <${importName}.Component {...data} />;\\n}`;\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName}, searchListingSearch } from '${moduleImport}';${typeImport}${extraTypeImport}\nimport { withHead } from '${baseImport.replace('/routes', '')}/tanstack';\n\n/**\n * Search route configuration: \\`searchListingSearch\\` keeps ?q=, ?page= and ?sort=\n * and forwards them to the loader.\n */\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n ...searchListingSearch,\n loader: ({ deps, params }): Promise<${loaderType}> =>\n ${importName}.loader({\n params: { source: 'search' },\n search: deps,\n locale: params.locale,\n }),\n head: withHead(${importName}),\n pendingComponent: () => <${listingPending(route.factory)} />,\n component: ${importName}Component,\n});\n\n/**\n * Search page component.\n * Uses Route.useLoaderData() to access the data loaded by the route loader,\n * following React best practices for data fetching in route components.\n */\n${componentFn}\n`;\n }\n\n // Products route picks its list from ?source=\n if (route.factory === 'createProductsRouteConfig') {\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName} } from '${moduleImport}';${typeImport}${extraTypeImport}\nimport { withHead } from '${baseImport.replace('/routes', '')}/tanstack';\n\nconst SOURCES = ['latest', 'sales', 'offers', 'reorder'] as const;\ntype Source = (typeof SOURCES)[number];\n\n/**\n * Products route configuration: \\`?source=\\` picks the list, the latest products by default.\n */\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n validateSearch: (search: Record<string, unknown>) => {\n const page = Number(search.page) || 1;\n const sort = (search.sort as string) || undefined;\n const source = SOURCES.find((s) => s === search.source) ?? 'latest';\n return { source: source as Source, ...(page > 1 ? { page } : {}), ...(sort ? { sort } : {}) };\n },\n loaderDeps: ({ search }) => ({ source: search.source, page: search.page, sort: search.sort }),\n loader: ({ deps, params }): Promise<${loaderType}> =>\n ${importName}.loader({\n params: { source: deps.source },\n search: { page: deps.page, sort: deps.sort },\n locale: params.locale,\n }),\n head: withHead(${importName}),\n pendingComponent: () => <${listingPending(route.factory)} />,\n component: ${importName}Component,\n});\n\n/**\n * Products page component.\n * Uses Route.useLoaderData() to access the data loaded by the route loader,\n * following React best practices for data fetching in route components.\n */\nfunction ${importName}Component() {\n const data: ${loaderType} = Route.useLoaderData();\n return <${importName}.Component {...data} />;\n}\n`;\n }\n\n // Typed loader call — always passes locale from $locale route param for SSR compatibility\n // FORMAT RULE: See file header for Prettier formatting rules\n const isDeferred = DEFERRED_ROUTES.has(moduleName);\n\n // ============================================================================\n // PRETTIER FORMAT HELPER - DO NOT MODIFY INDENTATION VALUES\n // ============================================================================\n // Prettier settings: printWidth: 100, tabWidth: 2\n // The loader line is prefixed with \" loader: \" (10 chars) in the route object\n // Plus trailing comma (1 char) = 11 chars overhead\n //\n // CRITICAL INDENTATION RULE:\n // When an arrow function body breaks to a new line, Prettier uses 4-space indent:\n // loader: ({ params }): Type =>\n // Module.loader(args) <-- 4 spaces (2 for object + 2 for continuation)\n //\n // This is because:\n // 1. Object properties are indented 2 spaces from the object start\n // 2. Arrow function continuation adds another 2-space indent\n // ============================================================================\n const PRETTIER_INDENT = 10; // \" loader: \" prefix length\n const PRETTIER_PRINT_WIDTH = 100;\n\n const getTypedLoaderCall = (returnType: string, name: string, args: string) => {\n const inline = `({ params }): ${returnType} => ${name}.loader(${args})`;\n const lineLength = PRETTIER_INDENT + inline.length + 1;\n if (lineLength <= PRETTIER_PRINT_WIDTH) {\n // Fits on one line - use inline format (Prettier prefers this for short lines)\n return inline;\n }\n // Exceeds printWidth - use multi-line format with 4-space indent\n // The 4 spaces = 2 (object property) + 2 (arrow continuation)\n return `({ params }): ${returnType} =>\n ${name}.loader(${args})`;\n };\n\n const returnType = isDeferred ? loaderType : `Promise<${loaderType}>`;\n\n const typedLoaderCall = loaderType\n ? hasParams\n ? // Routes with URL params - check if inline fits\n getTypedLoaderCall(\n returnType,\n importName,\n `{ params: ${paramMapping}, locale: params.locale }`\n )\n : // Routes without params - check if inline fits\n getTypedLoaderCall(returnType, importName, '{ locale: params.locale }')\n : loaderCall;\n\n // Resolve per-page skeleton if available\n const skeletonName = MODULE_PENDING_SKELETON[moduleName];\n const skeletonModulePath = baseImport.replace(/\\/routes$/, '/skeleton');\n const skeletonImport = skeletonName\n ? `\\nimport { ${skeletonName} } from '${skeletonModulePath}';`\n : '';\n const pendingLine =\n moduleName === 'ProductListing'\n ? `\\n pendingComponent: () => <${listingPending(route.factory)} />,`\n : skeletonName\n ? `\\n pendingComponent: () => <${skeletonName} />,`\n : '';\n\n // Import withHead helper for simplified head callback\n const headImport = `import { withHead } from '${baseImport.replace('/routes', '')}/tanstack';`;\n\n // Head callback uses withHead for clean DX\n const headCallback = route.isIndex ? `withHead(${importName})` : `withHead(${importName})`;\n\n // Generate named component function\n // For deferred routes, the component uses Await to handle promises\n const componentFn = isDeferred\n ? `function ${importName}Component() {\\n const data: ${loaderType} = Route.useLoaderData();\\n return <${importName}.Component components={data.components} />;\\n}`\n : loaderType\n ? `function ${importName}Component() {\\n const data: ${loaderType} = Route.useLoaderData();\\n return <${importName}.Component {...data} />;\\n}`\n : `function ${importName}Component() {\\n const data = Route.useLoaderData();\\n return <${importName}.Component {...data} />;\\n}`;\n\n // Route description for JSDoc\n const routeDescription = route.isIndex\n ? 'Home (index) route configuration.'\n : `${importName} route configuration.`;\n\n // Sort + paginated routes — forward ?sort= and ?page= to the loader (e.g. ProductListing)\n if (SORT_PAGINATED_MODULES.has(moduleName) || SORT_PAGINATED_FACTORIES.has(route.factory)) {\n const sortLoaderCall = hasParams\n ? `({ deps, params }): ${returnType} =>\n ${importName}.loader({\n params: ${paramMapping},\n search: deps,\n locale: params.locale,\n })`\n : `({ deps, params }): ${returnType} =>\n ${importName}.loader({\n search: deps,\n locale: params.locale,\n })`;\n\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName}, listingSearch } from '${moduleImport}';${typeImport}${skeletonImport}\n${headImport}\n\n/**\n * ${routeDescription}\n * Loads page data via loader and renders the ${importName} component.\n */\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n ...listingSearch,\n loader: ${sortLoaderCall},\n head: ${headCallback},${pendingLine}\n component: ${importName}Component,\n});\n\n/**\n * ${importName} page component.\n * Uses Route.useLoaderData() to access the data loaded by the route loader,\n * following React best practices for data fetching in route components.\n */\n${componentFn}\n`;\n }\n\n // Paginated routes — forward ?page= query param to the loader\n if (PAGINATED_MODULES.has(moduleName) || PAGINATED_NO_LOCALE.has(moduleName)) {\n const isNoLocale = PAGINATED_NO_LOCALE.has(moduleName);\n const loaderArgs = isNoLocale\n ? `{ search: { page: deps.page ?? 1 } }`\n : `{ search: { page: deps.page ?? 1 }, locale: params.locale }`;\n const loaderDestructuring = isNoLocale ? '{ deps }' : '{ deps, params }';\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName} } from '${moduleImport}';${typeImport}${skeletonImport}\n${headImport}\n\n/**\n * ${routeDescription}\n * Loads page data via loader and renders the ${importName} component.\n */\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n validateSearch: (search: Record<string, unknown>) => {\n const page = Number(search.page) || 1;\n return page > 1 ? { page } : {};\n },\n loaderDeps: ({ search }) => ({ page: search.page }),\n loader: (${loaderDestructuring}): ${returnType} =>\n ${importName}.loader(${loaderArgs}),\n head: ${headCallback},${pendingLine}\n component: ${importName}Component,\n});\n\n/**\n * ${importName} page component.\n * Uses Route.useLoaderData() to access the data loaded by the route loader,\n * following React best practices for data fetching in route components.\n */\n${componentFn}\n`;\n }\n\n // Status-filtered routes — forward ?status= to the loader (e.g. Orders)\n if (STATUS_FILTERED_MODULES.has(moduleName)) {\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName} } from '${moduleImport}';${typeImport}${skeletonImport}\n${headImport}\n\n/**\n * ${routeDescription}\n * Loads page data via loader and renders the ${importName} component.\n */\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n validateSearch: (search: Record<string, unknown>) => {\n const status = (search.status as string) || undefined;\n return status ? { status } : {};\n },\n loaderDeps: ({ search }) => ({ status: search.status }),\n loader: ({ deps, params }): ${returnType} =>\n ${importName}.loader({ search: { status: deps.status }, locale: params.locale }),\n head: ${headCallback},${pendingLine}\n component: ${importName}Component,\n});\n\n/**\n * ${importName} page component.\n * Uses Route.useLoaderData() to access the data loaded by the route loader,\n * following React best practices for data fetching in route components.\n */\n${componentFn}\n`;\n }\n\n // Standard route with loader, head, and component\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName} } from '${moduleImport}';${typeImport}${extraTypeImport}${skeletonImport}\n${headImport}\n\n/**\n * ${routeDescription}\n * Loads page data via loader and renders the ${importName} component.\n */\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: ${typedLoaderCall},\n head: ${headCallback},${pendingLine}\n component: ${importName}Component,\n});\n\n/**\n * ${importName} page component.\n * Uses Route.useLoaderData() to access the data loaded by the route loader,\n * following React best practices for data fetching in route components.\n */\n${componentFn}\n`;\n }\n\n // Fallback for custom routes\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${route.factory} } from '${baseImport}';\n\nconst config = ${route.factory}();\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: config.Loader,\n component: () => { const data = Route.useLoaderData(); return <config.Component {...data} />; },\n});\n`;\n}\n\n/** Routes kept in the engine's `.twilight/` dir instead of the theme's routes. */\nconst ENGINE_OWNED_FACTORIES = new Set([\n 'createAccountRedirectConfig',\n 'createPendingOrdersRedirectConfig',\n 'createRatingRedirectConfig',\n 'createLatestProductsRouteConfig',\n 'createMostSalesProductsRouteConfig',\n 'createOffersRouteConfig',\n 'createProductsRouteConfig',\n 'createSearchRouteConfig',\n 'createSlugCategoryRouteConfig',\n 'createSlugTagRouteConfig',\n 'createTagRouteConfig',\n 'createBrandSingleRouteConfig',\n 'createReviewsRouteConfig',\n]);\n\n/** A theme file without the `// @auto-generated` header is the theme's own and stays in use. */\nfunction isEngineOwned(route: TwilightRoute, routesDir: string): boolean {\n if (!ENGINE_OWNED_FACTORIES.has(route.factory)) return false;\n // The path comes from the engine's own route table, not from input.\n const themeFile = join(routesDir, route.file); // nosemgrep\n if (!existsSync(themeFile)) return true; // nosemgrep\n return readFileSync(themeFile, 'utf-8').startsWith('// @auto-generated'); // nosemgrep\n}\n\n/**\n * Resolve the engine's .twilight directory path relative to the project's routes directory.\n * This lets TanStack Router's generator find the engine-owned route files.\n */\nfunction getEngineTwilightRelPath(routesDir: string): string {\n // Find engine package root from this file's location\n let dir = dirname(fileURLToPath(import.meta.url));\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, 'package.json'))) break;\n dir = dirname(dir);\n }\n const twilightDir = join(dir, '.twilight');\n const absRoutes = resolve(routesDir);\n return relative(absRoutes, twilightDir).split(sep).join('/');\n}\n\nfunction resolveProjectPkg(projectRoot: string, pkg: string, subpath?: string): string {\n const pkgJsonPath = join(projectRoot, 'node_modules', pkg, 'package.json');\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n const key = subpath ? `./${subpath}` : '.';\n const exportEntry = pkgJson.exports?.[key];\n const rel =\n typeof exportEntry === 'string'\n ? exportEntry\n : (exportEntry?.import?.default ??\n exportEntry?.default ??\n exportEntry?.require?.default ??\n pkgJson.main);\n if (!rel)\n throw new Error(`[twilight-react] Cannot resolve ${pkg}${subpath ? `/${subpath}` : ''}`);\n return join(projectRoot, 'node_modules', pkg, rel);\n}\n\n/**\n * The workerd SSR runtime plugin, owned by the engine so themes hold no runtime\n * configuration of their own. Returns nothing when the theme opts out with\n * `worker: false` and registers the plugin itself.\n *\n * Unlike `tanstackStart` and `@vitejs/plugin-react` — peer deps that must resolve\n * to the *theme's* copy for a single instance — the runtime plugin is an engine\n * dependency, so a bare specifier is what correctly finds it.\n */\nasync function createWorkerPlugins(\n projectRoot: string,\n worker: NonNullable<TwilightReactOptions['worker']>\n): Promise<PluginOption[]> {\n if (worker === false) return [];\n\n const { cloudflare } = (await import('@cloudflare/vite-plugin')) as {\n cloudflare: (opts?: Record<string, unknown>) => PluginOption;\n };\n const configPath = resolveWorkerConfigPath(projectRoot, worker === true ? {} : worker);\n\n return [\n cloudflare({\n viteEnvironment: { name: 'ssr' },\n // Omitted when the theme ships its own config, which the plugin then\n // discovers exactly as it did before the engine took this over.\n ...(configPath ? { configPath } : {}),\n }),\n ];\n}\n\nexport function buildVirtualRouteConfig(\n routes: TwilightRoute[],\n rootRouteFile: string,\n routesDir: string\n): unknown {\n try {\n const projectRequire = createRequire(resolve(process.cwd(), 'package.json'));\n const { rootRoute, index, route } = projectRequire('@tanstack/virtual-file-routes');\n\n const accountPrefix = '/account/';\n const accountLayout = routes.find((r) => r.isLayout && r.path === '/account');\n const accountChildren = routes.filter((r) => !r.isLayout && r.path.startsWith(accountPrefix));\n const nonAccountRoutes = routes.filter((r) => !r.isLayout && !r.path.startsWith(accountPrefix));\n const twilightRel = getEngineTwilightRelPath(routesDir);\n const fileOf = (r: TwilightRoute) =>\n isEngineOwned(r, routesDir) ? `${twilightRel}/${r.file}` : r.file;\n\n const langChildren = nonAccountRoutes.map((r) => {\n if (r.isIndex) return index(r.file);\n const relativePath = r.path.replace(/^\\//, '');\n return route(relativePath, fileOf(r));\n });\n\n if (accountLayout) {\n const accChildren = accountChildren.map((r) => {\n const relativePath = r.path.replace(/^\\/account\\/?/, '');\n return route(relativePath, fileOf(r));\n });\n langChildren.push(route('account', `${twilightRel}/account.tsx`, accChildren));\n }\n\n return rootRoute(rootRouteFile, [\n route('{-$locale}', `${twilightRel}/$locale.tsx`, [\n ...langChildren,\n // Redirect route - handles /{-$locale}/redirect/{type}/{id} URLs\n route('redirect/$type/$id', `${twilightRel}/redirect.$type.$id.tsx`),\n ]),\n ]);\n } catch (_error) {\n console.warn(\n '[twilight-react:tanstack] @tanstack/virtual-file-routes not found. Please install it.'\n );\n return undefined;\n }\n}\n\nexport const tanstackAdapter: FrameworkAdapter = {\n name: 'tanstack',\n\n generateRouteFiles({\n projectRoot,\n baseRoutes,\n baseRoutesImport,\n }: GenerateRoutesOptions): TwilightRoute[] {\n const routesDir = DEFAULT_ROUTES_DIR;\n const routesFilePath = resolve(projectRoot, DEFAULT_ROUTES_FILE);\n\n const customRoutes = loadRoutesFile(routesFilePath);\n\n const routeMap = new Map<string, TwilightRoute>();\n (baseRoutes ?? DEFAULT_BASE_ROUTES).forEach((r) => routeMap.set(r.path, r));\n customRoutes.forEach((r) => routeMap.set(r.path, r));\n const allRoutes = Array.from(routeMap.values());\n\n const routesDirPath = resolve(projectRoot, routesDir);\n if (!existsSync(routesDirPath)) {\n mkdirSync(routesDirPath, { recursive: true });\n }\n\n // Generate minimal wiring files for the locale layout and root redirect.\n // TanStack Router's generator requires `createFileRoute` in each file.\n // All actual logic is delegated to functions exported from the engine.\n const engineRouteFiles: Array<{ name: string; content: string }> = [\n {\n name: '$locale.tsx',\n content: getLocaleWrapperTemplate(baseRoutesImport),\n },\n {\n name: 'redirect.$type.$id.tsx',\n content: getRedirectTemplate(baseRoutesImport),\n },\n {\n name: 'account.tsx',\n content: getAccountLayoutTemplate(baseRoutesImport),\n },\n ...allRoutes\n .filter((r) => !r.isLayout && isEngineOwned(r, routesDirPath))\n .map((r) => ({ name: r.file, content: generateRouteFileContent(r, baseRoutesImport) })),\n ];\n\n // Write into the engine package's .twilight/ dir — NOT the theme project.\n let engineRoot = dirname(fileURLToPath(import.meta.url));\n while (engineRoot !== dirname(engineRoot)) {\n if (existsSync(join(engineRoot, 'package.json'))) break;\n engineRoot = dirname(engineRoot);\n }\n const twilightDir = join(engineRoot, '.twilight');\n if (!existsSync(twilightDir)) {\n mkdirSync(twilightDir, { recursive: true });\n }\n\n for (const { name, content } of engineRouteFiles) {\n const filePath = join(twilightDir, name);\n if (!existsSync(filePath)) {\n writeFileSync(filePath, content);\n } else {\n const existing = readFileSync(filePath, 'utf-8');\n if (existing !== content) {\n writeFileSync(filePath, content);\n }\n }\n }\n\n // Generate all page route files at the flat routes/ level.\n // createFileRoute paths inside these files include the /$locale prefix\n // (e.g. /$locale/cart) so TanStack Router validates the virtual nesting.\n for (const route of allRoutes) {\n if (route.isLayout) continue;\n const filePath = join(routesDirPath, route.file);\n\n if (isEngineOwned(route, routesDirPath)) {\n // A copy generated into the theme by an older engine.\n rmSync(filePath, { force: true }); // nosemgrep\n continue;\n }\n\n const content = generateRouteFileContent(route, baseRoutesImport);\n\n if (!existsSync(filePath)) {\n writeFileSync(filePath, content);\n console.log(`[twilight-react:tanstack] Created: ${route.file}`);\n } else {\n const existing = readFileSync(filePath, 'utf-8');\n if (existing.startsWith('// @auto-generated') && existing !== content) {\n writeFileSync(filePath, content);\n console.log(`[twilight-react:tanstack] Updated: ${route.file}`);\n }\n }\n }\n\n return allRoutes;\n },\n\n async createPlugins(options: TwilightReactOptions): Promise<PluginOption[]> {\n const {\n srcDirectory = 'app',\n baseRoutesImport = '@salla.sa/twilight-theme-engine/routes',\n localesDir,\n twilightJson = 'twilight.json',\n worker = true,\n } = options;\n\n const projectRoot = process.cwd();\n\n const allRoutes = tanstackAdapter.generateRouteFiles({ projectRoot, baseRoutesImport });\n const virtualRouteConfig = buildVirtualRouteConfig(\n allRoutes,\n DEFAULT_ROOT_ROUTE,\n resolve(projectRoot, srcDirectory, 'routes')\n );\n\n const routeGeneratorPlugin: Plugin = {\n name: 'twilight:react',\n enforce: 'pre',\n config(config) {\n tanstackAdapter.generateRouteFiles({\n projectRoot: config.root || projectRoot,\n baseRoutesImport,\n });\n // The engine's dist is served unbundled in dev, so vite never scans its\n // dependency graph. react-i18next reaches the CJS-only\n // html-parse-stringify/void-elements chain; without pre-bundling, dev\n // serves them raw as ESM and hydration dies on \"does not provide an\n // export named 'default'\". The `>` chains matter: these are the\n // engine's transitive deps, not the theme's, so flat names fail to\n // resolve under pnpm's strict (non-hoisted) node_modules.\n config.optimizeDeps ??= {};\n config.optimizeDeps.include = [\n ...(config.optimizeDeps.include ?? []),\n '@salla.sa/twilight-theme-engine > react-i18next',\n '@salla.sa/twilight-theme-engine > i18next',\n '@salla.sa/twilight-theme-engine > react-i18next > html-parse-stringify',\n '@salla.sa/twilight-theme-engine > react-i18next > html-parse-stringify > void-elements',\n ];\n // Pre-bundle the component wrappers up front: a wrapper discovered on a first page visit\n // re-optimizes mid-request, loads a second React and fails that page with \"Invalid hook call\".\n const wrappers = collectComponentWrapperImports(\n [resolve(config.root || projectRoot, srcDirectory), engineSourceDir()].filter(\n (dir): dir is string => Boolean(dir)\n )\n );\n config.optimizeDeps.include.push(\n ...wrappers,\n // Engine-only browser deps found late otherwise (one full reload on a cold start).\n '@salla.sa/twilight-theme-engine > @sentry/tanstackstart-react',\n '@salla.sa/twilight-theme-engine > @justinribeiro/lite-youtube',\n '@salla.sa/twilight-theme-engine > @tanstack/react-router-ssr-query',\n '@salla.sa/twilight-theme-engine > ky',\n '@salla.sa/twilight-theme-engine > sonner'\n );\n config.environments ??= {};\n config.environments.ssr ??= {};\n config.environments.ssr.optimizeDeps ??= {};\n config.environments.ssr.optimizeDeps.include = [\n ...(config.environments.ssr.optimizeDeps.include ?? []),\n ...wrappers,\n ];\n return config;\n },\n // configureServer(server) {\n // // Proactively warm up the Cloudflare Worker module graph so the user's\n // // first browser request is served promptly. Without this, Worker\n // // compilation is triggered lazily on the first navigation request,\n // // causing a ~10-15 second blank-page window on cold starts.\n // server.httpServer?.on('listening', () => {\n // const address = server.httpServer?.address();\n // const port =\n // address && typeof address === 'object' && 'port' in address\n // ? (address as { port: number }).port\n // : null;\n // if (!port) return;\n\n // void (async () => {\n // // Give TanStack Start + Cloudflare plugin time to finish registering\n // // their middleware before we make the warmup request.\n // await new Promise<void>((r) => setTimeout(r, 1500));\n\n // for (let attempt = 0; attempt < 10; attempt++) {\n // try {\n // const ctrl = new AbortController();\n // const tid = setTimeout(() => ctrl.abort(), 12000);\n // const resp = await fetch(`http://localhost:${port}/ar`, {\n // signal: ctrl.signal,\n // });\n // clearTimeout(tid);\n // const text = await resp.text();\n // // A substantial response means the Worker is compiled and SSR works.\n // if (text.length > 500) return;\n // } catch {\n // // Worker not ready yet — retry\n // }\n // await new Promise<void>((r) => setTimeout(r, 2000));\n // }\n // })();\n // });\n // },\n };\n\n const { tanstackStart } = (await import(\n pathToFileURL(resolveProjectPkg(projectRoot, '@tanstack/react-start', 'plugin/vite')).href\n )) as { tanstackStart: (opts: unknown) => PluginOption };\n\n const reactMod = (await import(\n pathToFileURL(resolveProjectPkg(projectRoot, '@vitejs/plugin-react')).href\n )) as { default: (opts?: unknown) => PluginOption };\n\n return [\n assetsBasePlugin(), // before tanstackStart, which reads `base` once — see the plugin\n ...(await createWorkerPlugins(projectRoot, worker)),\n tanstackStart({ srcDirectory, router: { virtualRouteConfig } }),\n reactMod.default(),\n packageAliasesPlugin(),\n routeGeneratorPlugin,\n webHydrationPlugin(),\n themeTranslationsPlugin(localesDir),\n twilightSchemaPlugin(twilightJson),\n bestPracticesPlugin(),\n ];\n },\n};\n","/**\n * @fileoverview Next.js framework adapter (placeholder for future implementation)\n *\n * This adapter will provide integration with Next.js App Router.\n * Currently not implemented - coming soon.\n */\n\nimport type { PluginOption } from 'vite';\nimport type {\n FrameworkAdapter,\n GenerateRoutesOptions,\n TwilightReactOptions,\n TwilightRoute,\n} from '../types';\n\n/**\n * Next.js framework adapter (placeholder for future implementation)\n */\nexport const nextjsAdapter: FrameworkAdapter = {\n name: 'nextjs',\n\n generateRouteFiles(_options: GenerateRoutesOptions): TwilightRoute[] {\n throw new Error('[twilight-react:nextjs] Next.js framework support is not yet implemented');\n },\n\n async createPlugins(_options: TwilightReactOptions): Promise<PluginOption[]> {\n throw new Error('[twilight-react:nextjs] Next.js framework support is not yet implemented');\n },\n};\n","/**\n * @fileoverview Framework adapters registry\n *\n * This file exports all available framework adapters and provides\n * a registry for looking up adapters by framework name.\n */\n\nimport type { Framework, FrameworkAdapter } from '../types';\nimport { tanstackAdapter } from './tanstack.adapter';\nimport { nextjsAdapter } from './nextjs.adapter';\n\n/**\n * Framework adapters registry\n */\nexport const frameworkAdapters: Record<Framework, FrameworkAdapter> = {\n tanstack: tanstackAdapter,\n nextjs: nextjsAdapter,\n};\n\n/**\n * Get framework adapter by name\n */\nexport function getFrameworkAdapter(framework: Framework): FrameworkAdapter {\n const adapter = frameworkAdapters[framework];\n if (!adapter) {\n throw new Error(`[twilight-react] Unsupported framework: ${framework}`);\n }\n return adapter;\n}\n\n// Export individual adapters for direct use\nexport { tanstackAdapter } from './tanstack.adapter';\nexport { nextjsAdapter } from './nextjs.adapter';\n","/**\n * @fileoverview twilightReact — entry point for the Twilight Vite plugin.\n *\n * Framework-specific setup is fully delegated to the adapter for that framework.\n * Developers can optionally create `app/routes.ts` to add or override routes.\n */\n\nimport type { PluginOption } from 'vite';\nimport type { TwilightReactOptions } from './types';\nimport { getFrameworkAdapter } from './adapters';\nimport { setHeadAdapter } from '../utils/head';\nimport { tanstackHeadAdapter } from '../tanstack/head';\nimport { nextjsHeadAdapter } from '../nextjs/head';\n\n// Re-export types for convenience\nexport type {\n TwilightRoute,\n Framework,\n ReactPluginOptions,\n TanStackRouterOptions,\n NextJsRouterOptions,\n RouterOptions,\n TwilightReactOptions,\n FrameworkAdapter,\n} from './types';\n\n/**\n * Main Twilight Vite plugin.\n *\n * For TanStack Start + Cloudflare Workers (default):\n * ```ts\n * export default defineConfig(async () => ({\n * plugins: [cloudflare({ viteEnvironment: { name: 'ssr' } }), ...(await twilightReact())],\n * }));\n * ```\n */\nexport async function twilightReact(options: TwilightReactOptions = {}): Promise<PluginOption[]> {\n const { framework = 'tanstack' } = options;\n\n if (framework === 'tanstack') setHeadAdapter(tanstackHeadAdapter);\n else if (framework === 'nextjs') setHeadAdapter(nextjsHeadAdapter);\n\n return getFrameworkAdapter(framework).createPlugins(options);\n}\n\nexport default twilightReact;\n"]}
1
+ {"version":3,"sources":["../../src/vite/plugins/assets-base.plugin.ts","../../src/vite/plugins/salla-hydration.plugin.ts","../../src/vite/plugins/theme-translations.plugin.ts","../../src/vite/plugins/twilight-schema.ts","../../src/vite/plugins/twilight-schema.plugin.ts","../../src/vite/plugins/best-practices/rules/no-deep-component-import.ts","../../src/vite/plugins/best-practices/rules/no-window-location-reload.ts","../../src/vite/plugins/best-practices/rules/no-manual-dom.ts","../../src/vite/plugins/best-practices/rules/no-img-without-dimensions.ts","../../src/vite/plugins/best-practices/rules/no-direct-product-card-import.ts","../../src/vite/plugins/best-practices/hooks-registry.ts","../../src/vite/plugins/best-practices/rules/require-page-hooks.ts","../../src/vite/plugins/best-practices/rules/index.ts","../../src/vite/plugins/best-practices/reporter.ts","../../src/vite/plugins/best-practices/best-practices.plugin.ts","../../src/vite/plugins/package-aliases.plugin.ts","../../src/vite/plugins/component-deps.ts","../../src/vite/plugins/worker-config.ts","../../src/tanstack/templates/locale-wrapper.ts","../../src/tanstack/templates/redirect.ts","../../src/tanstack/templates/account-layout.ts","../../src/vite/adapters/tanstack.adapter.ts","../../src/vite/adapters/nextjs.adapter.ts","../../src/vite/adapters/index.ts","../../src/vite/twilight-react.ts"],"names":["VIRTUAL_ID","RESOLVED_ID","readFile","resolve","dirname","createHash","existsSync","join","readFileSync","fileURLToPath","basename","loaderCall","componentFn","returnType","relative","mkdirSync","writeFileSync"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @fileoverview Where a built theme's client files are served from.\n *\n * A deployed theme is a worker, and the worker carries its client bundle as its\n * own static assets — so by default every script, stylesheet and font a page\n * asks for is answered by the storefront's hostname\n * (`https://<store>/assets/app-abc.js`). The platform can put those same bytes\n * on a CDN instead, and when it does it tells the build where, through\n * {@link ASSETS_BASE_URL_ENV}.\n *\n * The whole mechanism is Vite's `base`, set to an absolute URL, and that is\n * enough on its own because every emitter of an asset URL already reads it:\n *\n * - Vite writes it into the client bundle — the dynamic-import preload helper\n * and every `url(...)` in the emitted CSS;\n * - TanStack Start builds its manifest from it, so the `<script>`, `<link>` and\n * `modulepreload` tags in the server-rendered HTML carry it too.\n *\n * And it moves nothing that must stay on the storefront. Start resolves an\n * absolute `base` to a router basepath of `/` and keeps `/_serverFn` relative to\n * that, so routing and server functions still answer on the store's own host.\n * (`normalizePublicBase` / `deriveRouterBasepath` in `@tanstack/start-plugin-core`.)\n *\n * Build only. `vite dev` serves modules from its own origin, and a dev server\n * that tried to load them from a CDN would load nothing.\n */\nimport type { Plugin } from 'vite';\n\n/**\n * Set by the build service on `pnpm build`, never by a theme.\n *\n * An environment variable rather than a plugin option, because the value is\n * the platform's decision about where it hosts files, not the theme's: a theme's\n * `vite.config.ts` is partner code, and the one input the platform controls at\n * build time is the environment the command runs in.\n */\nexport const ASSETS_BASE_URL_ENV = 'TWILIGHT_ASSETS_BASE_URL';\n\n/**\n * The value as a Vite `base`: absolute, no query or fragment, ending in `/`.\n *\n * `undefined` for unset or blank, which leaves `base` exactly as the theme has\n * it. Anything else that is not a usable URL **throws** rather than being\n * ignored. The variable is only ever set by the platform, so a malformed one is\n * the platform's bug, and ignoring it would produce the worst version of that\n * bug: a build that succeeds, deploys, and serves every asset from the wrong\n * place with nothing in the log to say so.\n *\n * The trailing slash is added, not required. Vite joins `base` and a file name\n * by concatenation, so `https://cdn/x` + `assets/a.js` is `https://cdn/xassets/a.js`.\n */\nexport function resolveAssetsBaseUrl(raw: string | undefined): string | undefined {\n const value = raw?.trim();\n if (!value) return undefined;\n\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(`[twilight-react] ${ASSETS_BASE_URL_ENV} is not an absolute URL: ${value}`);\n }\n\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n throw new Error(\n `[twilight-react] ${ASSETS_BASE_URL_ENV} must be an http(s) URL, got ${url.protocol}`\n );\n }\n // Each of these would ride along into every asset URL the build emits — a\n // `?v=1` becomes `https://cdn/?v=1assets/a.js` — so none of them has a\n // meaning here that is not a mistake.\n if (url.search || url.hash || url.username || url.password) {\n throw new Error(\n `[twilight-react] ${ASSETS_BASE_URL_ENV} must be a plain base URL with no query, ` +\n `fragment or credentials: ${value}`\n );\n }\n\n const path = url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`;\n return `${url.origin}${path}`;\n}\n\n/**\n * Sets Vite's `base` from {@link ASSETS_BASE_URL_ENV} on a build.\n *\n * `enforce: 'pre'` and registered ahead of `tanstackStart`, and both halves are\n * needed. Vite runs `config` hooks in order and merges each result before\n * calling the next, and Start's own config hook — also `pre` — reads `base` once\n * to build its manifest. Registered after it, Vite would emit CDN URLs into the\n * bundle while Start wrote root-relative ones into the HTML, and a page would\n * load its entry from one place and its chunks from another.\n *\n * It overrides a `base` the theme set itself, on purpose: when the platform has\n * uploaded the files to a CDN, that is where they are.\n */\nexport function assetsBasePlugin(env: NodeJS.ProcessEnv = process.env): Plugin {\n return {\n name: 'twilight:assets-base',\n enforce: 'pre',\n config(_config, { command }) {\n if (command !== 'build') return undefined;\n\n const base = resolveAssetsBaseUrl(env[ASSETS_BASE_URL_ENV]);\n return base ? { base } : undefined;\n },\n };\n}\n","import type { Plugin } from 'vite';\n\n// Regex to match opening tags of salla-* or custom-* web components\nconst TAG_START_RE = /<(?:salla|custom)-[a-z][a-z0-9-]*/g;\n\n/**\n * Vite plugin that automatically adds `suppressHydrationWarning` to all Salla\n * web components (`salla-*` and `custom-*`) in JSX/TSX source files.\n *\n * All Salla web components are built with Stencil.js, which adds\n * `class=\"hydrated\"` and may inject light DOM content after the browser parses\n * the SSR HTML but before React's `hydrateRoot` runs. Without suppression,\n * React throws a hydration mismatch and regenerates the entire subtree.\n */\nexport function webHydrationPlugin(): Plugin {\n return {\n name: 'twilight:web-hydration',\n enforce: 'pre',\n transform(code, id) {\n if (!/\\.[jt]sx$/.test(id)) return null;\n if (!/<(?:salla|custom)-[a-z]/.test(code)) return null;\n\n let result = '';\n let lastIndex = 0;\n\n TAG_START_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = TAG_START_RE.exec(code)) !== null) {\n const tagStart = match.index;\n const afterTag = tagStart + match[0].length;\n\n // Walk forward from after the tag name, skipping JSX expression\n // braces { } so we don't mistake `>` inside `() =>` or generics\n // for the tag's closing bracket.\n let i = afterTag;\n let braceDepth = 0;\n let closingPos = -1;\n let isSelfClosing = false;\n\n while (i < code.length) {\n const ch = code[i];\n if (ch === '{') {\n braceDepth++;\n } else if (ch === '}') {\n braceDepth--;\n } else if (braceDepth === 0 && ch === '>') {\n isSelfClosing = i > 0 && code[i - 1] === '/';\n closingPos = i;\n break;\n }\n i++;\n }\n\n if (closingPos === -1) break; // malformed, bail out\n\n const propsSlice = code.slice(afterTag, isSelfClosing ? closingPos - 1 : closingPos);\n\n if (propsSlice.includes('suppressHydrationWarning')) {\n // Already present — skip past this tag\n TAG_START_RE.lastIndex = closingPos + 1;\n continue;\n }\n\n // Insert suppressHydrationWarning before the closing > or />\n const insertPos = isSelfClosing ? closingPos - 1 : closingPos;\n result += code.slice(lastIndex, insertPos) + ' suppressHydrationWarning';\n lastIndex = insertPos;\n TAG_START_RE.lastIndex = closingPos + 1;\n }\n\n if (lastIndex === 0) return null; // nothing changed\n result += code.slice(lastIndex);\n return { code: result };\n },\n };\n}\n","/**\n * Vite plugin that exposes a `virtual:twilight/theme-translations` module\n * built from all `*.json` files found in the configured `localesDir`.\n *\n * The virtual module exports a `TranslationMessages` object keyed by\n * `{locale}.trans` so it maps directly into the i18next `theme` namespace.\n *\n * @example\n * // vite.config.ts\n * twilightReact({ localesDir: './locales' })\n *\n * // virtual module output (auto-generated, never written to disk):\n * export default {\n * 'ar.trans': { \"key\": \"قيمة\" },\n * 'en.trans': { \"key\": \"value\" },\n * };\n */\n\nimport type { Plugin } from 'vite';\nimport { readdir, readFile } from 'fs/promises';\nimport { join, basename, resolve } from 'path';\n\nconst VIRTUAL_ID = 'virtual:twilight/theme-translations';\nconst RESOLVED_ID = '\\0' + VIRTUAL_ID;\n\nexport function themeTranslationsPlugin(localesDir?: string): Plugin {\n let resolvedLocalesDir: string | undefined;\n\n return {\n name: 'twilight:translations',\n\n configResolved(config) {\n if (localesDir) {\n resolvedLocalesDir = resolve(config.root, localesDir);\n }\n },\n\n resolveId(id) {\n if (id === VIRTUAL_ID) return RESOLVED_ID;\n },\n\n async load(id) {\n if (id !== RESOLVED_ID) return;\n if (!resolvedLocalesDir) return 'export default {};';\n\n try {\n const files = await readdir(resolvedLocalesDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n if (jsonFiles.length === 0) return 'export default {};';\n\n const entries: string[] = [];\n for (const file of jsonFiles) {\n const locale = basename(file, '.json');\n const content = await readFile(join(resolvedLocalesDir, file), 'utf-8');\n const data = JSON.parse(content);\n entries.push(` '${locale}.trans': ${JSON.stringify(data)}`);\n }\n\n return `export default {\\n${entries.join(',\\n')}\\n};\\n`;\n } catch {\n return 'export default {};';\n }\n },\n\n configureServer(server) {\n if (!resolvedLocalesDir) return;\n\n server.watcher.add(join(resolvedLocalesDir, '*.json'));\n\n server.watcher.on('change', (file) => {\n if (file.startsWith(resolvedLocalesDir!) && file.endsWith('.json')) {\n const mod = server.moduleGraph.getModuleById(RESOLVED_ID);\n if (mod) server.moduleGraph.invalidateModule(mod);\n }\n });\n\n server.watcher.on('add', (file) => {\n if (file.startsWith(resolvedLocalesDir!) && file.endsWith('.json')) {\n const mod = server.moduleGraph.getModuleById(RESOLVED_ID);\n if (mod) server.moduleGraph.invalidateModule(mod);\n }\n });\n },\n };\n}\n","/**\n * Pure transform: twilight.json → {@link DevSchema}. Runs in Node (dev-server\n * build step), so it must stay dependency-free and defensive about shape — a\n * hand-edited twilight.json can have missing/renamed keys.\n *\n * twilight.json quirks this handles (see raed/twilight.json):\n * - A setting/field has BOTH a semantic `type` (boolean|items|static|string|\n * collection) and a widget `format` (switch|dropdown-list|text|...).\n * - Boolean/string defaults live in `value`; single-select defaults live in\n * `selected` (settings list) OR `value` (component fields) — we read either.\n * - `static` entries are presentational (HTML) and are skipped.\n * - `collection` entries nest their item `fields`, whose ids carry the\n * collection's id as a prefix (`slides.image`).\n * - `variable-list` and remote-source items (products, brands, categories)\n * need a live store to pick from, so they are surfaced as `readonly`.\n * - Collection rows key their values `<collection>.<field>` in twilight.json,\n * but the API hands a block plain `<field>` keys, so `blockDefaults` strips\n * the prefix.\n */\n\nimport type {\n DevFieldCondition,\n DevSchema,\n DevSchemaComponent,\n DevSchemaField,\n DevSchemaOption,\n} from '../../dev/schema-types';\n\ninterface RawEntry {\n id?: string;\n type?: string;\n format?: string;\n label?: string | null;\n value?: unknown;\n selected?: unknown;\n options?: unknown;\n source?: string;\n fields?: RawEntry[];\n description?: unknown;\n placeholder?: unknown;\n minimum?: unknown;\n maximum?: unknown;\n minLength?: unknown;\n maxLength?: unknown;\n item_label?: unknown;\n multichoice?: unknown;\n sources?: unknown;\n conditions?: unknown;\n}\n\ninterface RawComponent {\n image?: unknown;\n icon?: unknown;\n path?: string;\n key?: string;\n title?: unknown;\n fields?: RawEntry[];\n}\n\n/** `string` formats edited as one line of text. `color`, `url` and friends included. */\nconst TEXT_FORMATS = new Set(['text', 'icon', 'line', 'hidden', 'url', 'email', 'color']);\n\nfunction text(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value : undefined;\n}\n\nfunction num(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\n/** twilight.json `conditions`, keeping only entries that name a field. */\nfunction toConditions(raw: unknown): DevFieldCondition[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const conditions = raw.flatMap((c): DevFieldCondition[] => {\n const obj = (c ?? {}) as Record<string, unknown>;\n if (typeof obj.id !== 'string' || !obj.id) return [];\n const operation = typeof obj.operation === 'string' && obj.operation ? obj.operation : '=';\n return [{ id: obj.id, operation, value: obj.value }];\n });\n return conditions.length ? conditions : undefined;\n}\n\n/** The optional bits every kind of field can carry, left out when absent. */\nfunction extras(entry: RawEntry): Partial<DevSchemaField> {\n const out: Partial<DevSchemaField> = {};\n const description = text(entry.description);\n const placeholder = text(entry.placeholder);\n const conditions = toConditions(entry.conditions);\n if (description) out.description = description;\n if (placeholder) out.placeholder = placeholder;\n if (conditions) out.conditions = conditions;\n return out;\n}\n\nfunction labelOf(entry: RawEntry, fallback: string): string {\n return typeof entry.label === 'string' && entry.label.trim() ? entry.label : fallback;\n}\n\nfunction titleOf(component: RawComponent): string {\n const t = component.title;\n const fallback = component.path ?? component.key ?? 'component';\n if (t && typeof t === 'object') {\n const obj = t as Record<string, unknown>;\n const en = typeof obj.en === 'string' ? obj.en : undefined;\n const ar = typeof obj.ar === 'string' ? obj.ar : undefined;\n return en || ar || fallback;\n }\n return typeof t === 'string' && t ? t : fallback;\n}\n\nfunction toOptions(raw: unknown): DevSchemaOption[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const opts = raw\n .map((o): DevSchemaOption => {\n const obj = (o ?? {}) as Record<string, unknown>;\n const value = obj.value ?? obj.key ?? '';\n const label = obj.label ?? obj.value ?? obj.key ?? '';\n return { label: String(label), value: String(value) };\n })\n .filter((o) => o.value !== '');\n return opts.length ? opts : undefined;\n}\n\n/** Extract a scalar default from a `value`/`selected` field that may be an\n * array of chosen option objects, an array of scalars, or a bare scalar. */\nfunction firstScalar(v: unknown): unknown {\n if (Array.isArray(v)) {\n const first = v[0];\n if (first && typeof first === 'object') {\n const obj = first as Record<string, unknown>;\n return obj.value ?? obj.key ?? undefined;\n }\n return first;\n }\n return v;\n}\n\nconst ENTITY_SOURCES = [\n 'products',\n 'categories',\n 'brands',\n 'blog_articles',\n 'blog_categories',\n] as const;\n\nfunction isEntitySource(source: unknown): source is (typeof ENTITY_SOURCES)[number] {\n return (ENTITY_SOURCES as readonly unknown[]).includes(source);\n}\n\nfunction classifyString(entry: RawEntry, id: string, label: string): DevSchemaField | null {\n const { format } = entry;\n const value = typeof entry.value === 'string' ? entry.value : '';\n const base = { id, label, default: value, ...extras(entry) };\n if (format === 'textarea') return { ...base, kind: 'textarea' };\n if (format === 'image') return { ...base, kind: 'image' };\n if (typeof format === 'string' && TEXT_FORMATS.has(format)) return { ...base, kind: 'text' };\n return null;\n}\n\nfunction classifyCollection(entry: RawEntry, id: string, label: string): DevSchemaField {\n const prefix = `${id}.`;\n const fields: DevSchemaField[] = [];\n for (const sub of Array.isArray(entry.fields) ? entry.fields : []) {\n const subId =\n typeof sub.id === 'string' && sub.id.startsWith(prefix)\n ? sub.id.slice(prefix.length)\n : sub.id;\n const field = classify({ ...sub, id: subId });\n if (!field) continue;\n // Conditions name their sibling the way twilight.json does (`slides.x`); a row\n // holds it without the prefix, like the field ids above.\n field.conditions = field.conditions?.map((c) =>\n c.id.startsWith(prefix) ? { ...c, id: c.id.slice(prefix.length) } : c\n );\n if (!field.conditions) delete field.conditions;\n fields.push(field);\n }\n const min = num(entry.minLength);\n const max = num(entry.maxLength);\n const itemLabel = text(entry.item_label);\n return {\n id,\n label,\n kind: 'collection',\n default: collectionRows(entry),\n fields,\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n ...(itemLabel ? { itemLabel } : {}),\n ...extras(entry),\n };\n}\n\nfunction classify(entry: RawEntry): DevSchemaField | null {\n const id = typeof entry.id === 'string' ? entry.id : '';\n if (!id) return null;\n\n const { type, format } = entry;\n const label = labelOf(entry, id);\n\n // Presentational dividers / titles — nothing to edit.\n if (type === 'static') return null;\n\n if (type === 'boolean') {\n return {\n id,\n label,\n kind: 'toggle',\n default: typeof entry.value === 'boolean' ? entry.value : false,\n ...extras(entry),\n };\n }\n\n if (type === 'items' && format === 'dropdown-list') {\n const options = toOptions(entry.options);\n // Remote-source items (products, brands, categories, blog) have no inline options:\n // the editor picks them from the store, or from samples.\n if (!options && isEntitySource(entry.source)) {\n const min = num(entry.minLength);\n const max = num(entry.maxLength);\n return {\n id,\n label,\n kind: 'entities',\n source: entry.source,\n multiple: entry.multichoice === true,\n default: Array.isArray(entry.value) ? entry.value : [],\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n ...extras(entry),\n };\n }\n if (!options) {\n return {\n id,\n label,\n kind: 'readonly',\n default: null,\n note: `remote (${entry.source ?? 'dynamic'})`,\n ...extras(entry),\n };\n }\n const fallback = options[0]?.value;\n const def = firstScalar(entry.value) ?? firstScalar(entry.selected) ?? fallback;\n return { id, label, kind: 'select', default: def ?? '', options, ...extras(entry) };\n }\n\n if (type === 'string') {\n const field = classifyString(entry, id, label);\n if (field) return field;\n }\n\n if (type === 'number') {\n const min = num(entry.minimum);\n const max = num(entry.maximum);\n return {\n id,\n label,\n kind: 'number',\n default: num(entry.value) ?? null,\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n ...extras(entry),\n };\n }\n\n if (type === 'collection') return classifyCollection(entry, id, label);\n\n if (type === 'items' && format === 'variable-list') {\n const linkSources = toOptions(entry.sources);\n return {\n id,\n label,\n kind: 'link',\n default: typeof entry.value === 'string' ? entry.value : '',\n ...(linkSources ? { linkSources } : {}),\n ...extras(entry),\n };\n }\n\n // variable-list and anything unrecognised: show but don't edit.\n return {\n id,\n label,\n kind: 'readonly',\n default: null,\n note: `${type ?? 'unknown'}/${format ?? '?'}`,\n ...extras(entry),\n };\n}\n\n/** A collection's rows as the API delivers them: `slides.image` → `image`. */\nfunction collectionRows(entry: RawEntry): Record<string, unknown>[] {\n if (!Array.isArray(entry.value)) return [];\n const prefix = `${entry.id}.`;\n return entry.value\n .filter((row): row is Record<string, unknown> => !!row && typeof row === 'object')\n .map((row) =>\n Object.fromEntries(\n Object.entries(row).map(([key, value]) => [\n key.startsWith(prefix) ? key.slice(prefix.length) : key,\n value,\n ])\n )\n );\n}\n\n/**\n * What a newly added block starts with, readonly fields included, so it renders\n * like a configured block instead of crashing on a missing list. Remote lists\n * (products, brands, categories) start empty: they need a live store to resolve.\n */\nfunction blockDefaultsFor(\n fieldsRaw: RawEntry[],\n fields: DevSchemaField[]\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const entry of fieldsRaw) {\n if (typeof entry.id !== 'string' || !entry.id || entry.type === 'static') continue;\n if (entry.type === 'collection') out[entry.id] = collectionRows(entry);\n else if (entry.type === 'items' && entry.format === 'variable-list')\n out[entry.id] = typeof entry.value === 'string' ? entry.value : '';\n else if (entry.type === 'items' && !toOptions(entry.options)) out[entry.id] = [];\n else if (entry.value !== undefined) out[entry.id] = entry.value;\n }\n return { ...out, ...defaultsFor(fields) };\n}\n\nfunction defaultsFor(fields: DevSchemaField[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const f of fields) {\n if (f.kind !== 'readonly') out[f.id] = f.default;\n }\n return out;\n}\n\nfunction localizedOf(name: unknown): Record<string, string> | undefined {\n if (typeof name === 'string' && name) return { ar: name, en: name };\n if (!name || typeof name !== 'object') return undefined;\n const entries = Object.entries(name).filter(\n (entry): entry is [string, string] => typeof entry[1] === 'string' && entry[1] !== ''\n );\n return entries.length ? Object.fromEntries(entries) : undefined;\n}\n\n/** Build the browser-shipped schema from a parsed twilight.json object. */\nexport function buildTwilightSchema(raw: unknown): DevSchema {\n const root = (raw ?? {}) as { name?: unknown; settings?: unknown; components?: unknown };\n\n const settingsRaw: RawEntry[] = Array.isArray(root.settings) ? (root.settings as RawEntry[]) : [];\n const settings: DevSchemaField[] = [];\n for (const s of settingsRaw) {\n const field = classify(s);\n if (field) settings.push(field);\n }\n\n const componentsRaw: RawComponent[] = Array.isArray(root.components)\n ? (root.components as RawComponent[])\n : [];\n const components: DevSchemaComponent[] = [];\n const componentDefaults: Record<string, Record<string, unknown>> = {};\n const blockDefaults: Record<string, Record<string, unknown>> = {};\n for (const c of componentsRaw) {\n const path =\n (typeof c.path === 'string' && c.path) || (typeof c.key === 'string' && c.key) || '';\n if (!path) continue;\n const fieldsRaw = Array.isArray(c.fields) ? c.fields : [];\n const fields: DevSchemaField[] = [];\n for (const fr of fieldsRaw) {\n const field = classify(fr);\n if (field) fields.push(field);\n }\n const key = typeof c.key === 'string' && c.key ? c.key : undefined;\n const titles = c.title && typeof c.title === 'object' ? localizedOf(c.title) : undefined;\n components.push({\n path,\n ...(key ? { key } : {}),\n title: titleOf(c),\n ...(titles ? { titles } : {}),\n ...(text(c.image) ? { image: text(c.image) } : {}),\n ...(typeof c.icon === 'string' && /^sicon-[a-z0-9-]+$/.test(c.icon) ? { icon: c.icon } : {}),\n fields,\n });\n componentDefaults[path] = defaultsFor(fields);\n blockDefaults[path] = blockDefaultsFor(fieldsRaw, fields);\n }\n\n const themeName = localizedOf(root.name);\n return {\n ...(themeName ? { themeName } : {}),\n settings,\n components,\n settingsDefaults: defaultsFor(settings),\n componentDefaults,\n blockDefaults,\n };\n}\n","/**\n * Dev-only Vite plugin that exposes `virtual:twilight/schema` built from the\n * theme's local `twilight.json`. Mirrors `theme-translations.plugin.ts`.\n *\n * The virtual module default-exports a {@link DevSchema} (settings + components\n * + computed defaults) that the `DevSettingsWidget` renders and edits. It is\n * populated ONLY in the dev server; a production build ships an empty schema so\n * no theme manifest leaks into the bundle and the widget tree-shakes away.\n *\n * The module also carries the editor's saved state, `twilight.preview.json`\n * (see {@link DevPreviewState}), and puts it on `globalThis` as it loads. The\n * root route imports this module on the server and in the browser before\n * anything renders, so both renders start from the same saved values and the\n * page hydrates without a flash. The editor saves through `POST\n * /__twilight/preview`; a save re-runs the server's modules so the next render\n * reads it, and a hand edit of the file reloads the open tabs.\n *\n * It also serves the theme editor at `/__twilight/editor`: a page of its own\n * whose entry (`virtual:twilight/editor`) mounts the engine's `ThemeEditor`\n * around the storefront in a frame.\n *\n * It also owns the dev-time check of the manifest's `\"type\": \"react\"` marker\n * (see `twilight-manifest.ts`) — this is the only place the engine reads\n * twilight.json, so it is where a wrong or missing `type` is caught.\n *\n * @example\n * // vite.config.ts\n * twilightReact() // reads ./twilight.json by default\n *\n * // __root.tsx\n * import devSchema from 'virtual:twilight/schema';\n * {import.meta.env.DEV && <DevSettingsWidget schema={devSchema} />}\n */\n\nimport type { Plugin, ViteDevServer } from 'vite';\nimport type { IncomingMessage, ServerResponse } from 'http';\nimport { createHash } from 'crypto';\nimport { mkdir, readFile, writeFile } from 'fs/promises';\nimport { dirname, resolve } from 'path';\nimport { buildTwilightSchema } from './twilight-schema';\nimport { validateTwilightManifest } from './twilight-manifest';\nimport {\n DEV_EDITOR_PATH,\n DEV_PREVIEW_ENDPOINT,\n DEV_PREVIEW_EVENT,\n DEV_PREVIEW_GLOBAL,\n DEV_PREVIEW_IMAGE_ENDPOINT,\n DEV_PREVIEW_IMAGE_MAX_BYTES,\n EMPTY_DEV_SCHEMA,\n normalizePreviewState,\n type DevPreviewState,\n} from '../../dev/schema-types';\n\nconst VIRTUAL_ID = 'virtual:twilight/schema';\nconst RESOLVED_ID = '\\0' + VIRTUAL_ID;\nconst EDITOR_ENTRY_ID = 'virtual:twilight/editor';\nconst RESOLVED_EDITOR_ENTRY_ID = '\\0' + EDITOR_ENTRY_ID;\n\n/** What the editor page runs: the schema (with the saved state) handed to the engine's editor. */\nconst EDITOR_ENTRY = [\n `import schema from '${VIRTUAL_ID}';`,\n `import { mountThemeEditor } from '@salla.sa/twilight-theme-engine/dev/editor';`,\n `mountThemeEditor(document.getElementById('root'), schema);`,\n].join('\\n');\n\n/**\n * The editor page. Vite serves a virtual module at `/@id/__x00__<id>`; going\n * through `transformIndexHtml` adds the Vite client and React's refresh preamble.\n */\n// nosemgrep: interpolates module-level constants only, never request data\nconst EDITOR_HTML = `<!doctype html>\n<html lang=\"ar\" dir=\"rtl\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Theme editor</title>\n <link rel=\"stylesheet\" href=\"https://cdn.salla.network/fonts/pingarlt.css\" />\n <link rel=\"stylesheet\" href=\"https://cdn.salla.network/fonts/sallaicons.css\" />\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/@id/__x00__${EDITOR_ENTRY_ID}\"></script>\n </body>\n</html>\n`;\n\n/** Serve the editor page on GET; anything else under the path is Vite's. */\nfunction serveEditorPage(server: ViteDevServer, onShown: () => void): void {\n server.middlewares.use(DEV_EDITOR_PATH, (req, res, next) => {\n // Connect strips the mount path: `/` (or `/?path=…`) is the page itself.\n const rest = (req.url ?? '/').split('?')[0];\n if (req.method !== 'GET' || (rest !== '/' && rest !== '')) {\n next();\n return;\n }\n onShown();\n server\n .transformIndexHtml(req.originalUrl ?? DEV_EDITOR_PATH, EDITOR_HTML)\n .then((html) => {\n res.statusCode = 200;\n res.setHeader('content-type', 'text/html; charset=utf-8');\n res.end(html);\n })\n .catch(next);\n });\n}\n\n/** `?editor=off` shows the storefront page instead of opening the editor. */\nconst EDITOR_OPT_OUT = /(?:^|&)editor=off(?:&|$)/;\n\n/** Vite's own files and the dev server's endpoints: never a storefront page. */\nfunction isStorefrontPage(path: string): boolean {\n if (/^\\/(?:@|__|node_modules\\/|_serverFn)/.test(path)) return false;\n const last = path.split('/').pop() ?? '';\n return !last.includes('.');\n}\n\n/**\n * Opens the theme editor when a browser tab first loads the storefront after\n * the dev server starts: `salla theme dev` opens a storefront address\n * (`/ar?storeId=…`, or `/`), and the editor is where a developer starts. That\n * page is opened inside the editor, query and all. Once the editor has been\n * shown, storefront pages load as themselves (a new tab, a typed `/ar`), and\n * `/` keeps opening the editor. `?editor=off` skips it.\n *\n * Only a top-level page load is sent there (`Sec-Fetch-Dest: document`): the\n * editor's own frame, fetches, and tools without the header (the CLI's\n * warm-up, curl) get the storefront as before.\n */\nfunction openEditorFirst(server: ViteDevServer, editorShown: () => boolean): void {\n server.middlewares.use((req, res, next) => {\n const url = req.url ?? '/';\n const [path, query = ''] = url.split('?');\n const opens =\n req.method === 'GET' &&\n req.headers['sec-fetch-dest'] === 'document' &&\n !EDITOR_OPT_OUT.test(query) &&\n isStorefrontPage(path) &&\n (path === '/' || !editorShown());\n if (!opens) {\n next();\n return;\n }\n const location =\n url === '/' ? DEV_EDITOR_PATH : `${DEV_EDITOR_PATH}?path=${encodeURIComponent(url)}`;\n res.statusCode = 302;\n res.setHeader('location', location);\n res.end();\n });\n}\n\n/** The editor page, and the storefront loads that open it. */\nfunction serveEditor(server: ViteDevServer): void {\n let shown = false;\n serveEditorPage(server, () => {\n shown = true;\n });\n openEditorFirst(server, () => shown);\n}\n\nconst EMPTY_MODULE = `export default ${JSON.stringify(EMPTY_DEV_SCHEMA)};`;\nconst LOG_PREFIX = '[twilight-react:schema]';\n/** Lines printed per check, so a bad file does not flood the terminal. */\nconst MAX_REPORTED = 8;\n/**\n * The editor's saved state, next to twilight.json and gitignored. Not under\n * `.twilight/`: the route generator writes there and the router plugin scans it.\n */\nexport const DEV_PREVIEW_FILE = 'twilight.preview.json';\n/** A layout of a few dozen blocks is tens of KB; anything near this is not one. */\nconst MAX_PREVIEW_BYTES = 2 * 1024 * 1024;\n\nasync function readPreview(path: string): Promise<DevPreviewState | null> {\n try {\n // nosemgrep: `path` is the fixed preview file this plugin resolved\n return normalizePreviewState(JSON.parse(await readFile(path, 'utf-8')));\n } catch {\n return null; // No file yet, or not JSON: start from the store.\n }\n}\n\nfunction readBody(req: IncomingMessage, limit: number): Promise<Buffer> {\n return new Promise((resolveBody, reject) => {\n let size = 0;\n const chunks: Buffer[] = [];\n req.on('data', (chunk: Buffer) => {\n size += chunk.length;\n if (size > limit) {\n reject(new Error('request too large'));\n req.destroy();\n return;\n }\n chunks.push(chunk);\n });\n req.on('end', () => resolveBody(Buffer.concat(chunks)));\n req.on('error', reject);\n });\n}\n\n/**\n * Whether a write came from a page on this dev server. A browser sends `Origin`\n * on every POST, and `Sec-Fetch-Site` too; another site's page fails both.\n * Tools with neither (curl) are the developer's own.\n */\nexport function isSameOrigin(req: IncomingMessage): boolean {\n const { origin, host } = req.headers;\n const site = req.headers['sec-fetch-site'];\n if (site !== undefined && site !== 'same-origin' && site !== 'none') return false;\n if (origin === undefined) return true;\n try {\n return new URL(origin).host === host;\n } catch {\n return false;\n }\n}\n\n/** Image types the editor accepts, by MIME type. SVG is left out: it can carry script. */\nconst IMAGE_EXTENSIONS: Record<string, string> = {\n 'image/png': 'png',\n 'image/jpeg': 'jpg',\n 'image/webp': 'webp',\n 'image/gif': 'gif',\n 'image/avif': 'avif',\n};\nconst IMAGE_TYPES = Object.fromEntries(\n Object.entries(IMAGE_EXTENSIONS).map(([type, ext]) => [ext, type])\n);\n/** A stored image's name: a content hash and a known extension, nothing else. */\nconst IMAGE_NAME = /^[a-f0-9]{16}\\.(png|jpg|webp|gif|avif)$/;\n/** Picked images live here, next to twilight.preview.json. Gitignored. */\nexport const DEV_PREVIEW_ASSETS_DIR = 'twilight-preview-assets';\n\nfunction send(res: ServerResponse, status: number, body?: string, type = 'text/plain'): void {\n res.statusCode = status;\n if (body !== undefined) res.setHeader('content-type', type);\n res.end(body);\n}\n\n/**\n * Drop the cached virtual module everywhere, and make every server-side module\n * runner start over so its next render imports the fresh copy. `full-reload` on\n * a runner clears what it has evaluated; it does not touch the browser.\n */\nfunction refreshServerModules(server: ViteDevServer, resolvedId: string): void {\n const environments = Object.values(server.environments ?? {});\n if (!environments.length) {\n const mod = server.moduleGraph.getModuleById(resolvedId);\n if (mod) server.moduleGraph.invalidateModule(mod);\n return;\n }\n for (const environment of environments) {\n const mod = environment.moduleGraph.getModuleById(resolvedId);\n if (mod) environment.moduleGraph.invalidateModule(mod);\n if (environment.name !== 'client') environment.hot.send({ type: 'full-reload' });\n }\n}\n\n/** Picked images: stored under a content hash in `assets`, and served back from there. */\nfunction imageRoutes(assets: string) {\n const saveImage = async (req: IncomingMessage, res: ServerResponse) => {\n const ext = IMAGE_EXTENSIONS[String(req.headers['content-type']).split(';')[0].trim()];\n if (!ext) {\n send(res, 415, 'expected a png, jpeg, webp, gif or avif image');\n return;\n }\n const bytes = await readBody(req, DEV_PREVIEW_IMAGE_MAX_BYTES);\n const name = `${createHash('sha256').update(bytes).digest('hex').slice(0, 16)}.${ext}`;\n await mkdir(assets, { recursive: true });\n await writeFile(resolve(assets, name), bytes); // nosemgrep: name is a hash + known extension\n send(\n res,\n 201,\n JSON.stringify({ url: `${DEV_PREVIEW_IMAGE_ENDPOINT}/${name}` }),\n 'application/json'\n );\n };\n\n const serveImage = async (name: string, res: ServerResponse) => {\n if (!IMAGE_NAME.test(name)) {\n send(res, 404);\n return;\n }\n try {\n const bytes = await readFile(resolve(assets, name)); // nosemgrep: name checked against IMAGE_NAME\n res.statusCode = 200;\n res.setHeader('x-content-type-options', 'nosniff');\n res.setHeader('content-type', IMAGE_TYPES[name.slice(name.lastIndexOf('.') + 1)]);\n res.end(bytes);\n } catch {\n send(res, 404);\n }\n };\n\n return { saveImage, serveImage };\n}\n\n/**\n * Watch `twilight.preview.json` and serve the editor's saves to it. A hand\n * edit (or a deleted file) reloads everything. The editor's own saves land in\n * the watcher too; those were already applied in the tab that made them and\n * pushed to the others, so they only refresh the server.\n */\nfunction servePreviewFile(server: ViteDevServer, preview: string): void {\n /** What this server last wrote, to tell its own saves from hand edits. */\n let lastWritten: string | undefined;\n /** Saves are written one after another, in the order they arrived. */\n let writes: Promise<void> = Promise.resolve();\n const { saveImage, serveImage } = imageRoutes(resolve(dirname(preview), DEV_PREVIEW_ASSETS_DIR));\n server.watcher.add(preview);\n\n const onPreviewFile = async (file: string) => {\n if (file !== preview) return;\n let content: string | undefined;\n try {\n content = await readFile(preview, 'utf-8'); // nosemgrep: fixed path built by this plugin\n } catch {\n content = undefined;\n }\n if (content !== undefined && content === lastWritten) return;\n refreshServerModules(server, RESOLVED_ID);\n server.ws.send({ type: 'full-reload' });\n };\n server.watcher.on('change', (file) => void onPreviewFile(file));\n server.watcher.on('add', (file) => void onPreviewFile(file));\n server.watcher.on('unlink', (file) => void onPreviewFile(file));\n\n const saveState = async (req: IncomingMessage, res: ServerResponse) => {\n if (!String(req.headers['content-type']).startsWith('application/json')) {\n send(res, 415, 'expected application/json');\n return;\n }\n const body = JSON.parse((await readBody(req, MAX_PREVIEW_BYTES)).toString('utf-8')) as {\n state?: unknown;\n from?: unknown;\n };\n const state = normalizePreviewState(body.state);\n if (!state) throw new Error('not a preview state');\n const content = `${JSON.stringify(state, null, 2)}\\n`;\n const write = writes.then(async () => {\n lastWritten = content;\n await writeFile(preview, content); // nosemgrep: fixed path built by this plugin\n });\n writes = write.catch(() => {});\n await write;\n refreshServerModules(server, RESOLVED_ID);\n server.ws.send({\n type: 'custom',\n event: DEV_PREVIEW_EVENT,\n data: { state, from: typeof body.from === 'string' ? body.from : null },\n });\n send(res, 204);\n };\n\n // Connect strips the mount path: `/` is the state, `/image` and `/image/<name>` the pictures.\n server.middlewares.use(DEV_PREVIEW_ENDPOINT, (req, res) => {\n const route = (req.url ?? '/').split('?')[0];\n if (req.method === 'GET' && route.startsWith('/image/')) {\n void serveImage(route.slice('/image/'.length), res);\n return;\n }\n if (req.method !== 'POST' || (route !== '/' && route !== '' && route !== '/image')) {\n send(res, 405);\n return;\n }\n if (!isSameOrigin(req)) {\n send(res, 403, 'cross-origin write refused');\n return;\n }\n (route === '/image' ? saveImage(req, res) : saveState(req, res)).catch((error: unknown) =>\n send(res, 400, error instanceof Error ? error.message : 'bad request')\n );\n });\n}\n\nexport function twilightSchemaPlugin(twilightJsonPath = 'twilight.json'): Plugin {\n let filePath: string | undefined;\n let previewPath: string | undefined;\n let isDevServer = false;\n\n /**\n * Dev-only manifest check. A missing twilight.json stays silent — there is no\n * manifest to fix, and the CLI falls back to sniffing the engine dependency —\n * but a manifest that is present and wrong is worth one line.\n */\n async function checkManifest(): Promise<void> {\n if (!isDevServer || !filePath) return;\n\n let raw: string;\n try {\n raw = await readFile(filePath, 'utf-8');\n } catch {\n return; // No manifest yet.\n }\n\n try {\n // Errors only. Warnings are for `pnpm check:manifest`, so a normal start stays quiet.\n const { errors: issues } = validateTwilightManifest(JSON.parse(raw), twilightJsonPath);\n for (const issue of issues.slice(0, MAX_REPORTED)) {\n const where = issue.path ? `${twilightJsonPath} ${issue.path}: ` : '';\n console.warn(`${LOG_PREFIX} ${where}${issue.message}`);\n }\n if (issues.length > MAX_REPORTED) {\n console.warn(\n `${LOG_PREFIX} ...and ${issues.length - MAX_REPORTED} more. Run \\`pnpm check:manifest\\` for the full list.`\n );\n }\n } catch {\n console.warn(\n `${LOG_PREFIX} ${twilightJsonPath} is not valid JSON — theme settings and the dev widget will be empty.`\n );\n }\n }\n\n return {\n name: 'twilight:schema',\n\n configResolved(config) {\n isDevServer = config.command === 'serve';\n filePath = resolve(config.root, twilightJsonPath);\n previewPath = resolve(config.root, DEV_PREVIEW_FILE); // nosemgrep: constant file name\n },\n\n buildStart() {\n return checkManifest();\n },\n\n resolveId(id) {\n if (id === VIRTUAL_ID) return RESOLVED_ID;\n if (id === EDITOR_ENTRY_ID && isDevServer) return RESOLVED_EDITOR_ENTRY_ID;\n },\n\n async load(id) {\n if (id === RESOLVED_EDITOR_ENTRY_ID) return EDITOR_ENTRY;\n if (id !== RESOLVED_ID) return;\n // Dev-only: production builds get an empty schema.\n if (!isDevServer || !filePath) return EMPTY_MODULE;\n\n const preview = previewPath ? await readPreview(previewPath) : null;\n let schema = EMPTY_DEV_SCHEMA;\n try {\n schema = buildTwilightSchema(JSON.parse(await readFile(filePath, 'utf-8')));\n } catch {\n // Missing or malformed twilight.json — fail soft, no widget content.\n }\n return [\n `const schema = ${JSON.stringify({ ...schema, preview })};`,\n `globalThis[${JSON.stringify(DEV_PREVIEW_GLOBAL)}] = schema.preview;`,\n 'export default schema;',\n ].join('\\n');\n },\n\n configureServer(server) {\n if (!filePath) return;\n const target = filePath;\n server.watcher.add(target);\n\n const invalidate = (file: string) => {\n if (file !== target) return;\n void checkManifest();\n const mod = server.moduleGraph.getModuleById(RESOLVED_ID);\n if (mod) {\n server.moduleGraph.invalidateModule(mod);\n server.ws.send({ type: 'full-reload' });\n }\n };\n\n server.watcher.on('change', invalidate);\n server.watcher.on('add', invalidate);\n\n if (previewPath) servePreviewFile(server, previewPath);\n serveEditor(server);\n },\n };\n}\n","import type { Rule, RuleContext, Violation } from '../types';\n\nconst COMPONENT_FOLDERS = [\n 'common',\n 'cart',\n 'product',\n 'layout',\n 'home',\n 'modal',\n 'drawer',\n 'dropdown',\n 'collapse',\n 'toast',\n 'navigation',\n];\n\n/**\n * Matches: import { X } from '../common/Link'\n * import { X } from '../../layout/Header'\n * import { X } from '../../../cart/CartItem'\n * Captures: (1) the folder name, (2) the deep path after it\n *\n * Allows: import { X } from '../common' (no trailing slash/file)\n */\nconst FOLDERS_PATTERN = COMPONENT_FOLDERS.join('|');\n\nconst DEEP_IMPORT_RE = new RegExp(\n `(?:import|from)\\\\s+.*['\"](?:\\\\.\\\\.\\\\/)+(${FOLDERS_PATTERN})\\\\/([^'\"]+)['\"]`,\n 'g'\n);\n\nexport const noDeepComponentImport: Rule = {\n name: 'no-deep-component-import',\n description: 'Enforce imports from barrel exports (index.ts) to preserve lazy loading.',\n severity: 'warn',\n\n check(context: RuleContext): Violation[] {\n const violations: Violation[] = [];\n const lines = context.code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Quick guard — skip lines without import-like syntax\n if (!line.includes('import') && !line.includes('from')) continue;\n\n DEEP_IMPORT_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = DEEP_IMPORT_RE.exec(line)) !== null) {\n const folder = match[1];\n violations.push({\n rule: 'no-deep-component-import',\n message: `Deep import into '${folder}/' bypasses the barrel export and breaks lazy loading.`,\n line: i + 1,\n recommendation: `Import from '../${folder}' (barrel export) instead of '../${folder}/${match[2]}'.`,\n });\n }\n }\n\n return violations;\n },\n};\n","import type { Rule, RuleContext, Violation } from '../types';\n\nconst RELOAD_RE = /window\\s*\\.\\s*location\\s*\\.\\s*reload\\s*\\(/g;\n\nexport const noWindowLocationReload: Rule = {\n name: 'no-window-location-reload',\n description: 'Disallow window.location.reload() in React components.',\n severity: 'error',\n\n check(context: RuleContext): Violation[] {\n const violations: Violation[] = [];\n const lines = context.code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n RELOAD_RE.lastIndex = 0;\n if (RELOAD_RE.test(line)) {\n violations.push({\n rule: 'no-window-location-reload',\n message: 'window.location.reload() forces a full page reload, discarding React state.',\n line: i + 1,\n recommendation:\n 'Use React state for empty-state handling, React key prop to remount components, or router.invalidate() to refetch loaders.',\n });\n }\n }\n\n return violations;\n },\n};\n","import type { Rule, RuleContext, Violation } from '../types';\n\nconst DOM_METHODS = [\n { pattern: /document\\s*\\.\\s*querySelector\\s*\\(/g, name: 'document.querySelector()' },\n { pattern: /document\\s*\\.\\s*querySelectorAll\\s*\\(/g, name: 'document.querySelectorAll()' },\n { pattern: /document\\s*\\.\\s*getElementById\\s*\\(/g, name: 'document.getElementById()' },\n {\n pattern: /document\\s*\\.\\s*getElementsByClassName\\s*\\(/g,\n name: 'document.getElementsByClassName()',\n },\n { pattern: /\\.classList\\s*\\.\\s*(?:add|remove|toggle)\\s*\\(/g, name: 'classList manipulation' },\n];\n\nexport const noManualDom: Rule = {\n name: 'no-manual-dom',\n description: 'Disallow direct DOM manipulation in React components.',\n severity: 'warn',\n\n check(context: RuleContext): Violation[] {\n const violations: Violation[] = [];\n const lines = context.code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Quick guard\n if (!line.includes('document') && !line.includes('classList')) continue;\n\n for (const method of DOM_METHODS) {\n method.pattern.lastIndex = 0;\n if (method.pattern.test(line)) {\n violations.push({\n rule: 'no-manual-dom',\n message: `${method.name} performs direct DOM manipulation outside React's control.`,\n line: i + 1,\n recommendation:\n 'Use useRef() for element access and React state/clsx() for class toggling.',\n });\n }\n }\n }\n\n return violations;\n },\n};\n","import type { Rule, RuleContext, Violation } from '../types';\n\n/**\n * Matches <img ... > or <img ... /> tags (single line).\n * Captures the attributes portion to check for width/height.\n */\nconst IMG_TAG_RE = /<img\\s([^>]*?)\\/?>/gi;\n\nexport const noImgWithoutDimensions: Rule = {\n name: 'no-img-without-dimensions',\n description: 'Require width and height on <img> elements to prevent layout shifts (CLS).',\n severity: 'info',\n\n check(context: RuleContext): Violation[] {\n // Only check JSX/TSX files\n if (!/\\.[jt]sx$/.test(context.id)) return [];\n\n const violations: Violation[] = [];\n const lines = context.code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line.includes('<img')) continue;\n\n IMG_TAG_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = IMG_TAG_RE.exec(line)) !== null) {\n const attrs = match[1];\n const hasWidth = /\\bwidth\\s*[={]/.test(attrs);\n const hasHeight = /\\bheight\\s*[={]/.test(attrs);\n\n if (!hasWidth || !hasHeight) {\n violations.push({\n rule: 'no-img-without-dimensions',\n message: '<img> without explicit width/height causes layout shifts (CLS).',\n line: i + 1,\n recommendation:\n 'Add width and height attributes, or use the <Image> component which handles this automatically.',\n });\n }\n }\n }\n\n return violations;\n },\n};\n","import type { Rule, RuleContext, Violation } from '../types';\n\n/**\n * Matches direct ProductCard imports from deep paths:\n * - import { ProductCard } from '../product/ProductCard'\n * - import ProductCard from '../../components/product/ProductCard'\n *\n * Allows:\n * - import { ProductCard } from '../product' (barrel export)\n * - import { ProductCard } from '@salla.sa/twilight-theme-engine/components/product'\n * - Files in test directories (tests/**)\n * - ProductCard.tsx itself\n */\nconst DIRECT_PRODUCT_CARD_IMPORT_RE =\n /(?:import|from)\\s+.*['\"](?:\\.\\.\\/)+product\\/ProductCard['\"]/g;\n\nconst ALLOWED_PATHS = ['/ProductCard.tsx', '/ProductCard.test.tsx', '.test.', '.spec.'];\n\nexport const noDirectProductCardImport: Rule = {\n name: 'no-direct-product-card-import',\n description: 'Prevent direct imports of ProductCard to ensure registry override works correctly.',\n severity: 'error',\n\n check(context: RuleContext): Violation[] {\n const violations: Violation[] = [];\n\n // Allow imports in test files and ProductCard itself\n if (ALLOWED_PATHS.some((path) => context.relativeId.includes(path))) {\n return violations;\n }\n\n const lines = context.code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line.includes('import') && !line.includes('from')) continue;\n\n DIRECT_PRODUCT_CARD_IMPORT_RE.lastIndex = 0;\n if (DIRECT_PRODUCT_CARD_IMPORT_RE.test(line)) {\n violations.push({\n rule: 'no-direct-product-card-import',\n message: `Direct import of ProductCard bypasses the registry override mechanism.`,\n line: i + 1,\n recommendation: `Import ProductCard from barrel export '../product' or use registry override to customize.`,\n });\n }\n }\n\n return violations;\n },\n};\n","/**\n * Hook expectations registry for the require-page-hooks rule.\n *\n * Maps route file patterns to their expected HookSlot/hookRegistry entries.\n * Used by the Vite best-practices plugin to validate that theme developers\n * preserve customization points when overriding route pages.\n */\n\nexport interface ExpectedHook {\n hook: string;\n severity: 'error' | 'warn' | 'info';\n}\n\nexport interface RouteHookEntry {\n pattern: RegExp;\n routeType: string;\n expectedHooks: ExpectedHook[];\n}\n\n/**\n * Registry of expected hooks per route type.\n * Each entry maps a file path pattern to the hooks that should be present.\n */\nexport const ROUTE_HOOK_MAP: RouteHookEntry[] = [\n // Product Page\n {\n pattern: /ProductPage|product\\.tsx$/,\n routeType: 'product',\n expectedHooks: [\n { hook: 'product:start', severity: 'warn' },\n { hook: 'product:details.start', severity: 'warn' },\n { hook: 'product:details.end', severity: 'warn' },\n { hook: 'product:single.description.start', severity: 'warn' },\n { hook: 'product:single.description', severity: 'warn' },\n { hook: 'product:single.description.end', severity: 'warn' },\n { hook: 'product:single.form.start', severity: 'warn' },\n { hook: 'product:single.form.end', severity: 'warn' },\n { hook: 'product:related.start', severity: 'warn' },\n { hook: 'product:related.end', severity: 'warn' },\n { hook: 'product:end', severity: 'warn' },\n ],\n },\n // Cart Page\n {\n pattern: /CartPage|cart\\.tsx$/,\n routeType: 'cart',\n expectedHooks: [\n { hook: 'cart:start', severity: 'warn' },\n { hook: 'cart:items.start', severity: 'warn' },\n { hook: 'cart:items.end', severity: 'warn' },\n { hook: 'cart:summary.start', severity: 'warn' },\n { hook: 'cart:summary.end', severity: 'warn' },\n { hook: 'cart:submit.start', severity: 'warn' },\n { hook: 'cart:submit.end', severity: 'warn' },\n { hook: 'cart:end', severity: 'warn' },\n ],\n },\n // Home Page\n {\n pattern: /routes\\/home\\/HomePage\\.tsx$/,\n routeType: 'home',\n expectedHooks: [\n { hook: 'home:start', severity: 'warn' },\n { hook: 'home:content', severity: 'warn' },\n { hook: 'home:end', severity: 'warn' },\n ],\n },\n // Blog Index\n {\n pattern: /BlogPage|blog\\.tsx$/,\n routeType: 'blog',\n expectedHooks: [\n { hook: 'blog:start', severity: 'warn' },\n { hook: 'blog:items.start', severity: 'warn' },\n { hook: 'blog:items.end', severity: 'warn' },\n { hook: 'blog:end', severity: 'warn' },\n ],\n },\n // Blog Single\n {\n pattern: /BlogSinglePage/,\n routeType: 'blog-single',\n expectedHooks: [\n { hook: 'blog:single.start', severity: 'warn' },\n { hook: 'blog:single.end', severity: 'warn' },\n { hook: 'blog:single.related.start', severity: 'warn' },\n { hook: 'blog:single.related.end', severity: 'warn' },\n ],\n },\n // Blog Category\n {\n pattern: /BlogCategoryPage/,\n routeType: 'blog-category',\n expectedHooks: [\n { hook: 'blog:category.start', severity: 'warn' },\n { hook: 'blog:category.end', severity: 'warn' },\n ],\n },\n // Blog Tag\n {\n pattern: /BlogTagPage/,\n routeType: 'blog-tag',\n expectedHooks: [\n { hook: 'blog:tag.start', severity: 'warn' },\n { hook: 'blog:tag.end', severity: 'warn' },\n ],\n },\n // Blog Author\n {\n pattern: /BlogAuthorPage/,\n routeType: 'blog-author',\n expectedHooks: [\n { hook: 'blog:author.start', severity: 'warn' },\n { hook: 'blog:author.end', severity: 'warn' },\n ],\n },\n // Product Listing\n {\n pattern: /ProductListPage\\.tsx$/,\n routeType: 'product-listing',\n expectedHooks: [\n { hook: 'product:list.start', severity: 'warn' },\n { hook: 'product:list.items.start', severity: 'warn' },\n { hook: 'product:list.items.end', severity: 'warn' },\n { hook: 'product:list.end', severity: 'warn' },\n ],\n },\n // Brands\n {\n pattern: /BrandsPage\\.tsx$/,\n routeType: 'brands',\n expectedHooks: [\n { hook: 'brands:index.items.start', severity: 'warn' },\n { hook: 'brands:index.items.end', severity: 'warn' },\n ],\n },\n // Thank You\n {\n pattern: /ThankYouPage\\.tsx$/,\n routeType: 'thank-you',\n expectedHooks: [\n { hook: 'thank-you:start', severity: 'warn' },\n { hook: 'thank-you:items.start', severity: 'warn' },\n { hook: 'thank-you:items.end', severity: 'warn' },\n { hook: 'thank-you:payment.end', severity: 'warn' },\n { hook: 'thank-you:end', severity: 'warn' },\n ],\n },\n // Loyalty\n {\n pattern: /LoyaltyPage|loyalty\\.tsx$/,\n routeType: 'loyalty',\n expectedHooks: [\n { hook: 'loyalty:start', severity: 'warn' },\n { hook: 'loyalty:end', severity: 'warn' },\n ],\n },\n // Not Found\n {\n pattern: /not-found/,\n routeType: 'not-found',\n expectedHooks: [\n { hook: 'notfound:start', severity: 'warn' },\n { hook: 'notfound:content', severity: 'warn' },\n { hook: 'notfound:end', severity: 'warn' },\n ],\n },\n // Account - Profile\n {\n pattern: /ProfilePage\\.tsx$/,\n routeType: 'customer-profile',\n expectedHooks: [\n { hook: 'customer:profile.start', severity: 'warn' },\n { hook: 'customer:profile.form.start', severity: 'warn' },\n { hook: 'customer:profile.form.end', severity: 'warn' },\n { hook: 'customer:profile.end', severity: 'warn' },\n ],\n },\n // Account - Orders\n {\n pattern: /OrdersPage\\.tsx$/,\n routeType: 'customer-orders',\n expectedHooks: [\n { hook: 'customer:orders.index.items.start', severity: 'warn' },\n { hook: 'customer:orders.index.items.end', severity: 'warn' },\n ],\n },\n // Account - Order Single\n {\n pattern: /OrderSinglePage\\.tsx$/,\n routeType: 'customer-order-single',\n expectedHooks: [\n { hook: 'customer:orders.single.details.start', severity: 'warn' },\n { hook: 'customer:orders.single.details.end', severity: 'warn' },\n ],\n },\n // Account - Notifications\n {\n pattern: /NotificationsPage\\.tsx$/,\n routeType: 'customer-notifications',\n expectedHooks: [\n { hook: 'customer:notifications.items.start', severity: 'warn' },\n { hook: 'customer:notifications.items.end', severity: 'warn' },\n ],\n },\n // Account - Wallet\n {\n pattern: /WalletPage\\.tsx$/,\n routeType: 'customer-wallet',\n expectedHooks: [\n { hook: 'customer:wallet.transactions.start', severity: 'warn' },\n { hook: 'customer:wallet.transactions.end', severity: 'warn' },\n ],\n },\n // Account - Settings\n {\n pattern: /SettingsPage\\.tsx$/,\n routeType: 'customer-settings',\n expectedHooks: [\n { hook: 'customer:settings.start', severity: 'warn' },\n { hook: 'customer:settings.end', severity: 'warn' },\n ],\n },\n // Account - Wishlist\n {\n pattern: /WishlistPage\\.tsx$/,\n routeType: 'customer-wishlist',\n expectedHooks: [\n { hook: 'customer:wishlist.items.start', severity: 'warn' },\n { hook: 'customer:wishlist.items.end', severity: 'warn' },\n ],\n },\n];\n\n/**\n * Get expected hooks for a given file path.\n * Returns null if the file doesn't match any route pattern.\n */\nexport function getExpectedHooks(filePath: string): ExpectedHook[] | null {\n for (const entry of ROUTE_HOOK_MAP) {\n if (entry.pattern.test(filePath)) {\n return entry.expectedHooks;\n }\n }\n return null;\n}\n","/**\n * require-page-hooks rule for the best-practices Vite plugin.\n *\n * Validates that route files include expected HookSlot components or\n * hookRegistry.register() calls to preserve SDK customization points.\n *\n * Uses oxc-parser for AST-based detection to avoid false-positives\n * from comments and string literals.\n */\n\nimport { parseSync } from 'oxc-parser';\nimport { resolve, dirname } from 'path';\nimport { existsSync, readFileSync, statSync } from 'fs';\nimport type { Rule, RuleContext, Violation } from '../types';\nimport { getExpectedHooks } from '../hooks-registry';\n\n/** Map HookName enum constants to their string values */\nconst HOOK_NAME_ENUM_TO_STRING: Record<string, string> = {\n BODY_START: 'body:start',\n BODY_END: 'body:end',\n BODY_INNER: 'body:inner',\n HEAD_START: 'head:start',\n HEAD_END: 'head:end',\n HEAD_INNER: 'head:inner',\n HEADER_START: 'header:start',\n HEADER_END: 'header:end',\n FOOTER_START: 'footer:start',\n FOOTER_END: 'footer:end',\n PRODUCT_DESCRIPTION_START: 'product:single.description.start',\n PRODUCT_DESCRIPTION: 'product:single.description',\n PRODUCT_DESCRIPTION_END: 'product:single.description.end',\n PRODUCT_FORM_START: 'product:single.form.start',\n PRODUCT_FORM_END: 'product:single.form.end',\n CART_ITEMS_START: 'cart:items.start',\n CART_ITEMS_END: 'cart:items.end',\n CART_SUMMARY_START: 'cart:summary.start',\n CART_SUMMARY_END: 'cart:summary.end',\n SEARCH_START: 'search:start',\n SEARCH_ITEMS_START: 'search:items.start',\n SEARCH_ITEMS_END: 'search:items.end',\n SEARCH_END: 'search:end',\n HOMEPAGE_SLIDER: 'homepage:slider',\n HOMEPAGE_BANNERS: 'homepage:banners',\n HOMEPAGE_FEATURED: 'homepage:featured',\n};\n\n/** Check if path is in node_modules */\nfunction isNodeModules(path: string): boolean {\n return path.includes('node_modules');\n}\n\n/** Check if import is local (relative path) */\nfunction isLocalImport(importPath: string): boolean {\n return importPath.startsWith('.') || importPath.startsWith('/');\n}\n\n/** Check if file imports route components from theme-engine package */\nfunction importsThemeEngineRoutes(code: string): boolean {\n // Match imports like: import { Cart } from '@salla.sa/twilight-theme-engine/routes/cart'\n const importRegex =\n /import\\s+.*\\s+from\\s+['\"]@salla\\.sa\\/twilight-theme-engine\\/routes\\/[^'\"]+['\"]/;\n return importRegex.test(code);\n}\n\n/** Resolve import path to absolute file path */\nfunction resolveImportPath(importer: string, importPath: string): string | null {\n const dir = dirname(importer);\n const resolved = resolve(dir, importPath);\n\n // Try exact path first (must be a file, not a directory)\n if (existsSync(resolved)) {\n try {\n if (statSync(resolved).isFile()) {\n return resolved;\n }\n } catch {\n // Ignore stat errors\n }\n }\n\n // Try with extensions\n for (const ext of ['.ts', '.tsx', '.js', '.jsx']) {\n const withExt = resolved + ext;\n if (existsSync(withExt)) return withExt;\n }\n\n // Try index files\n for (const index of ['index.ts', 'index.tsx', 'index.js', 'index.jsx']) {\n const indexPath = resolve(resolved, index);\n if (existsSync(indexPath)) return indexPath;\n }\n\n return null;\n}\n\n/** Extract hook name from JSX attribute value */\nfunction extractHookNameFromAttrValue(attrValue: unknown): string | null {\n if (!attrValue || typeof attrValue !== 'object') return null;\n\n const value = attrValue as Record<string, unknown>;\n\n // String literal: name=\"product:start\" (oxc uses 'Literal' type)\n if (\n (value.type === 'Literal' || value.type === 'StringLiteral') &&\n typeof value.value === 'string'\n ) {\n return value.value;\n }\n\n // JSX expression container: name={HookName.BODY_END}\n if (value.type === 'JSXExpressionContainer') {\n const expr = value.expression as Record<string, unknown>;\n if (expr?.type === 'MemberExpression') {\n const object = expr.object as Record<string, unknown>;\n const property = expr.property as Record<string, unknown>;\n if (\n object?.type === 'Identifier' &&\n object.name === 'HookName' &&\n property?.type === 'Identifier' &&\n typeof property.name === 'string'\n ) {\n return HOOK_NAME_ENUM_TO_STRING[property.name] || null;\n }\n }\n }\n\n return null;\n}\n\n/** Extract hooks from AST node recursively */\nexport function extractHooksFromAst(node: unknown, hooks: Set<string>): void {\n if (!node || typeof node !== 'object') return;\n\n const obj = node as Record<string, unknown>;\n\n // Check for JSXElement with HookSlot\n if (obj.type === 'JSXElement') {\n const opening = obj.openingElement as Record<string, unknown>;\n if (opening && typeof opening === 'object') {\n const name = opening.name as Record<string, unknown>;\n if (name?.type === 'JSXIdentifier' && name.name === 'HookSlot') {\n const attributes = opening.attributes as unknown[];\n if (Array.isArray(attributes)) {\n for (const attr of attributes) {\n if (attr && typeof attr === 'object') {\n const attrObj = attr as Record<string, unknown>;\n if (attrObj.type === 'JSXAttribute') {\n const attrName = attrObj.name as Record<string, unknown>;\n if (attrName?.type === 'JSXIdentifier' && attrName.name === 'name') {\n const hookName = extractHookNameFromAttrValue(attrObj.value);\n if (hookName) hooks.add(hookName);\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Check for hookRegistry.register() calls\n if (obj.type === 'CallExpression') {\n const callee = obj.callee as Record<string, unknown>;\n if (callee?.type === 'MemberExpression') {\n const object = callee.object as Record<string, unknown>;\n const property = callee.property as Record<string, unknown>;\n if (\n object?.type === 'Identifier' &&\n object.name === 'hookRegistry' &&\n property?.type === 'Identifier' &&\n property.name === 'register'\n ) {\n const args = obj.arguments as unknown[];\n if (Array.isArray(args) && args.length > 0) {\n const firstArg = args[0] as Record<string, unknown>;\n // Handle both direct expression and wrapped argument\n const expr = (firstArg.expression || firstArg) as Record<string, unknown>;\n if (\n (expr?.type === 'Literal' || expr?.type === 'StringLiteral') &&\n typeof expr.value === 'string'\n ) {\n hooks.add(expr.value);\n } else if (expr?.type === 'MemberExpression') {\n const argObject = expr.object as Record<string, unknown>;\n const argProperty = expr.property as Record<string, unknown>;\n if (\n argObject?.type === 'Identifier' &&\n argObject.name === 'HookName' &&\n argProperty?.type === 'Identifier' &&\n typeof argProperty.name === 'string'\n ) {\n const hookName = HOOK_NAME_ENUM_TO_STRING[argProperty.name];\n if (hookName) hooks.add(hookName);\n }\n }\n }\n }\n }\n }\n\n // Recurse into children\n for (const key of Object.keys(obj)) {\n if (key === 'loc' || key === 'range' || key === 'start' || key === 'end') continue;\n const child = obj[key];\n if (Array.isArray(child)) {\n for (const item of child) {\n extractHooksFromAst(item, hooks);\n }\n } else if (typeof child === 'object' && child !== null) {\n extractHooksFromAst(child, hooks);\n }\n }\n}\n\n/** Recursively find dynamic import() calls in AST node */\nfunction findDynamicImportsInNode(\n node: unknown,\n filePath: string,\n visited: Set<string>,\n hooks: Set<string>\n): void {\n if (!node || typeof node !== 'object') return;\n\n const obj = node as Record<string, unknown>;\n\n // Check for ImportExpression (oxc-parser uses this for dynamic import())\n if (obj.type === 'ImportExpression') {\n const source = obj.source as Record<string, unknown>;\n if (\n (source?.type === 'Literal' || source?.type === 'StringLiteral') &&\n typeof source.value === 'string'\n ) {\n const importPath = source.value;\n if (isLocalImport(importPath)) {\n const resolved = resolveImportPath(filePath, importPath);\n if (resolved) {\n const nestedHooks = findHooksInFile(resolved, visited);\n for (const hook of nestedHooks) {\n hooks.add(hook);\n }\n }\n }\n }\n }\n\n // Recurse into children (skip location metadata)\n for (const key of Object.keys(obj)) {\n if (key === 'loc' || key === 'range' || key === 'start' || key === 'end') continue;\n const child = obj[key];\n if (Array.isArray(child)) {\n for (const item of child) {\n findDynamicImportsInNode(item, filePath, visited, hooks);\n }\n } else if (typeof child === 'object' && child !== null) {\n findDynamicImportsInNode(child, filePath, visited, hooks);\n }\n }\n}\n\n/** Find all hooks in a file using oxc-parser, tracing local imports */\nexport function findHooksInFile(filePath: string, visited: Set<string> = new Set()): Set<string> {\n if (visited.has(filePath)) return new Set();\n if (isNodeModules(filePath)) return new Set();\n\n visited.add(filePath);\n const hooks = new Set<string>();\n\n try {\n const code = readFileSync(filePath, 'utf-8');\n const ast = parseSync(filePath, code, {\n sourceType: 'module',\n preserveParens: false,\n });\n\n // Extract hooks from this file\n extractHooksFromAst(ast.program, hooks);\n\n // Trace local imports (static and dynamic)\n const body = (ast.program as unknown as Record<string, unknown>)?.body;\n if (Array.isArray(body)) {\n for (const stmt of body) {\n if (stmt && typeof stmt === 'object') {\n const stmtObj = stmt as Record<string, unknown>;\n\n // Handle static imports: import X from './file'\n if (stmtObj.type === 'ImportDeclaration') {\n const source = stmtObj.source as Record<string, unknown>;\n if (\n (source?.type === 'Literal' || source?.type === 'StringLiteral') &&\n typeof source.value === 'string'\n ) {\n const importPath = source.value;\n if (isLocalImport(importPath)) {\n const resolved = resolveImportPath(filePath, importPath);\n if (resolved) {\n const nestedHooks = findHooksInFile(resolved, visited);\n for (const hook of nestedHooks) {\n hooks.add(hook);\n }\n }\n }\n }\n }\n\n // Handle re-exports: export { X } from './file'\n if (stmtObj.type === 'ExportNamedDeclaration') {\n const source = stmtObj.source as Record<string, unknown>;\n if (\n source &&\n (source.type === 'Literal' || source.type === 'StringLiteral') &&\n typeof source.value === 'string'\n ) {\n const importPath = source.value;\n if (isLocalImport(importPath)) {\n const resolved = resolveImportPath(filePath, importPath);\n if (resolved) {\n const nestedHooks = findHooksInFile(resolved, visited);\n for (const hook of nestedHooks) {\n hooks.add(hook);\n }\n }\n }\n }\n }\n\n // Handle dynamic imports: lazy(() => import('./file'))\n // Walk the entire statement to find CallExpression with import()\n findDynamicImportsInNode(stmtObj, filePath, visited, hooks);\n }\n }\n }\n } catch {\n // Skip files that can't be parsed\n }\n\n return hooks;\n}\n\n/** Get line number for violation reporting */\nfunction getLineForHook(code: string, hookName: string): number {\n const lines = code.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].includes(hookName)) {\n return i + 1;\n }\n }\n return 1;\n}\n\nexport const requirePageHooks: Rule = {\n name: 'require-page-hooks',\n description:\n 'Ensure route files include expected HookSlot or hookRegistry entries for customization.',\n severity: 'warn',\n\n check(context: RuleContext): Violation[] {\n const violations: Violation[] = [];\n const expectedHooks = getExpectedHooks(context.relativeId);\n\n if (!expectedHooks) return violations;\n\n // Skip validation for theme-custom route files that import from theme-engine\n // These files use pre-built route components that already have hooks\n if (importsThemeEngineRoutes(context.code)) {\n return violations;\n }\n\n // Find all hooks in this file and its local imports\n // Try file-based detection first, fall back to code-based detection\n let foundHooks: Set<string>;\n try {\n foundHooks = findHooksInFile(context.id);\n } catch {\n foundHooks = new Set();\n }\n\n // If file-based detection found nothing, parse the code directly\n if (foundHooks.size === 0) {\n try {\n const ast = parseSync(context.id, context.code, {\n sourceType: 'module',\n preserveParens: false,\n });\n extractHooksFromAst(ast.program, foundHooks);\n } catch {\n // If parsing fails, continue with empty set\n }\n }\n\n // Check for missing hooks\n for (const expected of expectedHooks) {\n if (!foundHooks.has(expected.hook)) {\n violations.push({\n rule: 'require-page-hooks',\n message: `Missing expected hook '${expected.hook}' in ${context.relativeId}`,\n line: getLineForHook(context.code, 'HookSlot') || 1,\n recommendation: `Add <HookSlot name=\"${expected.hook}\" /> or hookRegistry.register('${expected.hook}', ...) to enable theme customization.`,\n });\n }\n }\n\n return violations;\n },\n};\n","import type { Rule } from '../types';\nimport { noDeepComponentImport } from './no-deep-component-import';\nimport { noWindowLocationReload } from './no-window-location-reload';\nimport { noManualDom } from './no-manual-dom';\nimport { noImgWithoutDimensions } from './no-img-without-dimensions';\nimport { noDirectProductCardImport } from './no-direct-product-card-import';\nimport { requirePageHooks } from './require-page-hooks';\n\n/** All built-in rules. Add new rules to this array. */\nexport const builtinRules: Rule[] = [\n noDeepComponentImport,\n noWindowLocationReload,\n noManualDom,\n noImgWithoutDimensions,\n noDirectProductCardImport,\n requirePageHooks,\n];\n","import type { Severity, Violation } from './types';\n\nconst COLORS = {\n reset: '\\x1b[0m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n dim: '\\x1b[2m',\n bold: '\\x1b[1m',\n green: '\\x1b[32m',\n};\n\nconst SEVERITY_LABEL: Record<Severity, string> = {\n error: `${COLORS.red}ERROR${COLORS.reset}`,\n warn: `${COLORS.yellow}WARN${COLORS.reset}`,\n info: `${COLORS.cyan}INFO${COLORS.reset}`,\n};\n\nconst SEVERITY_ICON: Record<Severity, string> = {\n error: `${COLORS.red}\\u2718${COLORS.reset}`,\n warn: `${COLORS.yellow}\\u26A0${COLORS.reset}`,\n info: `${COLORS.cyan}\\u2139${COLORS.reset}`,\n};\n\nexport function formatViolation(\n violation: Violation,\n severity: Severity,\n relativeId: string\n): string {\n const loc = `${COLORS.dim}${relativeId}:${violation.line}${COLORS.reset}`;\n const icon = SEVERITY_ICON[severity];\n const label = SEVERITY_LABEL[severity];\n const rule = `${COLORS.dim}(${violation.rule})${COLORS.reset}`;\n\n return [\n ` ${icon} ${label} ${rule}`,\n ` ${loc}`,\n ` ${violation.message}`,\n ` ${COLORS.green}\\u2192 ${violation.recommendation}${COLORS.reset}`,\n ].join('\\n');\n}\n\nexport function formatSummary(errors: number, warnings: number, infos: number): string {\n const parts: string[] = [];\n if (errors > 0) parts.push(`${COLORS.red}${errors} error(s)${COLORS.reset}`);\n if (warnings > 0) parts.push(`${COLORS.yellow}${warnings} warning(s)${COLORS.reset}`);\n if (infos > 0) parts.push(`${COLORS.cyan}${infos} info(s)${COLORS.reset}`);\n return `${COLORS.bold}[twilight:best-practices]${COLORS.reset} ${parts.join(', ')}`;\n}\n","import type { Plugin } from 'vite';\nimport type { BestPracticesOptions, Severity, Violation } from './types';\nimport { builtinRules } from './rules';\nimport { formatViolation, formatSummary } from './reporter';\nimport { createHash } from 'crypto';\nimport { relative } from 'path';\n\n/** Hash of the last-seen source per file — skip unchanged files. */\nconst fileHashCache = new Map<string, string>();\n\nfunction hash(content: string): string {\n return createHash('md5').update(content).digest('hex');\n}\n\nfunction matchesGlob(id: string, patterns: string[]): boolean {\n return patterns.some((p) => {\n if (/[\\\\^$|+?(){}[\\]\\\\\\\\]/.test(p)) return false;\n const regex = new RegExp(\n '^' +\n p\n .replace(/\\./g, '\\\\.')\n .replace(/\\*\\*/g, '\\0GLOBSTAR\\0')\n .replace(/\\*/g, '[^/]*')\n .replace(/\\0GLOBSTAR\\0/g, '.*') +\n '$'\n );\n return regex.test(id);\n });\n}\n\nexport function bestPracticesPlugin(options: BestPracticesOptions = {}): Plugin {\n const {\n include = ['**/*.ts', '**/*.tsx'],\n exclude = ['**/node_modules/**', '**/dist/**', '**/*.d.ts', '**/.twilight/**'],\n disabledRules = [],\n severityOverrides = {},\n browserConsole = false,\n } = options;\n\n const enabledRules = builtinRules.filter((r) => !disabledRules.includes(r.name));\n let projectRoot = '';\n\n return {\n name: 'twilight:best-practices',\n apply: 'build',\n enforce: 'pre',\n\n configResolved(config) {\n projectRoot = config.root;\n },\n\n transform(code, id) {\n if (!/\\.[jt]sx?$/.test(id)) return null;\n\n const relativeId = relative(projectRoot, id);\n\n // Include/exclude filtering\n if (!matchesGlob(relativeId, include)) return null;\n if (matchesGlob(relativeId, exclude)) return null;\n\n // Skip unchanged files\n const h = hash(code);\n if (fileHashCache.get(id) === h) return null;\n fileHashCache.set(id, h);\n\n const context = { code, id, relativeId };\n const allViolations: Array<{ violation: Violation; severity: Severity }> = [];\n\n for (const rule of enabledRules) {\n const severity = severityOverrides[rule.name] ?? rule.severity;\n const violations = rule.check(context);\n for (const v of violations) {\n allViolations.push({ violation: v, severity });\n }\n }\n\n if (allViolations.length === 0) return null;\n\n // Print to Vite terminal\n const counts = { error: 0, warn: 0, info: 0 };\n const lines: string[] = [];\n for (const { violation, severity } of allViolations) {\n counts[severity]++;\n lines.push(formatViolation(violation, severity, relativeId));\n }\n\n console.error('\\n' + lines.join('\\n'));\n console.error(formatSummary(counts.error, counts.warn, counts.info) + '\\n');\n\n // Optionally inject browser console warnings\n if (browserConsole && allViolations.length > 0) {\n const consoleStatements = allViolations\n .map(({ violation, severity }) => {\n const method = severity === 'error' ? 'error' : severity === 'warn' ? 'warn' : 'info';\n const msg = `[twilight:${violation.rule}] ${violation.message}\\\\n → ${violation.recommendation}\\\\n at ${relativeId}:${violation.line}`;\n return `console.${method}(${JSON.stringify(msg)});`;\n })\n .join('\\n');\n\n return {\n code: code + '\\n' + consoleStatements,\n map: null,\n };\n }\n\n return null;\n },\n };\n}\n","import type { Plugin, AliasOptions } from 'vite';\nimport { fileURLToPath } from 'url';\nimport { existsSync } from 'node:fs';\nimport { dirname } from 'path';\n\n// Only the monorepo checkout has src/ next to dist/ — a registry install ships\n// dist/ alone, and there the package.json exports map already resolves every\n// subpath, so no aliasing is needed (null disables the plugin).\nfunction findEngineSrc(startDir: string): string | null {\n let dir = startDir;\n for (let i = 0; i < 6; i++) {\n const candidate = `${dir}/src`;\n if (existsSync(`${candidate}/index.ts`)) return candidate;\n dir = dirname(dir);\n }\n return null;\n}\n\nconst engineSrc = findEngineSrc(dirname(fileURLToPath(import.meta.url)));\n\nconst PKG = '@salla.sa/twilight-theme-engine';\nconst ESCAPED_PKG = PKG.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst SAFE_SUBPATH = /^[a-zA-Z0-9/_-]+$/;\n\nfunction pkgPattern(subpath: string): RegExp {\n if (subpath && !SAFE_SUBPATH.test(subpath))\n throw new Error(`Invalid package subpath: ${subpath}`);\n return new RegExp(`^${ESCAPED_PKG}${subpath ? '/' + subpath : ''}$`);\n}\n\nconst ALIASES: AliasOptions = !engineSrc\n ? []\n : [\n { find: pkgPattern('i18n'), replacement: `${engineSrc}/providers/I18nProvider.tsx` },\n { find: pkgPattern('hooks'), replacement: `${engineSrc}/hooks/index.ts` },\n {\n find: pkgPattern('hooks/useAsyncFn'),\n replacement: `${engineSrc}/hooks/useAsyncFn.ts`,\n },\n { find: pkgPattern('hooks/useStore'), replacement: `${engineSrc}/hooks/useStore.ts` },\n { find: pkgPattern('hooks/useTheme'), replacement: `${engineSrc}/hooks/useTheme.ts` },\n { find: pkgPattern('hooks/useMoney'), replacement: `${engineSrc}/hooks/useMoney.tsx` },\n { find: pkgPattern('hooks/useAsset'), replacement: `${engineSrc}/hooks/useAsset.ts` },\n {\n find: pkgPattern('hooks/useProduct'),\n replacement: `${engineSrc}/hooks/useProduct.ts`,\n },\n {\n find: pkgPattern('hooks/useDocumentClass'),\n replacement: `${engineSrc}/hooks/useDocumentClass.ts`,\n },\n {\n find: pkgPattern('hooks/useHostAttributes'),\n replacement: `${engineSrc}/hooks/useHostAttributes.ts`,\n },\n {\n find: pkgPattern('hooks/useCoupon'),\n replacement: `${engineSrc}/hooks/useCoupon.ts`,\n },\n {\n find: pkgPattern('hooks/useWishlist'),\n replacement: `${engineSrc}/hooks/useWishlist.ts`,\n },\n {\n find: pkgPattern('hooks/useBlogLike'),\n replacement: `${engineSrc}/hooks/useBlogLike.ts`,\n },\n {\n find: pkgPattern('hooks/useComments'),\n replacement: `${engineSrc}/hooks/useComments.ts`,\n },\n {\n find: pkgPattern('hooks/HookRegistry'),\n replacement: `${engineSrc}/hooks/HookRegistry.ts`,\n },\n { find: pkgPattern('hooks/HookSlot'), replacement: `${engineSrc}/hooks/HookSlot.tsx` },\n { find: pkgPattern('hooks/useHook'), replacement: `${engineSrc}/hooks/useHook.ts` },\n { find: pkgPattern('hooks/useGtm'), replacement: `${engineSrc}/hooks/useGtm.ts` },\n { find: pkgPattern('contexts'), replacement: `${engineSrc}/contexts/index.ts` },\n { find: pkgPattern('utils'), replacement: `${engineSrc}/utils/index.ts` },\n { find: pkgPattern('utils/baseHead'), replacement: `${engineSrc}/utils/baseHead.ts` },\n { find: pkgPattern('utils/cdn-image'), replacement: `${engineSrc}/utils/cdn-image.ts` },\n { find: pkgPattern('utils/head'), replacement: `${engineSrc}/utils/head.ts` },\n { find: pkgPattern('types'), replacement: `${engineSrc}/types/index.ts` },\n { find: pkgPattern('types/hooks'), replacement: `${engineSrc}/types/hooks.ts` },\n { find: pkgPattern('eslint'), replacement: `${engineSrc}/eslint/index.ts` },\n { find: pkgPattern('vite'), replacement: `${engineSrc}/vite/index.ts` },\n { find: pkgPattern('routes'), replacement: `${engineSrc}/routes/index.ts` },\n { find: pkgPattern('routes/home'), replacement: `${engineSrc}/routes/home/index.tsx` },\n { find: pkgPattern('routes/cart'), replacement: `${engineSrc}/routes/cart/index.tsx` },\n {\n find: pkgPattern('routes/product'),\n replacement: `${engineSrc}/routes/product/index.tsx`,\n },\n {\n find: pkgPattern('routes/product-listing'),\n replacement: `${engineSrc}/routes/product-listing/index.tsx`,\n },\n { find: pkgPattern('routes/blog'), replacement: `${engineSrc}/routes/blog/index.tsx` },\n {\n find: pkgPattern('routes/brands'),\n replacement: `${engineSrc}/routes/brands/index.tsx`,\n },\n {\n find: pkgPattern('routes/account'),\n replacement: `${engineSrc}/routes/account/index.tsx`,\n },\n {\n find: pkgPattern('routes/account/orders'),\n replacement: `${engineSrc}/routes/account/orders/index.tsx`,\n },\n {\n find: pkgPattern('routes/loyalty'),\n replacement: `${engineSrc}/routes/loyalty/index.tsx`,\n },\n { find: pkgPattern('routes/page'), replacement: `${engineSrc}/routes/page/index.tsx` },\n {\n find: pkgPattern('routes/testimonials'),\n replacement: `${engineSrc}/routes/testimonials/index.tsx`,\n },\n {\n find: pkgPattern('routes/thank-you'),\n replacement: `${engineSrc}/routes/thank-you/index.tsx`,\n },\n {\n find: pkgPattern('routes/seo-redirects'),\n replacement: `${engineSrc}/routes/seo-redirects.ts`,\n },\n { find: pkgPattern('skeleton'), replacement: `${engineSrc}/skeleton.ts` },\n { find: pkgPattern('tanstack'), replacement: `${engineSrc}/tanstack/index.ts` },\n { find: pkgPattern('nextjs'), replacement: `${engineSrc}/nextjs/index.ts` },\n { find: pkgPattern('dom'), replacement: `${engineSrc}/dom/index.ts` },\n { find: pkgPattern('native-app'), replacement: `${engineSrc}/native-app/index.ts` },\n {\n find: pkgPattern('components/modal'),\n replacement: `${engineSrc}/components/modal/index.ts`,\n },\n {\n find: pkgPattern('components/drawer'),\n replacement: `${engineSrc}/components/drawer/index.ts`,\n },\n {\n find: pkgPattern('components/dropdown'),\n replacement: `${engineSrc}/components/dropdown/index.ts`,\n },\n {\n find: pkgPattern('components/collapse'),\n replacement: `${engineSrc}/components/collapse/index.ts`,\n },\n {\n find: pkgPattern('components/toast'),\n replacement: `${engineSrc}/components/toast/index.ts`,\n },\n {\n find: pkgPattern('components/cart'),\n replacement: `${engineSrc}/components/cart/index.ts`,\n },\n {\n find: pkgPattern('components/product'),\n replacement: `${engineSrc}/components/product/index.ts`,\n },\n {\n find: pkgPattern('components/layout'),\n replacement: `${engineSrc}/components/layout/index.ts`,\n },\n {\n find: pkgPattern('components/home'),\n replacement: `${engineSrc}/components/home/index.ts`,\n },\n {\n find: pkgPattern('components/common'),\n replacement: `${engineSrc}/components/common/index.ts`,\n },\n { find: pkgPattern('modal'), replacement: `${engineSrc}/components/modal/index.ts` },\n { find: pkgPattern('drawer'), replacement: `${engineSrc}/components/drawer/index.ts` },\n {\n find: pkgPattern('dropdown'),\n replacement: `${engineSrc}/components/dropdown/index.ts`,\n },\n {\n find: pkgPattern('collapse'),\n replacement: `${engineSrc}/components/collapse/index.ts`,\n },\n { find: pkgPattern('toast'), replacement: `${engineSrc}/components/toast/index.ts` },\n { find: pkgPattern('cart'), replacement: `${engineSrc}/components/cart/index.ts` },\n {\n find: pkgPattern('product'),\n replacement: `${engineSrc}/components/product/index.ts`,\n },\n { find: pkgPattern('layout'), replacement: `${engineSrc}/components/layout/index.ts` },\n { find: pkgPattern('home'), replacement: `${engineSrc}/components/home/index.ts` },\n { find: pkgPattern('common'), replacement: `${engineSrc}/components/common/index.ts` },\n { find: pkgPattern('providers'), replacement: `${engineSrc}/providers/index.ts` },\n { find: pkgPattern('api/types'), replacement: `${engineSrc}/api/types.ts` },\n { find: pkgPattern('api/client'), replacement: `${engineSrc}/api/client.ts` },\n { find: pkgPattern('api/store'), replacement: `${engineSrc}/api/store.ts` },\n {\n find: pkgPattern('api/translations'),\n replacement: `${engineSrc}/api/translations.ts`,\n },\n { find: pkgPattern('api/cart'), replacement: `${engineSrc}/api/cart.ts` },\n { find: pkgPattern('api/product'), replacement: `${engineSrc}/api/product.ts` },\n { find: pkgPattern('api/home'), replacement: `${engineSrc}/api/home.ts` },\n { find: pkgPattern('api/brands'), replacement: `${engineSrc}/api/brands.ts` },\n { find: pkgPattern('api/loyalty'), replacement: `${engineSrc}/api/loyalty.ts` },\n { find: pkgPattern('api/order'), replacement: `${engineSrc}/api/order.ts` },\n { find: pkgPattern('api/category'), replacement: `${engineSrc}/api/category.ts` },\n { find: pkgPattern('api/page'), replacement: `${engineSrc}/api/page.ts` },\n { find: pkgPattern('api/menu'), replacement: `${engineSrc}/api/menu.ts` },\n {\n find: pkgPattern('api/notification'),\n replacement: `${engineSrc}/api/notification.ts`,\n },\n { find: pkgPattern('api/wishlist'), replacement: `${engineSrc}/api/wishlist.ts` },\n { find: pkgPattern('api/profile'), replacement: `${engineSrc}/api/profile.ts` },\n {\n find: pkgPattern('tracking'),\n replacement: `${engineSrc}/components/tracking/index.ts`,\n },\n { find: pkgPattern('store'), replacement: `${engineSrc}/components/store/index.ts` },\n { find: pkgPattern(''), replacement: `${engineSrc}/index.ts` },\n ];\n\nexport function packageAliasesPlugin(): Plugin {\n return {\n name: 'twilight:package-aliases',\n enforce: 'pre',\n config() {\n return {\n resolve: {\n alias: ALIASES,\n },\n };\n },\n };\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst WRAPPER_IMPORT = /@salla\\.sa\\/twilight-components-react\\/([a-z0-9-]+(?:\\/[a-z0-9-]+)?)\\b/g;\nconst SOURCE_FILE = /\\.[cm]?[jt]sx?$/;\nconst SKIPPED_FILE = /\\.d\\.ts$|\\.(?:test|spec)\\.[cm]?[jt]sx?$/;\nconst SKIPPED_DIR = new Set([\n 'node_modules',\n 'tests',\n '__tests__',\n 'coverage',\n '.vite',\n '.wrangler',\n]);\n\n/** Every `@salla.sa/twilight-components-react/<subpath>` imported by the source files under `dirs`. */\nexport function collectComponentWrapperImports(dirs: string[]): string[] {\n const found = new Set<string>();\n const walk = (dir: string) => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const path = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (!SKIPPED_DIR.has(entry.name)) walk(path);\n } else if (SOURCE_FILE.test(entry.name) && !SKIPPED_FILE.test(entry.name)) {\n for (const [specifier, subpath] of readFileSync(path, 'utf8').matchAll(WRAPPER_IMPORT)) {\n if (!subpath.startsWith('dist')) found.add(specifier);\n }\n }\n }\n };\n dirs.filter((dir) => existsSync(dir)).forEach(walk);\n return [...found].sort();\n}\n\n/** The engine's own code: `src/` in the monorepo, `dist/` in a registry install. */\nexport function engineSourceDir(startDir = dirname(fileURLToPath(import.meta.url))): string | null {\n let dir = startDir;\n for (let i = 0; i < 6; i++) {\n const pkg = join(dir, 'package.json');\n if (\n existsSync(pkg) &&\n JSON.parse(readFileSync(pkg, 'utf8')).name === '@salla.sa/twilight-theme-engine'\n ) {\n return existsSync(join(dir, 'src')) ? join(dir, 'src') : join(dir, 'dist');\n }\n dir = dirname(dir);\n }\n return null;\n}\n","/**\n * @fileoverview The workerd runtime config for a theme's SSR environment.\n *\n * A React theme renders server-side in `workerd`, which needs a wrangler config\n * to boot. Themes used to own that file and pass the runtime plugin themselves;\n * the engine now owns both, so a scaffolded theme carries no runtime\n * configuration of its own and `compatibility_date` / flags move forward for\n * every theme at once instead of drifting per repository.\n *\n * A theme that still ships its own wrangler config keeps it untouched — that is\n * how the internal reference themes pin store vars and an explicit worker name.\n * Deployment config is never read from here; the platform generates it at\n * publish time.\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\n\n/** Config filenames the runtime plugin discovers on its own, in its own order. */\nconst THEME_CONFIG_NAMES = ['wrangler.jsonc', 'wrangler.json', 'wrangler.toml'] as const;\n\n/** Bumped here, once, for every theme the engine builds. */\nexport const DEFAULT_COMPATIBILITY_DATE = '2026-03-03';\n\n/** The engine's SSR code paths (i18n, ALS request context) need node built-ins. */\nexport const DEFAULT_COMPATIBILITY_FLAGS = ['nodejs_compat'];\n\n/** TanStack Start owns the request handler; the worker only re-exports it. */\nconst SERVER_ENTRY = '@tanstack/react-start/server-entry';\n\n/** Generated under node_modules so it never shows up in a theme's own tree. */\nconst GENERATED_DIR = join('node_modules', '.twilight');\nconst GENERATED_NAME = 'wrangler.json';\n\nexport interface WorkerOptions {\n /**\n * Worker name for the local dev runtime. Defaults to the theme's package name\n * without its scope, suffixed `-dev`. Never used for deployment.\n */\n name?: string;\n /** Overrides {@link DEFAULT_COMPATIBILITY_DATE}. */\n compatibilityDate?: string;\n /** Overrides {@link DEFAULT_COMPATIBILITY_FLAGS} — replaces, does not merge. */\n compatibilityFlags?: string[];\n}\n\nexport interface GeneratedWorkerConfig {\n name: string;\n compatibility_date: string;\n compatibility_flags: string[];\n main: string;\n}\n\n/** Absolute path to a wrangler config the theme owns, if it has one. */\nexport function findThemeWorkerConfig(projectRoot: string): string | undefined {\n for (const name of THEME_CONFIG_NAMES) {\n const candidate = join(projectRoot, name);\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\n/**\n * `@salla.sa/theme-raed` → `theme-raed-dev`. Worker names accept only lowercase\n * alphanumerics and dashes, so every other character collapses to a dash.\n *\n * This is what preserves the scaffolded worker name across the CLI handoff:\n * `salla theme create` personalizes `package.json` to the theme's slug, so\n * deriving from it yields the same `<slug>-dev` the CLI used to write into the\n * theme's wrangler config directly. Its guarded write there is now a no-op.\n */\nexport function deriveWorkerName(projectRoot: string): string {\n let base = '';\n try {\n const pkg = JSON.parse(readFileSync(join(projectRoot, 'package.json'), 'utf-8')) as {\n name?: unknown;\n };\n if (typeof pkg.name === 'string') base = pkg.name.split('/').pop() ?? '';\n } catch {\n // Unreadable or absent package.json — the fallback name still boots dev.\n }\n\n const slug = base\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\n return `${slug || 'twilight-theme'}-dev`;\n}\n\nexport function buildWorkerConfig(\n projectRoot: string,\n options: WorkerOptions = {}\n): GeneratedWorkerConfig {\n return {\n name: options.name ?? deriveWorkerName(projectRoot),\n compatibility_date: options.compatibilityDate ?? DEFAULT_COMPATIBILITY_DATE,\n compatibility_flags: options.compatibilityFlags ?? DEFAULT_COMPATIBILITY_FLAGS,\n main: SERVER_ENTRY,\n };\n}\n\n/** Write the generated config and return its path. */\nexport function writeGeneratedWorkerConfig(\n projectRoot: string,\n options: WorkerOptions = {}\n): string {\n const filePath = join(projectRoot, GENERATED_DIR, GENERATED_NAME);\n const contents = `${JSON.stringify(buildWorkerConfig(projectRoot, options), null, 2)}\\n`;\n\n mkdirSync(join(projectRoot, GENERATED_DIR), { recursive: true });\n\n // Rewriting an identical file would churn the mtime that the dev runtime\n // watches, restarting the worker on every vite config reload.\n let current: string | undefined;\n try {\n current = readFileSync(filePath, 'utf-8');\n } catch {\n // Not written yet.\n }\n if (current !== contents) writeFileSync(filePath, contents);\n\n return filePath;\n}\n\n/**\n * `configPath` for the workerd runtime plugin — or `undefined` when the theme\n * ships its own config, which the plugin then discovers unchanged.\n */\nexport function resolveWorkerConfigPath(\n projectRoot: string,\n options: WorkerOptions = {}\n): string | undefined {\n if (findThemeWorkerConfig(projectRoot)) return undefined;\n return writeGeneratedWorkerConfig(projectRoot, options);\n}\n","/** The generated file's helper, which `beforeLoad` and `loader` both read the settings with. */\nconst ADDRESS_LANGUAGE = `/**\n * Which language the store's addresses carry. Single-language when the merchant says so, or\n * when the store lists fewer than two languages. A page with no locale is read as\n * FALLBACK_LOCALE (\\`rootBeforeLoad\\`), so a single-language store in another language keeps\n * its segment instead: it is what the page is addressed and read by. Without it an\n * English-only store would render in Arabic.\n */\nfunction addressLanguage(settings) {\n const listed = settings?.languages;\n const soleEntry = listed?.length === 1 ? listed[0] : undefined;\n const soleLang = soleEntry ? (soleEntry.iso_code ?? soleEntry.code)?.toLowerCase() : undefined;\n const single =\n settings?.store?.settings?.is_multilingual === false || (listed != null && listed.length < 2);\n const segment = single && isLocale(soleLang) && soleLang !== FALLBACK_LOCALE ? soleLang : null;\n return { single, segment };\n}`;\n\n/**\n * Template for $locale.tsx route file\n * Locale wrapper — validates optional locale prefix and gates on is_multilingual.\n *\n * Uses TanStack Router's optional path parameter syntax /{-$locale}:\n * - /{-$locale}/cart matches both /cart and /ar/cart\n *\n * beforeLoad: validates the locale format when present. A first segment that is not a locale\n * gets the fallback locale, except on a store whose addresses carry none: there it is a page\n * no route has, and the loader would strip the locale straight off again.\n * loader: checks store.settings.is_multilingual (and the number of languages) and redirects\n * accordingly. On a Salla shared host the address has no locale, so it redirects nothing.\n *\n * Note: loader and head are in __root.tsx for better SSR support.\n * Note: RouteDocumentSync is now in TwilightProvider for automatic route class syncing.\n */\nexport function getLocaleWrapperTemplate(baseRoutesImport: string): string {\n const mainPkg = baseRoutesImport.replace(/\\/routes$/, '');\n return `// @auto-generated\n// @ts-nocheck — params types are generated by TanStack Router on pnpm dev\nimport { createFileRoute, notFound, Outlet, redirect } from '@tanstack/react-router';\nimport { FALLBACK_LOCALE, isLocale } from '${baseRoutesImport}';\nimport { store } from '${mainPkg}/api/store';\n\n${ADDRESS_LANGUAGE}\n\nexport const Route = createFileRoute('/{-$locale}')({\n beforeLoad: async ({ params, location, context }) => {\n const { locale } = params;\n if (!locale) return;\n if (!isLocale(locale)) {\n // A first segment that is not a language is a page no route has: \\`/nothing-here\\` binds\n // \\`{-$locale}\\` to \\`nothing-here\\`. On a store whose addresses carry no language the\n // loader strips the locale this would add, and the two redirects sent the page back\n // and forth forever (\\`/x\\` → \\`/ar/x\\` → \\`/x\\`), so there it is the not-found page.\n if (!context.storeBaseFollowsLocale) {\n const settings = await context.queryClient.ensureQueryData(store.queries.settings());\n const { single, segment } = addressLanguage(settings);\n if (single && !segment) throw notFound();\n }\n throw redirect({\n to: \\`/\\${FALLBACK_LOCALE}\\${location.pathname}\\`,\n search: location.search,\n replace: true,\n });\n }\n },\n loader: async ({ params, context, location }) => {\n // On a Salla shared host the address never carries a language: the router adds a virtual\n // one on the way in and strips it on the way out, and \\`rootBeforeLoad\\` settles which\n // language the store shows (\\`?lang=\\`, the \\`s-lang\\` cookie, the store's default). A redirect\n // here between locale-less and locale-bearing paths would come back as the same URL.\n if (context.storeBaseFollowsLocale) return;\n\n const settings = await context.queryClient.ensureQueryData(store.queries.settings());\n const { single, segment } = addressLanguage(settings);\n const isMultilingual = !single;\n const pathWithoutLocale = params.locale\n ? location.pathname.slice(params.locale.length + 1) || '/'\n : location.pathname;\n\n if (!isMultilingual && !segment && params.locale) {\n throw redirect({\n to: pathWithoutLocale,\n search: location.search,\n replace: true,\n });\n }\n if (!isMultilingual && segment && params.locale !== segment) {\n // The store's one language, wherever the path pointed: the right page, and the one\n // every other rule sends this visitor to.\n throw redirect({\n to: \\`/\\${segment}\\${pathWithoutLocale === '/' ? '' : pathWithoutLocale}\\`,\n search: location.search,\n replace: true,\n });\n }\n if (!isMultilingual && segment && !params.locale) {\n throw redirect({\n to: \\`/\\${segment}\\${location.pathname === '/' ? '' : location.pathname}\\`,\n search: location.search,\n replace: true,\n });\n }\n if (isMultilingual && !params.locale) {\n // A leading locale bound to a child param (/ar/p1 as slug 'ar'): Twig has no such page.\n if (isLocale(location.pathname.split('/')[1])) throw notFound();\n throw redirect({\n to: \\`/\\${FALLBACK_LOCALE}\\${location.pathname}\\`,\n search: location.search,\n replace: true,\n });\n }\n // The localization modal asks for another language with \\`?lang=\\`, and only\n // rewrites the locale segment when a slash follows it (\\`/ar?scope=1\\` keeps \\`/ar\\`).\n const { lang, ...search } = location.search;\n const offered = settings?.languages?.some(\n (language) => (language.iso_code ?? language.code)?.toLowerCase() === lang\n );\n if (params.locale && lang !== params.locale && isLocale(lang) && offered) {\n throw redirect({\n to: \\`/\\${lang}\\${location.pathname.slice(params.locale.length + 1)}\\`,\n search,\n replace: true,\n });\n }\n },\n component: () => <Outlet />,\n});\n`;\n}\n","/**\n * Template for redirect.$type.$id.tsx route file (/{-$locale}/redirect/$type/$id)\n * Handles custom link redirects from backend. Works with and without locale prefix.\n */\nexport function getRedirectTemplate(baseRoutesImport: string): string {\n return `// @auto-generated\n// @ts-nocheck — params types are generated by TanStack Router on pnpm dev\nimport { createFileRoute, redirect } from '@tanstack/react-router';\nimport { FALLBACK_LOCALE } from '${baseRoutesImport}';\n\ntype RedirectType =\n | 'products'\n | 'categories'\n | 'brands'\n | 'pages'\n | 'blog_articles'\n | 'blog_categories'\n | 'products_tags'\n | 'reviews_link'\n | 'book_now';\n\nexport const Route = createFileRoute('/{-$locale}/redirect/$type/$id')({\n loader: async ({ params }) => {\n const { type, id } = params;\n const locale = params.locale || FALLBACK_LOCALE;\n\n let redirectPath: string;\n const slug = '-';\n\n switch (type as RedirectType) {\n case 'products':\n redirectPath = \\`/\\${locale}/\\${slug}/p\\${id}\\`;\n break;\n case 'categories':\n redirectPath = \\`/\\${locale}/\\${slug}/c\\${id}\\`;\n break;\n case 'brands':\n redirectPath = \\`/\\${locale}/brands/\\${id}\\`;\n break;\n case 'pages':\n redirectPath = \\`/\\${locale}/\\${slug}/page-\\${id}\\`;\n break;\n case 'blog_articles':\n redirectPath = \\`/\\${locale}/blog/\\${slug}/a-\\${id}\\`;\n break;\n case 'blog_categories':\n redirectPath = \\`/\\${locale}/blog/\\${slug}/c-\\${id}\\`;\n break;\n case 'products_tags':\n redirectPath = \\`/\\${locale}/\\${slug}/tag-\\${id}\\`;\n break;\n case 'book_now':\n redirectPath = \\`/\\${locale}/landing/\\${id}\\`;\n break;\n case 'reviews_link':\n default:\n redirectPath = \\`/\\${locale}\\`;\n }\n\n throw redirect({ to: redirectPath });\n },\n});\n`;\n}\n","/**\n * Template for account.tsx layout route file (/{-$locale}/account)\n * Renders CustomerLayout with sidebar, breadcrumb, and user menu.\n * Child account routes render their content via <Outlet />.\n * The `page` data is read from the active child route's loader data.\n */\nexport function getAccountLayoutTemplate(baseRoutesImport: string): string {\n const mainPkg = baseRoutesImport.replace(/\\/routes$/, '');\n return `// @auto-generated\n// @ts-nocheck — params types are generated by TanStack Router on pnpm dev\nimport { createFileRoute, Outlet, useMatches } from '@tanstack/react-router';\nimport { useComponent } from '${mainPkg}';\nimport { CustomerLayout } from '${mainPkg}/components/layout';\nimport { CustomerLayoutSkeleton } from '${mainPkg}/skeleton';\n\nconst ACCOUNT_LAYOUT_PENDING_KEY = 'account:layout-pending';\n\nfunction AccountLayoutComponent() {\n const matches = useMatches();\n const page = matches.reduceRight(\n (found, m) => found ?? (m.loaderData?.page ? m.loaderData.page : null),\n null,\n );\n\n return (\n <CustomerLayout page={page}>\n <Outlet />\n </CustomerLayout>\n );\n}\n\nfunction AccountLayoutPendingComponent() {\n const AccountLayoutPending = useComponent(ACCOUNT_LAYOUT_PENDING_KEY);\n return AccountLayoutPending ? <AccountLayoutPending /> : <CustomerLayoutSkeleton />;\n}\n\nexport const Route = createFileRoute('/{-$locale}/account')({\n component: AccountLayoutComponent,\n pendingComponent: AccountLayoutPendingComponent,\n});\n`;\n}\n","/**\n * @fileoverview TanStack Router framework adapter\n *\n * This adapter provides integration with TanStack Router and React.\n * It handles plugin injection, route file generation, and custom routes\n * loading for TanStack Router.\n *\n * The virtual route config is built inline from the resolved routes,\n * eliminating the need for a physical `app/routes.ts` file in the theme project.\n *\n * =============================================================================\n * PRETTIER FORMATTING RULES - DO NOT MODIFY WITHOUT TESTING\n * =============================================================================\n *\n * Generated route files MUST match Prettier output to avoid format conflicts.\n * The formatting is built into the templates below - no runtime Prettier is used.\n *\n * The project uses these Prettier settings (.prettierrc):\n * - printWidth: 100\n * - tabWidth: 2\n * - singleQuote: true\n * - trailingComma: 'es5'\n *\n * CRITICAL FORMATTING RULES (ENCODED IN TEMPLATES):\n *\n * 1. LOADER CALL FORMATTING:\n * - If the full loader line fits within printWidth (100 chars), use INLINE format:\n * `loader: ({ params }): Promise<Type> => Module.loader({ ... })`\n *\n * - If the line exceeds printWidth, use MULTI-LINE format with 4-space indent:\n * ```\n * loader: ({ params }): Promise<Type> =>\n * Module.loader({ ... })\n * ```\n * IMPORTANT: The 4-space indent is computed as: 2 (object property) + 2 (arrow continuation)\n *\n * 2. INDENTATION CALCULATION:\n * - Object property inside route config: 2 spaces\n * - Arrow function continuation: +2 spaces (total 4)\n * - Inside loader args object: +2 from continuation (total 6)\n *\n * 3. REDIRECT ROUTES:\n * - Same multi-line format with 4-space indent for arrow continuation\n *\n * WHEN MODIFYING THIS FILE:\n * 1. Run `pnpm build` after changes\n * 2. Run `pnpm dev` to regenerate routes\n * 3. Run `pnpm format` to verify no changes\n * 4. Check `git status` - should show no modifications to route files\n *\n * =============================================================================\n */\n\nimport type { Plugin, PluginOption } from 'vite';\nimport { assetsBasePlugin } from '../plugins/assets-base.plugin';\nimport { webHydrationPlugin } from '../plugins/salla-hydration.plugin';\nimport { themeTranslationsPlugin } from '../plugins/theme-translations.plugin';\nimport { twilightSchemaPlugin } from '../plugins/twilight-schema.plugin';\nimport { bestPracticesPlugin } from '../plugins/best-practices/best-practices.plugin';\nimport { packageAliasesPlugin } from '../plugins/package-aliases.plugin';\nimport { collectComponentWrapperImports, engineSourceDir } from '../plugins/component-deps';\nimport { resolveWorkerConfigPath } from '../plugins/worker-config';\nimport type {\n FrameworkAdapter,\n GenerateRoutesOptions,\n TwilightReactOptions,\n TwilightRoute,\n} from '../types';\nimport { RouteId } from '../../router/route-ids';\nimport { createRequire } from 'module';\nimport Module from 'module';\nimport { resolve, basename, dirname, join, relative, sep } from 'path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync } from 'fs';\nimport { transformSync } from 'esbuild';\nimport { fileURLToPath, pathToFileURL } from 'url';\nimport {\n getLocaleWrapperTemplate,\n getRedirectTemplate,\n getAccountLayoutTemplate,\n} from '../../tanstack/templates';\n\nconst DEFAULT_ROUTES_DIR = './app/routes';\nconst DEFAULT_ROUTES_FILE = './app/routes.ts';\nconst DEFAULT_ROOT_ROUTE = '__root.tsx';\n\nexport const DEFAULT_BASE_ROUTES: TwilightRoute[] = [\n // Core routes\n {\n path: '/',\n file: 'index.tsx',\n factory: 'createHomeRouteConfig',\n id: RouteId.INDEX,\n isIndex: true,\n },\n { path: '/cart', file: 'cart.tsx', factory: 'createCartRouteConfig', id: RouteId.CART },\n { path: '/search', file: 'search.tsx', factory: 'createSearchRouteConfig', id: RouteId.SEARCH },\n\n // Product listing routes\n {\n path: '/latest-products',\n file: 'latest-products.tsx',\n factory: 'createLatestProductsRouteConfig',\n id: RouteId.PRODUCT_INDEX_LATEST,\n },\n {\n path: '/most-sales-products',\n file: 'most-sales-products.tsx',\n factory: 'createMostSalesProductsRouteConfig',\n id: RouteId.PRODUCT_INDEX_SALES,\n },\n {\n path: '/offers',\n file: 'offers.tsx',\n factory: 'createOffersRouteConfig',\n id: RouteId.PRODUCT_INDEX_OFFERS,\n },\n {\n // Twig's products page, `?source=` picking the list (the home's \"order again\" links to `reorder`).\n path: '/products',\n file: 'products.tsx',\n factory: 'createProductsRouteConfig',\n id: RouteId.PRODUCT_INDEX,\n },\n\n // Blog routes\n { path: '/blog', file: 'blog.tsx', factory: 'createBlogRouteConfig', id: RouteId.BLOG_INDEX },\n {\n path: '/blog/author/$id',\n file: 'blog_.author.$id.tsx',\n factory: 'createBlogAuthorRouteConfig',\n id: RouteId.BLOG_INDEX_AUTHOR,\n },\n {\n path: '/blog/$slug/a-{$id}',\n file: 'blog_.$slug.a-$id.tsx',\n factory: 'createBlogSingleRouteConfig',\n id: RouteId.BLOG_SINGLE,\n },\n {\n path: '/blog/$slug/c-{$id}',\n file: 'blog_.$slug.c-$id.tsx',\n factory: 'createBlogCategoryRouteConfig',\n id: RouteId.BLOG_INDEX_CATEGORY,\n },\n {\n path: '/blog/$slug/tag-{$id}',\n file: 'blog_.$slug.tag-$id.tsx',\n factory: 'createBlogTagRouteConfig',\n id: RouteId.BLOG_INDEX_TAG,\n },\n\n // Brands routes\n {\n path: '/brands',\n file: 'brands.tsx',\n factory: 'createBrandsRouteConfig',\n id: RouteId.BRANDS_INDEX,\n },\n {\n path: '/brands/$id',\n file: 'brands.$id.tsx',\n factory: 'createBrandSingleRouteConfig',\n id: RouteId.BRANDS_SINGLE,\n },\n\n // Tag routes\n {\n path: '/tags/$id',\n file: 'tags.$id.tsx',\n factory: 'createTagRouteConfig',\n id: RouteId.PRODUCT_INDEX_TAG,\n },\n\n // Customer routes\n {\n path: '/account',\n file: 'account.tsx',\n factory: 'createAccountLayoutConfig',\n id: RouteId.CUSTOMER_LAYOUT,\n isLayout: true,\n },\n {\n path: '/account/profile',\n file: 'account.profile.tsx',\n factory: 'createProfileRouteConfig',\n id: RouteId.CUSTOMER_PROFILE,\n },\n {\n path: '/account/wishlist',\n file: 'account.wishlist.tsx',\n factory: 'createWishlistRouteConfig',\n id: RouteId.CUSTOMER_WISHLIST,\n },\n {\n path: '/account/wallet',\n file: 'account.wallet.tsx',\n factory: 'createWalletRouteConfig',\n id: RouteId.CUSTOMER_WALLET,\n },\n {\n path: '/account/notifications',\n file: 'account.notifications.tsx',\n factory: 'createNotificationsRouteConfig',\n id: RouteId.CUSTOMER_NOTIFICATIONS,\n },\n {\n path: '/account/settings',\n file: 'account.settings.tsx',\n factory: 'createSettingsRouteConfig',\n id: RouteId.CUSTOMER_SETTINGS,\n },\n {\n path: '/account/orders',\n file: 'account.orders.tsx',\n factory: 'createOrdersRouteConfig',\n id: RouteId.CUSTOMER_ORDERS_INDEX,\n },\n {\n path: '/account/orders/$id',\n file: 'account.orders.$id.tsx',\n factory: 'createOrderSingleRouteConfig',\n id: RouteId.CUSTOMER_ORDERS_SINGLE,\n },\n {\n path: '/pending-orders',\n file: 'pending-orders.tsx',\n factory: 'createPendingOrdersRedirectConfig',\n id: RouteId.CUSTOMER_ORDERS_INDEX_PENDING,\n },\n {\n // Where the SDK redirects after `salla.auth.logout()` (`salla.url.get('logout?from=…')`).\n path: '/logout',\n file: 'logout.tsx',\n factory: 'createLogoutRedirectConfig',\n id: RouteId.LOGOUT,\n },\n {\n // The URL the SDK's <salla-user-menu> links \"Pending orders\" to (`/account/{key}`).\n path: '/account/pending_orders',\n file: 'account.pending_orders.tsx',\n factory: 'createPendingOrdersRedirectConfig',\n id: RouteId.CUSTOMER_ORDERS_INDEX_PENDING,\n },\n {\n // Where the loyalty page's \"rate your orders\" point links (the API's `points[].url`).\n path: '/account/rating',\n file: 'account.rating.tsx',\n factory: 'createRatingRedirectConfig',\n id: RouteId.CUSTOMER_ORDERS_INDEX,\n },\n // Twig customer URLs, redirected to their `/account/…` page.\n {\n path: '/profile',\n file: 'profile.tsx',\n factory: 'createAccountRedirectConfig',\n id: RouteId.CUSTOMER_PROFILE,\n },\n {\n path: '/orders',\n file: 'orders.tsx',\n factory: 'createAccountRedirectConfig',\n id: RouteId.CUSTOMER_ORDERS_INDEX,\n },\n {\n path: '/wishlist',\n file: 'wishlist.tsx',\n factory: 'createAccountRedirectConfig',\n id: RouteId.CUSTOMER_WISHLIST,\n },\n {\n path: '/wallet',\n file: 'wallet.tsx',\n factory: 'createAccountRedirectConfig',\n id: RouteId.CUSTOMER_WALLET,\n },\n {\n path: '/notifications',\n file: 'notifications.tsx',\n factory: 'createAccountRedirectConfig',\n id: RouteId.CUSTOMER_NOTIFICATIONS,\n },\n\n // Other routes\n {\n path: '/loyalty',\n file: 'loyalty.tsx',\n factory: 'createLoyaltyRouteConfig',\n id: RouteId.LOYALTY,\n },\n {\n // Where the SDK's <salla-loyalty-program> links \"view points log\" (`salla.url.get('loyalty_points')`).\n path: '/loyalty_points',\n file: 'loyalty_points.tsx',\n factory: 'createLoyaltyPointsRouteConfig',\n id: RouteId.CUSTOMER_LOYALTY_POINTS,\n },\n {\n path: '/testimonials',\n file: 'testimonials.tsx',\n factory: 'createTestimonialsRouteConfig',\n id: RouteId.TESTIMONIALS,\n },\n {\n // Twig's product reviews page, which store menus link to.\n path: '/reviews',\n file: 'reviews.tsx',\n factory: 'createReviewsRouteConfig',\n id: RouteId.REVIEWS,\n },\n {\n // Salla's platform redirects post-payment to /{locale}/thankyou/{orderId} (legacy, no hyphen).\n path: '/thankyou/$orderId',\n file: 'thankyou.$orderId.tsx',\n factory: 'createThankYouRouteConfig',\n id: RouteId.THANK_YOU,\n },\n\n // SEO-friendly slug routes\n {\n path: '/$slug/c{$id}',\n file: '$slug.c$id.tsx',\n factory: 'createSlugCategoryRouteConfig',\n id: RouteId.PRODUCT_INDEX,\n },\n {\n path: '/$slug/p{$id}',\n file: '$slug.p$id.tsx',\n factory: 'createSlugProductRouteConfig',\n id: RouteId.PRODUCT_SINGLE,\n },\n {\n path: '/$slug/brand-{$id}',\n file: '$slug.brand-$id.tsx',\n factory: 'createSlugBrandRedirectConfig',\n id: RouteId.BRANDS_SINGLE,\n },\n {\n path: '/$slug/tag-{$id}',\n file: '$slug.tag-$id.tsx',\n factory: 'createSlugTagRouteConfig',\n id: RouteId.PRODUCT_INDEX_TAG,\n },\n {\n path: '/$slug/page-{$id}',\n file: '$slug.page-$id.tsx',\n factory: 'createSlugPageRouteConfig',\n id: RouteId.PAGE_SINGLE,\n },\n];\n\ninterface VirtualRouteNode {\n type: 'index' | 'route' | 'layout' | 'physical';\n file?: string;\n path?: string;\n}\n\n/**\n * Load the developer's `app/routes.ts` and read the exported `routes` array.\n */\nfunction loadRoutesFile(filePath: string): TwilightRoute[] {\n if (!existsSync(filePath)) return [];\n\n const raw = readFileSync(filePath, 'utf-8');\n\n let code: string;\n try {\n const result = transformSync(raw, {\n loader: 'ts',\n format: 'cjs',\n target: 'node18',\n });\n code = result.code;\n } catch (err) {\n console.warn(`[twilight-react:tanstack] Failed to transpile ${basename(filePath)}:`, err);\n return [];\n }\n\n const projectRequire = createRequire(resolve(process.cwd(), 'package.json'));\n\n let exported: { routes?: VirtualRouteNode[] };\n try {\n const m = new Module(filePath) as any;\n m.filename = filePath;\n m.paths = (Module as any)._nodeModulePaths(dirname(filePath));\n m.require = projectRequire;\n m._compile(code, filePath);\n exported = m.exports;\n } catch (err) {\n console.warn(`[twilight-react:tanstack] Failed to evaluate ${basename(filePath)}:`, err);\n return [];\n }\n\n if (!Array.isArray(exported.routes)) return [];\n\n const routes: TwilightRoute[] = [];\n for (const node of exported.routes) {\n if (!node || typeof node !== 'object' || !node.file) continue;\n\n if (node.type === 'index') {\n routes.push({\n path: '/',\n file: node.file,\n factory: `createCustomRoute_${node.file.replace(/[^a-zA-Z0-9]/g, '_')}`,\n isIndex: true,\n });\n } else if (node.type === 'route' && node.path) {\n routes.push({\n path: node.path,\n file: node.file,\n factory: `createCustomRoute_${node.file.replace(/[^a-zA-Z0-9]/g, '_')}`,\n });\n }\n }\n\n if (routes.length > 0) {\n console.log(\n `[twilight-react:tanstack] Loaded ${routes.length} custom route(s) from ${basename(filePath)}`\n );\n }\n\n return routes;\n}\n\nconst FACTORY_TO_MODULE: Record<string, string> = {\n createHomeRouteConfig: 'Home',\n createCartRouteConfig: 'Cart',\n // All product listing routes use the unified ProductListing module\n createSearchRouteConfig: 'ProductListing',\n createProductsRouteConfig: 'ProductListing',\n createSlugCategoryRouteConfig: 'ProductListing',\n createSlugTagRouteConfig: 'ProductListing',\n createTagRouteConfig: 'ProductListing',\n createBrandSingleRouteConfig: 'ProductListing',\n createBlogRouteConfig: 'Blog',\n createBlogSingleRouteConfig: 'BlogSingle',\n createBlogAuthorRouteConfig: 'BlogAuthorRoute',\n createBlogCategoryRouteConfig: 'BlogCategoryRoute',\n createBlogTagRouteConfig: 'BlogTagRoute',\n createBrandsRouteConfig: 'Brands',\n createProfileRouteConfig: 'Profile',\n createWishlistRouteConfig: 'Wishlist',\n createWalletRouteConfig: 'Wallet',\n createNotificationsRouteConfig: 'Notifications',\n createSettingsRouteConfig: 'Settings',\n createOrdersRouteConfig: 'Orders',\n createOrderSingleRouteConfig: 'OrderSingle',\n createAccountLayoutConfig: 'AccountLayout',\n createLoyaltyRouteConfig: 'Loyalty',\n createLoyaltyPointsRouteConfig: 'LoyaltyPoints',\n createTestimonialsRouteConfig: 'Testimonials',\n createReviewsRouteConfig: 'Reviews',\n createThankYouRouteConfig: 'ThankYou',\n // Other routes\n createSlugProductRouteConfig: 'Product',\n createSlugPageRouteConfig: 'PageSingle',\n // SEO slug redirect (redirect-only, no component)\n createSlugBrandRedirectConfig: 'slugBrandRedirect',\n // Pending orders redirect\n createPendingOrdersRedirectConfig: 'pendingOrdersRedirect',\n createRatingRedirectConfig: 'ratingRedirect',\n createAccountRedirectConfig: 'accountRedirect',\n // Twig listing URLs redirected to /products?source=\n createLatestProductsRouteConfig: 'productsSourceRedirect',\n createMostSalesProductsRouteConfig: 'productsSourceRedirect',\n createOffersRouteConfig: 'productsSourceRedirect',\n // Logout redirect\n createLogoutRedirectConfig: 'logoutRedirect',\n};\n\nconst REDIRECT_ONLY_MODULES = new Set([\n 'slugBrandRedirect',\n 'pendingOrdersRedirect',\n 'ratingRedirect',\n 'accountRedirect',\n 'productsSourceRedirect',\n 'logoutRedirect',\n]);\n\n/**\n * Maps module name → sub-path under the routes directory.\n * Used to generate granular imports instead of barrel imports.\n * e.g. 'Cart' → 'cart' → `import { Cart } from '…/routes/cart'`\n */\nconst MODULE_SUBPATH: Record<string, string> = {\n Home: 'home',\n Cart: 'cart',\n ProductListing: 'product-listing',\n Blog: 'blog',\n BlogSingle: 'blog',\n BlogAuthorRoute: 'blog',\n BlogCategoryRoute: 'blog',\n BlogTagRoute: 'blog',\n Brands: 'brands',\n BrandSingle: 'brands',\n Profile: 'account',\n Wishlist: 'account',\n Wallet: 'account',\n Notifications: 'account',\n Settings: 'account',\n Orders: 'account/orders',\n OrderSingle: 'account/orders',\n Loyalty: 'loyalty',\n LoyaltyPoints: 'loyalty',\n PageSingle: 'page',\n Testimonials: 'testimonials',\n Reviews: 'testimonials',\n ThankYou: 'thank-you',\n Product: 'product',\n slugBrandRedirect: 'seo-redirects',\n pendingOrdersRedirect: 'seo-redirects',\n ratingRedirect: 'seo-redirects',\n accountRedirect: 'seo-redirects',\n productsSourceRedirect: 'seo-redirects',\n logoutRedirect: 'seo-redirects',\n};\n\n/**\n * Maps module name → exported LoaderData type name from '@salla.sa/twilight-theme-engine/routes'.\n * Used to generate explicit type annotations in route files for better DX.\n */\nconst MODULE_LOADER_TYPE: Record<string, string> = {\n Home: 'HomeLoaderData',\n Cart: 'CartPageProps',\n ProductListing: 'ProductListLoaderData',\n Blog: 'BlogPageProps',\n BlogSingle: 'BlogSinglePageProps',\n BlogAuthorRoute: 'BlogAuthorLoaderData',\n BlogCategoryRoute: 'BlogCategoryLoaderData',\n BlogTagRoute: 'BlogTagLoaderData',\n Brands: 'BrandsPageProps',\n BrandSingle: 'ProductListLoaderData',\n Profile: 'ProfilePageProps',\n Wishlist: 'WishlistPageProps',\n Wallet: 'WalletPageProps',\n Notifications: 'NotificationsPageProps',\n Settings: 'SettingsPageProps',\n Orders: 'OrdersPageProps',\n OrderSingle: 'OrderSinglePageProps',\n Loyalty: 'LoyaltyPageProps',\n LoyaltyPoints: 'LoyaltyPointsPageProps',\n PageSingle: 'PageSingleProps',\n Testimonials: 'TestimonialsPageProps',\n Reviews: 'ReviewsPageProps',\n ThankYou: 'ThankYouPageProps',\n Product: 'ProductPageProps',\n};\n\n/**\n * Routes that support URL-based pagination via ?page= query param.\n * These routes get validateSearch + loaderDeps to forward the page param to the loader.\n */\nconst PAGINATED_MODULES = new Set(['Wishlist']);\n\n/**\n * Paginated routes that don't require locale in their loader context.\n */\nconst PAGINATED_NO_LOCALE = new Set(['Wallet']);\n\n/**\n * Routes that support both ?page= and ?sort= search params.\n * These routes get validateSearch + loaderDeps to forward both to the loader.\n */\nconst SORT_PAGINATED_MODULES = new Set(['ProductListing']);\n\n/**\n * Route factories that need sort pagination support.\n * Used when the module name doesn't match (e.g., Tag routes use ProductListing module).\n */\nconst SORT_PAGINATED_FACTORIES = new Set([\n 'createSearchRouteConfig',\n 'createSlugTagRouteConfig',\n 'createTagRouteConfig',\n 'createBrandSingleRouteConfig',\n]);\n\n/**\n * Routes that use deferred data loading.\n * These routes return promises that are resolved in the component via <Await>.\n * This allows the page to render immediately while data loads in background.\n */\nconst DEFERRED_ROUTES = new Set<string>();\n\n/**\n * Routes that support ?status= search param.\n * These routes get validateSearch + loaderDeps to forward status to the loader.\n */\nconst STATUS_FILTERED_MODULES = new Set(['Orders']);\n\n/**\n * Maps module name → skeleton component name from '@salla.sa/twilight-theme-engine/components'.\n * When present, the generated route file adds a `pendingComponent` that renders\n * the page-specific skeleton instead of the generic default.\n */\nconst MODULE_PENDING_SKELETON: Record<string, string> = {\n Home: 'HomeSkeleton',\n Product: 'ProductDetailSkeleton',\n Blog: 'BlogSkeleton',\n BlogSingle: 'BlogSkeleton',\n BlogAuthorRoute: 'BlogSkeleton',\n BlogCategoryRoute: 'BlogSkeleton',\n BlogTagRoute: 'BlogSkeleton',\n Cart: 'CartSkeleton',\n Profile: 'CustomerPageSkeleton',\n Wishlist: 'CustomerPageSkeleton',\n Wallet: 'CustomerPageSkeleton',\n Notifications: 'CustomerPageSkeleton',\n Settings: 'CustomerPageSkeleton',\n Orders: 'CustomerPageSkeleton',\n OrderSingle: 'CustomerPageSkeleton',\n LoyaltyPoints: 'CustomerLayoutSkeleton',\n};\n\n/**\n * Explicit mapping from factory → loader params.\n * Maps loader param names to URL param names (from TanStack route path).\n * Only needed for routes where URL params differ from loader params.\n * If a factory is not listed, all URL params are forwarded as-is.\n */\nconst FACTORY_LOADER_PARAMS: Record<string, Record<string, string>> = {\n // /$slug/c{$id} → category.loader({ id }) — slug is SEO-only, not used by loader\n createSlugCategoryRouteConfig: { id: 'id' },\n // /$slug/p{$id} → product.loader({ id })\n createSlugProductRouteConfig: { id: 'id' },\n // /$slug/tag-{$id} → productListLoader({ source: 'tags', id })\n createSlugTagRouteConfig: { id: 'id' },\n // /$slug/page-{$id} → pageSingle.loader({ id }) — slug is SEO-only, not used by loader\n createSlugPageRouteConfig: { id: 'id' },\n // /tags/$id → productListLoader({ source: 'tags', id })\n createTagRouteConfig: { id: 'id' },\n // /brands/$id → productListLoader({ source: 'brands', id })\n createBrandSingleRouteConfig: { id: 'id' },\n};\n\n/** Listings that show the filter column. */\nconst LISTINGS_WITH_FILTERS = new Set(['createSlugCategoryRouteConfig', 'createSearchRouteConfig']);\n\nfunction listingPending(factory: string): string {\n return LISTINGS_WITH_FILTERS.has(factory)\n ? 'ProductListing.Pending'\n : 'ProductListing.Pending hideFilters';\n}\n\nconst FACTORY_PRODUCTS_SOURCE: Record<string, string> = {\n createLatestProductsRouteConfig: 'latest',\n createMostSalesProductsRouteConfig: 'sales',\n createOffersRouteConfig: 'offers',\n};\n\nfunction getParamMapping(routePath: string, factory?: string): string {\n // Use explicit mapping if available\n if (factory && FACTORY_LOADER_PARAMS[factory]) {\n const mapping = FACTORY_LOADER_PARAMS[factory];\n const entries = Object.entries(mapping).map(\n ([loaderParam, urlParam]) => `${loaderParam}: params.${urlParam}`\n );\n // Add source param for tag routes\n if (factory === 'createTagRouteConfig' || factory === 'createSlugTagRouteConfig') {\n return `{ source: 'tags', ${entries.join(', ')} }`;\n }\n // Add source param for brand routes\n if (factory === 'createBrandSingleRouteConfig') {\n return `{ source: 'brands', ${entries.join(', ')} }`;\n }\n return `{ ${entries.join(', ')} }`;\n }\n\n // Default: forward all URL params as-is\n const paramMatches = routePath.match(/\\$([a-zA-Z]+)/g);\n if (!paramMatches || paramMatches.length === 0) return '';\n\n const params = paramMatches.map((match) => {\n const paramName = match.slice(1);\n return `${paramName}: params.${paramName}`;\n });\n\n return `{ ${params.join(', ')} }`;\n}\n\n/** Path shown in `createFileRoute(...)` — always includes the `/{-$locale}` optional prefix.\n * Index routes use trailing slash to indicate they're the index child of the locale layout.\n */\nfunction toTanstackRoutePath(route: TwilightRoute): string {\n if (route.isIndex) return '/{-$locale}/';\n return `/{-$locale}${route.path}`;\n}\n\nfunction generateRouteFileContent(route: TwilightRoute, baseImport: string): string {\n // `routePath` is the original engine path (e.g. '/cart', '/$slug/p{$id}').\n // Used only for param extraction / loader call generation — NOT for createFileRoute.\n const routePath = route.isIndex ? '/' : route.path;\n // `tanstackRoutePath` is the full path registered with TanStack Router.\n const tanstackRoutePath = toTanstackRoutePath(route);\n const moduleName = FACTORY_TO_MODULE[route.factory];\n\n if (moduleName) {\n const hasParams = routePath.includes('$');\n const paramMapping = getParamMapping(routePath, route.factory);\n const isRedirectOnly = REDIRECT_ONLY_MODULES.has(moduleName);\n\n // Granular import path: e.g. '@salla.sa/twilight-theme-engine/routes/cart'\n // Falls back to the barrel import if no subpath mapping exists.\n const subpath = MODULE_SUBPATH[moduleName];\n const moduleImport = subpath ? `${baseImport}/${subpath}` : baseImport;\n\n // Redirect-only routes using standalone loader functions\n if (route.factory === 'createSlugBrandRedirectConfig') {\n const loaderImport = 'slugBrandRedirectLoader';\n // Remove trailing space before } and add locale param\n const redirectParamMapping = paramMapping\n ? paramMapping.replace(/\\s*}$/, ', locale: params.locale }')\n : '{ locale: params.locale }';\n // Format loader call with 4-space indent for Prettier compatibility\n // 4 spaces = 2 (object property) + 2 (arrow continuation)\n const loaderCall = `({ params }) =>\n ${loaderImport}({\n params: ${redirectParamMapping},\n })`;\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${loaderImport} } from '${baseImport}/seo-redirects';\n\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: ${loaderCall},\n});\n`;\n }\n\n // Logout redirect route\n if (route.factory === 'createLogoutRedirectConfig') {\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { LogoutRedirect } from '${baseImport}/seo-redirects';\n\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n component: LogoutRedirect,\n});\n`;\n }\n\n // Pending orders / rating redirect routes\n if (\n route.factory === 'createPendingOrdersRedirectConfig' ||\n route.factory === 'createRatingRedirectConfig'\n ) {\n const loaderImport =\n route.factory === 'createRatingRedirectConfig'\n ? 'ratingRedirectLoader'\n : 'pendingOrdersRedirectLoader';\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${loaderImport} } from '${baseImport}/seo-redirects';\n\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: ({ params }) =>\n ${loaderImport}({\n params: { locale: params.locale },\n }),\n});\n`;\n }\n\n // Twig customer URL redirect route\n if (route.factory === 'createAccountRedirectConfig') {\n const loaderImport = 'accountRedirectLoader';\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${loaderImport} } from '${baseImport}/seo-redirects';\n\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: ({ params, location }) =>\n ${loaderImport}({\n params: { locale: params.locale },\n page: '${routePath.slice(1)}',\n search: location.searchStr,\n }),\n});\n`;\n }\n\n // Twig listing URL redirect route\n if (moduleName === 'productsSourceRedirect') {\n const loaderImport = 'productsSourceRedirectLoader';\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${loaderImport} } from '${baseImport}/seo-redirects';\n\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: ({ params, location }) =>\n ${loaderImport}({\n params: { locale: params.locale },\n source: '${FACTORY_PRODUCTS_SOURCE[route.factory]}',\n search: location.searchStr,\n }),\n});\n`;\n }\n\n // Resolve the LoaderData type for this module\n const loaderType = MODULE_LOADER_TYPE[moduleName];\n // Type imports come from the same granular module as the value import.\n // Import from main package entry to avoid barrel routes import.\n const typeImport = loaderType ? `\\nimport type { ${loaderType} } from '${moduleImport}';` : '';\n const extraTypeImport = '';\n\n // Standard module pattern (Module.loader, Module.Component, Module.head)\n const importName = moduleName;\n\n const loaderCall = hasParams\n ? `({ params }) => ${importName}.loader({ params: ${paramMapping}, locale: params.locale })`\n : `({ params }) => ${importName}.loader({ locale: params.locale })`;\n\n if (isRedirectOnly) {\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName} } from '${moduleImport}';\n\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: ${loaderCall},\n});\n`;\n }\n\n // Search route needs search params\n if (route.factory === 'createSearchRouteConfig') {\n const componentFn = loaderType\n ? `function ${importName}Component() {\\n const data: ${loaderType} = Route.useLoaderData();\\n return <${importName}.Component {...data} />;\\n}`\n : `function ${importName}Component() {\\n const data = Route.useLoaderData();\\n return <${importName}.Component {...data} />;\\n}`;\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName}, searchListingSearch } from '${moduleImport}';${typeImport}${extraTypeImport}\nimport { withHead } from '${baseImport.replace('/routes', '')}/tanstack';\n\n/**\n * Search route configuration: \\`searchListingSearch\\` keeps ?q=, ?page= and ?sort=\n * and forwards them to the loader.\n */\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n ...searchListingSearch,\n loader: ({ deps, params }): Promise<${loaderType}> =>\n ${importName}.loader({\n params: { source: 'search' },\n search: deps,\n locale: params.locale,\n }),\n head: withHead(${importName}),\n pendingComponent: () => <${listingPending(route.factory)} />,\n component: ${importName}Component,\n});\n\n/**\n * Search page component.\n * Uses Route.useLoaderData() to access the data loaded by the route loader,\n * following React best practices for data fetching in route components.\n */\n${componentFn}\n`;\n }\n\n // Products route picks its list from ?source=\n if (route.factory === 'createProductsRouteConfig') {\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName} } from '${moduleImport}';${typeImport}${extraTypeImport}\nimport { withHead } from '${baseImport.replace('/routes', '')}/tanstack';\n\nconst SOURCES = ['latest', 'sales', 'offers', 'reorder'] as const;\ntype Source = (typeof SOURCES)[number];\n\n/**\n * Products route configuration: \\`?source=\\` picks the list, the latest products by default.\n */\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n validateSearch: (search: Record<string, unknown>) => {\n const page = Number(search.page) || 1;\n const sort = (search.sort as string) || undefined;\n const source = SOURCES.find((s) => s === search.source) ?? 'latest';\n return { source: source as Source, ...(page > 1 ? { page } : {}), ...(sort ? { sort } : {}) };\n },\n loaderDeps: ({ search }) => ({ source: search.source, page: search.page, sort: search.sort }),\n loader: ({ deps, params }): Promise<${loaderType}> =>\n ${importName}.loader({\n params: { source: deps.source },\n search: { page: deps.page, sort: deps.sort },\n locale: params.locale,\n }),\n head: withHead(${importName}),\n pendingComponent: () => <${listingPending(route.factory)} />,\n component: ${importName}Component,\n});\n\n/**\n * Products page component.\n * Uses Route.useLoaderData() to access the data loaded by the route loader,\n * following React best practices for data fetching in route components.\n */\nfunction ${importName}Component() {\n const data: ${loaderType} = Route.useLoaderData();\n return <${importName}.Component {...data} />;\n}\n`;\n }\n\n // Typed loader call — always passes locale from $locale route param for SSR compatibility\n // FORMAT RULE: See file header for Prettier formatting rules\n const isDeferred = DEFERRED_ROUTES.has(moduleName);\n\n // ============================================================================\n // PRETTIER FORMAT HELPER - DO NOT MODIFY INDENTATION VALUES\n // ============================================================================\n // Prettier settings: printWidth: 100, tabWidth: 2\n // The loader line is prefixed with \" loader: \" (10 chars) in the route object\n // Plus trailing comma (1 char) = 11 chars overhead\n //\n // CRITICAL INDENTATION RULE:\n // When an arrow function body breaks to a new line, Prettier uses 4-space indent:\n // loader: ({ params }): Type =>\n // Module.loader(args) <-- 4 spaces (2 for object + 2 for continuation)\n //\n // This is because:\n // 1. Object properties are indented 2 spaces from the object start\n // 2. Arrow function continuation adds another 2-space indent\n // ============================================================================\n const PRETTIER_INDENT = 10; // \" loader: \" prefix length\n const PRETTIER_PRINT_WIDTH = 100;\n\n const getTypedLoaderCall = (returnType: string, name: string, args: string) => {\n const inline = `({ params }): ${returnType} => ${name}.loader(${args})`;\n const lineLength = PRETTIER_INDENT + inline.length + 1;\n if (lineLength <= PRETTIER_PRINT_WIDTH) {\n // Fits on one line - use inline format (Prettier prefers this for short lines)\n return inline;\n }\n // Exceeds printWidth - use multi-line format with 4-space indent\n // The 4 spaces = 2 (object property) + 2 (arrow continuation)\n return `({ params }): ${returnType} =>\n ${name}.loader(${args})`;\n };\n\n const returnType = isDeferred ? loaderType : `Promise<${loaderType}>`;\n\n const typedLoaderCall = loaderType\n ? hasParams\n ? // Routes with URL params - check if inline fits\n getTypedLoaderCall(\n returnType,\n importName,\n `{ params: ${paramMapping}, locale: params.locale }`\n )\n : // Routes without params - check if inline fits\n getTypedLoaderCall(returnType, importName, '{ locale: params.locale }')\n : loaderCall;\n\n // Resolve per-page skeleton if available\n const skeletonName = MODULE_PENDING_SKELETON[moduleName];\n const skeletonModulePath = baseImport.replace(/\\/routes$/, '/skeleton');\n const skeletonImport = skeletonName\n ? `\\nimport { ${skeletonName} } from '${skeletonModulePath}';`\n : '';\n const pendingLine =\n moduleName === 'ProductListing'\n ? `\\n pendingComponent: () => <${listingPending(route.factory)} />,`\n : skeletonName\n ? `\\n pendingComponent: () => <${skeletonName} />,`\n : '';\n\n // Import withHead helper for simplified head callback\n const headImport = `import { withHead } from '${baseImport.replace('/routes', '')}/tanstack';`;\n\n // Head callback uses withHead for clean DX\n const headCallback = route.isIndex ? `withHead(${importName})` : `withHead(${importName})`;\n\n // Generate named component function\n // For deferred routes, the component uses Await to handle promises\n const componentFn = isDeferred\n ? `function ${importName}Component() {\\n const data: ${loaderType} = Route.useLoaderData();\\n return <${importName}.Component components={data.components} />;\\n}`\n : loaderType\n ? `function ${importName}Component() {\\n const data: ${loaderType} = Route.useLoaderData();\\n return <${importName}.Component {...data} />;\\n}`\n : `function ${importName}Component() {\\n const data = Route.useLoaderData();\\n return <${importName}.Component {...data} />;\\n}`;\n\n // Route description for JSDoc\n const routeDescription = route.isIndex\n ? 'Home (index) route configuration.'\n : `${importName} route configuration.`;\n\n // Sort + paginated routes — forward ?sort= and ?page= to the loader (e.g. ProductListing)\n if (SORT_PAGINATED_MODULES.has(moduleName) || SORT_PAGINATED_FACTORIES.has(route.factory)) {\n const sortLoaderCall = hasParams\n ? `({ deps, params }): ${returnType} =>\n ${importName}.loader({\n params: ${paramMapping},\n search: deps,\n locale: params.locale,\n })`\n : `({ deps, params }): ${returnType} =>\n ${importName}.loader({\n search: deps,\n locale: params.locale,\n })`;\n\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName}, listingSearch } from '${moduleImport}';${typeImport}${skeletonImport}\n${headImport}\n\n/**\n * ${routeDescription}\n * Loads page data via loader and renders the ${importName} component.\n */\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n ...listingSearch,\n loader: ${sortLoaderCall},\n head: ${headCallback},${pendingLine}\n component: ${importName}Component,\n});\n\n/**\n * ${importName} page component.\n * Uses Route.useLoaderData() to access the data loaded by the route loader,\n * following React best practices for data fetching in route components.\n */\n${componentFn}\n`;\n }\n\n // Paginated routes — forward ?page= query param to the loader\n if (PAGINATED_MODULES.has(moduleName) || PAGINATED_NO_LOCALE.has(moduleName)) {\n const isNoLocale = PAGINATED_NO_LOCALE.has(moduleName);\n const loaderArgs = isNoLocale\n ? `{ search: { page: deps.page ?? 1 } }`\n : `{ search: { page: deps.page ?? 1 }, locale: params.locale }`;\n const loaderDestructuring = isNoLocale ? '{ deps }' : '{ deps, params }';\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName} } from '${moduleImport}';${typeImport}${skeletonImport}\n${headImport}\n\n/**\n * ${routeDescription}\n * Loads page data via loader and renders the ${importName} component.\n */\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n validateSearch: (search: Record<string, unknown>) => {\n const page = Number(search.page) || 1;\n return page > 1 ? { page } : {};\n },\n loaderDeps: ({ search }) => ({ page: search.page }),\n loader: (${loaderDestructuring}): ${returnType} =>\n ${importName}.loader(${loaderArgs}),\n head: ${headCallback},${pendingLine}\n component: ${importName}Component,\n});\n\n/**\n * ${importName} page component.\n * Uses Route.useLoaderData() to access the data loaded by the route loader,\n * following React best practices for data fetching in route components.\n */\n${componentFn}\n`;\n }\n\n // Status-filtered routes — forward ?status= to the loader (e.g. Orders)\n if (STATUS_FILTERED_MODULES.has(moduleName)) {\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName} } from '${moduleImport}';${typeImport}${skeletonImport}\n${headImport}\n\n/**\n * ${routeDescription}\n * Loads page data via loader and renders the ${importName} component.\n */\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n validateSearch: (search: Record<string, unknown>) => {\n const status = (search.status as string) || undefined;\n return status ? { status } : {};\n },\n loaderDeps: ({ search }) => ({ status: search.status }),\n loader: ({ deps, params }): ${returnType} =>\n ${importName}.loader({ search: { status: deps.status }, locale: params.locale }),\n head: ${headCallback},${pendingLine}\n component: ${importName}Component,\n});\n\n/**\n * ${importName} page component.\n * Uses Route.useLoaderData() to access the data loaded by the route loader,\n * following React best practices for data fetching in route components.\n */\n${componentFn}\n`;\n }\n\n // Standard route with loader, head, and component\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${importName} } from '${moduleImport}';${typeImport}${extraTypeImport}${skeletonImport}\n${headImport}\n\n/**\n * ${routeDescription}\n * Loads page data via loader and renders the ${importName} component.\n */\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: ${typedLoaderCall},\n head: ${headCallback},${pendingLine}\n component: ${importName}Component,\n});\n\n/**\n * ${importName} page component.\n * Uses Route.useLoaderData() to access the data loaded by the route loader,\n * following React best practices for data fetching in route components.\n */\n${componentFn}\n`;\n }\n\n // Fallback for custom routes\n return `// @auto-generated\nimport { createFileRoute } from '@tanstack/react-router';\nimport { ${route.factory} } from '${baseImport}';\n\nconst config = ${route.factory}();\nexport const Route = createFileRoute('${tanstackRoutePath}')({\n loader: config.Loader,\n component: () => { const data = Route.useLoaderData(); return <config.Component {...data} />; },\n});\n`;\n}\n\n/** Routes kept in the engine's `.twilight/` dir instead of the theme's routes. */\nconst ENGINE_OWNED_FACTORIES = new Set([\n 'createAccountRedirectConfig',\n 'createPendingOrdersRedirectConfig',\n 'createRatingRedirectConfig',\n 'createLatestProductsRouteConfig',\n 'createMostSalesProductsRouteConfig',\n 'createOffersRouteConfig',\n 'createProductsRouteConfig',\n 'createSearchRouteConfig',\n 'createSlugCategoryRouteConfig',\n 'createSlugTagRouteConfig',\n 'createTagRouteConfig',\n 'createBrandSingleRouteConfig',\n 'createReviewsRouteConfig',\n]);\n\n/** A theme file without the `// @auto-generated` header is the theme's own and stays in use. */\nfunction isEngineOwned(route: TwilightRoute, routesDir: string): boolean {\n if (!ENGINE_OWNED_FACTORIES.has(route.factory)) return false;\n // The path comes from the engine's own route table, not from input.\n const themeFile = join(routesDir, route.file); // nosemgrep\n if (!existsSync(themeFile)) return true; // nosemgrep\n return readFileSync(themeFile, 'utf-8').startsWith('// @auto-generated'); // nosemgrep\n}\n\n/**\n * Resolve the engine's .twilight directory path relative to the project's routes directory.\n * This lets TanStack Router's generator find the engine-owned route files.\n */\nfunction getEngineTwilightRelPath(routesDir: string): string {\n // Find engine package root from this file's location\n let dir = dirname(fileURLToPath(import.meta.url));\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, 'package.json'))) break;\n dir = dirname(dir);\n }\n const twilightDir = join(dir, '.twilight');\n const absRoutes = resolve(routesDir);\n return relative(absRoutes, twilightDir).split(sep).join('/');\n}\n\nfunction resolveProjectPkg(projectRoot: string, pkg: string, subpath?: string): string {\n const pkgJsonPath = join(projectRoot, 'node_modules', pkg, 'package.json');\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n const key = subpath ? `./${subpath}` : '.';\n const exportEntry = pkgJson.exports?.[key];\n const rel =\n typeof exportEntry === 'string'\n ? exportEntry\n : (exportEntry?.import?.default ??\n exportEntry?.default ??\n exportEntry?.require?.default ??\n pkgJson.main);\n if (!rel)\n throw new Error(`[twilight-react] Cannot resolve ${pkg}${subpath ? `/${subpath}` : ''}`);\n return join(projectRoot, 'node_modules', pkg, rel);\n}\n\n/**\n * The workerd SSR runtime plugin, owned by the engine so themes hold no runtime\n * configuration of their own. Returns nothing when the theme opts out with\n * `worker: false` and registers the plugin itself.\n *\n * Unlike `tanstackStart` and `@vitejs/plugin-react` — peer deps that must resolve\n * to the *theme's* copy for a single instance — the runtime plugin is an engine\n * dependency, so a bare specifier is what correctly finds it.\n */\nasync function createWorkerPlugins(\n projectRoot: string,\n worker: NonNullable<TwilightReactOptions['worker']>\n): Promise<PluginOption[]> {\n if (worker === false) return [];\n\n const { cloudflare } = (await import('@cloudflare/vite-plugin')) as {\n cloudflare: (opts?: Record<string, unknown>) => PluginOption;\n };\n const configPath = resolveWorkerConfigPath(projectRoot, worker === true ? {} : worker);\n\n return [\n cloudflare({\n viteEnvironment: { name: 'ssr' },\n // Omitted when the theme ships its own config, which the plugin then\n // discovers exactly as it did before the engine took this over.\n ...(configPath ? { configPath } : {}),\n }),\n ];\n}\n\nexport function buildVirtualRouteConfig(\n routes: TwilightRoute[],\n rootRouteFile: string,\n routesDir: string\n): unknown {\n try {\n const projectRequire = createRequire(resolve(process.cwd(), 'package.json'));\n const { rootRoute, index, route } = projectRequire('@tanstack/virtual-file-routes');\n\n const accountPrefix = '/account/';\n const accountLayout = routes.find((r) => r.isLayout && r.path === '/account');\n const accountChildren = routes.filter((r) => !r.isLayout && r.path.startsWith(accountPrefix));\n const nonAccountRoutes = routes.filter((r) => !r.isLayout && !r.path.startsWith(accountPrefix));\n const twilightRel = getEngineTwilightRelPath(routesDir);\n const fileOf = (r: TwilightRoute) =>\n isEngineOwned(r, routesDir) ? `${twilightRel}/${r.file}` : r.file;\n\n const langChildren = nonAccountRoutes.map((r) => {\n if (r.isIndex) return index(r.file);\n const relativePath = r.path.replace(/^\\//, '');\n return route(relativePath, fileOf(r));\n });\n\n if (accountLayout) {\n const accChildren = accountChildren.map((r) => {\n const relativePath = r.path.replace(/^\\/account\\/?/, '');\n return route(relativePath, fileOf(r));\n });\n langChildren.push(route('account', `${twilightRel}/account.tsx`, accChildren));\n }\n\n return rootRoute(rootRouteFile, [\n route('{-$locale}', `${twilightRel}/$locale.tsx`, [\n ...langChildren,\n // Redirect route - handles /{-$locale}/redirect/{type}/{id} URLs\n route('redirect/$type/$id', `${twilightRel}/redirect.$type.$id.tsx`),\n ]),\n ]);\n } catch (_error) {\n console.warn(\n '[twilight-react:tanstack] @tanstack/virtual-file-routes not found. Please install it.'\n );\n return undefined;\n }\n}\n\nexport const tanstackAdapter: FrameworkAdapter = {\n name: 'tanstack',\n\n generateRouteFiles({\n projectRoot,\n baseRoutes,\n baseRoutesImport,\n }: GenerateRoutesOptions): TwilightRoute[] {\n const routesDir = DEFAULT_ROUTES_DIR;\n const routesFilePath = resolve(projectRoot, DEFAULT_ROUTES_FILE);\n\n const customRoutes = loadRoutesFile(routesFilePath);\n\n const routeMap = new Map<string, TwilightRoute>();\n (baseRoutes ?? DEFAULT_BASE_ROUTES).forEach((r) => routeMap.set(r.path, r));\n customRoutes.forEach((r) => routeMap.set(r.path, r));\n const allRoutes = Array.from(routeMap.values());\n\n const routesDirPath = resolve(projectRoot, routesDir);\n if (!existsSync(routesDirPath)) {\n mkdirSync(routesDirPath, { recursive: true });\n }\n\n // Generate minimal wiring files for the locale layout and root redirect.\n // TanStack Router's generator requires `createFileRoute` in each file.\n // All actual logic is delegated to functions exported from the engine.\n const engineRouteFiles: Array<{ name: string; content: string }> = [\n {\n name: '$locale.tsx',\n content: getLocaleWrapperTemplate(baseRoutesImport),\n },\n {\n name: 'redirect.$type.$id.tsx',\n content: getRedirectTemplate(baseRoutesImport),\n },\n {\n name: 'account.tsx',\n content: getAccountLayoutTemplate(baseRoutesImport),\n },\n ...allRoutes\n .filter((r) => !r.isLayout && isEngineOwned(r, routesDirPath))\n .map((r) => ({ name: r.file, content: generateRouteFileContent(r, baseRoutesImport) })),\n ];\n\n // Write into the engine package's .twilight/ dir — NOT the theme project.\n let engineRoot = dirname(fileURLToPath(import.meta.url));\n while (engineRoot !== dirname(engineRoot)) {\n if (existsSync(join(engineRoot, 'package.json'))) break;\n engineRoot = dirname(engineRoot);\n }\n const twilightDir = join(engineRoot, '.twilight');\n if (!existsSync(twilightDir)) {\n mkdirSync(twilightDir, { recursive: true });\n }\n\n for (const { name, content } of engineRouteFiles) {\n const filePath = join(twilightDir, name);\n if (!existsSync(filePath)) {\n writeFileSync(filePath, content);\n } else {\n const existing = readFileSync(filePath, 'utf-8');\n if (existing !== content) {\n writeFileSync(filePath, content);\n }\n }\n }\n\n // Generate all page route files at the flat routes/ level.\n // createFileRoute paths inside these files include the /$locale prefix\n // (e.g. /$locale/cart) so TanStack Router validates the virtual nesting.\n for (const route of allRoutes) {\n if (route.isLayout) continue;\n const filePath = join(routesDirPath, route.file);\n\n if (isEngineOwned(route, routesDirPath)) {\n // A copy generated into the theme by an older engine.\n rmSync(filePath, { force: true }); // nosemgrep\n continue;\n }\n\n const content = generateRouteFileContent(route, baseRoutesImport);\n\n if (!existsSync(filePath)) {\n writeFileSync(filePath, content);\n console.log(`[twilight-react:tanstack] Created: ${route.file}`);\n } else {\n const existing = readFileSync(filePath, 'utf-8');\n if (existing.startsWith('// @auto-generated') && existing !== content) {\n writeFileSync(filePath, content);\n console.log(`[twilight-react:tanstack] Updated: ${route.file}`);\n }\n }\n }\n\n return allRoutes;\n },\n\n async createPlugins(options: TwilightReactOptions): Promise<PluginOption[]> {\n const {\n srcDirectory = 'app',\n baseRoutesImport = '@salla.sa/twilight-theme-engine/routes',\n localesDir,\n twilightJson = 'twilight.json',\n worker = true,\n } = options;\n\n const projectRoot = process.cwd();\n\n const allRoutes = tanstackAdapter.generateRouteFiles({ projectRoot, baseRoutesImport });\n const virtualRouteConfig = buildVirtualRouteConfig(\n allRoutes,\n DEFAULT_ROOT_ROUTE,\n resolve(projectRoot, srcDirectory, 'routes')\n );\n\n const routeGeneratorPlugin: Plugin = {\n name: 'twilight:react',\n enforce: 'pre',\n config(config) {\n tanstackAdapter.generateRouteFiles({\n projectRoot: config.root || projectRoot,\n baseRoutesImport,\n });\n // The engine's dist is served unbundled in dev, so vite never scans its\n // dependency graph. react-i18next reaches the CJS-only\n // html-parse-stringify/void-elements chain; without pre-bundling, dev\n // serves them raw as ESM and hydration dies on \"does not provide an\n // export named 'default'\". The `>` chains matter: these are the\n // engine's transitive deps, not the theme's, so flat names fail to\n // resolve under pnpm's strict (non-hoisted) node_modules.\n config.optimizeDeps ??= {};\n config.optimizeDeps.include = [\n ...(config.optimizeDeps.include ?? []),\n '@salla.sa/twilight-theme-engine > react-i18next',\n '@salla.sa/twilight-theme-engine > i18next',\n '@salla.sa/twilight-theme-engine > react-i18next > html-parse-stringify',\n '@salla.sa/twilight-theme-engine > react-i18next > html-parse-stringify > void-elements',\n ];\n // Pre-bundle the component wrappers up front: a wrapper discovered on a first page visit\n // re-optimizes mid-request, loads a second React and fails that page with \"Invalid hook call\".\n const wrappers = collectComponentWrapperImports(\n [resolve(config.root || projectRoot, srcDirectory), engineSourceDir()].filter(\n (dir): dir is string => Boolean(dir)\n )\n );\n config.optimizeDeps.include.push(\n ...wrappers,\n // Engine-only browser deps found late otherwise (one full reload on a cold start).\n '@salla.sa/twilight-theme-engine > @sentry/tanstackstart-react',\n '@salla.sa/twilight-theme-engine > @justinribeiro/lite-youtube',\n '@salla.sa/twilight-theme-engine > @tanstack/react-router-ssr-query',\n '@salla.sa/twilight-theme-engine > ky',\n '@salla.sa/twilight-theme-engine > sonner'\n );\n config.environments ??= {};\n config.environments.ssr ??= {};\n config.environments.ssr.optimizeDeps ??= {};\n config.environments.ssr.optimizeDeps.include = [\n ...(config.environments.ssr.optimizeDeps.include ?? []),\n ...wrappers,\n ];\n return config;\n },\n // configureServer(server) {\n // // Proactively warm up the Cloudflare Worker module graph so the user's\n // // first browser request is served promptly. Without this, Worker\n // // compilation is triggered lazily on the first navigation request,\n // // causing a ~10-15 second blank-page window on cold starts.\n // server.httpServer?.on('listening', () => {\n // const address = server.httpServer?.address();\n // const port =\n // address && typeof address === 'object' && 'port' in address\n // ? (address as { port: number }).port\n // : null;\n // if (!port) return;\n\n // void (async () => {\n // // Give TanStack Start + Cloudflare plugin time to finish registering\n // // their middleware before we make the warmup request.\n // await new Promise<void>((r) => setTimeout(r, 1500));\n\n // for (let attempt = 0; attempt < 10; attempt++) {\n // try {\n // const ctrl = new AbortController();\n // const tid = setTimeout(() => ctrl.abort(), 12000);\n // const resp = await fetch(`http://localhost:${port}/ar`, {\n // signal: ctrl.signal,\n // });\n // clearTimeout(tid);\n // const text = await resp.text();\n // // A substantial response means the Worker is compiled and SSR works.\n // if (text.length > 500) return;\n // } catch {\n // // Worker not ready yet — retry\n // }\n // await new Promise<void>((r) => setTimeout(r, 2000));\n // }\n // })();\n // });\n // },\n };\n\n const { tanstackStart } = (await import(\n pathToFileURL(resolveProjectPkg(projectRoot, '@tanstack/react-start', 'plugin/vite')).href\n )) as { tanstackStart: (opts: unknown) => PluginOption };\n\n const reactMod = (await import(\n pathToFileURL(resolveProjectPkg(projectRoot, '@vitejs/plugin-react')).href\n )) as { default: (opts?: unknown) => PluginOption };\n\n return [\n assetsBasePlugin(), // before tanstackStart, which reads `base` once — see the plugin\n ...(await createWorkerPlugins(projectRoot, worker)),\n tanstackStart({ srcDirectory, router: { virtualRouteConfig } }),\n reactMod.default(),\n packageAliasesPlugin(),\n routeGeneratorPlugin,\n webHydrationPlugin(),\n themeTranslationsPlugin(localesDir),\n twilightSchemaPlugin(twilightJson),\n bestPracticesPlugin(),\n ];\n },\n};\n","/**\n * @fileoverview Next.js framework adapter (placeholder for future implementation)\n *\n * This adapter will provide integration with Next.js App Router.\n * Currently not implemented - coming soon.\n */\n\nimport type { PluginOption } from 'vite';\nimport type {\n FrameworkAdapter,\n GenerateRoutesOptions,\n TwilightReactOptions,\n TwilightRoute,\n} from '../types';\n\n/**\n * Next.js framework adapter (placeholder for future implementation)\n */\nexport const nextjsAdapter: FrameworkAdapter = {\n name: 'nextjs',\n\n generateRouteFiles(_options: GenerateRoutesOptions): TwilightRoute[] {\n throw new Error('[twilight-react:nextjs] Next.js framework support is not yet implemented');\n },\n\n async createPlugins(_options: TwilightReactOptions): Promise<PluginOption[]> {\n throw new Error('[twilight-react:nextjs] Next.js framework support is not yet implemented');\n },\n};\n","/**\n * @fileoverview Framework adapters registry\n *\n * This file exports all available framework adapters and provides\n * a registry for looking up adapters by framework name.\n */\n\nimport type { Framework, FrameworkAdapter } from '../types';\nimport { tanstackAdapter } from './tanstack.adapter';\nimport { nextjsAdapter } from './nextjs.adapter';\n\n/**\n * Framework adapters registry\n */\nexport const frameworkAdapters: Record<Framework, FrameworkAdapter> = {\n tanstack: tanstackAdapter,\n nextjs: nextjsAdapter,\n};\n\n/**\n * Get framework adapter by name\n */\nexport function getFrameworkAdapter(framework: Framework): FrameworkAdapter {\n const adapter = frameworkAdapters[framework];\n if (!adapter) {\n throw new Error(`[twilight-react] Unsupported framework: ${framework}`);\n }\n return adapter;\n}\n\n// Export individual adapters for direct use\nexport { tanstackAdapter } from './tanstack.adapter';\nexport { nextjsAdapter } from './nextjs.adapter';\n","/**\n * @fileoverview twilightReact — entry point for the Twilight Vite plugin.\n *\n * Framework-specific setup is fully delegated to the adapter for that framework.\n * Developers can optionally create `app/routes.ts` to add or override routes.\n */\n\nimport type { PluginOption } from 'vite';\nimport type { TwilightReactOptions } from './types';\nimport { getFrameworkAdapter } from './adapters';\nimport { setHeadAdapter } from '../utils/head';\nimport { tanstackHeadAdapter } from '../tanstack/head';\nimport { nextjsHeadAdapter } from '../nextjs/head';\n\n// Re-export types for convenience\nexport type {\n TwilightRoute,\n Framework,\n ReactPluginOptions,\n TanStackRouterOptions,\n NextJsRouterOptions,\n RouterOptions,\n TwilightReactOptions,\n FrameworkAdapter,\n} from './types';\n\n/**\n * Main Twilight Vite plugin.\n *\n * For TanStack Start + Cloudflare Workers (default):\n * ```ts\n * export default defineConfig(async () => ({\n * plugins: [cloudflare({ viteEnvironment: { name: 'ssr' } }), ...(await twilightReact())],\n * }));\n * ```\n */\nexport async function twilightReact(options: TwilightReactOptions = {}): Promise<PluginOption[]> {\n const { framework = 'tanstack' } = options;\n\n if (framework === 'tanstack') setHeadAdapter(tanstackHeadAdapter);\n else if (framework === 'nextjs') setHeadAdapter(nextjsHeadAdapter);\n\n return getFrameworkAdapter(framework).createPlugins(options);\n}\n\nexport default twilightReact;\n"]}