@salla.sa/twilight-theme-engine 1.0.45 → 1.0.47

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 (263) hide show
  1. package/dist/{AddToCartForm-QBPE4QIU.js → AddToCartForm-NICDUAS3.js} +3 -3
  2. package/dist/{AddToCartForm-QBPE4QIU.js.map → AddToCartForm-NICDUAS3.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-X3I7KLML.js → BlogAuthorPage-NKPS4CQ2.js} +16 -15
  4. package/dist/BlogAuthorPage-NKPS4CQ2.js.map +1 -0
  5. package/dist/{BlogCategoryPage-F3ORUZAF.js → BlogCategoryPage-FSCFBS36.js} +16 -15
  6. package/dist/BlogCategoryPage-FSCFBS36.js.map +1 -0
  7. package/dist/{BlogPage-G7AOQDP2.js → BlogPage-OZTHYA3G.js} +14 -13
  8. package/dist/BlogPage-OZTHYA3G.js.map +1 -0
  9. package/dist/{BlogSinglePage-VP4ZLQPA.js → BlogSinglePage-KC67IUL7.js} +14 -13
  10. package/dist/BlogSinglePage-KC67IUL7.js.map +1 -0
  11. package/dist/{BlogTagPage-WCHB3VL2.js → BlogTagPage-N7JLIRKV.js} +16 -15
  12. package/dist/BlogTagPage-N7JLIRKV.js.map +1 -0
  13. package/dist/{BrandsPage-MR3RNHNS.js → BrandsPage-5SC62L6S.js} +14 -13
  14. package/dist/BrandsPage-5SC62L6S.js.map +1 -0
  15. package/dist/{Breadcrumb-QCWPUUEQ.js → Breadcrumb-W64WMO56.js} +14 -13
  16. package/dist/Breadcrumb-W64WMO56.js.map +1 -0
  17. package/dist/{CartItem-M2FEFI23.js → CartItem-UOVSSW5O.js} +14 -13
  18. package/dist/CartItem-UOVSSW5O.js.map +1 -0
  19. package/dist/{CartSummary-RND3CQYW.js → CartSummary-4V3L56U7.js} +14 -13
  20. package/dist/CartSummary-4V3L56U7.js.map +1 -0
  21. package/dist/{Copyright-YVUGHPR6.js → Copyright-OCQCOUFS.js} +3 -3
  22. package/dist/{Copyright-YVUGHPR6.js.map → Copyright-OCQCOUFS.js.map} +1 -1
  23. package/dist/{CustomerLayout-B7HTCSMV.js → CustomerLayout-PLJTAXCP.js} +14 -13
  24. package/dist/CustomerLayout-PLJTAXCP.js.map +1 -0
  25. package/dist/{Footer-JOBYWULB.js → Footer-QD7ASWFT.js} +14 -13
  26. package/dist/{Footer-JOBYWULB.js.map → Footer-QD7ASWFT.js.map} +1 -1
  27. package/dist/{Header-TE35DMNI.js → Header-M5GOR6XZ.js} +7 -6
  28. package/dist/{Header-TE35DMNI.js.map → Header-M5GOR6XZ.js.map} +1 -1
  29. package/dist/{LoyaltyPage-26NMNBJV.js → LoyaltyPage-C7FKYLIW.js} +15 -14
  30. package/dist/LoyaltyPage-C7FKYLIW.js.map +1 -0
  31. package/dist/{MainMenu-4ZZEDUBZ.js → MainMenu-MMAYRKYE.js} +8 -7
  32. package/dist/MainMenu-MMAYRKYE.js.map +1 -0
  33. package/dist/{MasterLayout-AELGECHE.js → MasterLayout-SCTQ42ID.js} +14 -13
  34. package/dist/{MasterLayout-AELGECHE.js.map → MasterLayout-SCTQ42ID.js.map} +1 -1
  35. package/dist/{MobileMenu-GFEOQWO6.js → MobileMenu-J34MVD6W.js} +15 -14
  36. package/dist/MobileMenu-J34MVD6W.js.map +1 -0
  37. package/dist/{NotificationsPage-226QGY4Q.js → NotificationsPage-KF6AIPK3.js} +14 -13
  38. package/dist/NotificationsPage-KF6AIPK3.js.map +1 -0
  39. package/dist/{OrderSinglePage-44VBTQQS.js → OrderSinglePage-LP7FUHKL.js} +18 -16
  40. package/dist/OrderSinglePage-LP7FUHKL.js.map +1 -0
  41. package/dist/{OrdersPage-NUQUDEAK.js → OrdersPage-A3K5BDBZ.js} +15 -14
  42. package/dist/OrdersPage-A3K5BDBZ.js.map +1 -0
  43. package/dist/{PageSingle-76O4HAYZ.js → PageSingle-FHHC5QDA.js} +3 -3
  44. package/dist/{PageSingle-76O4HAYZ.js.map → PageSingle-FHHC5QDA.js.map} +1 -1
  45. package/dist/{ProductDetails-WTXNHY2S.js → ProductDetails-AF3I5FQQ.js} +3 -3
  46. package/dist/{ProductDetails-WTXNHY2S.js.map → ProductDetails-AF3I5FQQ.js.map} +1 -1
  47. package/dist/{ProfilePage-K7ZEU6IF.js → ProfilePage-RXQIUTU4.js} +14 -13
  48. package/dist/ProfilePage-RXQIUTU4.js.map +1 -0
  49. package/dist/{SeoCartWidget-6LY5YQKA.js → SeoCartWidget-72U3UQKH.js} +14 -13
  50. package/dist/SeoCartWidget-72U3UQKH.js.map +1 -0
  51. package/dist/{SettingsPage-NDZAS5PQ.js → SettingsPage-65CZ2LNG.js} +14 -13
  52. package/dist/SettingsPage-65CZ2LNG.js.map +1 -0
  53. package/dist/{StoreClosedNotification-CU2OVCIG.js → StoreClosedNotification-4KJVEGPE.js} +15 -14
  54. package/dist/{StoreClosedNotification-CU2OVCIG.js.map → StoreClosedNotification-4KJVEGPE.js.map} +1 -1
  55. package/dist/{TestimonialsPage-ICQGRIXS.js → TestimonialsPage-NGCHKB4F.js} +3 -3
  56. package/dist/{TestimonialsPage-ICQGRIXS.js.map → TestimonialsPage-NGCHKB4F.js.map} +1 -1
  57. package/dist/{ThankYouPage-WIHRO3DC.js → ThankYouPage-A7IWCMXJ.js} +14 -13
  58. package/dist/ThankYouPage-A7IWCMXJ.js.map +1 -0
  59. package/dist/{WalletPage-YD4TKPGA.js → WalletPage-FNGL7Z3Z.js} +15 -14
  60. package/dist/WalletPage-FNGL7Z3Z.js.map +1 -0
  61. package/dist/{WishlistPage-3UNTMS2B.js → WishlistPage-KDLBETWD.js} +16 -15
  62. package/dist/WishlistPage-KDLBETWD.js.map +1 -0
  63. package/dist/api/apps.js +5 -4
  64. package/dist/api/brands.js +6 -5
  65. package/dist/api/cart.js +6 -5
  66. package/dist/api/category.js +6 -5
  67. package/dist/api/client.js +4 -3
  68. package/dist/api/home.js +5 -4
  69. package/dist/api/loyalty.js +6 -5
  70. package/dist/api/menu.js +5 -4
  71. package/dist/api/notification.js +5 -4
  72. package/dist/api/order.js +6 -5
  73. package/dist/api/page.js +6 -5
  74. package/dist/api/product.js +6 -5
  75. package/dist/api/profile.js +4 -3
  76. package/dist/api/profile.js.map +1 -1
  77. package/dist/api/store.js +5 -4
  78. package/dist/api/translations.js +5 -4
  79. package/dist/api/user.js +5 -4
  80. package/dist/api/wishlist.js +7 -6
  81. package/dist/chunk-3FIWHGCZ.js +101 -0
  82. package/dist/chunk-3FIWHGCZ.js.map +1 -0
  83. package/dist/{chunk-E5EH32L7.js → chunk-3MHDV5JS.js} +3 -3
  84. package/dist/{chunk-E5EH32L7.js.map → chunk-3MHDV5JS.js.map} +1 -1
  85. package/dist/{chunk-KOZYZQH4.js → chunk-3XIITSKM.js} +4 -4
  86. package/dist/{chunk-KOZYZQH4.js.map → chunk-3XIITSKM.js.map} +1 -1
  87. package/dist/{chunk-5TRRUV7N.js → chunk-4D44TJ72.js} +3 -3
  88. package/dist/{chunk-5TRRUV7N.js.map → chunk-4D44TJ72.js.map} +1 -1
  89. package/dist/{chunk-UWWYR3UX.js → chunk-65Z2ZDKZ.js} +6 -6
  90. package/dist/{chunk-UWWYR3UX.js.map → chunk-65Z2ZDKZ.js.map} +1 -1
  91. package/dist/{chunk-AGT5BKY4.js → chunk-AVPIY3Y4.js} +7 -7
  92. package/dist/{chunk-AGT5BKY4.js.map → chunk-AVPIY3Y4.js.map} +1 -1
  93. package/dist/{chunk-XLJPUFN4.js → chunk-CPQXPECC.js} +5 -5
  94. package/dist/{chunk-XLJPUFN4.js.map → chunk-CPQXPECC.js.map} +1 -1
  95. package/dist/{chunk-PNXUBS5X.js → chunk-DTWFNS3F.js} +16 -15
  96. package/dist/chunk-DTWFNS3F.js.map +1 -0
  97. package/dist/{chunk-ZNWNJZSM.js → chunk-EMKO3C2V.js} +4 -4
  98. package/dist/{chunk-ZNWNJZSM.js.map → chunk-EMKO3C2V.js.map} +1 -1
  99. package/dist/{chunk-KFH3OBFW.js → chunk-GXNQX4Z2.js} +4 -4
  100. package/dist/{chunk-KFH3OBFW.js.map → chunk-GXNQX4Z2.js.map} +1 -1
  101. package/dist/chunk-HNSZ6VBK.js +14 -0
  102. package/dist/{chunk-I2UBYEUG.js.map → chunk-HNSZ6VBK.js.map} +1 -1
  103. package/dist/{chunk-TMR7TZMB.js → chunk-ICNOLZNT.js} +4 -4
  104. package/dist/{chunk-TMR7TZMB.js.map → chunk-ICNOLZNT.js.map} +1 -1
  105. package/dist/{chunk-2AGMXJVP.js → chunk-IH3TQ3LD.js} +4 -4
  106. package/dist/{chunk-2AGMXJVP.js.map → chunk-IH3TQ3LD.js.map} +1 -1
  107. package/dist/{chunk-6KI2QCPL.js → chunk-JD4J2ZB6.js} +3 -3
  108. package/dist/{chunk-6KI2QCPL.js.map → chunk-JD4J2ZB6.js.map} +1 -1
  109. package/dist/{chunk-NX6BEOXW.js → chunk-JEJR23P4.js} +4 -4
  110. package/dist/{chunk-NX6BEOXW.js.map → chunk-JEJR23P4.js.map} +1 -1
  111. package/dist/{chunk-XLGVT7QF.js → chunk-JK77XRXR.js} +13 -9
  112. package/dist/chunk-JK77XRXR.js.map +1 -0
  113. package/dist/{chunk-XTOXFAP7.js → chunk-KT2MUSRN.js} +3 -3
  114. package/dist/{chunk-XTOXFAP7.js.map → chunk-KT2MUSRN.js.map} +1 -1
  115. package/dist/{chunk-ME727LL4.js → chunk-KV5R4LKM.js} +3 -3
  116. package/dist/{chunk-ME727LL4.js.map → chunk-KV5R4LKM.js.map} +1 -1
  117. package/dist/{chunk-3644MRQI.js → chunk-L42W6YS3.js} +5 -5
  118. package/dist/{chunk-3644MRQI.js.map → chunk-L42W6YS3.js.map} +1 -1
  119. package/dist/{chunk-G6F5DCCP.js → chunk-LKBWIN26.js} +3 -3
  120. package/dist/{chunk-G6F5DCCP.js.map → chunk-LKBWIN26.js.map} +1 -1
  121. package/dist/{chunk-CCCKRNO4.js → chunk-MENDTTOA.js} +3 -3
  122. package/dist/{chunk-CCCKRNO4.js.map → chunk-MENDTTOA.js.map} +1 -1
  123. package/dist/{chunk-AZ5HAIYQ.js → chunk-O6XXHXC4.js} +5 -4
  124. package/dist/chunk-O6XXHXC4.js.map +1 -0
  125. package/dist/{chunk-2TEGEKIQ.js → chunk-OKP6LUT7.js} +4 -4
  126. package/dist/{chunk-2TEGEKIQ.js.map → chunk-OKP6LUT7.js.map} +1 -1
  127. package/dist/{chunk-QG2Q6HB5.js → chunk-P4DUWQU4.js} +3 -3
  128. package/dist/{chunk-QG2Q6HB5.js.map → chunk-P4DUWQU4.js.map} +1 -1
  129. package/dist/{chunk-6XWMNQ52.js → chunk-PJWFEMBX.js} +15 -4
  130. package/dist/chunk-PJWFEMBX.js.map +1 -0
  131. package/dist/{chunk-OGGWNPF3.js → chunk-PZL3JWM2.js} +3 -3
  132. package/dist/{chunk-OGGWNPF3.js.map → chunk-PZL3JWM2.js.map} +1 -1
  133. package/dist/{chunk-6MGDRMZM.js → chunk-QKIQ3K24.js} +4 -4
  134. package/dist/{chunk-6MGDRMZM.js.map → chunk-QKIQ3K24.js.map} +1 -1
  135. package/dist/{chunk-BWIESZJK.js → chunk-QUUSMVCP.js} +3 -3
  136. package/dist/{chunk-BWIESZJK.js.map → chunk-QUUSMVCP.js.map} +1 -1
  137. package/dist/{chunk-MLIJWD6B.js → chunk-QVPMWMPP.js} +35 -14
  138. package/dist/chunk-QVPMWMPP.js.map +1 -0
  139. package/dist/{chunk-X26WB7AG.js → chunk-R6M6RM6U.js} +3 -3
  140. package/dist/{chunk-X26WB7AG.js.map → chunk-R6M6RM6U.js.map} +1 -1
  141. package/dist/{chunk-J5J64BAN.js → chunk-U325BK62.js} +4 -4
  142. package/dist/{chunk-J5J64BAN.js.map → chunk-U325BK62.js.map} +1 -1
  143. package/dist/{chunk-G4M73JU5.js → chunk-UQRLBMIO.js} +6 -6
  144. package/dist/{chunk-G4M73JU5.js.map → chunk-UQRLBMIO.js.map} +1 -1
  145. package/dist/{chunk-RBISDOPR.js → chunk-UV5BRJH4.js} +4 -4
  146. package/dist/{chunk-RBISDOPR.js.map → chunk-UV5BRJH4.js.map} +1 -1
  147. package/dist/{chunk-ULQMJUO2.js → chunk-WHOWSSX4.js} +4 -4
  148. package/dist/{chunk-ULQMJUO2.js.map → chunk-WHOWSSX4.js.map} +1 -1
  149. package/dist/{chunk-CG3AM4DH.js → chunk-WITIL2MK.js} +5 -5
  150. package/dist/{chunk-CG3AM4DH.js.map → chunk-WITIL2MK.js.map} +1 -1
  151. package/dist/{chunk-QIC6DSWU.js → chunk-WL5CWJVZ.js} +4 -4
  152. package/dist/{chunk-QIC6DSWU.js.map → chunk-WL5CWJVZ.js.map} +1 -1
  153. package/dist/{chunk-2KZORZZN.js → chunk-WMSOSA74.js} +5 -5
  154. package/dist/{chunk-2KZORZZN.js.map → chunk-WMSOSA74.js.map} +1 -1
  155. package/dist/{chunk-JBXTU5NM.js → chunk-XTMHHLNK.js} +62 -78
  156. package/dist/chunk-XTMHHLNK.js.map +1 -0
  157. package/dist/{chunk-RIZOT5FN.js → chunk-Z74NUTEI.js} +3 -3
  158. package/dist/{chunk-RIZOT5FN.js.map → chunk-Z74NUTEI.js.map} +1 -1
  159. package/dist/components/cart/index.js +1 -1
  160. package/dist/components/common/index.js +1 -1
  161. package/dist/components/drawer/index.js +12 -11
  162. package/dist/components/home/index.js +15 -14
  163. package/dist/components/layout/index.js +5 -5
  164. package/dist/components/product/index.js +13 -12
  165. package/dist/components/store/index.js +14 -13
  166. package/dist/components/store/index.js.map +1 -1
  167. package/dist/document-class-IESLLQCD.js +26 -0
  168. package/dist/{document-class-G34XZMVK.js.map → document-class-IESLLQCD.js.map} +1 -1
  169. package/dist/hooks/index.js +12 -11
  170. package/dist/hooks/useGtm.js +12 -11
  171. package/dist/hooks/useMoney.js +12 -11
  172. package/dist/hooks/useStore.js +12 -11
  173. package/dist/hooks/useUser.js +6 -5
  174. package/dist/index.js +12 -11
  175. package/dist/index.js.map +1 -1
  176. package/dist/{navigation-D7QS3NK2.js → navigation-BCTD7TIG.js} +5 -4
  177. package/dist/navigation-BCTD7TIG.js.map +1 -0
  178. package/dist/{navigation-DQNNT2LY.js → navigation-DF2RT7D6.js} +6 -5
  179. package/dist/{navigation-DQNNT2LY.js.map → navigation-DF2RT7D6.js.map} +1 -1
  180. package/dist/{not-found-6PX2EO7T.js → not-found-3OWRDBD3.js} +14 -13
  181. package/dist/not-found-3OWRDBD3.js.map +1 -0
  182. package/dist/providers/NavigationProvider.d.ts +9 -2
  183. package/dist/providers/NavigationProvider.d.ts.map +1 -1
  184. package/dist/providers/index.js +12 -11
  185. package/dist/routes/account/orders/OrderSinglePage.d.ts.map +1 -1
  186. package/dist/routes/account/orders.js +7 -6
  187. package/dist/routes/account.js +16 -15
  188. package/dist/routes/account.js.map +1 -1
  189. package/dist/routes/blog.js +11 -10
  190. package/dist/routes/blog.js.map +1 -1
  191. package/dist/routes/brands.js +7 -6
  192. package/dist/routes/brands.js.map +1 -1
  193. package/dist/routes/cart.js +20 -19
  194. package/dist/routes/cart.js.map +1 -1
  195. package/dist/routes/home.js +17 -16
  196. package/dist/routes/index.js +4 -3
  197. package/dist/routes/loyalty.js +7 -6
  198. package/dist/routes/loyalty.js.map +1 -1
  199. package/dist/routes/page.js +7 -6
  200. package/dist/routes/page.js.map +1 -1
  201. package/dist/routes/product-listing/ProductListPage.d.ts.map +1 -1
  202. package/dist/routes/product-listing.js +22 -21
  203. package/dist/routes/product-listing.js.map +1 -1
  204. package/dist/routes/product.js +15 -14
  205. package/dist/routes/product.js.map +1 -1
  206. package/dist/routes/root/beforeLoad.d.ts.map +1 -1
  207. package/dist/routes/seo-redirects.js +4 -3
  208. package/dist/routes/testimonials.js +2 -2
  209. package/dist/routes/thank-you.js +7 -6
  210. package/dist/routes/thank-you.js.map +1 -1
  211. package/dist/skeleton.js +17 -16
  212. package/dist/tanstack/middleware/twilight.d.ts.map +1 -1
  213. package/dist/tanstack/router.d.ts.map +1 -1
  214. package/dist/tanstack/store-base.d.ts +20 -0
  215. package/dist/tanstack/store-base.d.ts.map +1 -0
  216. package/dist/tanstack.js +18 -17
  217. package/dist/tanstack.js.map +1 -1
  218. package/dist/twilight/context.d.ts +10 -0
  219. package/dist/twilight/context.d.ts.map +1 -1
  220. package/dist/utils/cookies.d.ts +56 -0
  221. package/dist/utils/cookies.d.ts.map +1 -1
  222. package/dist/utils/index.js +5 -4
  223. package/dist/utils/index.js.map +1 -1
  224. package/dist/utils/runtime-env.d.ts +11 -0
  225. package/dist/utils/runtime-env.d.ts.map +1 -1
  226. package/dist/utils/store-base.d.ts +62 -0
  227. package/dist/utils/store-base.d.ts.map +1 -0
  228. package/dist/utils/store-identity.d.ts +38 -3
  229. package/dist/utils/store-identity.d.ts.map +1 -1
  230. package/dist/vite/index.js +2 -2
  231. package/package.json +1 -1
  232. package/dist/BlogAuthorPage-X3I7KLML.js.map +0 -1
  233. package/dist/BlogCategoryPage-F3ORUZAF.js.map +0 -1
  234. package/dist/BlogPage-G7AOQDP2.js.map +0 -1
  235. package/dist/BlogSinglePage-VP4ZLQPA.js.map +0 -1
  236. package/dist/BlogTagPage-WCHB3VL2.js.map +0 -1
  237. package/dist/BrandsPage-MR3RNHNS.js.map +0 -1
  238. package/dist/Breadcrumb-QCWPUUEQ.js.map +0 -1
  239. package/dist/CartItem-M2FEFI23.js.map +0 -1
  240. package/dist/CartSummary-RND3CQYW.js.map +0 -1
  241. package/dist/CustomerLayout-B7HTCSMV.js.map +0 -1
  242. package/dist/LoyaltyPage-26NMNBJV.js.map +0 -1
  243. package/dist/MainMenu-4ZZEDUBZ.js.map +0 -1
  244. package/dist/MobileMenu-GFEOQWO6.js.map +0 -1
  245. package/dist/NotificationsPage-226QGY4Q.js.map +0 -1
  246. package/dist/OrderSinglePage-44VBTQQS.js.map +0 -1
  247. package/dist/OrdersPage-NUQUDEAK.js.map +0 -1
  248. package/dist/ProfilePage-K7ZEU6IF.js.map +0 -1
  249. package/dist/SeoCartWidget-6LY5YQKA.js.map +0 -1
  250. package/dist/SettingsPage-NDZAS5PQ.js.map +0 -1
  251. package/dist/ThankYouPage-WIHRO3DC.js.map +0 -1
  252. package/dist/WalletPage-YD4TKPGA.js.map +0 -1
  253. package/dist/WishlistPage-3UNTMS2B.js.map +0 -1
  254. package/dist/chunk-6XWMNQ52.js.map +0 -1
  255. package/dist/chunk-AZ5HAIYQ.js.map +0 -1
  256. package/dist/chunk-I2UBYEUG.js +0 -14
  257. package/dist/chunk-JBXTU5NM.js.map +0 -1
  258. package/dist/chunk-MLIJWD6B.js.map +0 -1
  259. package/dist/chunk-PNXUBS5X.js.map +0 -1
  260. package/dist/chunk-XLGVT7QF.js.map +0 -1
  261. package/dist/document-class-G34XZMVK.js +0 -25
  262. package/dist/navigation-D7QS3NK2.js.map +0 -1
  263. package/dist/not-found-6PX2EO7T.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/product/loader.ts","../../src/routes/product/ProductPage.tsx","../../src/routes/product/index.tsx"],"names":["product"],"mappings":"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","file":"product.js","sourcesContent":["import type { ProductPageProps } from './types';\nimport type { IdParams } from '../types';\nimport { product } from '../../api/product';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\nimport type { Breadcrumb } from '../../types';\n\nexport async function productLoader({ params }: { params: IdParams }): Promise<ProductPageProps> {\n const data = await product.findOrThrow(params.id);\n const i18n = getTwilightContext().i18n;\n const home: Breadcrumb = { name: i18n.t('common.titles.home'), url: '/' };\n\n const breadcrumbs: Breadcrumb[] = [home];\n if (data.category) {\n breadcrumbs.push({ name: data.category.name, url: data.category.url });\n }\n breadcrumbs.push({ name: data.name, url: data.url });\n\n const page = {\n slug: RouteId.PRODUCT_SINGLE,\n id: data.id,\n title: data.name,\n url: data.url,\n parent:\n data.category && data.category.id\n ? { id: data.category.id, name: data.category.name, url: data.category.url }\n : null,\n breadcrumbs,\n };\n\n return {\n page,\n product: data,\n };\n}\n","import { SallaQuickOrder } from '@salla.sa/twilight-components-react/quick-order';\nimport { SallaOffer } from '@salla.sa/twilight-components-react/offer';\nimport { SallaComments } from '@salla.sa/twilight-components-react/comments';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useProduct } from '../../hooks/useProduct';\nimport { useComments } from '../../hooks/useComments';\nimport type { ProductPageProps } from './types';\nimport { Breadcrumb, RenderWhenVisible } from '../../components/common';\nimport { ProductDetails, AddToCartForm, ProductGallery } from '../../components/product';\nimport { ProductsSlider, Testimonials } from '../../components/home';\nimport { useTwilight } from '../../providers/twilight-context';\n\nexport function ProductPage({ product: initialProduct, page }: ProductPageProps) {\n const { theme, store } = useTwilight();\n const { t } = useTranslation();\n const { product } = useProduct(initialProduct);\n const { commentsKey } = useComments();\n\n return (\n <div key={product.id}>\n <div className=\"container\">\n <Breadcrumb page={page} />\n\n <HookSlot name=\"product:start\" />\n\n <div className=\"flex flex-col items-start md:flex-row\" id={`product-${product.id}`}>\n <ProductGallery product={product} />\n\n <div className=\"main-content md:sticky md:overflow-hidden top-24 w-full md:w-2/4 md:pb-16\">\n <HookSlot name=\"product:details.start\" />\n <HookSlot name=\"product:single.description.start\" />\n <ProductDetails product={product} showTags={theme.settings.show_tags} />\n <HookSlot name=\"product:single.description\" />\n <HookSlot name=\"product:single.description.end\" />\n <HookSlot name=\"product:details.end\" />\n\n <HookSlot name=\"product:single.form.start\" />\n <AddToCartForm product={product} stickyAddToCart={theme.settings.sticky_add_to_cart} />\n <HookSlot name=\"product:single.form.end\" />\n\n <SallaQuickOrder className=\"mt-5 md:-mb-2 block\" />\n </div>\n </div>\n\n <SallaOffer />\n </div>\n\n {store.settings?.rating?.show_on_product && (\n <RenderWhenVisible>\n <SallaComments key={commentsKey} itemId={product.id} type={'product' as any} />\n </RenderWhenVisible>\n )}\n\n <HookSlot name=\"product:related.start\" />\n <RenderWhenVisible>\n <div className=\"container\">\n <ProductsSlider\n data={{\n products: { source: 'related', source_value: product.id },\n title: t('pages.products.similar_products'),\n display_all_url: '',\n }}\n />\n </div>\n </RenderWhenVisible>\n <HookSlot name=\"product:related.end\" />\n\n <RenderWhenVisible>\n <div className=\"container\">\n <Testimonials data={{}} />\n </div>\n </RenderWhenVisible>\n\n <HookSlot name=\"product:end\" />\n </div>\n );\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport type { ProductPageProps } from './types';\nimport type { IdParams } from '../types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { productLoader } from './loader';\nimport { RouteId } from '../../router/route-ids';\nimport { ProductPage } from './ProductPage';\nexport { productLoader } from './loader';\nexport type { ProductPageProps } from './types';\n\nasync function loader(\n ctx: { params: IdParams; locale?: string },\n extend?: (\n data: ProductPageProps,\n ctx: { params: IdParams }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<ProductPageProps> {\n const data = await productLoader({ params: ctx.params });\n\n if (extend) {\n const extra = await extend(data, ctx);\n return { ...data, ...extra } as ProductPageProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: ProductPageProps): HeadDescriptor {\n if (!data?.product) {\n return {\n title: 'Products',\n description: 'Browse our products',\n };\n }\n const product = data.product;\n const storeName = ctx.settings?.store?.name ?? '';\n\n // Strip HTML and limit description to 160 chars\n const description = product.description?.replace(/<[^>]*>/g, '').slice(0, 160) ?? '';\n\n // Price valid until: 1 month from now\n const priceValidUntil = new Date();\n priceValidUntil.setMonth(priceValidUntil.getMonth() + 1);\n\n // Collect all product images\n const images = product.images?.map((img) => img.url).filter(Boolean) ?? [];\n if (product.image?.url && !images.includes(product.image.url)) {\n images.unshift(product.image.url);\n }\n\n // Build JSON-LD schema matching SchemaProductWidget.php\n const jsonLd: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'Product',\n name: product.name,\n description,\n sku: product.sku,\n image: images.length > 0 ? images : undefined,\n offers: {\n '@type': 'Offer',\n url: product.url,\n availability: product.is_available\n ? 'https://schema.org/InStock'\n : 'https://schema.org/OutOfStock',\n price: product.sale_price,\n priceCurrency: product.currency,\n priceValidUntil: priceValidUntil.toISOString().split('T')[0],\n seller: storeName\n ? {\n '@type': 'Organization',\n name: storeName,\n }\n : undefined,\n },\n };\n\n // Add brand if exists\n if (product.brand) {\n jsonLd.brand = {\n '@type': 'Brand',\n name: product.brand.name,\n description: product.brand.description,\n logo: product.brand.logo,\n };\n }\n\n // Add aggregateRating and review if rating exists\n if (product.rating && product.rating.count > 0) {\n const ratingValue = product.rating.stars;\n jsonLd.aggregateRating = {\n '@type': 'AggregateRating',\n ratingCount: product.rating.count,\n ratingValue,\n };\n jsonLd.review = {\n '@type': 'Review',\n author: storeName\n ? {\n '@type': 'Organization',\n name: storeName,\n }\n : undefined,\n reviewRating: {\n '@type': 'Rating',\n bestRating: 5,\n ratingValue,\n },\n };\n }\n\n if (product.gtin && product.gtin.length === 8) {\n jsonLd.gtin8 = product.gtin;\n }\n\n if (product.mpn) {\n jsonLd.mpn = product.mpn;\n }\n\n const base: HeadDescriptor = {\n title: product.name,\n description,\n canonical: product.url,\n openGraph: {\n type: 'product',\n title: product.name,\n description,\n images: product.image?.url,\n url: product.url,\n },\n twitter: {\n card: 'summary_large_image',\n title: product.name,\n description,\n images: product.image?.url,\n },\n jsonLd,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const Product = {\n id: RouteId.PRODUCT_SINGLE,\n loader,\n head,\n Component: ProductPage,\n} as const;\n"]}
1
+ {"version":3,"sources":["../../src/routes/product/loader.ts","../../src/routes/product/ProductPage.tsx","../../src/routes/product/index.tsx"],"names":["product"],"mappings":"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","file":"product.js","sourcesContent":["import type { ProductPageProps } from './types';\nimport type { IdParams } from '../types';\nimport { product } from '../../api/product';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\nimport type { Breadcrumb } from '../../types';\n\nexport async function productLoader({ params }: { params: IdParams }): Promise<ProductPageProps> {\n const data = await product.findOrThrow(params.id);\n const i18n = getTwilightContext().i18n;\n const home: Breadcrumb = { name: i18n.t('common.titles.home'), url: '/' };\n\n const breadcrumbs: Breadcrumb[] = [home];\n if (data.category) {\n breadcrumbs.push({ name: data.category.name, url: data.category.url });\n }\n breadcrumbs.push({ name: data.name, url: data.url });\n\n const page = {\n slug: RouteId.PRODUCT_SINGLE,\n id: data.id,\n title: data.name,\n url: data.url,\n parent:\n data.category && data.category.id\n ? { id: data.category.id, name: data.category.name, url: data.category.url }\n : null,\n breadcrumbs,\n };\n\n return {\n page,\n product: data,\n };\n}\n","import { SallaQuickOrder } from '@salla.sa/twilight-components-react/quick-order';\nimport { SallaOffer } from '@salla.sa/twilight-components-react/offer';\nimport { SallaComments } from '@salla.sa/twilight-components-react/comments';\nimport { HookSlot } from '../../hooks';\nimport { useTranslation } from '../../providers/I18nProvider';\nimport { useProduct } from '../../hooks/useProduct';\nimport { useComments } from '../../hooks/useComments';\nimport type { ProductPageProps } from './types';\nimport { Breadcrumb, RenderWhenVisible } from '../../components/common';\nimport { ProductDetails, AddToCartForm, ProductGallery } from '../../components/product';\nimport { ProductsSlider, Testimonials } from '../../components/home';\nimport { useTwilight } from '../../providers/twilight-context';\n\nexport function ProductPage({ product: initialProduct, page }: ProductPageProps) {\n const { theme, store } = useTwilight();\n const { t } = useTranslation();\n const { product } = useProduct(initialProduct);\n const { commentsKey } = useComments();\n\n return (\n <div key={product.id}>\n <div className=\"container\">\n <Breadcrumb page={page} />\n\n <HookSlot name=\"product:start\" />\n\n <div className=\"flex flex-col items-start md:flex-row\" id={`product-${product.id}`}>\n <ProductGallery product={product} />\n\n <div className=\"main-content md:sticky md:overflow-hidden top-24 w-full md:w-2/4 md:pb-16\">\n <HookSlot name=\"product:details.start\" />\n <HookSlot name=\"product:single.description.start\" />\n <ProductDetails product={product} showTags={theme.settings.show_tags} />\n <HookSlot name=\"product:single.description\" />\n <HookSlot name=\"product:single.description.end\" />\n <HookSlot name=\"product:details.end\" />\n\n <HookSlot name=\"product:single.form.start\" />\n <AddToCartForm product={product} stickyAddToCart={theme.settings.sticky_add_to_cart} />\n <HookSlot name=\"product:single.form.end\" />\n\n <SallaQuickOrder className=\"mt-5 md:-mb-2 block\" />\n </div>\n </div>\n\n <SallaOffer />\n </div>\n\n {store.settings?.rating?.show_on_product && (\n <RenderWhenVisible>\n <SallaComments key={commentsKey} itemId={product.id} type={'product' as any} />\n </RenderWhenVisible>\n )}\n\n <HookSlot name=\"product:related.start\" />\n <RenderWhenVisible>\n <div className=\"container\">\n <ProductsSlider\n data={{\n products: { source: 'related', source_value: product.id },\n title: t('pages.products.similar_products'),\n display_all_url: '',\n }}\n />\n </div>\n </RenderWhenVisible>\n <HookSlot name=\"product:related.end\" />\n\n <RenderWhenVisible>\n <div className=\"container\">\n <Testimonials data={{}} />\n </div>\n </RenderWhenVisible>\n\n <HookSlot name=\"product:end\" />\n </div>\n );\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport type { ProductPageProps } from './types';\nimport type { IdParams } from '../types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { productLoader } from './loader';\nimport { RouteId } from '../../router/route-ids';\nimport { ProductPage } from './ProductPage';\nexport { productLoader } from './loader';\nexport type { ProductPageProps } from './types';\n\nasync function loader(\n ctx: { params: IdParams; locale?: string },\n extend?: (\n data: ProductPageProps,\n ctx: { params: IdParams }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<ProductPageProps> {\n const data = await productLoader({ params: ctx.params });\n\n if (extend) {\n const extra = await extend(data, ctx);\n return { ...data, ...extra } as ProductPageProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: ProductPageProps): HeadDescriptor {\n if (!data?.product) {\n return {\n title: 'Products',\n description: 'Browse our products',\n };\n }\n const product = data.product;\n const storeName = ctx.settings?.store?.name ?? '';\n\n // Strip HTML and limit description to 160 chars\n const description = product.description?.replace(/<[^>]*>/g, '').slice(0, 160) ?? '';\n\n // Price valid until: 1 month from now\n const priceValidUntil = new Date();\n priceValidUntil.setMonth(priceValidUntil.getMonth() + 1);\n\n // Collect all product images\n const images = product.images?.map((img) => img.url).filter(Boolean) ?? [];\n if (product.image?.url && !images.includes(product.image.url)) {\n images.unshift(product.image.url);\n }\n\n // Build JSON-LD schema matching SchemaProductWidget.php\n const jsonLd: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'Product',\n name: product.name,\n description,\n sku: product.sku,\n image: images.length > 0 ? images : undefined,\n offers: {\n '@type': 'Offer',\n url: product.url,\n availability: product.is_available\n ? 'https://schema.org/InStock'\n : 'https://schema.org/OutOfStock',\n price: product.sale_price,\n priceCurrency: product.currency,\n priceValidUntil: priceValidUntil.toISOString().split('T')[0],\n seller: storeName\n ? {\n '@type': 'Organization',\n name: storeName,\n }\n : undefined,\n },\n };\n\n // Add brand if exists\n if (product.brand) {\n jsonLd.brand = {\n '@type': 'Brand',\n name: product.brand.name,\n description: product.brand.description,\n logo: product.brand.logo,\n };\n }\n\n // Add aggregateRating and review if rating exists\n if (product.rating && product.rating.count > 0) {\n const ratingValue = product.rating.stars;\n jsonLd.aggregateRating = {\n '@type': 'AggregateRating',\n ratingCount: product.rating.count,\n ratingValue,\n };\n jsonLd.review = {\n '@type': 'Review',\n author: storeName\n ? {\n '@type': 'Organization',\n name: storeName,\n }\n : undefined,\n reviewRating: {\n '@type': 'Rating',\n bestRating: 5,\n ratingValue,\n },\n };\n }\n\n if (product.gtin && product.gtin.length === 8) {\n jsonLd.gtin8 = product.gtin;\n }\n\n if (product.mpn) {\n jsonLd.mpn = product.mpn;\n }\n\n const base: HeadDescriptor = {\n title: product.name,\n description,\n canonical: product.url,\n openGraph: {\n type: 'product',\n title: product.name,\n description,\n images: product.image?.url,\n url: product.url,\n },\n twitter: {\n card: 'summary_large_image',\n title: product.name,\n description,\n images: product.image?.url,\n },\n jsonLd,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const Product = {\n id: RouteId.PRODUCT_SINGLE,\n loader,\n head,\n Component: ProductPage,\n} as const;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"beforeLoad.d.ts","sourceRoot":"","sources":["../../../src/routes/root/beforeLoad.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAQ,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AA0B/D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,KAAK,GAAG,KAAK,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;mGAC+F;IAC/F,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;IAC5B;2DACuD;IACvD,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE;QACP,WAAW,EAAE,WAAW,CAAC;QACzB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;KAC7D,CAAC;IACF,aAAa,CAAC,EAAE;QACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAC;CACH,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6G5B"}
1
+ {"version":3,"file":"beforeLoad.d.ts","sourceRoot":"","sources":["../../../src/routes/root/beforeLoad.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAQ,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AA2B/D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,KAAK,GAAG,KAAK,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;mGAC+F;IAC/F,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;IAC5B;2DACuD;IACvD,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE;QACP,WAAW,EAAE,WAAW,CAAC;QACzB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;KAC7D,CAAC;IACF,aAAa,CAAC,EAAE;QACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAC;CACH,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuH5B"}
@@ -1,7 +1,8 @@
1
- export { pendingOrdersRedirectLoader, slugBrandRedirectLoader } from '../chunk-ME727LL4.js';
2
- import '../chunk-XLGVT7QF.js';
1
+ export { pendingOrdersRedirectLoader, slugBrandRedirectLoader } from '../chunk-KV5R4LKM.js';
2
+ import '../chunk-JK77XRXR.js';
3
3
  import '../chunk-MTONGOJD.js';
4
- import '../chunk-6XWMNQ52.js';
4
+ import '../chunk-XTMHHLNK.js';
5
+ import '../chunk-PJWFEMBX.js';
5
6
  import '../chunk-T72DAX7R.js';
6
7
  import '../chunk-DF6FBKDN.js';
7
8
  import '../chunk-DGUM43GV.js';
@@ -1,6 +1,6 @@
1
1
  import { buildHreflangAlternates } from '../chunk-TZ3E5BN4.js';
2
2
  import { RouteId } from '../chunk-MTONGOJD.js';
3
- import { getTwilightContext } from '../chunk-6XWMNQ52.js';
3
+ import { getTwilightContext } from '../chunk-PJWFEMBX.js';
4
4
  import '../chunk-T72DAX7R.js';
5
5
  import '../chunk-DGUM43GV.js';
6
6
  import { lazy } from 'react';
@@ -18,7 +18,7 @@ async function testimonialsLoader(_ctx) {
18
18
 
19
19
  // src/routes/testimonials/index.tsx
20
20
  var LazyTestimonialsPage = lazy(
21
- () => import('../TestimonialsPage-ICQGRIXS.js').then((m) => ({ default: m.TestimonialsPage }))
21
+ () => import('../TestimonialsPage-NGCHKB4F.js').then((m) => ({ default: m.TestimonialsPage }))
22
22
  );
23
23
  var TestimonialsPage = LazyTestimonialsPage;
24
24
  async function loader(ctx, extend) {
@@ -1,10 +1,11 @@
1
- import { order } from '../chunk-2TEGEKIQ.js';
1
+ import { order } from '../chunk-OKP6LUT7.js';
2
2
  import { buildHreflangAlternates } from '../chunk-TZ3E5BN4.js';
3
- import '../chunk-XLGVT7QF.js';
3
+ import '../chunk-JK77XRXR.js';
4
4
  import { RouteId } from '../chunk-MTONGOJD.js';
5
- import '../chunk-AZ5HAIYQ.js';
6
- import '../chunk-JBXTU5NM.js';
7
- import { getTwilightContext } from '../chunk-6XWMNQ52.js';
5
+ import '../chunk-O6XXHXC4.js';
6
+ import '../chunk-3FIWHGCZ.js';
7
+ import '../chunk-XTMHHLNK.js';
8
+ import { getTwilightContext } from '../chunk-PJWFEMBX.js';
8
9
  import '../chunk-T72DAX7R.js';
9
10
  import '../chunk-DF6FBKDN.js';
10
11
  import '../chunk-DGUM43GV.js';
@@ -38,7 +39,7 @@ async function thankYouLoader({
38
39
 
39
40
  // src/routes/thank-you/index.tsx
40
41
  var LazyThankYouPage = lazy(
41
- () => import('../ThankYouPage-WIHRO3DC.js').then((m) => ({ default: m.ThankYouPage }))
42
+ () => import('../ThankYouPage-A7IWCMXJ.js').then((m) => ({ default: m.ThankYouPage }))
42
43
  );
43
44
  var ThankYouPage = LazyThankYouPage;
44
45
  async function loader(ctx, extend) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/thank-you/loader.ts","../../src/routes/thank-you/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;AAMA,eAAsB,cAAA,CAAe;AAAA,EACnC;AACF,CAAA,EAE+B;AAC7B,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AAMvB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,MAAM,QAAQ,UAAA,CAAW;AAAA,IAC7D,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,IAClB,KAAA,CAAM,SAAS,OAAO;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,YACJ,WAAA,CAAY,MAAA,KAAW,WAAA,GAAc,WAAA,CAAY,MAAM,KAAA,GAAQ,MAAA;AACjE,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,MAAA,KAAW,WAAA,GAAc,eAAe,KAAA,GAAQ,MAAA;AAEpF,EAAA,MAAM,IAAA,GAAO,oBAAmB,CAAE,IAAA;AAClC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,MAAM,OAAA,CAAQ,SAAA;AAAA,MACd,EAAA,EAAI,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA,GAAI,OAAA;AAAA,MACvC,KAAA,EAAO,IAAA,CAAK,CAAA,CAAE,yBAAyB,CAAA,IAAK;AAAA,KAC9C;AAAA,IACA,KAAA,EAAO,SAAA;AAAA,IACP,iBAAiB,YAAA,EAAc,eAAA;AAAA,IAC/B,QAAA,EAAU,YAAA,EAAc,QAAA,IAAY,EAAC;AAAA,IACrC,eAAe,YAAA,EAAc,aAAA;AAAA,IAC7B,qBAAqB,YAAA,EAAc;AAAA,GACrC;AACF;;;AC9BA,IAAM,gBAAA,GAAmB,IAAA;AAAA,EAAK,MAC5B,OAAO,6BAAgB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,YAAA,EAAa,CAAE;AACpE,CAAA;AAEO,IAAM,YAAA,GAAe;AAI5B,eAAe,MAAA,CACb,KACA,MAAA,EAI4B;AAC5B,EAAA,MAAM,OAAO,MAAM,cAAA,CAAe,EAAE,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA;AAExD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA;AACpC,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,EAAM;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,IAAA,CAAK,KAAsB,IAAA,EAAyC;AAC3E,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,KAAA,EAAO,KAAK,IAAA,CAAK,KAAA;AAAA,IACjB,WAAA,EAAa,KAAK,IAAA,CAAK,WAAA;AAAA,IACvB,oBAAoB,uBAAA,CAAwB,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,SAAS,QAAQ;AAAA,GACjF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,QAAA,GAAW;AAAA,EACtB,IAAI,OAAA,CAAQ,SAAA;AAAA,EACZ,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,EAAW;AACb","file":"thank-you.js","sourcesContent":["import type { ThankYouPageProps, ThankYouLoaderParams } from './types';\nimport type { Order } from '../account/types';\nimport { order } from '../../api/order';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\nexport async function thankYouLoader({\n params,\n}: {\n params: ThankYouLoaderParams;\n}): Promise<ThankYouPageProps> {\n const orderId = params.orderId;\n\n // orders/{id} needs a customer token that guest checkout / tokenless SSR lacks (400\n // token_not_provided). Don't let that 500 the page — render whatever resolves.\n // ponytail: guest order detail needs checkout/thank-you to return the order; source it\n // here once that payload is confirmed on a correctly store-bound worker.\n const [orderResult, thankYouResult] = await Promise.allSettled([\n order.find(orderId),\n order.thankYou(orderId),\n ]);\n\n const orderData: Order | undefined =\n orderResult.status === 'fulfilled' ? orderResult.value.order : undefined;\n const thankYouData = thankYouResult.status === 'fulfilled' ? thankYouResult.value : undefined;\n\n const i18n = getTwilightContext().i18n;\n return {\n page: {\n slug: RouteId.THANK_YOU,\n id: orderData ? String(orderData.id) : orderId,\n title: i18n.t('common.titles.thank_you') || 'Thank You',\n },\n order: orderData,\n thank_you_title: thankYouData?.thank_you_title,\n messages: thankYouData?.messages ?? [],\n share_message: thankYouData?.share_message,\n short_share_message: thankYouData?.short_share_message,\n };\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport { lazy } from 'react';\nimport { thankYouLoader } from './loader';\nimport type { ThankYouPageProps, ThankYouLoaderParams } from './types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\n// Lazy-load component for code-splitting\nconst LazyThankYouPage = lazy(() =>\n import('./ThankYouPage').then((m) => ({ default: m.ThankYouPage }))\n);\n\nexport const ThankYouPage = LazyThankYouPage;\nexport { thankYouLoader } from './loader';\nexport type { ThankYouLoaderParams, ThankYouPageProps } from './types';\n\nasync function loader(\n ctx: { params: ThankYouLoaderParams; locale?: string },\n extend?: (\n data: ThankYouPageProps,\n ctx: { params: ThankYouLoaderParams }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<ThankYouPageProps> {\n const data = await thankYouLoader({ params: ctx.params });\n\n if (extend) {\n const extra = await extend(data, ctx);\n return { ...data, ...extra } as ThankYouPageProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: ThankYouPageProps): HeadDescriptor {\n const base: HeadDescriptor = {\n title: data.page.title,\n description: data.page.description,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const ThankYou = {\n id: RouteId.THANK_YOU,\n loader,\n head,\n Component: LazyThankYouPage,\n} as const;\n"]}
1
+ {"version":3,"sources":["../../src/routes/thank-you/loader.ts","../../src/routes/thank-you/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;AAMA,eAAsB,cAAA,CAAe;AAAA,EACnC;AACF,CAAA,EAE+B;AAC7B,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AAMvB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,MAAM,QAAQ,UAAA,CAAW;AAAA,IAC7D,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,IAClB,KAAA,CAAM,SAAS,OAAO;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,YACJ,WAAA,CAAY,MAAA,KAAW,WAAA,GAAc,WAAA,CAAY,MAAM,KAAA,GAAQ,MAAA;AACjE,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,MAAA,KAAW,WAAA,GAAc,eAAe,KAAA,GAAQ,MAAA;AAEpF,EAAA,MAAM,IAAA,GAAO,oBAAmB,CAAE,IAAA;AAClC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,MAAM,OAAA,CAAQ,SAAA;AAAA,MACd,EAAA,EAAI,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA,GAAI,OAAA;AAAA,MACvC,KAAA,EAAO,IAAA,CAAK,CAAA,CAAE,yBAAyB,CAAA,IAAK;AAAA,KAC9C;AAAA,IACA,KAAA,EAAO,SAAA;AAAA,IACP,iBAAiB,YAAA,EAAc,eAAA;AAAA,IAC/B,QAAA,EAAU,YAAA,EAAc,QAAA,IAAY,EAAC;AAAA,IACrC,eAAe,YAAA,EAAc,aAAA;AAAA,IAC7B,qBAAqB,YAAA,EAAc;AAAA,GACrC;AACF;;;AC9BA,IAAM,gBAAA,GAAmB,IAAA;AAAA,EAAK,MAC5B,OAAO,6BAAgB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,YAAA,EAAa,CAAE;AACpE,CAAA;AAEO,IAAM,YAAA,GAAe;AAI5B,eAAe,MAAA,CACb,KACA,MAAA,EAI4B;AAC5B,EAAA,MAAM,OAAO,MAAM,cAAA,CAAe,EAAE,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA;AAExD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA;AACpC,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA,EAAM;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,IAAA,CAAK,KAAsB,IAAA,EAAyC;AAC3E,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,KAAA,EAAO,KAAK,IAAA,CAAK,KAAA;AAAA,IACjB,WAAA,EAAa,KAAK,IAAA,CAAK,WAAA;AAAA,IACvB,oBAAoB,uBAAA,CAAwB,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,SAAS,QAAQ;AAAA,GACjF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,QAAA,GAAW;AAAA,EACtB,IAAI,OAAA,CAAQ,SAAA;AAAA,EACZ,MAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,EAAW;AACb","file":"thank-you.js","sourcesContent":["import type { ThankYouPageProps, ThankYouLoaderParams } from './types';\nimport type { Order } from '../account/types';\nimport { order } from '../../api/order';\nimport { getTwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\nexport async function thankYouLoader({\n params,\n}: {\n params: ThankYouLoaderParams;\n}): Promise<ThankYouPageProps> {\n const orderId = params.orderId;\n\n // orders/{id} needs a customer token that guest checkout / tokenless SSR lacks (400\n // token_not_provided). Don't let that 500 the page — render whatever resolves.\n // ponytail: guest order detail needs checkout/thank-you to return the order; source it\n // here once that payload is confirmed on a correctly store-bound worker.\n const [orderResult, thankYouResult] = await Promise.allSettled([\n order.find(orderId),\n order.thankYou(orderId),\n ]);\n\n const orderData: Order | undefined =\n orderResult.status === 'fulfilled' ? orderResult.value.order : undefined;\n const thankYouData = thankYouResult.status === 'fulfilled' ? thankYouResult.value : undefined;\n\n const i18n = getTwilightContext().i18n;\n return {\n page: {\n slug: RouteId.THANK_YOU,\n id: orderData ? String(orderData.id) : orderId,\n title: i18n.t('common.titles.thank_you') || 'Thank You',\n },\n order: orderData,\n thank_you_title: thankYouData?.thank_you_title,\n messages: thankYouData?.messages ?? [],\n share_message: thankYouData?.share_message,\n short_share_message: thankYouData?.short_share_message,\n };\n}\n","import type { HeadDescriptor } from '../../utils/head';\nimport { buildHreflangAlternates } from '../../utils/baseHead';\nimport { lazy } from 'react';\nimport { thankYouLoader } from './loader';\nimport type { ThankYouPageProps, ThankYouLoaderParams } from './types';\nimport type { TwilightContext } from '../../twilight/context';\nimport { RouteId } from '../../router/route-ids';\n\n// Lazy-load component for code-splitting\nconst LazyThankYouPage = lazy(() =>\n import('./ThankYouPage').then((m) => ({ default: m.ThankYouPage }))\n);\n\nexport const ThankYouPage = LazyThankYouPage;\nexport { thankYouLoader } from './loader';\nexport type { ThankYouLoaderParams, ThankYouPageProps } from './types';\n\nasync function loader(\n ctx: { params: ThankYouLoaderParams; locale?: string },\n extend?: (\n data: ThankYouPageProps,\n ctx: { params: ThankYouLoaderParams }\n ) => Promise<Record<string, unknown>> | Record<string, unknown>\n): Promise<ThankYouPageProps> {\n const data = await thankYouLoader({ params: ctx.params });\n\n if (extend) {\n const extra = await extend(data, ctx);\n return { ...data, ...extra } as ThankYouPageProps;\n }\n return data;\n}\n\nfunction head(ctx: TwilightContext, data: ThankYouPageProps): HeadDescriptor {\n const base: HeadDescriptor = {\n title: data.page.title,\n description: data.page.description,\n alternateLanguages: buildHreflangAlternates(ctx.settings, ctx.location.pathname),\n };\n\n return base;\n}\n\nexport const ThankYou = {\n id: RouteId.THANK_YOU,\n loader,\n head,\n Component: LazyThankYouPage,\n} as const;\n"]}
package/dist/skeleton.js CHANGED
@@ -1,27 +1,28 @@
1
1
  export { BlogSkeleton, BreadcrumbSkeleton, CartSkeleton, CustomerLayoutSkeleton, CustomerPageSkeleton, PageSkeleton, ProductCardSkeleton, ProductDetailSkeleton, ProductGridSkeleton, SkeletonPulse } from './chunk-N7CCSGZF.js';
2
- export { HomeSkeleton } from './chunk-3644MRQI.js';
3
- import './chunk-QG2Q6HB5.js';
2
+ export { HomeSkeleton } from './chunk-L42W6YS3.js';
3
+ import './chunk-P4DUWQU4.js';
4
4
  import './chunk-TZ3E5BN4.js';
5
- import './chunk-CG3AM4DH.js';
6
- import './chunk-XLJPUFN4.js';
7
- import './chunk-G4M73JU5.js';
5
+ import './chunk-WITIL2MK.js';
6
+ import './chunk-CPQXPECC.js';
7
+ import './chunk-UQRLBMIO.js';
8
8
  import './chunk-342EPVXN.js';
9
- import './chunk-PNXUBS5X.js';
10
- import './chunk-UWWYR3UX.js';
9
+ import './chunk-DTWFNS3F.js';
10
+ import './chunk-65Z2ZDKZ.js';
11
11
  import './chunk-JKIRRMBU.js';
12
12
  import './chunk-2JV6WZ6O.js';
13
13
  import './chunk-6IATCGID.js';
14
- import './chunk-E5EH32L7.js';
14
+ import './chunk-3MHDV5JS.js';
15
15
  import './chunk-VVZNW5CB.js';
16
- import './chunk-6KI2QCPL.js';
17
- import './chunk-XLGVT7QF.js';
16
+ import './chunk-JD4J2ZB6.js';
17
+ import './chunk-JK77XRXR.js';
18
18
  import './chunk-MTONGOJD.js';
19
19
  import './chunk-C5X6CVXC.js';
20
- import './chunk-6MGDRMZM.js';
21
- import './chunk-RIZOT5FN.js';
22
- import './chunk-AZ5HAIYQ.js';
23
- import './chunk-JBXTU5NM.js';
24
- import './chunk-6XWMNQ52.js';
20
+ import './chunk-QKIQ3K24.js';
21
+ import './chunk-Z74NUTEI.js';
22
+ import './chunk-O6XXHXC4.js';
23
+ import './chunk-3FIWHGCZ.js';
24
+ import './chunk-XTMHHLNK.js';
25
+ import './chunk-PJWFEMBX.js';
25
26
  import './chunk-TP3LCGE7.js';
26
27
  import './chunk-Z653O7MX.js';
27
28
  import './chunk-ZCH7W7DZ.js';
@@ -37,7 +38,7 @@ import './chunk-YMVLYYLU.js';
37
38
  import './chunk-RJPPO3ET.js';
38
39
  import './chunk-Q7VWURUR.js';
39
40
  import './chunk-GU2KUQVD.js';
40
- import './chunk-G6F5DCCP.js';
41
+ import './chunk-LKBWIN26.js';
41
42
  import './chunk-AXW67SY7.js';
42
43
  import './chunk-BYMOPN2S.js';
43
44
  import './chunk-SKLEJJ6M.js';
@@ -1 +1 @@
1
- {"version":3,"file":"twilight.d.ts","sourceRoot":"","sources":["../../../src/tanstack/middleware/twilight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAYlE,UAAU,yBAAyB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,kBAAkB,GAAI,UAAU,yBAAyB,KAAG,oBA4BxE,CAAC"}
1
+ {"version":3,"file":"twilight.d.ts","sourceRoot":"","sources":["../../../src/tanstack/middleware/twilight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAYlE,UAAU,yBAAyB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,kBAAkB,GAAI,UAAU,yBAAyB,KAAG,oBAiCxE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/tanstack/router.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKpD,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAMnF,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAQhE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;CAC7D;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAqC7D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEzD;AAoED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,KAG7B,SAAS,GAAG,kRAOrB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,sCAkBhE;AAmHD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uBAAuB,CAAC,EAAE,CAAC,MAAM,SAAS,CAAC,GAAG,KAAK,CAAC;IACpD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,uGAgIzE;AAED,OAAO,QAAQ,wBAAwB,CAAC;IACtC,UAAU,QAAQ;QAChB,MAAM,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;KACzC;IAED,UAAU,aAAc,SAAQ,oBAAoB;KAAG;CACxD"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/tanstack/router.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKpD,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAMnF,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAUhE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;CAC7D;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAqC7D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEzD;AAoED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,KAG7B,SAAS,GAAG,kRAOrB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,sCAkBhE;AAmHD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uBAAuB,CAAC,EAAE,CAAC,MAAM,SAAS,CAAC,GAAG,KAAK,CAAC;IACpD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,uGAuIzE;AAED,OAAO,QAAQ,wBAAwB,CAAC;IACtC,UAAU,QAAQ;QAChB,MAAM,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;KACzC;IAED,UAAU,aAAc,SAAQ,oBAAoB;KAAG;CACxD"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @fileoverview The store segment, carried by the router instead of the route tree.
3
+ *
4
+ * TanStack Router rewrites every location it reads and every one it writes:
5
+ * `input` runs before a URL is matched, and `output` before an href is rendered,
6
+ * pushed to history or sent as a redirect's `Location`. So on a host where the
7
+ * store is the root, the route tree stays `/{-$locale}/cart` and
8
+ * `<Link to="/cart">` renders `/mtgr-alaatr-2/cart` by itself.
9
+ *
10
+ * Why not the router's `basepath`: TanStack Start overwrites it from the build on
11
+ * both sides (`router.update({ basepath })` per request on the server, and in
12
+ * `hydrateStart` on the client). `rewrite` is a separate option that the router
13
+ * composes with that basepath, so it survives. Server functions are dispatched on
14
+ * the raw URL before the router runs, and assets are root-absolute, so neither
15
+ * moves. See `docs/store-base-path.md`.
16
+ */
17
+ import type { LocationRewrite } from '@tanstack/react-router';
18
+ /** A rewrite that serves the application from `/<base>`. */
19
+ export declare function storeBaseRewrite(base: string): LocationRewrite;
20
+ //# sourceMappingURL=store-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-base.d.ts","sourceRoot":"","sources":["../../src/tanstack/store-base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAW9D"}
package/dist/tanstack.js CHANGED
@@ -1,23 +1,24 @@
1
- import { rootHead } from './chunk-MLIJWD6B.js';
2
- export { tanstackDocumentAdapter as attrs, createRouter, createTwilightRootRoute, useTanstackDocumentAttrs as useAttrs } from './chunk-MLIJWD6B.js';
3
- export { TanStackLinkAdapter, TanStackNavigationProvider, createTanStackLinkAdapter } from './chunk-BWIESZJK.js';
1
+ import { rootHead } from './chunk-QVPMWMPP.js';
2
+ export { tanstackDocumentAdapter as attrs, createRouter, createTwilightRootRoute, useTanstackDocumentAttrs as useAttrs } from './chunk-QVPMWMPP.js';
3
+ export { TanStackLinkAdapter, TanStackNavigationProvider, createTanStackLinkAdapter } from './chunk-QUUSMVCP.js';
4
4
  import './chunk-Z4Y55HWX.js';
5
- export { tanstackHeadAdapter as head, withHead } from './chunk-5TRRUV7N.js';
6
- import './chunk-X26WB7AG.js';
5
+ export { tanstackHeadAdapter as head, withHead } from './chunk-4D44TJ72.js';
6
+ import './chunk-R6M6RM6U.js';
7
7
  import './chunk-B3EFOE57.js';
8
- import './chunk-2KZORZZN.js';
9
- import './chunk-XTOXFAP7.js';
8
+ import './chunk-WMSOSA74.js';
9
+ import './chunk-KT2MUSRN.js';
10
10
  import './chunk-TZ3E5BN4.js';
11
- import './chunk-XLJPUFN4.js';
11
+ import './chunk-CPQXPECC.js';
12
12
  import './chunk-6IATCGID.js';
13
- import './chunk-E5EH32L7.js';
14
- import './chunk-6KI2QCPL.js';
15
- import './chunk-XLGVT7QF.js';
13
+ import './chunk-3MHDV5JS.js';
14
+ import './chunk-JD4J2ZB6.js';
15
+ import './chunk-JK77XRXR.js';
16
16
  import './chunk-MTONGOJD.js';
17
- import './chunk-AZ5HAIYQ.js';
18
- import { AUTH_TOKEN_COOKIE_NAME, extractTokenFromCookies, extractScopeFromCookies, resolveRequestStoreId, resolveRequestVersionId } from './chunk-JBXTU5NM.js';
19
- import { runWithTwilightContext } from './chunk-6XWMNQ52.js';
20
- export { getTwilightContext, runWithTwilightContext, updateTwilightContext } from './chunk-6XWMNQ52.js';
17
+ import './chunk-O6XXHXC4.js';
18
+ import './chunk-3FIWHGCZ.js';
19
+ import { AUTH_TOKEN_COOKIE_NAME, extractTokenFromCookies, extractScopeFromCookies, resolveRequestStore, resolveRequestVersionId } from './chunk-XTMHHLNK.js';
20
+ import { runWithTwilightContext } from './chunk-PJWFEMBX.js';
21
+ export { getTwilightContext, runWithTwilightContext, updateTwilightContext } from './chunk-PJWFEMBX.js';
21
22
  import './chunk-JWXJPJBO.js';
22
23
  export { mergeDocumentDescriptors as mergeAttrs } from './chunk-CW625T2E.js';
23
24
  import './chunk-TYNZ5B2B.js';
@@ -46,10 +47,10 @@ var twilightMiddleware = (options) => {
46
47
  const authToken = extractTokenFromCookies(cookieHeader, cookieName);
47
48
  const scope = extractScopeFromCookies(cookieHeader);
48
49
  const requestHost = requestHostOf(request);
49
- const storeId = resolveRequestStoreId(request.url, cookieHeader, requestHost);
50
+ const { storeId, storeBase } = resolveRequestStore(request.url, cookieHeader, requestHost);
50
51
  const versionId = resolveRequestVersionId(request.url, cookieHeader, requestHost);
51
52
  return runWithTwilightContext(
52
- { authToken, scope, storeId, versionId, requestHost },
53
+ { authToken, scope, storeId, storeBase, versionId, requestHost },
53
54
  () => next({ context: { authToken } })
54
55
  );
55
56
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/request-host.ts","../src/tanstack/middleware/twilight.ts","../src/tanstack/middleware/earlyHints.ts"],"names":["createMiddleware"],"mappings":"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","file":"tanstack.js","sourcesContent":["/**\n * What the request itself is enough to describe: its host.\n *\n * Small, and deliberately its own module rather than a helper inside the\n * middleware. This value decides two things — which store a live storefront is,\n * and whether the request is allowed to name a store at all — so it is worth\n * testing directly instead of only through the wiring that calls it.\n */\n\n/** The part of a `Request` this needs, so a test does not have to build a whole one. */\nexport interface HostSource {\n url: string;\n headers: { get(name: string): string | null };\n}\n\n/**\n * The host this request arrived on, with its port when it has one.\n *\n * Taken from the request URL, which in a Worker is the address the platform\n * actually routed on, and from the `Host` header only when that fails.\n *\n * **`X-Forwarded-Host` is deliberately not consulted.** A client can set it, and\n * this value gates `allowsRequestStoreId` — so honouring it would be a way to\n * talk a merchant's own domain into behaving like the preview host, and from\n * there into serving a stranger's shop. The dispatcher strips that header today;\n * a theme must not be one edit to another repository's allowlist away from a\n * spoofable identity.\n */\nexport function requestHostOf(request: HostSource): string | null {\n try {\n const fromUrl = new URL(request.url).host;\n if (fromUrl) return fromUrl;\n } catch {\n /* an unparseable URL falls through to the header */\n }\n\n return request.headers.get('Host')?.trim() || null;\n}\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport {\n extractTokenFromCookies,\n extractScopeFromCookies,\n resolveRequestStoreId,\n resolveRequestVersionId,\n AUTH_TOKEN_COOKIE_NAME,\n} from '../../utils/cookies';\nimport { runWithTwilightContext } from '../../twilight/context';\nimport { requestHostOf } from '../../utils/request-host';\n\ninterface TwilightMiddlewareOptions {\n cookieName?: string;\n}\n\nexport const twilightMiddleware = (options?: TwilightMiddlewareOptions): AnyRequestMiddleware => {\n const cookieName = options?.cookieName ?? AUTH_TOKEN_COOKIE_NAME;\n\n return createMiddleware().server(({ request, next }) => {\n const cookieHeader = request.headers.get('Cookie');\n const authToken = extractTokenFromCookies(cookieHeader, cookieName);\n const scope = extractScopeFromCookies(cookieHeader);\n const requestHost = requestHostOf(request);\n // Read here and nowhere else: a deployed theme worker has no vars and no\n // bindings, so the request is the only thing that knows which store it is\n // serving. Everything downstream reads it off the context rather than\n // reaching for a build-time constant that is not there in production.\n //\n // The host goes in because it decides whether the request is allowed to name\n // a store at all. On a merchant's own domain it is not: the hostname is the\n // store, and `?storeId=` there would serve a stranger's shop from a domain\n // its owner controls.\n const storeId = resolveRequestStoreId(request.url, cookieHeader, requestHost);\n // The version is read here for the same reason and behind the same gate. A\n // theme editor previews a draft version of a merchant's settings before it is\n // published, and a partner running the theme locally renders against one —\n // both open the storefront in an iframe and say which version in the URL.\n const versionId = resolveRequestVersionId(request.url, cookieHeader, requestHost);\n\n return runWithTwilightContext({ authToken, scope, storeId, versionId, requestHost }, () =>\n next({ context: { authToken } })\n );\n });\n};\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport { tsrStartManifest } from 'tanstack-start-manifest:v';\nimport { rootHead } from '../../routes/root/head';\n\n/** Known critical assets that should always be preloaded */\nconst CRITICAL_ASSETS = [\n { rel: 'modulepreload', href: 'https://cdn.assets.salla.network/static/lit/3.3.3/lit.js' },\n { rel: 'preconnect', href: 'https://api.salla.dev' },\n { rel: 'preconnect', href: 'https://cdn.salla.sa' },\n { rel: 'preconnect', href: 'https://cdn.assets.salla.network', crossOrigin: 'anonymous' },\n { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossOrigin: 'anonymous' },\n] as const;\n\n/** Extract locale from URL path (e.g., /ar/products → 'ar') */\nfunction extractLocale(url: string): string | undefined {\n const match = url.match(/^\\/([a-z]{2})(\\/|$)/);\n return match?.[1];\n}\n\n/** Build Link header value from a link descriptor */\nfunction buildLinkHeader(link: Record<string, unknown>): string | null {\n const href = link.href as string | undefined;\n const rel = link.rel as string | undefined;\n if (!href || !rel) return null;\n\n // Skip print-media stylesheets (already non-blocking)\n if (rel === 'stylesheet') {\n const media = link.media as string | undefined;\n if (media === 'print') return null;\n return `<${href}>; rel=preload; as=style`;\n }\n\n if (rel === 'preload') {\n const asType = link.as as string | undefined;\n if (!asType) return null;\n const parts = [`<${href}>`, 'rel=preload', `as=${asType}`];\n if (asType === 'font' || link.crossOrigin) {\n parts.push('crossorigin');\n }\n return parts.join('; ');\n }\n\n if (rel === 'modulepreload') {\n return `<${href}>; rel=modulepreload`;\n }\n\n return null;\n}\n\nexport const earlyHintsMiddleware = (): AnyRequestMiddleware => {\n let cachedManifestPaths: string[] | null = null;\n\n return createMiddleware().server(async ({ request, next }) => {\n const response = await next();\n\n const accept = request.headers.get('Accept') ?? '';\n if (!accept.includes('text/html') && accept !== '*/*') return response;\n if (!(response instanceof Response)) return response;\n\n const linkHeaders: string[] = [];\n\n // 1. Add critical assets from rootHead (fonts, icons, SDK, etc.)\n try {\n const url = new URL(request.url);\n const locale = extractLocale(url.pathname);\n if (locale) {\n const headResult = rootHead({ params: { locale } });\n const links = (headResult.links as Record<string, unknown>[]) ?? [];\n for (const link of links) {\n const header = buildLinkHeader(link);\n if (header) linkHeaders.push(header);\n }\n }\n } catch (e) {\n // rootHead failed — log why, then fall back to known critical assets\n console.warn('[earlyHints] rootHead failed:', e instanceof Error ? e.message : e);\n for (const asset of CRITICAL_ASSETS) {\n const co = 'crossOrigin' in asset ? asset.crossOrigin : undefined;\n linkHeaders.push(`<${asset.href}>; rel=${asset.rel}${co ? '; crossorigin' : ''}`);\n }\n }\n\n // 2. Add CSS from TanStack Start manifest (bundled theme CSS)\n if (!cachedManifestPaths) {\n try {\n const manifest = tsrStartManifest();\n const rootAssets = manifest.routes['__root__']?.assets ?? [];\n const seen = new Set<string>();\n cachedManifestPaths = [];\n for (const asset of rootAssets) {\n if (asset.tag === 'link' && asset.attrs?.href?.endsWith('.css')) {\n if (!seen.has(asset.attrs.href)) {\n seen.add(asset.attrs.href);\n cachedManifestPaths.push(asset.attrs.href);\n }\n }\n }\n } catch (e) {\n // manifest not available — skip\n console.warn('[earlyHints] tsrStartManifest failed:', e instanceof Error ? e.message : e);\n }\n }\n\n if (cachedManifestPaths) {\n for (const href of cachedManifestPaths) {\n linkHeaders.push(`<${href}>; rel=preload; as=style`);\n }\n }\n\n // Apply Link headers if we have any\n if (linkHeaders.length === 0) {\n console.warn('[earlyHints] no critical assets found — no Link headers added');\n return response;\n }\n\n const headers = new Headers(response.headers);\n for (const linkHeader of linkHeaders) {\n headers.append('Link', linkHeader);\n }\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n });\n};\n"]}
1
+ {"version":3,"sources":["../src/utils/request-host.ts","../src/tanstack/middleware/twilight.ts","../src/tanstack/middleware/earlyHints.ts"],"names":["createMiddleware"],"mappings":"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","file":"tanstack.js","sourcesContent":["/**\n * What the request itself is enough to describe: its host.\n *\n * Small, and deliberately its own module rather than a helper inside the\n * middleware. This value decides two things — which store a live storefront is,\n * and whether the request is allowed to name a store at all — so it is worth\n * testing directly instead of only through the wiring that calls it.\n */\n\n/** The part of a `Request` this needs, so a test does not have to build a whole one. */\nexport interface HostSource {\n url: string;\n headers: { get(name: string): string | null };\n}\n\n/**\n * The host this request arrived on, with its port when it has one.\n *\n * Taken from the request URL, which in a Worker is the address the platform\n * actually routed on, and from the `Host` header only when that fails.\n *\n * **`X-Forwarded-Host` is deliberately not consulted.** A client can set it, and\n * this value gates `allowsRequestStoreId` — so honouring it would be a way to\n * talk a merchant's own domain into behaving like the preview host, and from\n * there into serving a stranger's shop. The dispatcher strips that header today;\n * a theme must not be one edit to another repository's allowlist away from a\n * spoofable identity.\n */\nexport function requestHostOf(request: HostSource): string | null {\n try {\n const fromUrl = new URL(request.url).host;\n if (fromUrl) return fromUrl;\n } catch {\n /* an unparseable URL falls through to the header */\n }\n\n return request.headers.get('Host')?.trim() || null;\n}\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport {\n extractTokenFromCookies,\n extractScopeFromCookies,\n resolveRequestStore,\n resolveRequestVersionId,\n AUTH_TOKEN_COOKIE_NAME,\n} from '../../utils/cookies';\nimport { runWithTwilightContext } from '../../twilight/context';\nimport { requestHostOf } from '../../utils/request-host';\n\ninterface TwilightMiddlewareOptions {\n cookieName?: string;\n}\n\nexport const twilightMiddleware = (options?: TwilightMiddlewareOptions): AnyRequestMiddleware => {\n const cookieName = options?.cookieName ?? AUTH_TOKEN_COOKIE_NAME;\n\n return createMiddleware().server(({ request, next }) => {\n const cookieHeader = request.headers.get('Cookie');\n const authToken = extractTokenFromCookies(cookieHeader, cookieName);\n const scope = extractScopeFromCookies(cookieHeader);\n const requestHost = requestHostOf(request);\n // Read here and nowhere else: a deployed theme worker has no vars and no\n // bindings, so the request is the only thing that knows which store it is\n // serving. Everything downstream reads it off the context rather than\n // reaching for a build-time constant that is not there in production.\n //\n // The host goes in because it decides whether the request is allowed to name\n // a store at all. On a merchant's own domain it is not: the hostname is the\n // store, and `?storeId=` there would serve a stranger's shop from a domain\n // its owner controls.\n //\n // On those same hosts the store is also the first segment of the path, the\n // root of every URL there, and a store named that way takes the cookie's\n // place: the path is the address the visitor can see.\n const { storeId, storeBase } = resolveRequestStore(request.url, cookieHeader, requestHost);\n // The version is read here for the same reason and behind the same gate. A\n // theme editor previews a draft version of a merchant's settings before it is\n // published, and a partner running the theme locally renders against one —\n // both open the storefront in an iframe and say which version in the URL.\n const versionId = resolveRequestVersionId(request.url, cookieHeader, requestHost);\n\n return runWithTwilightContext(\n { authToken, scope, storeId, storeBase, versionId, requestHost },\n () => next({ context: { authToken } })\n );\n });\n};\n","import type { AnyRequestMiddleware } from '@tanstack/react-start';\nimport { createMiddleware } from '@tanstack/react-start';\nimport { tsrStartManifest } from 'tanstack-start-manifest:v';\nimport { rootHead } from '../../routes/root/head';\n\n/** Known critical assets that should always be preloaded */\nconst CRITICAL_ASSETS = [\n { rel: 'modulepreload', href: 'https://cdn.assets.salla.network/static/lit/3.3.3/lit.js' },\n { rel: 'preconnect', href: 'https://api.salla.dev' },\n { rel: 'preconnect', href: 'https://cdn.salla.sa' },\n { rel: 'preconnect', href: 'https://cdn.assets.salla.network', crossOrigin: 'anonymous' },\n { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossOrigin: 'anonymous' },\n] as const;\n\n/** Extract locale from URL path (e.g., /ar/products → 'ar') */\nfunction extractLocale(url: string): string | undefined {\n const match = url.match(/^\\/([a-z]{2})(\\/|$)/);\n return match?.[1];\n}\n\n/** Build Link header value from a link descriptor */\nfunction buildLinkHeader(link: Record<string, unknown>): string | null {\n const href = link.href as string | undefined;\n const rel = link.rel as string | undefined;\n if (!href || !rel) return null;\n\n // Skip print-media stylesheets (already non-blocking)\n if (rel === 'stylesheet') {\n const media = link.media as string | undefined;\n if (media === 'print') return null;\n return `<${href}>; rel=preload; as=style`;\n }\n\n if (rel === 'preload') {\n const asType = link.as as string | undefined;\n if (!asType) return null;\n const parts = [`<${href}>`, 'rel=preload', `as=${asType}`];\n if (asType === 'font' || link.crossOrigin) {\n parts.push('crossorigin');\n }\n return parts.join('; ');\n }\n\n if (rel === 'modulepreload') {\n return `<${href}>; rel=modulepreload`;\n }\n\n return null;\n}\n\nexport const earlyHintsMiddleware = (): AnyRequestMiddleware => {\n let cachedManifestPaths: string[] | null = null;\n\n return createMiddleware().server(async ({ request, next }) => {\n const response = await next();\n\n const accept = request.headers.get('Accept') ?? '';\n if (!accept.includes('text/html') && accept !== '*/*') return response;\n if (!(response instanceof Response)) return response;\n\n const linkHeaders: string[] = [];\n\n // 1. Add critical assets from rootHead (fonts, icons, SDK, etc.)\n try {\n const url = new URL(request.url);\n const locale = extractLocale(url.pathname);\n if (locale) {\n const headResult = rootHead({ params: { locale } });\n const links = (headResult.links as Record<string, unknown>[]) ?? [];\n for (const link of links) {\n const header = buildLinkHeader(link);\n if (header) linkHeaders.push(header);\n }\n }\n } catch (e) {\n // rootHead failed — log why, then fall back to known critical assets\n console.warn('[earlyHints] rootHead failed:', e instanceof Error ? e.message : e);\n for (const asset of CRITICAL_ASSETS) {\n const co = 'crossOrigin' in asset ? asset.crossOrigin : undefined;\n linkHeaders.push(`<${asset.href}>; rel=${asset.rel}${co ? '; crossorigin' : ''}`);\n }\n }\n\n // 2. Add CSS from TanStack Start manifest (bundled theme CSS)\n if (!cachedManifestPaths) {\n try {\n const manifest = tsrStartManifest();\n const rootAssets = manifest.routes['__root__']?.assets ?? [];\n const seen = new Set<string>();\n cachedManifestPaths = [];\n for (const asset of rootAssets) {\n if (asset.tag === 'link' && asset.attrs?.href?.endsWith('.css')) {\n if (!seen.has(asset.attrs.href)) {\n seen.add(asset.attrs.href);\n cachedManifestPaths.push(asset.attrs.href);\n }\n }\n }\n } catch (e) {\n // manifest not available — skip\n console.warn('[earlyHints] tsrStartManifest failed:', e instanceof Error ? e.message : e);\n }\n }\n\n if (cachedManifestPaths) {\n for (const href of cachedManifestPaths) {\n linkHeaders.push(`<${href}>; rel=preload; as=style`);\n }\n }\n\n // Apply Link headers if we have any\n if (linkHeaders.length === 0) {\n console.warn('[earlyHints] no critical assets found — no Link headers added');\n return response;\n }\n\n const headers = new Headers(response.headers);\n for (const linkHeader of linkHeaders) {\n headers.append('Link', linkHeader);\n }\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n });\n};\n"]}
@@ -49,6 +49,15 @@ export interface TwilightContext {
49
49
  * nothing to carry. See {@link resolveRequestStoreId}.
50
50
  */
51
51
  storeId: string | null;
52
+ /**
53
+ * Which store the first segment of this request's path named, on a host where
54
+ * the store is the root of every URL: `mtgr-alaatr-2` for
55
+ * `https://preview.salla.design/mtgr-alaatr-2/cart`.
56
+ *
57
+ * Null whenever something else named the store, and on every merchant domain.
58
+ * See {@link resolveRequestStoreBase}.
59
+ */
60
+ storeBase: string | null;
52
61
  /**
53
62
  * Which version of the theme's settings this request asked for — the
54
63
  * `?versionId=` an editor preview or a local dev session was opened with, or
@@ -94,6 +103,7 @@ export declare function hasTwilightSettings(): boolean;
94
103
  /** What a request addressed, as opposed to what it is. */
95
104
  export interface RequestAddressing {
96
105
  storeId: string | null;
106
+ storeBase: string | null;
97
107
  versionId: string | null;
98
108
  requestHost: string | null;
99
109
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/twilight/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/twilight/context.ts"],"names":[],"mappings":"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"}
@@ -115,6 +115,62 @@ export declare function hostIdentifiesStore(host: string | null | undefined): bo
115
115
  * just typed.
116
116
  */
117
117
  export declare function resolveRequestStoreId(url: string, cookieHeader: string | null, host: string | null | undefined): string | null;
118
+ /**
119
+ * Whether this could be a store's username in the first segment of a path.
120
+ *
121
+ * A supported locale code never is, in any case: `/ar` and `/EN` are languages,
122
+ * so `preview.salla.design/en/cart` is the English cart of the store the cookie
123
+ * names. That makes a store whose username is a locale code (`ar` is one)
124
+ * unreachable by path; `?storeId=` still reaches it.
125
+ *
126
+ * The same predicate decides whether a username may become a path's root
127
+ * (`storeBaseRedirectHref`). That is what stops the redirect from looping: a
128
+ * store called `ar`, sent to `/ar/…`, would find no store there and be sent again.
129
+ */
130
+ export declare function isStoreBaseSegment(value: string | null | undefined): value is string;
131
+ /**
132
+ * The store the first segment of this request's path names, on a host permitted
133
+ * to name one.
134
+ *
135
+ * On such a host the first segment **is** the store. It is the root of the
136
+ * application there, so `https://preview.salla.design/mtgr-alaatr-2/cart` is the
137
+ * cart of the store whose username is `mtgr-alaatr-2`. This is a rule rather than
138
+ * a guess, and it has to be: `cart`, `offers` and `search` are all real store
139
+ * usernames, so a store cannot be told from a page by looking at the segment.
140
+ * `/cart` on these hosts is the store called `cart`.
141
+ *
142
+ * The one segment that is not a store is a supported locale code (see
143
+ * {@link isStoreBaseSegment}). `/ar/cart` names a language, and the store comes
144
+ * from the cookie or `VITE_STORE_DOMAIN`, as it would at `/`.
145
+ *
146
+ * A URL that carries `storeId` is not read this way at all, whatever its value.
147
+ * That is how `salla theme dev` names a store (`/ar?storeId=…`), on a path that
148
+ * begins with a page; the root loader then redirects to the store's own address.
149
+ * Checking for a *valid* id instead would let a malformed one hand the page's
150
+ * first segment the store's job. (On the preview host the dispatcher removes the
151
+ * parameter and sends a cookie; the editor opens that host at `/`, where there is
152
+ * no segment to read.)
153
+ *
154
+ * Same gate as {@link resolveRequestStoreId}, for the same reason: on a merchant's
155
+ * own domain the hostname is the store and the path is only ever a page.
156
+ */
157
+ export declare function resolveRequestStoreBase(url: string, host: string | null | undefined): string | null;
158
+ /** Which store a request addressed, and how. At most one of the two is set. */
159
+ export interface RequestStore {
160
+ /** Named by `?storeId=`, or by the cookie remembering it. */
161
+ storeId: string | null;
162
+ /** Named by the first segment of the path. */
163
+ storeBase: string | null;
164
+ }
165
+ /**
166
+ * The store this request addressed: the query, then the path, then the cookie.
167
+ *
168
+ * The path outranks the cookie because it is the address the visitor can see.
169
+ * The cookie is one value for the whole preview host, so with two stores open in
170
+ * two tabs it names whichever was opened last; the path names the one in front
171
+ * of them.
172
+ */
173
+ export declare function resolveRequestStore(url: string, cookieHeader: string | null, host: string | null | undefined): RequestStore;
118
174
  /**
119
175
  * The theme-settings version this request names, on a host permitted to name one.
120
176
  *
@@ -1 +1 @@
1
- {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAC9C,eAAO,MAAM,iBAAiB,UAAU,CAAC;AAEzC;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,oBAAoB,cAAc,CAAC;AAEhD,6EAA6E;AAC7E,eAAO,MAAM,cAAc,YAAY,CAAC;AAExC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,sBAAsB,cAAc,CAAC;AAElD,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAmB5C,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAE1E;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAE5E;AAED,wFAAwF;AACxF,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAEpF;AAED,0FAA0F;AAC1F,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAEtF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAA6B,CAAC;AAoB1E;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAI7E;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE5E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,GAAG,IAAI,CAEf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,MAAM,GAAG,IAAI,CAEf;AA2BD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C;AAED,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CA2Bf;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAeD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAQvF;AAED,yDAAyD;AACzD,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAEpF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,WAAW,GAAG,IAAI,GAAG,SAAS,CAI7D;AAED,oFAAoF;AACpF,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,GAAG,SAAS,CAG1D;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAYnE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC"}
1
+ {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,14 @@
1
1
  export { stripUnsafeHtml } from '../chunk-RUHSV4Z6.js';
2
2
  export { formatSallaPlural } from '../chunk-BT6HEEAP.js';
3
- export { dispatchRouteChanged } from '../chunk-X26WB7AG.js';
3
+ export { dispatchRouteChanged } from '../chunk-R6M6RM6U.js';
4
4
  export { mergeHead, resolveHead, setHeadAdapter } from '../chunk-B3EFOE57.js';
5
5
  export { sortOptions } from '../chunk-6Z4MOC4S.js';
6
6
  export { buildBaseHead, buildHreflangAlternates, localeToOgLocale } from '../chunk-TZ3E5BN4.js';
7
7
  export { color } from '../chunk-VVZNW5CB.js';
8
- export { applyAppScopeMocks, registerThemeHookSlots } from '../chunk-6KI2QCPL.js';
9
- export { AUTH_TOKEN_COOKIE_NAME, clearAuthTokenCookie, extractTokenFromCookies, getSallaSDK, getStoreIdentifier } from '../chunk-JBXTU5NM.js';
10
- import '../chunk-6XWMNQ52.js';
8
+ export { applyAppScopeMocks, registerThemeHookSlots } from '../chunk-JD4J2ZB6.js';
9
+ export { getSallaSDK, getStoreIdentifier } from '../chunk-3FIWHGCZ.js';
10
+ export { AUTH_TOKEN_COOKIE_NAME, clearAuthTokenCookie, extractTokenFromCookies } from '../chunk-XTMHHLNK.js';
11
+ import '../chunk-PJWFEMBX.js';
11
12
  export { asset, cdn, isPlaceholder } from '../chunk-ZCH7W7DZ.js';
12
13
  export { mergeDocumentDescriptors, mergeElementAttrs, normalizeClasses, syncAttrsToElement, toReactProps } from '../chunk-CW625T2E.js';
13
14
  import '../chunk-T72DAX7R.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/device.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AASO,SAAS,WAAA,GAAwB;AACtC,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,OAAA;AAC7C,EAAA,MAAM,EAAA,GAAK,UAAU,SAAA,IAAa,EAAA;AAClC,EAAA,IAAI,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,SAAA;AAEhC,EAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA,IAAM,WAAA,CAAY,KAAK,EAAE,CAAA,IAAK,SAAA,CAAU,cAAA,GAAiB,CAAA,EAAI;AACzF,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA;AACT;AAWO,SAAS,kBAAA,CACd,IAAA,EACA,EAAA,GAAe,WAAA,EAAY,EACP;AACpB,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI,EAAA,KAAO,SAAA,EAAW,OAAO,IAAA,CAAK,cAAc,IAAA,CAAK,QAAA;AACrD,EAAA,OAAO,IAAA,CAAK,YAAY,IAAA,CAAK,UAAA;AAC/B","file":"index.js","sourcesContent":["import type { StoreApps } from '../types';\n\n/** The visitor's mobile operating system, or `'other'` (desktop/unknown/server). */\nexport type MobileOS = 'ios' | 'android' | 'other';\n\n/**\n * Detects the current mobile OS from the User-Agent.\n * Returns `'other'` on the server (no `navigator`) and on desktop/unknown agents.\n */\nexport function getMobileOS(): MobileOS {\n if (typeof navigator === 'undefined') return 'other';\n const ua = navigator.userAgent || '';\n if (/android/i.test(ua)) return 'android';\n // iOS, incl. iPadOS which reports a desktop \"Macintosh\" UA but exposes touch\n if (/iPad|iPhone|iPod/.test(ua) || (/Macintosh/.test(ua) && navigator.maxTouchPoints > 1)) {\n return 'ios';\n }\n return 'other';\n}\n\n/**\n * Picks the mobile-app store URL for the given OS:\n * - `ios` → App Store, falling back to Google Play\n * - `android` → Google Play, falling back to App Store\n * - `other` → App Store, falling back to Google Play\n *\n * `os` defaults to {@link getMobileOS}; pass `'other'` during SSR/first render\n * to keep the output stable and avoid a hydration mismatch on the resolved URL.\n */\nexport function resolveAppStoreUrl(\n apps?: StoreApps,\n os: MobileOS = getMobileOS()\n): string | undefined {\n if (!apps) return undefined;\n if (os === 'android') return apps.googleplay || apps.appstore;\n return apps.appstore || apps.googleplay;\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/device.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AASO,SAAS,WAAA,GAAwB;AACtC,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,OAAA;AAC7C,EAAA,MAAM,EAAA,GAAK,UAAU,SAAA,IAAa,EAAA;AAClC,EAAA,IAAI,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,SAAA;AAEhC,EAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAA,IAAM,WAAA,CAAY,KAAK,EAAE,CAAA,IAAK,SAAA,CAAU,cAAA,GAAiB,CAAA,EAAI;AACzF,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA;AACT;AAWO,SAAS,kBAAA,CACd,IAAA,EACA,EAAA,GAAe,WAAA,EAAY,EACP;AACpB,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI,EAAA,KAAO,SAAA,EAAW,OAAO,IAAA,CAAK,cAAc,IAAA,CAAK,QAAA;AACrD,EAAA,OAAO,IAAA,CAAK,YAAY,IAAA,CAAK,UAAA;AAC/B","file":"index.js","sourcesContent":["import type { StoreApps } from '../types';\n\n/** The visitor's mobile operating system, or `'other'` (desktop/unknown/server). */\nexport type MobileOS = 'ios' | 'android' | 'other';\n\n/**\n * Detects the current mobile OS from the User-Agent.\n * Returns `'other'` on the server (no `navigator`) and on desktop/unknown agents.\n */\nexport function getMobileOS(): MobileOS {\n if (typeof navigator === 'undefined') return 'other';\n const ua = navigator.userAgent || '';\n if (/android/i.test(ua)) return 'android';\n // iOS, incl. iPadOS which reports a desktop \"Macintosh\" UA but exposes touch\n if (/iPad|iPhone|iPod/.test(ua) || (/Macintosh/.test(ua) && navigator.maxTouchPoints > 1)) {\n return 'ios';\n }\n return 'other';\n}\n\n/**\n * Picks the mobile-app store URL for the given OS:\n * - `ios` → App Store, falling back to Google Play\n * - `android` → Google Play, falling back to App Store\n * - `other` → App Store, falling back to Google Play\n *\n * `os` defaults to {@link getMobileOS}; pass `'other'` during SSR/first render\n * to keep the output stable and avoid a hydration mismatch on the resolved URL.\n */\nexport function resolveAppStoreUrl(\n apps?: StoreApps,\n os: MobileOS = getMobileOS()\n): string | undefined {\n if (!apps) return undefined;\n if (os === 'android') return apps.googleplay || apps.appstore;\n return apps.appstore || apps.googleplay;\n}\n"]}
@@ -17,6 +17,17 @@ export interface RuntimeEnv {
17
17
  * script entirely rather than publishing a value that means "live".
18
18
  */
19
19
  versionId?: string;
20
+ /**
21
+ * The store segment at the root of this page's paths, when the store is
22
+ * addressed that way — see `resolveStoreBase`.
23
+ *
24
+ * Published because the browser's address is not always the URL the server
25
+ * read: the dispatcher removes `?storeId=` from the request it forwards but not
26
+ * from the address bar, and a URL carrying it is never read for a segment. The
27
+ * client builds its router from this, and a router that disagreed with the
28
+ * server about the root would hydrate a different page.
29
+ */
30
+ storeBase?: string;
20
31
  }
21
32
  /**
22
33
  * A build-time `import.meta.env` var, falling back to the worker's runtime `process.env`
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-env.d.ts","sourceRoot":"","sources":["../../src/utils/runtime-env.ts"],"names":[],"mappings":"AAOA,qFAAqF;AACrF,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUvD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,CAqB9C;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,UAAU,CAGlD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,UAAgC,GAAG,MAAM,GAAG,IAAI,CAK3F"}
1
+ {"version":3,"file":"runtime-env.d.ts","sourceRoot":"","sources":["../../src/utils/runtime-env.ts"],"names":[],"mappings":"AAOA,qFAAqF;AACrF,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUvD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,CAyB9C;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,UAAU,CAGlD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,UAAgC,GAAG,MAAM,GAAG,IAAI,CAK3F"}