@vtex/faststore 0.0.6 → 0.0.8

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 (488) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/dist/actions.json +152 -1
  3. package/dist/catalog.json +2541 -1278
  4. package/dist/cli/UnreachableCaseError-Crd168Vu.js +10 -0
  5. package/dist/cli/UnreachableCaseError-Crd168Vu.js.map +1 -0
  6. package/dist/cli/cacheControl-CEojH_TM.js +158 -0
  7. package/dist/cli/cacheControl-CEojH_TM.js.map +1 -0
  8. package/dist/cli/cachePolicy-m2vASMRW.js +26 -0
  9. package/dist/cli/cachePolicy-m2vASMRW.js.map +1 -0
  10. package/dist/cli/computeCoreSchemaHash-DPJZj-qJ.js +10 -0
  11. package/dist/cli/computeCoreSchemaHash-DPJZj-qJ.js.map +1 -0
  12. package/dist/cli/default-BCQHcwbL.js +253 -0
  13. package/dist/cli/default-BCQHcwbL.js.map +1 -0
  14. package/dist/cli/disableSuggestions-yO9UqiWn.js +21 -0
  15. package/dist/cli/disableSuggestions-yO9UqiWn.js.map +1 -0
  16. package/dist/cli/dist-C1JhdHfo.js +2001 -0
  17. package/dist/cli/dist-C1JhdHfo.js.map +1 -0
  18. package/dist/cli/graphql-DG9thCDG.js +14589 -0
  19. package/dist/cli/graphql-DG9thCDG.js.map +1 -0
  20. package/dist/cli/index.d.ts +799 -0
  21. package/dist/cli/index.js +36459 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/cli/index.min-BsIHDfFK.js +613 -0
  24. package/dist/cli/index.min-BsIHDfFK.js.map +1 -0
  25. package/dist/cli/inlineTrace-uLgOJ3TH.js +52 -0
  26. package/dist/cli/inlineTrace-uLgOJ3TH.js.map +1 -0
  27. package/dist/cli/internalPlugin-DnuwN4_4.js +11 -0
  28. package/dist/cli/internalPlugin-DnuwN4_4.js.map +1 -0
  29. package/dist/cli/packageVersion-DQAnIEil.js +6 -0
  30. package/dist/cli/packageVersion-DQAnIEil.js.map +1 -0
  31. package/dist/cli/rolldown-runtime-BMI-E3GI.js +44 -0
  32. package/dist/cli/schemaIsSubgraph-DoGh3OYj.js +17 -0
  33. package/dist/cli/schemaIsSubgraph-DoGh3OYj.js.map +1 -0
  34. package/dist/cli/schemaReporting-K-me-3-v.js +199 -0
  35. package/dist/cli/schemaReporting-K-me-3-v.js.map +1 -0
  36. package/dist/cli/server-runtime.js +49879 -0
  37. package/dist/cli/server-runtime.js.map +1 -0
  38. package/dist/cli/traceTreeBuilder-BIcV2U7b.js +9118 -0
  39. package/dist/cli/traceTreeBuilder-BIcV2U7b.js.map +1 -0
  40. package/dist/cli/usageReporting-Bpl8vSZX.js +10201 -0
  41. package/dist/cli/usageReporting-Bpl8vSZX.js.map +1 -0
  42. package/dist/cli/v4-CBhFvC49.js +42 -0
  43. package/dist/cli/v4-CBhFvC49.js.map +1 -0
  44. package/dist/client.d.ts +5 -1
  45. package/dist/client.js +5 -1
  46. package/dist/components.d.ts +38 -9
  47. package/dist/components.js +42 -13
  48. package/dist/content-types.json +616 -0
  49. package/dist/core/dist/define-component.d.ts +43 -1
  50. package/dist/core/dist/index.d.ts +2 -2
  51. package/dist/docs/account-access-gate.md +4 -4
  52. package/dist/docs/account-address-book.md +519 -0
  53. package/dist/docs/account-entry-point.md +1 -1
  54. package/dist/docs/account-menu-identity.md +160 -0
  55. package/dist/docs/account-menu.md +107 -24
  56. package/dist/docs/alert-dialog.md +2 -2
  57. package/dist/docs/avatar.md +103 -0
  58. package/dist/docs/billing-address.md +17 -9
  59. package/dist/docs/card-entry.md +37 -6
  60. package/dist/docs/cardholder-document.md +16 -14
  61. package/dist/docs/cart-item.md +1 -1
  62. package/dist/docs/cart.md +8 -8
  63. package/dist/docs/client-profile-fieldset.md +7 -5
  64. package/dist/docs/copy-text.md +84 -0
  65. package/dist/docs/document-field.md +8 -8
  66. package/dist/docs/footer-link-group.md +2 -2
  67. package/dist/docs/header-root.md +1 -1
  68. package/dist/docs/incentives.md +2 -2
  69. package/dist/docs/logo.md +5 -5
  70. package/dist/docs/my-account-profile.md +5 -5
  71. package/dist/docs/navigation-link-list.md +2 -2
  72. package/dist/docs/navigation-link.md +3 -3
  73. package/dist/docs/order-cancel.md +52 -0
  74. package/dist/docs/order-delivery-address.md +63 -0
  75. package/dist/docs/order-delivery-group.md +83 -0
  76. package/dist/docs/order-details-back.md +41 -0
  77. package/dist/docs/order-details-header.md +48 -0
  78. package/dist/docs/order-list-row.md +46 -0
  79. package/dist/docs/order-list-search.md +101 -0
  80. package/dist/docs/order-list-views.md +97 -0
  81. package/dist/docs/order-list.md +94 -0
  82. package/dist/docs/order-payment.md +94 -0
  83. package/dist/docs/order-placed-date.md +49 -0
  84. package/dist/docs/order-placed-payment-summary.md +13 -15
  85. package/dist/docs/order-placed.md +225 -0
  86. package/dist/docs/order-progress.md +88 -0
  87. package/dist/docs/order-status-badge.md +91 -0
  88. package/dist/docs/order-summary.md +53 -0
  89. package/dist/docs/payment-method-badges.md +14 -3
  90. package/dist/docs/place-order.md +13 -9
  91. package/dist/docs/product-shelf.md +20 -13
  92. package/dist/docs/saved-cards.md +2 -2
  93. package/dist/docs/select.md +19 -6
  94. package/dist/docs/session.md +1 -1
  95. package/dist/docs/shipping-address.md +1 -1
  96. package/dist/docs/sign-in-redirect.md +6 -6
  97. package/dist/docs/toast.md +7 -3
  98. package/dist/index.d.ts +7 -3
  99. package/dist/index.js +2 -1
  100. package/dist/internal/client.d.ts +6 -1
  101. package/dist/internal/client.js +8 -3
  102. package/dist/internal/content.d.ts +2 -2
  103. package/dist/internal/server.d.ts +8 -1
  104. package/dist/internal/server.js +8 -1
  105. package/dist/matter/account-access-gate/account-access-gate.d.ts +2 -1
  106. package/dist/matter/account-access-gate/account-access-gate.js +19 -16
  107. package/dist/matter/account-access-gate/account-access-gate.js.map +1 -1
  108. package/dist/matter/account-address-book/account-address-book-delete.d.ts +60 -0
  109. package/dist/matter/account-address-book/account-address-book-delete.js +184 -0
  110. package/dist/matter/account-address-book/account-address-book-delete.js.map +1 -0
  111. package/dist/matter/account-address-book/account-address-book-deliverability.d.ts +19 -0
  112. package/dist/matter/account-address-book/account-address-book-deliverability.js +50 -0
  113. package/dist/matter/account-address-book/account-address-book-deliverability.js.map +1 -0
  114. package/dist/matter/account-address-book/account-address-book-form-parts.d.ts +42 -0
  115. package/dist/matter/account-address-book/account-address-book-form-parts.js +146 -0
  116. package/dist/matter/account-address-book/account-address-book-form-parts.js.map +1 -0
  117. package/dist/matter/account-address-book/account-address-book-profile-notice.d.ts +25 -0
  118. package/dist/matter/account-address-book/account-address-book-profile-notice.js +72 -0
  119. package/dist/matter/account-address-book/account-address-book-profile-notice.js.map +1 -0
  120. package/dist/matter/account-address-book/account-address-book.d.ts +120 -0
  121. package/dist/matter/account-address-book/account-address-book.js +469 -0
  122. package/dist/matter/account-address-book/account-address-book.js.map +1 -0
  123. package/dist/matter/account-address-book/account-address-country-switch.js +59 -0
  124. package/dist/matter/account-address-book/account-address-country-switch.js.map +1 -0
  125. package/dist/matter/account-address-book/account-address-country.d.ts +36 -0
  126. package/dist/matter/account-address-book/account-address-country.js +151 -0
  127. package/dist/matter/account-address-book/account-address-country.js.map +1 -0
  128. package/dist/matter/account-address-book/account-address-first-line.js +11 -0
  129. package/dist/matter/account-address-book/account-address-first-line.js.map +1 -0
  130. package/dist/matter/account-address-book/account-address-form-context.d.ts +55 -0
  131. package/dist/matter/account-address-book/account-address-form-context.js +14 -0
  132. package/dist/matter/account-address-book/account-address-form-context.js.map +1 -0
  133. package/dist/matter/account-address-book/account-address-form.d.ts +85 -0
  134. package/dist/matter/account-address-book/account-address-form.js +946 -0
  135. package/dist/matter/account-address-book/account-address-form.js.map +1 -0
  136. package/dist/matter/account-address-book/account-address-postal-autofill.js +189 -0
  137. package/dist/matter/account-address-book/account-address-postal-autofill.js.map +1 -0
  138. package/dist/matter/account-address-book/account-address-record.d.ts +26 -0
  139. package/dist/matter/account-address-book/account-address-record.js +138 -0
  140. package/dist/matter/account-address-book/account-address-record.js.map +1 -0
  141. package/dist/matter/account-entry-point/account-entry-point.js +11 -11
  142. package/dist/matter/account-entry-point/account-entry-point.js.map +1 -1
  143. package/dist/matter/account-menu/account-menu.d.ts +77 -3
  144. package/dist/matter/account-menu/account-menu.js +252 -19
  145. package/dist/matter/account-menu/account-menu.js.map +1 -1
  146. package/dist/matter/account-menu/sign-out-failure.js +50 -0
  147. package/dist/matter/account-menu/sign-out-failure.js.map +1 -0
  148. package/dist/matter/account-menu-identity/account-menu-identity.d.ts +21 -0
  149. package/dist/matter/account-menu-identity/account-menu-identity.js +88 -0
  150. package/dist/matter/account-menu-identity/account-menu-identity.js.map +1 -0
  151. package/dist/matter/billing-address/billing-address.d.ts +30 -17
  152. package/dist/matter/billing-address/billing-address.js +128 -33
  153. package/dist/matter/billing-address/billing-address.js.map +1 -1
  154. package/dist/matter/breadcrumb/breadcrumb.js +2 -2
  155. package/dist/matter/breadcrumb/breadcrumb.js.map +1 -1
  156. package/dist/matter/card-entry/card-capture.js +4 -3
  157. package/dist/matter/card-entry/card-capture.js.map +1 -1
  158. package/dist/matter/card-entry/card-entry.d.ts +5 -3
  159. package/dist/matter/card-entry/card-entry.js +78 -27
  160. package/dist/matter/card-entry/card-entry.js.map +1 -1
  161. package/dist/matter/cardholder-document/cardholder-document.d.ts +10 -9
  162. package/dist/matter/cardholder-document/cardholder-document.js +36 -16
  163. package/dist/matter/cardholder-document/cardholder-document.js.map +1 -1
  164. package/dist/matter/cart/cart.d.ts +7 -2
  165. package/dist/matter/cart/cart.js +29 -26
  166. package/dist/matter/cart/cart.js.map +1 -1
  167. package/dist/matter/cart-item/cart-item.js +2 -2
  168. package/dist/matter/cart-item/cart-item.js.map +1 -1
  169. package/dist/matter/client-preferences/client-preferences-fieldset.js +2 -2
  170. package/dist/matter/client-profile-form/client-profile-fieldset.js +9 -6
  171. package/dist/matter/client-profile-form/client-profile-fieldset.js.map +1 -1
  172. package/dist/matter/identity-edit/identity-edit.js +3 -3
  173. package/dist/matter/identity-edit/identity-edit.js.map +1 -1
  174. package/dist/matter/identity-summary/identity-summary.js +4 -3
  175. package/dist/matter/identity-summary/identity-summary.js.map +1 -1
  176. package/dist/matter/my-account-profile/my-account-profile.d.ts +6 -3
  177. package/dist/matter/my-account-profile/my-account-profile.js +6 -5
  178. package/dist/matter/my-account-profile/my-account-profile.js.map +1 -1
  179. package/dist/matter/order-cancel/order-cancel.d.ts +110 -0
  180. package/dist/matter/order-cancel/order-cancel.js +344 -0
  181. package/dist/matter/order-cancel/order-cancel.js.map +1 -0
  182. package/dist/matter/order-delivery-address/order-delivery-address.d.ts +73 -0
  183. package/dist/matter/order-delivery-address/order-delivery-address.js +172 -0
  184. package/dist/matter/order-delivery-address/order-delivery-address.js.map +1 -0
  185. package/dist/matter/order-delivery-group/order-delivery-group.d.ts +128 -0
  186. package/dist/matter/order-delivery-group/order-delivery-group.js +408 -0
  187. package/dist/matter/order-delivery-group/order-delivery-group.js.map +1 -0
  188. package/dist/matter/order-details-header/order-details-header.d.ts +104 -0
  189. package/dist/matter/order-details-header/order-details-header.js +190 -0
  190. package/dist/matter/order-details-header/order-details-header.js.map +1 -0
  191. package/dist/matter/order-list/customer-orders-filter.d.ts +12 -0
  192. package/dist/matter/order-list/customer-orders-filter.js +30 -0
  193. package/dist/matter/order-list/customer-orders-filter.js.map +1 -0
  194. package/dist/matter/order-list/order-list.d.ts +121 -0
  195. package/dist/matter/order-list/order-list.js +395 -0
  196. package/dist/matter/order-list/order-list.js.map +1 -0
  197. package/dist/matter/order-list-row/order-list-row.d.ts +44 -0
  198. package/dist/matter/order-list-row/order-list-row.js +127 -0
  199. package/dist/matter/order-list-row/order-list-row.js.map +1 -0
  200. package/dist/matter/order-list-search/order-list-search.d.ts +72 -0
  201. package/dist/matter/order-list-search/order-list-search.js +296 -0
  202. package/dist/matter/order-list-search/order-list-search.js.map +1 -0
  203. package/dist/matter/order-list-views/order-list-views.d.ts +65 -0
  204. package/dist/matter/order-list-views/order-list-views.js +154 -0
  205. package/dist/matter/order-list-views/order-list-views.js.map +1 -0
  206. package/dist/matter/order-payment/order-payment.d.ts +83 -0
  207. package/dist/matter/order-payment/order-payment.js +258 -0
  208. package/dist/matter/order-payment/order-payment.js.map +1 -0
  209. package/dist/matter/order-placed/order-placed-deliveries.d.ts +145 -0
  210. package/dist/matter/order-placed/order-placed-deliveries.js +380 -0
  211. package/dist/matter/order-placed/order-placed-deliveries.js.map +1 -0
  212. package/dist/matter/order-placed/order-placed.d.ts +122 -0
  213. package/dist/matter/order-placed/order-placed.js +452 -0
  214. package/dist/matter/order-placed/order-placed.js.map +1 -0
  215. package/dist/matter/order-placed-date/order-placed-date.d.ts +45 -0
  216. package/dist/matter/order-placed-date/order-placed-date.js +92 -0
  217. package/dist/matter/order-placed-date/order-placed-date.js.map +1 -0
  218. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.d.ts +5 -8
  219. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js +29 -81
  220. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js.map +1 -1
  221. package/dist/matter/order-progress/order-progress.d.ts +85 -0
  222. package/dist/matter/order-progress/order-progress.js +203 -0
  223. package/dist/matter/order-progress/order-progress.js.map +1 -0
  224. package/dist/matter/order-summary/order-summary.d.ts +81 -0
  225. package/dist/matter/order-summary/order-summary.js +192 -0
  226. package/dist/matter/order-summary/order-summary.js.map +1 -0
  227. package/dist/matter/payment/cardholder-document-rule.d.ts +35 -0
  228. package/dist/matter/payment/cardholder-document-rule.js +35 -0
  229. package/dist/matter/payment/cardholder-document-rule.js.map +1 -0
  230. package/dist/matter/payment/payment-card-capture.js +38 -23
  231. package/dist/matter/payment/payment-card-capture.js.map +1 -1
  232. package/dist/matter/payment/payment-controller.js +12 -0
  233. package/dist/matter/payment/payment-controller.js.map +1 -1
  234. package/dist/matter/payment/payment-method-badges.js +4 -2
  235. package/dist/matter/payment/payment-method-badges.js.map +1 -1
  236. package/dist/matter/payment/payment.js +12 -0
  237. package/dist/matter/payment/payment.js.map +1 -1
  238. package/dist/matter/payment/use-payment-method-selection.d.ts +39 -0
  239. package/dist/matter/payment/use-payment-method-selection.js +30 -2
  240. package/dist/matter/payment/use-payment-method-selection.js.map +1 -1
  241. package/dist/matter/payment/use-payment-submit-gate.d.ts +16 -2
  242. package/dist/matter/payment/use-payment-submit-gate.js +42 -14
  243. package/dist/matter/payment/use-payment-submit-gate.js.map +1 -1
  244. package/dist/matter/place-order/place-order.d.ts +12 -7
  245. package/dist/matter/place-order/place-order.js +126 -103
  246. package/dist/matter/place-order/place-order.js.map +1 -1
  247. package/dist/matter/pricing/pricing.js +5 -5
  248. package/dist/matter/pricing/pricing.js.map +1 -1
  249. package/dist/matter/product-shelf/product-shelf.d.ts +61 -31
  250. package/dist/matter/product-shelf/product-shelf.js +157 -57
  251. package/dist/matter/product-shelf/product-shelf.js.map +1 -1
  252. package/dist/matter/region/region.js +1 -1
  253. package/dist/matter/saved-cards/saved-cards.js +27 -15
  254. package/dist/matter/saved-cards/saved-cards.js.map +1 -1
  255. package/dist/matter/session/session.js +2 -2
  256. package/dist/matter/session/session.js.map +1 -1
  257. package/dist/matter/shipping-address/country-descriptors.d.ts +1 -0
  258. package/dist/matter/shipping-address/country-descriptors.js +23 -1
  259. package/dist/matter/shipping-address/country-descriptors.js.map +1 -1
  260. package/dist/matter/shipping-address/shipping-address.js +63 -15
  261. package/dist/matter/shipping-address/shipping-address.js.map +1 -1
  262. package/dist/matter/shipping-simulator/shipping-simulator.d.ts +1 -1
  263. package/dist/matter/shipping-simulator/shipping-simulator.js.map +1 -1
  264. package/dist/matter/sign-in-redirect/sign-in-redirect.js +48 -10
  265. package/dist/matter/sign-in-redirect/sign-in-redirect.js.map +1 -1
  266. package/dist/matter/variant-selector/variant-selector.js +2 -2
  267. package/dist/matter/variant-selector/variant-selector.js.map +1 -1
  268. package/dist/particles/address-summary/address-summary.js +2 -2
  269. package/dist/particles/address-summary/address-summary.js.map +1 -1
  270. package/dist/particles/alert-dialog/alert-dialog.d.ts +5 -1
  271. package/dist/particles/alert-dialog/alert-dialog.js +5 -2
  272. package/dist/particles/alert-dialog/alert-dialog.js.map +1 -1
  273. package/dist/particles/avatar/avatar.d.ts +17 -0
  274. package/dist/particles/avatar/avatar.js +65 -0
  275. package/dist/particles/avatar/avatar.js.map +1 -0
  276. package/dist/particles/copy-text/copy-text.d.ts +28 -0
  277. package/dist/particles/copy-text/copy-text.js +140 -0
  278. package/dist/particles/copy-text/copy-text.js.map +1 -0
  279. package/dist/particles/document-field/document-field.d.ts +34 -5
  280. package/dist/particles/document-field/document-field.js +115 -19
  281. package/dist/particles/document-field/document-field.js.map +1 -1
  282. package/dist/particles/field/field.js +1 -1
  283. package/dist/particles/field/field.js.map +1 -1
  284. package/dist/particles/footer-link-group/footer-link-group.d.ts +6 -2
  285. package/dist/particles/footer-link-group/footer-link-group.js +18 -7
  286. package/dist/particles/footer-link-group/footer-link-group.js.map +1 -1
  287. package/dist/particles/incentives/incentives.d.ts +6 -2
  288. package/dist/particles/incentives/incentives.js +7 -2
  289. package/dist/particles/incentives/incentives.js.map +1 -1
  290. package/dist/particles/logo/logo.d.ts +3 -2
  291. package/dist/particles/logo/logo.js +20 -8
  292. package/dist/particles/logo/logo.js.map +1 -1
  293. package/dist/particles/navigation-link/navigation-link.d.ts +2 -3
  294. package/dist/particles/navigation-link/navigation-link.js +4 -4
  295. package/dist/particles/navigation-link/navigation-link.js.map +1 -1
  296. package/dist/particles/navigation-link-list/navigation-link-list.d.ts +6 -2
  297. package/dist/particles/navigation-link-list/navigation-link-list.js +18 -7
  298. package/dist/particles/navigation-link-list/navigation-link-list.js.map +1 -1
  299. package/dist/particles/order-details-back/order-details-back.d.ts +28 -0
  300. package/dist/particles/order-details-back/order-details-back.js +52 -0
  301. package/dist/particles/order-details-back/order-details-back.js.map +1 -0
  302. package/dist/particles/order-status-badge/order-status-badge.d.ts +19 -0
  303. package/dist/particles/order-status-badge/order-status-badge.js +50 -0
  304. package/dist/particles/order-status-badge/order-status-badge.js.map +1 -0
  305. package/dist/particles/phone-field/phone-field.js +2 -2
  306. package/dist/particles/phone-field/phone-field.js.map +1 -1
  307. package/dist/particles/select/select.js +6 -6
  308. package/dist/particles/select/select.js.map +1 -1
  309. package/dist/particles/toast/toast.d.ts +1 -1
  310. package/dist/particles/toast/toast.js +32 -6
  311. package/dist/particles/toast/toast.js.map +1 -1
  312. package/dist/schema.graphql +1079 -54
  313. package/dist/sdk/actions/address-action-provider.d.ts +16 -0
  314. package/dist/sdk/actions/address-action-provider.js +20 -0
  315. package/dist/sdk/actions/address-action-provider.js.map +1 -0
  316. package/dist/sdk/actions/analytics-action-provider.js +1 -1
  317. package/dist/sdk/actions/index.d.ts +3 -1
  318. package/dist/sdk/actions/index.js +3 -1
  319. package/dist/sdk/actions/order-action-provider.d.ts +12 -0
  320. package/dist/sdk/actions/order-action-provider.js +16 -0
  321. package/dist/sdk/actions/order-action-provider.js.map +1 -0
  322. package/dist/sdk/actions/types.d.ts +6 -2
  323. package/dist/sdk/address/address-fields.js +38 -0
  324. package/dist/sdk/address/address-fields.js.map +1 -0
  325. package/dist/sdk/address/checkout-readiness.js +17 -0
  326. package/dist/sdk/address/checkout-readiness.js.map +1 -0
  327. package/dist/sdk/address/constants.js +60 -0
  328. package/dist/sdk/address/constants.js.map +1 -0
  329. package/dist/sdk/address/country-display.js +19 -0
  330. package/dist/sdk/address/country-display.js.map +1 -0
  331. package/dist/sdk/address/country-rules.js +30 -0
  332. package/dist/sdk/address/country-rules.js.map +1 -0
  333. package/dist/sdk/address/format-address.js +18 -0
  334. package/dist/sdk/address/format-address.js.map +1 -0
  335. package/dist/sdk/address/iso-countries.js +262 -0
  336. package/dist/sdk/address/iso-countries.js.map +1 -0
  337. package/dist/sdk/address/layouts.js +56 -0
  338. package/dist/sdk/address/layouts.js.map +1 -0
  339. package/dist/sdk/address/messages.js +97 -0
  340. package/dist/sdk/address/messages.js.map +1 -0
  341. package/dist/sdk/address/operations.d.ts +54 -0
  342. package/dist/sdk/address/operations.js +83 -0
  343. package/dist/sdk/address/operations.js.map +1 -0
  344. package/dist/sdk/address/postal-code-lookup-operations.js +23 -0
  345. package/dist/sdk/address/postal-code-lookup-operations.js.map +1 -0
  346. package/dist/sdk/address/postal-code.js +11 -0
  347. package/dist/sdk/address/postal-code.js.map +1 -0
  348. package/dist/sdk/address/schema.js +14 -0
  349. package/dist/sdk/address/schema.js.map +1 -0
  350. package/dist/sdk/address/server-fields.js +25 -0
  351. package/dist/sdk/address/server-fields.js.map +1 -0
  352. package/dist/sdk/address/switch-country.js +57 -0
  353. package/dist/sdk/address/switch-country.js.map +1 -0
  354. package/dist/sdk/address/types.d.ts +26 -0
  355. package/dist/sdk/address/use-address-actions.d.ts +29 -0
  356. package/dist/sdk/address/use-address-actions.js +247 -0
  357. package/dist/sdk/address/use-address-actions.js.map +1 -0
  358. package/dist/sdk/address/use-address-by-postal-code.js +57 -0
  359. package/dist/sdk/address/use-address-by-postal-code.js.map +1 -0
  360. package/dist/sdk/address/validate-address.js +62 -0
  361. package/dist/sdk/address/validate-address.js.map +1 -0
  362. package/dist/sdk/analytics/use-analytics-actions.js +2 -1
  363. package/dist/sdk/analytics/use-analytics-actions.js.map +1 -1
  364. package/dist/sdk/cache/storefront-cache.js +29 -4
  365. package/dist/sdk/cache/storefront-cache.js.map +1 -1
  366. package/dist/sdk/cart/use-cart-actions.js +9 -8
  367. package/dist/sdk/cart/use-cart-actions.js.map +1 -1
  368. package/dist/sdk/cart/use-cart-validate-on-open.js +2 -1
  369. package/dist/sdk/cart/use-cart-validate-on-open.js.map +1 -1
  370. package/dist/sdk/client/fetch-page-data.d.ts +11 -0
  371. package/dist/sdk/client/fetch-page-data.js +12 -1
  372. package/dist/sdk/client/fetch-page-data.js.map +1 -1
  373. package/dist/sdk/content/create-content-runtime.d.ts +22 -1
  374. package/dist/sdk/content/create-content-runtime.js +90 -9
  375. package/dist/sdk/content/create-content-runtime.js.map +1 -1
  376. package/dist/sdk/data/empty-content-value.js +16 -0
  377. package/dist/sdk/data/empty-content-value.js.map +1 -0
  378. package/dist/sdk/data/failed-fields.js +23 -0
  379. package/dist/sdk/data/failed-fields.js.map +1 -0
  380. package/dist/sdk/data/hot-data-provider.js +2 -1
  381. package/dist/sdk/data/hot-data-provider.js.map +1 -1
  382. package/dist/sdk/data/index.js +1 -1
  383. package/dist/sdk/data/page-reactive-data-root.d.ts +45 -7
  384. package/dist/sdk/data/page-reactive-data-root.js +88 -12
  385. package/dist/sdk/data/page-reactive-data-root.js.map +1 -1
  386. package/dist/sdk/data/variables-from-content.d.ts +43 -0
  387. package/dist/sdk/data/variables-from-content.js +57 -0
  388. package/dist/sdk/data/variables-from-content.js.map +1 -0
  389. package/dist/sdk/generated/fragment-types.js +2 -0
  390. package/dist/sdk/generated/fragment-types.js.map +1 -1
  391. package/dist/sdk/generated/gql.js +4 -1
  392. package/dist/sdk/generated/gql.js.map +1 -1
  393. package/dist/sdk/generated/graphql.d.ts +8 -0
  394. package/dist/sdk/generated/graphql.js +296 -1
  395. package/dist/sdk/generated/graphql.js.map +1 -1
  396. package/dist/sdk/i18n/messages/en-US.js +138 -1
  397. package/dist/sdk/i18n/messages/en-US.json +138 -1
  398. package/dist/sdk/i18n/messages/en-US.json.d.ts +137 -0
  399. package/dist/sdk/i18n/messages/es-ES.js +138 -1
  400. package/dist/sdk/i18n/messages/es-ES.json +138 -1
  401. package/dist/sdk/i18n/messages/pt-BR.js +138 -1
  402. package/dist/sdk/i18n/messages/pt-BR.json +138 -1
  403. package/dist/sdk/identity/use-identity-actions.js +5 -4
  404. package/dist/sdk/identity/use-identity-actions.js.map +1 -1
  405. package/dist/sdk/navigation/current-page.js +30 -0
  406. package/dist/sdk/navigation/current-page.js.map +1 -0
  407. package/dist/sdk/navigation/not-found-log.d.ts +28 -0
  408. package/dist/sdk/navigation/not-found-log.js +133 -0
  409. package/dist/sdk/navigation/not-found-log.js.map +1 -0
  410. package/dist/sdk/navigation/path.js +25 -0
  411. package/dist/sdk/navigation/path.js.map +1 -0
  412. package/dist/sdk/navigation/redirect.d.ts +11 -0
  413. package/dist/sdk/navigation/redirect.js +22 -0
  414. package/dist/sdk/navigation/redirect.js.map +1 -0
  415. package/dist/sdk/navigation/report.js +70 -0
  416. package/dist/sdk/navigation/report.js.map +1 -0
  417. package/dist/sdk/navigation/resolve-storefront-href.d.ts +12 -0
  418. package/dist/sdk/navigation/resolve-storefront-href.js +214 -0
  419. package/dist/sdk/navigation/resolve-storefront-href.js.map +1 -0
  420. package/dist/sdk/navigation/route-identity-provider.d.ts +11 -0
  421. package/dist/sdk/navigation/route-identity-provider.js +20 -0
  422. package/dist/sdk/navigation/route-identity-provider.js.map +1 -0
  423. package/dist/sdk/navigation/route-map-provider.d.ts +19 -0
  424. package/dist/sdk/navigation/route-map-provider.js +29 -0
  425. package/dist/sdk/navigation/route-map-provider.js.map +1 -0
  426. package/dist/sdk/navigation/storefront-link.d.ts +16 -0
  427. package/dist/sdk/navigation/storefront-link.js +66 -0
  428. package/dist/sdk/navigation/storefront-link.js.map +1 -0
  429. package/dist/sdk/navigation/types.d.ts +45 -0
  430. package/dist/sdk/navigation/use-storefront-navigation.d.ts +26 -0
  431. package/dist/sdk/navigation/use-storefront-navigation.js +73 -0
  432. package/dist/sdk/navigation/use-storefront-navigation.js.map +1 -0
  433. package/dist/sdk/navigation/use-storefront-route.d.ts +26 -0
  434. package/dist/sdk/navigation/use-storefront-route.js +87 -0
  435. package/dist/sdk/navigation/use-storefront-route.js.map +1 -0
  436. package/dist/sdk/navigation/use-storefront-search-params.d.ts +11 -0
  437. package/dist/sdk/navigation/use-storefront-search-params.js +16 -0
  438. package/dist/sdk/navigation/use-storefront-search-params.js.map +1 -0
  439. package/dist/sdk/orders/completion-badge.d.ts +8 -0
  440. package/dist/sdk/orders/completion-badge.js +47 -0
  441. package/dist/sdk/orders/completion-badge.js.map +1 -0
  442. package/dist/sdk/orders/order-operations.d.ts +19 -0
  443. package/dist/sdk/orders/order-operations.js +21 -0
  444. package/dist/sdk/orders/order-operations.js.map +1 -0
  445. package/dist/sdk/orders/use-order-actions.d.ts +23 -0
  446. package/dist/sdk/orders/use-order-actions.js +62 -0
  447. package/dist/sdk/orders/use-order-actions.js.map +1 -0
  448. package/dist/sdk/payment/gateway-origin.js +26 -13
  449. package/dist/sdk/payment/gateway-origin.js.map +1 -1
  450. package/dist/sdk/payment/gateway.d.ts +14 -2
  451. package/dist/sdk/payment/gateway.js +32 -14
  452. package/dist/sdk/payment/gateway.js.map +1 -1
  453. package/dist/sdk/payment/operations.js +11 -0
  454. package/dist/sdk/payment/operations.js.map +1 -1
  455. package/dist/sdk/payment/submission-registry.d.ts +2 -1
  456. package/dist/sdk/payment/submission-registry.js +12 -8
  457. package/dist/sdk/payment/submission-registry.js.map +1 -1
  458. package/dist/sdk/payment/use-payment-actions.d.ts +5 -3
  459. package/dist/sdk/payment/use-payment-actions.js +6 -3
  460. package/dist/sdk/payment/use-payment-actions.js.map +1 -1
  461. package/dist/sdk/payment/use-place-order.d.ts +6 -3
  462. package/dist/sdk/payment/use-place-order.js +334 -144
  463. package/dist/sdk/payment/use-place-order.js.map +1 -1
  464. package/dist/sdk/region/use-region-actions.js +2 -1
  465. package/dist/sdk/region/use-region-actions.js.map +1 -1
  466. package/dist/sdk/seo/page-alternates.d.ts +55 -0
  467. package/dist/sdk/seo/page-alternates.js +132 -0
  468. package/dist/sdk/seo/page-alternates.js.map +1 -0
  469. package/dist/sdk/session/read-server-session.d.ts +21 -0
  470. package/dist/sdk/session/read-server-session.js +61 -0
  471. package/dist/sdk/session/read-server-session.js.map +1 -0
  472. package/dist/sdk/session/use-session-actions.js +5 -4
  473. package/dist/sdk/session/use-session-actions.js.map +1 -1
  474. package/dist/sdk/session/use-session-revalidation.js +2 -1
  475. package/dist/sdk/session/use-session-revalidation.js.map +1 -1
  476. package/dist/sdk/shipping/use-shipping-actions.js +3 -2
  477. package/dist/sdk/shipping/use-shipping-actions.js.map +1 -1
  478. package/dist/utils/own-value.js +19 -0
  479. package/dist/utils/own-value.js.map +1 -0
  480. package/dist/utils/safe-href.d.ts +11 -0
  481. package/dist/utils/safe-href.js +31 -22
  482. package/dist/utils/safe-href.js.map +1 -1
  483. package/package.json +17 -2
  484. package/skills/storefront-asset/SKILL.md +111 -0
  485. package/skills/storefront-asset/references/api-side.md +153 -0
  486. package/skills/storefront-asset/references/findings.md +40 -0
  487. package/skills/storefront-asset/references/ui-side.md +94 -0
  488. package/src/styles/tailwind.css +27 -0
@@ -0,0 +1,133 @@
1
+ import { normalizePath as normalizePath$1 } from "./path.js";
2
+ //#region src/sdk/navigation/not-found-log.ts
3
+ /** First segments no page may occupy (the page model's `RESERVED_SEGMENTS`): platform routes live there. */
4
+ const RESERVED_SEGMENTS = /* @__PURE__ */ new Set(["api", "_next"]);
5
+ function isProduction() {
6
+ return process.env.NODE_ENV === "production";
7
+ }
8
+ /** Lower-case, one trailing dot, then a trailing `:80` or `:443`. */
9
+ function normalizeHost(host) {
10
+ return host.toLowerCase().replace(/\.$/, "").replace(/:(?:80|443)$/, "");
11
+ }
12
+ function stripQueryAndHash(raw) {
13
+ return raw.split(/[?#]/, 1)[0] ?? "";
14
+ }
15
+ /** The resolver's slash rule: `''` and `'/'` become `'/'`. */
16
+ function normalizePath(raw) {
17
+ return normalizePath$1(stripQueryAndHash(raw));
18
+ }
19
+ /** `'/'` has no segments. Do not decode. */
20
+ function segmentsOf(raw) {
21
+ const normalized = normalizePath(raw);
22
+ if (normalized === "/") return [];
23
+ return normalized.split("/").slice(1);
24
+ }
25
+ function isReserved(path) {
26
+ const [first] = segmentsOf(path);
27
+ return first !== void 0 && RESERVED_SEGMENTS.has(first);
28
+ }
29
+ function isOptionalCatchAll(segment) {
30
+ return segment.startsWith("[[...") && segment.endsWith("]]");
31
+ }
32
+ function isCatchAll(segment) {
33
+ return segment.startsWith("[...") && segment.endsWith("]");
34
+ }
35
+ function isDynamic(segment) {
36
+ return segment.startsWith("[") && segment.endsWith("]") && !segment.includes("...");
37
+ }
38
+ /**
39
+ * A pattern matches a path when each literal equals the next segment, `[name]` consumes one, and a
40
+ * catch-all is last: `[...name]` takes one or more, `[[...name]]` takes the rest including none.
41
+ */
42
+ function patternMatches(pattern, path) {
43
+ const patternSegments = segmentsOf(pattern);
44
+ const pathSegments = segmentsOf(path);
45
+ let pathIndex = 0;
46
+ for (let index = 0; index < patternSegments.length; index += 1) {
47
+ const segment = patternSegments[index] ?? "";
48
+ const last = index === patternSegments.length - 1;
49
+ if (isOptionalCatchAll(segment)) return last;
50
+ if (isCatchAll(segment)) return last && pathIndex < pathSegments.length;
51
+ const next = pathSegments[pathIndex];
52
+ if (next === void 0) return false;
53
+ if (!isDynamic(segment) && segment !== next) return false;
54
+ pathIndex += 1;
55
+ }
56
+ return pathIndex === pathSegments.length;
57
+ }
58
+ /**
59
+ * Whether the entry serves this logical path. With a binding, only the path the binding serves the
60
+ * page at counts (its alias, or the pattern), and only when the page is served there. Without one,
61
+ * the pattern or any alias counts.
62
+ */
63
+ function matchesEntry(entry, logicalPath, bindingId) {
64
+ if (bindingId === null) {
65
+ if (patternMatches(entry.pattern, logicalPath)) return true;
66
+ return Object.values(entry.aliases ?? {}).some((alias) => patternMatches(alias, logicalPath));
67
+ }
68
+ if (entry.bindings !== void 0 && !entry.bindings.includes(bindingId)) return false;
69
+ return patternMatches((entry.aliases && Object.hasOwn(entry.aliases, bindingId) ? entry.aliases[bindingId] : void 0) ?? entry.pattern, logicalPath);
70
+ }
71
+ /**
72
+ * A referrer on a host this store serves. A synthesized binding bakes `host: ""`, so `knownHost` is
73
+ * false for every real host and `knownHost("")` is true — that empty host is not consulted. The
74
+ * fallback is the two hosts matching after normalisation, and only when the request host itself is
75
+ * not a known host.
76
+ */
77
+ function isSameStore(refererHost, requestHost, knownHost) {
78
+ if (knownHost(refererHost)) return true;
79
+ if (knownHost(requestHost)) return false;
80
+ return normalizeHost(refererHost) === normalizeHost(requestHost);
81
+ }
82
+ /** The request's logical path, and the binding it falls in when the resolver knows one. */
83
+ function logicalRequest(requestHost, requestPath, resolveBinding, toLogicalPath) {
84
+ const resolved = resolveBinding(requestHost, requestPath);
85
+ if (!resolved) return {
86
+ logicalPath: normalizePath(requestPath),
87
+ bindingId: null
88
+ };
89
+ return {
90
+ logicalPath: normalizePath(toLogicalPath(resolved.context, requestPath)),
91
+ bindingId: resolved.context.bindingId
92
+ };
93
+ }
94
+ function warnNotFound(ref, path) {
95
+ console.warn(`link.not-found: ${JSON.stringify(ref)} was requested from ${JSON.stringify(path)}, and the store declares no page there.`);
96
+ }
97
+ /**
98
+ * Logs `link.not-found` for a request whose referrer is a page of this store and whose path is not
99
+ * a page the store declared. Silent for an external referrer, a reload of this 404, a reserved
100
+ * first segment (`api`, `_next`), and an entity or content 404 whose path is one the binding serves
101
+ * a page at.
102
+ * Not deduplicated.
103
+ */
104
+ function reportNotFoundRequest({ referer, requestHost, requestPath, routeMap, knownHost, resolveBinding, toLogicalPath }) {
105
+ if (referer === null) return;
106
+ let refererUrl;
107
+ try {
108
+ refererUrl = new URL(referer);
109
+ } catch {
110
+ return;
111
+ }
112
+ if (!isSameStore(refererUrl.host, requestHost, knownHost)) return;
113
+ const ref = normalizePath(requestPath);
114
+ const path = normalizePath(refererUrl.pathname);
115
+ if (ref === path) return;
116
+ const { logicalPath, bindingId } = logicalRequest(requestHost, requestPath, resolveBinding, toLogicalPath);
117
+ if (isReserved(ref) || isReserved(logicalPath)) return;
118
+ if (Object.values(routeMap).some((entry) => matchesEntry(entry, logicalPath, bindingId))) return;
119
+ if (!isProduction()) {
120
+ warnNotFound(ref, path);
121
+ return;
122
+ }
123
+ console.error(JSON.stringify({
124
+ event: "link.not-found",
125
+ reason: "not-found",
126
+ ref,
127
+ path
128
+ }));
129
+ }
130
+ //#endregion
131
+ export { reportNotFoundRequest };
132
+
133
+ //# sourceMappingURL=not-found-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-found-log.js","names":["normalizeSlashes"],"sources":["../../../src/sdk/navigation/not-found-log.ts"],"sourcesContent":["import { normalizePath as normalizeSlashes } from './path.js';\nimport type { ToLogicalPath } from './route-map-provider.js';\nimport type { RouteMap, RouteMapEntry } from './types.js';\n\ntype ResolvedBinding = { context: { basePath: string; bindingId: string } } | null;\n\ntype ReportNotFoundRequestInput = Readonly<{\n referer: string | null;\n requestHost: string;\n requestPath: string;\n routeMap: RouteMap;\n knownHost: (host: string) => boolean;\n resolveBinding: (host: string, pathname: string) => ResolvedBinding;\n toLogicalPath: ToLogicalPath;\n}>;\n\n/** First segments no page may occupy (the page model's `RESERVED_SEGMENTS`): platform routes live there. */\nconst RESERVED_SEGMENTS = new Set(['api', '_next']);\n\nfunction isProduction(): boolean {\n return process.env.NODE_ENV === 'production';\n}\n\n/** Lower-case, one trailing dot, then a trailing `:80` or `:443`. */\nfunction normalizeHost(host: string): string {\n return host\n .toLowerCase()\n .replace(/\\.$/, '')\n .replace(/:(?:80|443)$/, '');\n}\n\nfunction stripQueryAndHash(raw: string): string {\n return raw.split(/[?#]/, 1)[0] ?? '';\n}\n\n/** The resolver's slash rule: `''` and `'/'` become `'/'`. */\nfunction normalizePath(raw: string): string {\n return normalizeSlashes(stripQueryAndHash(raw));\n}\n\n/** `'/'` has no segments. Do not decode. */\nfunction segmentsOf(raw: string): string[] {\n const normalized = normalizePath(raw);\n if (normalized === '/') return [];\n return normalized.split('/').slice(1);\n}\n\nfunction isReserved(path: string): boolean {\n const [first] = segmentsOf(path);\n return first !== undefined && RESERVED_SEGMENTS.has(first);\n}\n\nfunction isOptionalCatchAll(segment: string): boolean {\n return segment.startsWith('[[...') && segment.endsWith(']]');\n}\n\nfunction isCatchAll(segment: string): boolean {\n return segment.startsWith('[...') && segment.endsWith(']');\n}\n\nfunction isDynamic(segment: string): boolean {\n return segment.startsWith('[') && segment.endsWith(']') && !segment.includes('...');\n}\n\n/**\n * A pattern matches a path when each literal equals the next segment, `[name]` consumes one, and a\n * catch-all is last: `[...name]` takes one or more, `[[...name]]` takes the rest including none.\n */\nfunction patternMatches(pattern: string, path: string): boolean {\n const patternSegments = segmentsOf(pattern);\n const pathSegments = segmentsOf(path);\n let pathIndex = 0;\n\n for (let index = 0; index < patternSegments.length; index += 1) {\n const segment = patternSegments[index] ?? '';\n const last = index === patternSegments.length - 1;\n if (isOptionalCatchAll(segment)) return last;\n if (isCatchAll(segment)) return last && pathIndex < pathSegments.length;\n const next = pathSegments[pathIndex];\n if (next === undefined) return false;\n if (!isDynamic(segment) && segment !== next) return false;\n pathIndex += 1;\n }\n\n return pathIndex === pathSegments.length;\n}\n\n/**\n * Whether the entry serves this logical path. With a binding, only the path the binding serves the\n * page at counts (its alias, or the pattern), and only when the page is served there. Without one,\n * the pattern or any alias counts.\n */\nfunction matchesEntry(entry: RouteMapEntry, logicalPath: string, bindingId: string | null): boolean {\n if (bindingId === null) {\n if (patternMatches(entry.pattern, logicalPath)) return true;\n return Object.values(entry.aliases ?? {}).some((alias) => patternMatches(alias, logicalPath));\n }\n if (entry.bindings !== undefined && !entry.bindings.includes(bindingId)) return false;\n const alias = entry.aliases && Object.hasOwn(entry.aliases, bindingId) ? entry.aliases[bindingId] : undefined;\n return patternMatches(alias ?? entry.pattern, logicalPath);\n}\n\n/**\n * A referrer on a host this store serves. A synthesized binding bakes `host: \"\"`, so `knownHost` is\n * false for every real host and `knownHost(\"\")` is true — that empty host is not consulted. The\n * fallback is the two hosts matching after normalisation, and only when the request host itself is\n * not a known host.\n */\nfunction isSameStore(refererHost: string, requestHost: string, knownHost: (host: string) => boolean): boolean {\n if (knownHost(refererHost)) return true;\n if (knownHost(requestHost)) return false;\n return normalizeHost(refererHost) === normalizeHost(requestHost);\n}\n\n/** The request's logical path, and the binding it falls in when the resolver knows one. */\nfunction logicalRequest(\n requestHost: string,\n requestPath: string,\n resolveBinding: ReportNotFoundRequestInput['resolveBinding'],\n toLogicalPath: ToLogicalPath,\n): { logicalPath: string; bindingId: string | null } {\n const resolved = resolveBinding(requestHost, requestPath);\n if (!resolved) return { logicalPath: normalizePath(requestPath), bindingId: null };\n return {\n logicalPath: normalizePath(toLogicalPath(resolved.context, requestPath)),\n bindingId: resolved.context.bindingId,\n };\n}\n\nfunction warnNotFound(ref: string, path: string): void {\n console.warn(\n `link.not-found: ${JSON.stringify(ref)} was requested from ${JSON.stringify(path)}, ` +\n 'and the store declares no page there.',\n );\n}\n\n/**\n * Logs `link.not-found` for a request whose referrer is a page of this store and whose path is not\n * a page the store declared. Silent for an external referrer, a reload of this 404, a reserved\n * first segment (`api`, `_next`), and an entity or content 404 whose path is one the binding serves\n * a page at.\n * Not deduplicated.\n */\nexport function reportNotFoundRequest({\n referer,\n requestHost,\n requestPath,\n routeMap,\n knownHost,\n resolveBinding,\n toLogicalPath,\n}: ReportNotFoundRequestInput): void {\n if (referer === null) return;\n\n let refererUrl: URL;\n try {\n refererUrl = new URL(referer);\n } catch {\n return;\n }\n\n if (!isSameStore(refererUrl.host, requestHost, knownHost)) return;\n\n const ref = normalizePath(requestPath);\n const path = normalizePath(refererUrl.pathname);\n if (ref === path) return;\n\n const { logicalPath, bindingId } = logicalRequest(requestHost, requestPath, resolveBinding, toLogicalPath);\n if (isReserved(ref) || isReserved(logicalPath)) return;\n\n const declared = Object.values(routeMap).some((entry) => matchesEntry(entry, logicalPath, bindingId));\n if (declared) return;\n\n if (!isProduction()) {\n warnNotFound(ref, path);\n return;\n }\n\n console.error(JSON.stringify({ event: 'link.not-found', reason: 'not-found', ref, path }));\n}\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ //#region src/sdk/navigation/path.ts
2
+ /**
3
+ * The resolver's slash rule, shared by what resolves a link and what logs a 404: `''` and `'/'`
4
+ * become `'/'`, and any other path keeps one leading slash and no trailing slash.
5
+ */
6
+ function normalizePath(pathname) {
7
+ const trimmed = pathname.replaceAll(/^\/+|\/+$/g, "");
8
+ return trimmed.length === 0 ? "/" : `/${trimmed}`;
9
+ }
10
+ /**
11
+ * A site-relative href that already carries `basePath` (a URL pasted from the address bar, a
12
+ * bookmark) as the logical path it names, so prefixing it does not double the base path. Any other
13
+ * href is returned as is.
14
+ */
15
+ function withoutBasePath(href, basePath) {
16
+ if (basePath === "/") return href;
17
+ if (href === basePath) return "/";
18
+ const rest = href.slice(basePath.length);
19
+ if (!href.startsWith(basePath) || !/^[/?#]/.test(rest)) return href;
20
+ return rest.startsWith("/") ? rest : `/${rest}`;
21
+ }
22
+ //#endregion
23
+ export { normalizePath, withoutBasePath };
24
+
25
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","names":[],"sources":["../../../src/sdk/navigation/path.ts"],"sourcesContent":["/**\n * The resolver's slash rule, shared by what resolves a link and what logs a 404: `''` and `'/'`\n * become `'/'`, and any other path keeps one leading slash and no trailing slash.\n */\nexport function normalizePath(pathname: string): string {\n const trimmed = pathname.replaceAll(/^\\/+|\\/+$/g, '');\n return trimmed.length === 0 ? '/' : `/${trimmed}`;\n}\n\n/**\n * A site-relative href that already carries `basePath` (a URL pasted from the address bar, a\n * bookmark) as the logical path it names, so prefixing it does not double the base path. Any other\n * href is returned as is.\n */\nexport function withoutBasePath(href: string, basePath: string): string {\n if (basePath === '/') return href;\n if (href === basePath) return '/';\n const rest = href.slice(basePath.length);\n if (!href.startsWith(basePath) || !/^[/?#]/.test(rest)) return href;\n return rest.startsWith('/') ? rest : `/${rest}`;\n}\n"],"mappings":";;;;;AAIA,SAAgB,cAAc,UAA0B;CACtD,MAAM,UAAU,SAAS,WAAW,cAAc,EAAE;CACpD,OAAO,QAAQ,WAAW,IAAI,MAAM,IAAI;AAC1C;;;;;;AAOA,SAAgB,gBAAgB,MAAc,UAA0B;CACtE,IAAI,aAAa,KAAK,OAAO;CAC7B,IAAI,SAAS,UAAU,OAAO;CAC9B,MAAM,OAAO,KAAK,MAAM,SAAS,MAAM;CACvC,IAAI,CAAC,KAAK,WAAW,QAAQ,KAAK,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO;CAC/D,OAAO,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI;AAC3C"}
@@ -0,0 +1,11 @@
1
+ import { StorefrontContext } from "../../core/dist/schema/generated/schema.js";
2
+ import "../../core/dist/index.js";
3
+ import { PageRef, RouteMap } from "./types.js";
4
+ //#region src/sdk/navigation/redirect.d.ts
5
+ type BindingContext = Pick<StorefrontContext, 'bindingId' | 'basePath'>;
6
+ /** Next's `redirect` to a page reference or a logical path, resolved for the binding. */
7
+ export declare function redirectToStorefrontPage(context: BindingContext, routeMap: RouteMap, target: PageRef | string): never;
8
+ /** Next's `permanentRedirect` to a page reference or a logical path, resolved for the binding. */
9
+ export declare function permanentRedirectToStorefrontPage(context: BindingContext, routeMap: RouteMap, target: PageRef | string): never;
10
+ //#endregion
11
+ //# sourceMappingURL=redirect.d.ts.map
@@ -0,0 +1,22 @@
1
+ import { resolveStorefrontHref } from "./resolve-storefront-href.js";
2
+ import { reportUnresolved } from "./report.js";
3
+ import { permanentRedirect, redirect } from "next/navigation";
4
+ //#region src/sdk/navigation/redirect.ts
5
+ function resolveOrThrow(context, routeMap, target) {
6
+ const result = resolveStorefrontHref(context, routeMap, target);
7
+ if (result.href !== null) return result.href;
8
+ reportUnresolved(result.reason, target);
9
+ throw new Error(`Cannot redirect: ${JSON.stringify(target)} resolved to no href (${result.reason}) on binding ${JSON.stringify(context.bindingId)}.`);
10
+ }
11
+ /** Next's `redirect` to a page reference or a logical path, resolved for the binding. */
12
+ function redirectToStorefrontPage(context, routeMap, target) {
13
+ return redirect(resolveOrThrow(context, routeMap, target));
14
+ }
15
+ /** Next's `permanentRedirect` to a page reference or a logical path, resolved for the binding. */
16
+ function permanentRedirectToStorefrontPage(context, routeMap, target) {
17
+ return permanentRedirect(resolveOrThrow(context, routeMap, target));
18
+ }
19
+ //#endregion
20
+ export { permanentRedirectToStorefrontPage, redirectToStorefrontPage };
21
+
22
+ //# sourceMappingURL=redirect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirect.js","names":[],"sources":["../../../src/sdk/navigation/redirect.ts"],"sourcesContent":["import type { StorefrontContext } from '@vtex/fs-core';\nimport { permanentRedirect, redirect } from 'next/navigation';\nimport { reportUnresolved } from './report.js';\nimport { resolveStorefrontHref } from './resolve-storefront-href.js';\nimport type { PageRef, RouteMap } from './types.js';\n\ntype BindingContext = Pick<StorefrontContext, 'bindingId' | 'basePath'>;\n\nfunction resolveOrThrow(context: BindingContext, routeMap: RouteMap, target: PageRef | string): string {\n const result = resolveStorefrontHref(context, routeMap, target);\n if (result.href !== null) return result.href;\n reportUnresolved(result.reason, target);\n throw new Error(\n `Cannot redirect: ${JSON.stringify(target)} resolved to no href (${result.reason}) on ` +\n `binding ${JSON.stringify(context.bindingId)}.`,\n );\n}\n\n/** Next's `redirect` to a page reference or a logical path, resolved for the binding. */\nexport function redirectToStorefrontPage(context: BindingContext, routeMap: RouteMap, target: PageRef | string): never {\n return redirect(resolveOrThrow(context, routeMap, target));\n}\n\n/** Next's `permanentRedirect` to a page reference or a logical path, resolved for the binding. */\nexport function permanentRedirectToStorefrontPage(\n context: BindingContext,\n routeMap: RouteMap,\n target: PageRef | string,\n): never {\n return permanentRedirect(resolveOrThrow(context, routeMap, target));\n}\n"],"mappings":";;;;AAQA,SAAS,eAAe,SAAyB,UAAoB,QAAkC;CACrG,MAAM,SAAS,sBAAsB,SAAS,UAAU,MAAM;CAC9D,IAAI,OAAO,SAAS,MAAM,OAAO,OAAO;CACxC,iBAAiB,OAAO,QAAQ,MAAM;CACtC,MAAM,IAAI,MACR,oBAAoB,KAAK,UAAU,MAAM,EAAE,wBAAwB,OAAO,OAAO,eACpE,KAAK,UAAU,QAAQ,SAAS,EAAE,EACjD;AACF;;AAGA,SAAgB,yBAAyB,SAAyB,UAAoB,QAAiC;CACrH,OAAO,SAAS,eAAe,SAAS,UAAU,MAAM,CAAC;AAC3D;;AAGA,SAAgB,kCACd,SACA,UACA,QACO;CACP,OAAO,kBAAkB,eAAe,SAAS,UAAU,MAAM,CAAC;AACpE"}
@@ -0,0 +1,70 @@
1
+ //#region src/sdk/navigation/report.ts
2
+ /** Reasons a store produces on purpose, such as a page it does not serve on this binding. */
3
+ const DEGRADATION_REASONS = /* @__PURE__ */ new Set([
4
+ "unknown-page",
5
+ "unknown-standard",
6
+ "outside-bindings"
7
+ ]);
8
+ const warned = /* @__PURE__ */ new Set();
9
+ function isProduction() {
10
+ return process.env.NODE_ENV === "production";
11
+ }
12
+ /**
13
+ * Logs one link that resolved to `null`. In production: one-line JSON `link.unresolved`, on
14
+ * `console.info` for an intended degradation and `console.error` for a bug. Elsewhere: a readable
15
+ * `console.warn`. Callers deduplicate: `useStorefrontNavigation` reports a link once per component.
16
+ */
17
+ function reportUnresolved(reason, ref) {
18
+ if (!isProduction()) {
19
+ console.warn(`hrefFor: ${JSON.stringify(ref)} resolved to no href (${reason}).`);
20
+ return;
21
+ }
22
+ const line = JSON.stringify({
23
+ event: "link.unresolved",
24
+ reason,
25
+ ref,
26
+ path: globalThis.location?.pathname ?? null
27
+ });
28
+ if (DEGRADATION_REASONS.has(reason)) console.info(line);
29
+ else console.error(line);
30
+ }
31
+ function warnOnce(message) {
32
+ if (warned.has(message)) return;
33
+ warned.add(message);
34
+ console.warn(message);
35
+ }
36
+ /** The path without query and hash, and without trailing slashes (`'/'` stays `'/'`). */
37
+ function barePath(raw) {
38
+ const trimmed = (raw.split(/[?#]/, 1)[0] ?? "").replace(/\/+$/, "");
39
+ return trimmed.length === 0 ? "/" : trimmed;
40
+ }
41
+ /**
42
+ * Development-only warnings for a logical path that should not be one: a path that already carries
43
+ * this binding's base path, and a path equal to a singleton page's pattern or alias. Warns once per
44
+ * message. Changes nothing about the resolved href.
45
+ */
46
+ function warnSuspiciousPath(context, routeMap, raw) {
47
+ if (isProduction()) return;
48
+ const trimmed = raw.trim();
49
+ if (!trimmed.startsWith("/")) return;
50
+ const { basePath } = context;
51
+ if (basePath !== "/" && (trimmed === basePath || trimmed.startsWith(`${basePath}/`))) warnOnce(`hrefFor: ${JSON.stringify(raw)} already starts with this binding's base path ${JSON.stringify(basePath)}, which hrefFor adds. Pass the logical path instead.`);
52
+ for (const name of singletonsAt(routeMap).get(barePath(trimmed)) ?? []) warnOnce(`hrefFor: ${JSON.stringify(raw)} is the path of page ${JSON.stringify(name)}. Reference the page instead: { page: '${name}' }.`);
53
+ }
54
+ const singletonPaths = /* @__PURE__ */ new WeakMap();
55
+ /** The singleton pages at each pattern or alias of this route map, built once per map. */
56
+ function singletonsAt(routeMap) {
57
+ const cached = singletonPaths.get(routeMap);
58
+ if (cached) return cached;
59
+ const table = /* @__PURE__ */ new Map();
60
+ for (const [name, entry] of Object.entries(routeMap)) {
61
+ if (entry.kind !== "singleton") continue;
62
+ for (const literal of /* @__PURE__ */ new Set([entry.pattern, ...Object.values(entry.aliases ?? {})])) table.set(literal, [...table.get(literal) ?? [], name]);
63
+ }
64
+ singletonPaths.set(routeMap, table);
65
+ return table;
66
+ }
67
+ //#endregion
68
+ export { reportUnresolved, warnSuspiciousPath };
69
+
70
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","names":[],"sources":["../../../src/sdk/navigation/report.ts"],"sourcesContent":["import type { StorefrontContext } from '@vtex/fs-core';\nimport type { PageRef, ResolveHrefReason, RouteMap } from './types.js';\n\n/** Reasons a store produces on purpose, such as a page it does not serve on this binding. */\nconst DEGRADATION_REASONS: ReadonlySet<ResolveHrefReason> = new Set([\n 'unknown-page',\n 'unknown-standard',\n 'outside-bindings',\n]);\n\nconst warned = new Set<string>();\n\nfunction isProduction(): boolean {\n return process.env.NODE_ENV === 'production';\n}\n\n/**\n * Logs one link that resolved to `null`. In production: one-line JSON `link.unresolved`, on\n * `console.info` for an intended degradation and `console.error` for a bug. Elsewhere: a readable\n * `console.warn`. Callers deduplicate: `useStorefrontNavigation` reports a link once per component.\n */\nexport function reportUnresolved(reason: ResolveHrefReason, ref: PageRef | string): void {\n if (!isProduction()) {\n console.warn(`hrefFor: ${JSON.stringify(ref)} resolved to no href (${reason}).`);\n return;\n }\n const line = JSON.stringify({\n event: 'link.unresolved',\n reason,\n ref,\n path: globalThis.location?.pathname ?? null,\n });\n if (DEGRADATION_REASONS.has(reason)) console.info(line);\n else console.error(line);\n}\n\nfunction warnOnce(message: string): void {\n if (warned.has(message)) return;\n warned.add(message);\n console.warn(message);\n}\n\n/** The path without query and hash, and without trailing slashes (`'/'` stays `'/'`). */\nfunction barePath(raw: string): string {\n const path = raw.split(/[?#]/, 1)[0] ?? '';\n const trimmed = path.replace(/\\/+$/, '');\n return trimmed.length === 0 ? '/' : trimmed;\n}\n\n/**\n * Development-only warnings for a logical path that should not be one: a path that already carries\n * this binding's base path, and a path equal to a singleton page's pattern or alias. Warns once per\n * message. Changes nothing about the resolved href.\n */\nexport function warnSuspiciousPath(\n context: Pick<StorefrontContext, 'basePath'>,\n routeMap: RouteMap,\n raw: string,\n): void {\n if (isProduction()) return;\n const trimmed = raw.trim();\n if (!trimmed.startsWith('/')) return;\n\n const { basePath } = context;\n if (basePath !== '/' && (trimmed === basePath || trimmed.startsWith(`${basePath}/`))) {\n warnOnce(\n `hrefFor: ${JSON.stringify(raw)} already starts with this binding's base path ${JSON.stringify(basePath)}, ` +\n 'which hrefFor adds. Pass the logical path instead.',\n );\n }\n\n for (const name of singletonsAt(routeMap).get(barePath(trimmed)) ?? []) {\n warnOnce(\n `hrefFor: ${JSON.stringify(raw)} is the path of page ${JSON.stringify(name)}. ` +\n `Reference the page instead: { page: '${name}' }.`,\n );\n }\n}\n\nconst singletonPaths = new WeakMap<RouteMap, Map<string, string[]>>();\n\n/** The singleton pages at each pattern or alias of this route map, built once per map. */\nfunction singletonsAt(routeMap: RouteMap): Map<string, string[]> {\n const cached = singletonPaths.get(routeMap);\n if (cached) return cached;\n const table = new Map<string, string[]>();\n for (const [name, entry] of Object.entries(routeMap)) {\n if (entry.kind !== 'singleton') continue;\n for (const literal of new Set([entry.pattern, ...Object.values(entry.aliases ?? {})])) {\n table.set(literal, [...(table.get(literal) ?? []), name]);\n }\n }\n singletonPaths.set(routeMap, table);\n return table;\n}\n"],"mappings":";;AAIA,MAAM,sCAAsD,IAAI,IAAI;CAClE;CACA;CACA;AACF,CAAC;AAED,MAAM,yBAAS,IAAI,IAAY;AAE/B,SAAS,eAAwB;CAC/B,OAAO,QAAQ,IAAI,aAAa;AAClC;;;;;;AAOA,SAAgB,iBAAiB,QAA2B,KAA6B;CACvF,IAAI,CAAC,aAAa,GAAG;EACnB,QAAQ,KAAK,YAAY,KAAK,UAAU,GAAG,EAAE,wBAAwB,OAAO,GAAG;EAC/E;CACF;CACA,MAAM,OAAO,KAAK,UAAU;EAC1B,OAAO;EACP;EACA;EACA,MAAM,WAAW,UAAU,YAAY;CACzC,CAAC;CACD,IAAI,oBAAoB,IAAI,MAAM,GAAG,QAAQ,KAAK,IAAI;MACjD,QAAQ,MAAM,IAAI;AACzB;AAEA,SAAS,SAAS,SAAuB;CACvC,IAAI,OAAO,IAAI,OAAO,GAAG;CACzB,OAAO,IAAI,OAAO;CAClB,QAAQ,KAAK,OAAO;AACtB;;AAGA,SAAS,SAAS,KAAqB;CAErC,MAAM,WADO,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,MAAM,GAAA,CACnB,QAAQ,QAAQ,EAAE;CACvC,OAAO,QAAQ,WAAW,IAAI,MAAM;AACtC;;;;;;AAOA,SAAgB,mBACd,SACA,UACA,KACM;CACN,IAAI,aAAa,GAAG;CACpB,MAAM,UAAU,IAAI,KAAK;CACzB,IAAI,CAAC,QAAQ,WAAW,GAAG,GAAG;CAE9B,MAAM,EAAE,aAAa;CACrB,IAAI,aAAa,QAAQ,YAAY,YAAY,QAAQ,WAAW,GAAG,SAAS,EAAE,IAChF,SACE,YAAY,KAAK,UAAU,GAAG,EAAE,gDAAgD,KAAK,UAAU,QAAQ,EAAE,qDAE3G;CAGF,KAAK,MAAM,QAAQ,aAAa,QAAQ,CAAC,CAAC,IAAI,SAAS,OAAO,CAAC,KAAK,CAAC,GACnE,SACE,YAAY,KAAK,UAAU,GAAG,EAAE,uBAAuB,KAAK,UAAU,IAAI,EAAE,yCAClC,KAAK,KACjD;AAEJ;AAEA,MAAM,iCAAiB,IAAI,QAAyC;;AAGpE,SAAS,aAAa,UAA2C;CAC/D,MAAM,SAAS,eAAe,IAAI,QAAQ;CAC1C,IAAI,QAAQ,OAAO;CACnB,MAAM,wBAAQ,IAAI,IAAsB;CACxC,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,QAAQ,GAAG;EACpD,IAAI,MAAM,SAAS,aAAa;EAChC,KAAK,MAAM,2BAAW,IAAI,IAAI,CAAC,MAAM,SAAS,GAAG,OAAO,OAAO,MAAM,WAAW,CAAC,CAAC,CAAC,CAAC,GAClF,MAAM,IAAI,SAAS,CAAC,GAAI,MAAM,IAAI,OAAO,KAAK,CAAC,GAAI,IAAI,CAAC;CAE5D;CACA,eAAe,IAAI,UAAU,KAAK;CAClC,OAAO;AACT"}
@@ -0,0 +1,12 @@
1
+ import { StorefrontContext } from "../../core/dist/schema/generated/schema.js";
2
+ import "../../core/dist/index.js";
3
+ import { PageRef, ResolveHrefResult, RouteMap } from "./types.js";
4
+ //#region src/sdk/navigation/resolve-storefront-href.d.ts
5
+ /**
6
+ * The public href for one binding: a page reference looked up in the route map, or a logical path
7
+ * prefixed with `basePath`. An anchor is returned as written. A rejected string and a page that
8
+ * cannot be built return `href: null` and a reason. Never throws and never logs.
9
+ */
10
+ export declare function resolveStorefrontHref(context: Pick<StorefrontContext, 'bindingId' | 'basePath'>, routeMap: RouteMap, target: PageRef | string): ResolveHrefResult;
11
+ //#endregion
12
+ //# sourceMappingURL=resolve-storefront-href.d.ts.map
@@ -0,0 +1,214 @@
1
+ import { resolveSafeHref } from "../../utils/safe-href.js";
2
+ import { normalizePath, withoutBasePath } from "./path.js";
3
+ //#region src/sdk/navigation/resolve-storefront-href.ts
4
+ /**
5
+ * A param name is what Next and the compiler accept between brackets: word characters and hyphens.
6
+ * Shared: `matchAll` iterates a clone, so the `g` flag's `lastIndex` never leaks between calls.
7
+ */
8
+ const PARAM_TOKEN = /\[\[(?:\.{3})([\w-]+)\]\]|\[\.{3}([\w-]+)\]|\[([\w-]+)\]/g;
9
+ /**
10
+ * The public href for one binding: a page reference looked up in the route map, or a logical path
11
+ * prefixed with `basePath`. An anchor is returned as written. A rejected string and a page that
12
+ * cannot be built return `href: null` and a reason. Never throws and never logs.
13
+ */
14
+ function resolveStorefrontHref(context, routeMap, target) {
15
+ const value = target;
16
+ if (typeof value === "string") return resolveString(context, value);
17
+ if (!isRecord(value)) return {
18
+ href: null,
19
+ reason: "invalid-ref"
20
+ };
21
+ const page = value.page;
22
+ if (typeof page === "string") {
23
+ const entry = ownPage(routeMap, page);
24
+ if (entry === void 0) return {
25
+ href: null,
26
+ reason: "unknown-page"
27
+ };
28
+ return resolveEntry(context, entry, value);
29
+ }
30
+ const standard = value.standard;
31
+ if (typeof standard !== "string") return {
32
+ href: null,
33
+ reason: "invalid-ref"
34
+ };
35
+ const matches = standardIndex(routeMap).get(standard) ?? [];
36
+ const entry = matches[0];
37
+ if (entry === void 0) return {
38
+ href: null,
39
+ reason: "unknown-standard"
40
+ };
41
+ if (matches.length > 1) return {
42
+ href: null,
43
+ reason: "ambiguous-standard"
44
+ };
45
+ return resolveEntry(context, entry, value);
46
+ }
47
+ const standardIndexes = /* @__PURE__ */ new WeakMap();
48
+ /** The entries that declare each standard, built once per route map: links resolve on every render. */
49
+ function standardIndex(routeMap) {
50
+ const cached = standardIndexes.get(routeMap);
51
+ if (cached) return cached;
52
+ const index = /* @__PURE__ */ new Map();
53
+ for (const entry of Object.values(routeMap)) {
54
+ if (!isRouteMapEntry(entry) || entry.standard === void 0) continue;
55
+ index.set(entry.standard, [...index.get(entry.standard) ?? [], entry]);
56
+ }
57
+ standardIndexes.set(routeMap, index);
58
+ return index;
59
+ }
60
+ function resolveString(context, raw) {
61
+ const trimmed = raw.trim();
62
+ if (trimmed.startsWith("#")) return { href: trimmed };
63
+ const checked = resolveSafeHref(raw);
64
+ if (!checked.safe) return {
65
+ href: null,
66
+ reason: safeHrefReason(checked.reason)
67
+ };
68
+ if (checked.href.startsWith("/")) return { href: prefixBasePath(withoutBasePath(checked.href, context.basePath), context.basePath) };
69
+ return { href: checked.href };
70
+ }
71
+ function resolveEntry(context, entry, target) {
72
+ if (entry.bindings !== void 0 && !entry.bindings.includes(context.bindingId)) return {
73
+ href: null,
74
+ reason: "outside-bindings"
75
+ };
76
+ const filled = fillPattern(logicalPath(entry, context.bindingId), target.params);
77
+ if (filled === void 0) return {
78
+ href: null,
79
+ reason: "missing-param"
80
+ };
81
+ return { href: prefixBasePath(appendHash(appendQuery(filled, target.query), target.hash), context.basePath) };
82
+ }
83
+ /**
84
+ * The map entry stored on `page` itself. Bracket access also sees `Object.prototype`
85
+ * (`toString`, `constructor`, `hasOwnProperty`, `__proto__`), and those values are not pages.
86
+ */
87
+ function ownPage(routeMap, page) {
88
+ if (!Object.hasOwn(routeMap, page)) return void 0;
89
+ const entry = routeMap[page];
90
+ return isRouteMapEntry(entry) ? entry : void 0;
91
+ }
92
+ function isRouteMapEntry(value) {
93
+ return isRecord(value) && typeof value.pattern === "string";
94
+ }
95
+ function logicalPath(entry, bindingId) {
96
+ const aliases = entry.aliases;
97
+ if (aliases === void 0 || !Object.hasOwn(aliases, bindingId)) return entry.pattern;
98
+ return aliases[bindingId] ?? entry.pattern;
99
+ }
100
+ function fillPattern(pattern, params) {
101
+ const table = isRecord(params) ? params : void 0;
102
+ let path = "";
103
+ let last = 0;
104
+ for (const match of pattern.matchAll(PARAM_TOKEN)) {
105
+ const index = match.index ?? 0;
106
+ path += pattern.slice(last, index);
107
+ const filled = fillToken(match, table);
108
+ if (filled === void 0) return void 0;
109
+ if (filled === null) {
110
+ if (path.endsWith("/")) path = path.slice(0, -1);
111
+ } else path += filled;
112
+ last = index + match[0].length;
113
+ }
114
+ return path + pattern.slice(last);
115
+ }
116
+ /**
117
+ * The text one param token contributes: `null` for an omitted `[[...name]]`, which drops its
118
+ * preceding slash, and `undefined` for a missing param.
119
+ */
120
+ function fillToken(match, table) {
121
+ const [, optionalName, catchAllName, singleName] = match;
122
+ if (optionalName !== void 0) {
123
+ const filled = fillOptional(table?.[optionalName]);
124
+ if (filled === void 0) return void 0;
125
+ return filled.omit ? null : filled.text;
126
+ }
127
+ if (catchAllName !== void 0) return fillCatchAll(table?.[catchAllName]);
128
+ if (singleName !== void 0) return fillSingle(table?.[singleName]);
129
+ return "";
130
+ }
131
+ /** `[name]` takes one non-empty string. An array, `''`, or a missing key is a missing param. */
132
+ function fillSingle(value) {
133
+ if (typeof value !== "string" || value.length === 0) return void 0;
134
+ return encodeURIComponent(value);
135
+ }
136
+ /**
137
+ * `[...name]` takes one non-empty string (a single segment, slash included) or a non-empty list of
138
+ * non-empty segments. Each segment is encoded on its own.
139
+ */
140
+ function fillCatchAll(value) {
141
+ if (typeof value === "string") {
142
+ if (value.length === 0) return void 0;
143
+ return encodeURIComponent(value);
144
+ }
145
+ if (!Array.isArray(value) || value.length === 0) return void 0;
146
+ const segments = [];
147
+ for (const segment of value) {
148
+ if (typeof segment !== "string" || segment.length === 0) return void 0;
149
+ segments.push(encodeURIComponent(segment));
150
+ }
151
+ return segments.join("/");
152
+ }
153
+ /** `[[...name]]` omits the segment when the value is missing, `''`, or `[]`. */
154
+ function fillOptional(value) {
155
+ if (value === void 0 || value === "" || Array.isArray(value) && value.length === 0) return { omit: true };
156
+ const text = fillCatchAll(value);
157
+ if (text === void 0) return void 0;
158
+ return {
159
+ omit: false,
160
+ text
161
+ };
162
+ }
163
+ function appendQuery(path, query) {
164
+ if (!isRecord(query)) return path;
165
+ const search = new URLSearchParams();
166
+ for (const [key, value] of Object.entries(query)) {
167
+ const values = Array.isArray(value) ? value : [value];
168
+ for (const item of values) if (typeof item === "string") search.append(key, item);
169
+ }
170
+ const text = search.toString();
171
+ return text.length === 0 ? path : `${path}?${text}`;
172
+ }
173
+ function appendHash(path, hash) {
174
+ if (typeof hash !== "string" || hash.length === 0 || hash === "#") return path;
175
+ return `${path}${hash.startsWith("#") ? hash : `#${hash}`}`;
176
+ }
177
+ /**
178
+ * The `buildUrl` join, without an origin. `'/'` contributes no prefix, so a root path stays `'/'`
179
+ * and a root plus a query or hash stays `'/?…'` or `'/#…'`. Any other base path joins in front, and
180
+ * a root suffix is the bare base path (`/pt-BR`): Next.js 308-redirects `/pt-BR/` to it.
181
+ */
182
+ function prefixBasePath(href, basePath) {
183
+ const cut = splitPath(href);
184
+ const pathPart = cut === -1 ? href : href.slice(0, cut);
185
+ const tail = cut === -1 ? "" : href.slice(cut);
186
+ const suffix = normalizePath(pathPart);
187
+ const prefix = basePath === "/" ? "" : basePath;
188
+ return `${suffix === "/" ? prefix || "/" : `${prefix}${suffix}`}${tail}`;
189
+ }
190
+ /** The first `?` or `#`, or `-1` when the href is only a path. */
191
+ function splitPath(href) {
192
+ const query = href.indexOf("?");
193
+ const hash = href.indexOf("#");
194
+ if (query === -1) return hash;
195
+ if (hash === -1) return query;
196
+ return Math.min(query, hash);
197
+ }
198
+ function safeHrefReason(reason) {
199
+ switch (reason) {
200
+ case "blank":
201
+ case "malformed":
202
+ case "protocol-relative":
203
+ case "forbidden-scheme": return reason;
204
+ case "absolute":
205
+ case "sign-in-route": return "malformed";
206
+ }
207
+ }
208
+ function isRecord(value) {
209
+ return typeof value === "object" && value !== null && !Array.isArray(value);
210
+ }
211
+ //#endregion
212
+ export { resolveStorefrontHref };
213
+
214
+ //# sourceMappingURL=resolve-storefront-href.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-storefront-href.js","names":[],"sources":["../../../src/sdk/navigation/resolve-storefront-href.ts"],"sourcesContent":["import type { StorefrontContext } from '@vtex/fs-core';\nimport { resolveSafeHref, type SafeHrefRejection } from '../../utils/safe-href.js';\nimport { normalizePath, withoutBasePath } from './path.js';\nimport type { PageRef, ResolveHrefReason, ResolveHrefResult, RouteMap, RouteMapEntry } from './types.js';\n\ntype BindingContext = Pick<StorefrontContext, 'bindingId' | 'basePath'>;\n\n/**\n * A param name is what Next and the compiler accept between brackets: word characters and hyphens.\n * Shared: `matchAll` iterates a clone, so the `g` flag's `lastIndex` never leaks between calls.\n */\nconst PARAM_TOKEN = /\\[\\[(?:\\.{3})([\\w-]+)\\]\\]|\\[\\.{3}([\\w-]+)\\]|\\[([\\w-]+)\\]/g;\n\n/**\n * The public href for one binding: a page reference looked up in the route map, or a logical path\n * prefixed with `basePath`. An anchor is returned as written. A rejected string and a page that\n * cannot be built return `href: null` and a reason. Never throws and never logs.\n */\nexport function resolveStorefrontHref(\n context: Pick<StorefrontContext, 'bindingId' | 'basePath'>,\n routeMap: RouteMap,\n target: PageRef | string,\n): ResolveHrefResult {\n // `PageRef` is an exclusive union, so which field is present is a runtime check.\n const value: unknown = target;\n if (typeof value === 'string') return resolveString(context, value);\n if (!isRecord(value)) return { href: null, reason: 'invalid-ref' };\n\n const page = value.page;\n if (typeof page === 'string') {\n const entry = ownPage(routeMap, page);\n if (entry === undefined) return { href: null, reason: 'unknown-page' };\n return resolveEntry(context, entry, value);\n }\n\n const standard = value.standard;\n if (typeof standard !== 'string') return { href: null, reason: 'invalid-ref' };\n\n const matches = standardIndex(routeMap).get(standard) ?? [];\n const entry = matches[0];\n if (entry === undefined) return { href: null, reason: 'unknown-standard' };\n if (matches.length > 1) return { href: null, reason: 'ambiguous-standard' };\n return resolveEntry(context, entry, value);\n}\n\nconst standardIndexes = new WeakMap<RouteMap, Map<string, RouteMapEntry[]>>();\n\n/** The entries that declare each standard, built once per route map: links resolve on every render. */\nfunction standardIndex(routeMap: RouteMap): Map<string, RouteMapEntry[]> {\n const cached = standardIndexes.get(routeMap);\n if (cached) return cached;\n const index = new Map<string, RouteMapEntry[]>();\n for (const entry of Object.values(routeMap)) {\n if (!isRouteMapEntry(entry) || entry.standard === undefined) continue;\n index.set(entry.standard, [...(index.get(entry.standard) ?? []), entry]);\n }\n standardIndexes.set(routeMap, index);\n return index;\n}\n\nfunction resolveString(context: BindingContext, raw: string): ResolveHrefResult {\n const trimmed = raw.trim();\n if (trimmed.startsWith('#')) return { href: trimmed };\n\n const checked = resolveSafeHref(raw);\n if (!checked.safe) return { href: null, reason: safeHrefReason(checked.reason) };\n if (checked.href.startsWith('/')) {\n // A string that already carries this binding's base path is read as public: a CMS link is\n // published after the build, so the gate's `base-path-in-link` never sees it.\n return { href: prefixBasePath(withoutBasePath(checked.href, context.basePath), context.basePath) };\n }\n return { href: checked.href };\n}\n\nfunction resolveEntry(\n context: BindingContext,\n entry: RouteMapEntry,\n target: Record<string, unknown>,\n): ResolveHrefResult {\n if (entry.bindings !== undefined && !entry.bindings.includes(context.bindingId)) {\n return { href: null, reason: 'outside-bindings' };\n }\n\n const filled = fillPattern(logicalPath(entry, context.bindingId), target.params);\n if (filled === undefined) return { href: null, reason: 'missing-param' };\n\n return { href: prefixBasePath(appendHash(appendQuery(filled, target.query), target.hash), context.basePath) };\n}\n\n/**\n * The map entry stored on `page` itself. Bracket access also sees `Object.prototype`\n * (`toString`, `constructor`, `hasOwnProperty`, `__proto__`), and those values are not pages.\n */\nfunction ownPage(routeMap: RouteMap, page: string): RouteMapEntry | undefined {\n if (!Object.hasOwn(routeMap, page)) return undefined;\n const entry: unknown = routeMap[page];\n return isRouteMapEntry(entry) ? entry : undefined;\n}\n\nfunction isRouteMapEntry(value: unknown): value is RouteMapEntry {\n return isRecord(value) && typeof value.pattern === 'string';\n}\n\nfunction logicalPath(entry: RouteMapEntry, bindingId: string): string {\n const aliases = entry.aliases;\n if (aliases === undefined || !Object.hasOwn(aliases, bindingId)) return entry.pattern;\n return aliases[bindingId] ?? entry.pattern;\n}\n\nfunction fillPattern(pattern: string, params: unknown): string | undefined {\n const table = isRecord(params) ? params : undefined;\n let path = '';\n let last = 0;\n\n for (const match of pattern.matchAll(PARAM_TOKEN)) {\n const index = match.index ?? 0;\n path += pattern.slice(last, index);\n\n const filled = fillToken(match, table);\n if (filled === undefined) return undefined;\n if (filled === null) {\n if (path.endsWith('/')) path = path.slice(0, -1);\n } else {\n path += filled;\n }\n\n last = index + match[0].length;\n }\n\n return path + pattern.slice(last);\n}\n\n/**\n * The text one param token contributes: `null` for an omitted `[[...name]]`, which drops its\n * preceding slash, and `undefined` for a missing param.\n */\nfunction fillToken(match: RegExpMatchArray, table: Record<string, unknown> | undefined): string | null | undefined {\n const [, optionalName, catchAllName, singleName] = match;\n if (optionalName !== undefined) {\n const filled = fillOptional(table?.[optionalName]);\n if (filled === undefined) return undefined;\n return filled.omit ? null : filled.text;\n }\n if (catchAllName !== undefined) return fillCatchAll(table?.[catchAllName]);\n if (singleName !== undefined) return fillSingle(table?.[singleName]);\n return '';\n}\n\n/** `[name]` takes one non-empty string. An array, `''`, or a missing key is a missing param. */\nfunction fillSingle(value: unknown): string | undefined {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n return encodeURIComponent(value);\n}\n\n/**\n * `[...name]` takes one non-empty string (a single segment, slash included) or a non-empty list of\n * non-empty segments. Each segment is encoded on its own.\n */\nfunction fillCatchAll(value: unknown): string | undefined {\n if (typeof value === 'string') {\n if (value.length === 0) return undefined;\n return encodeURIComponent(value);\n }\n if (!Array.isArray(value) || value.length === 0) return undefined;\n\n const segments: string[] = [];\n for (const segment of value) {\n if (typeof segment !== 'string' || segment.length === 0) return undefined;\n segments.push(encodeURIComponent(segment));\n }\n return segments.join('/');\n}\n\n/** `[[...name]]` omits the segment when the value is missing, `''`, or `[]`. */\nfunction fillOptional(value: unknown): { omit: true } | { omit: false; text: string } | undefined {\n if (value === undefined || value === '' || (Array.isArray(value) && value.length === 0)) return { omit: true };\n const text = fillCatchAll(value);\n if (text === undefined) return undefined;\n return { omit: false, text };\n}\n\nfunction appendQuery(path: string, query: unknown): string {\n if (!isRecord(query)) return path;\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n const values: unknown[] = Array.isArray(value) ? value : [value];\n for (const item of values) {\n if (typeof item === 'string') search.append(key, item);\n }\n }\n const text = search.toString();\n return text.length === 0 ? path : `${path}?${text}`;\n}\n\nfunction appendHash(path: string, hash: unknown): string {\n if (typeof hash !== 'string' || hash.length === 0 || hash === '#') return path;\n const fragment = hash.startsWith('#') ? hash : `#${hash}`;\n return `${path}${fragment}`;\n}\n\n/**\n * The `buildUrl` join, without an origin. `'/'` contributes no prefix, so a root path stays `'/'`\n * and a root plus a query or hash stays `'/?…'` or `'/#…'`. Any other base path joins in front, and\n * a root suffix is the bare base path (`/pt-BR`): Next.js 308-redirects `/pt-BR/` to it.\n */\nfunction prefixBasePath(href: string, basePath: string): string {\n const cut = splitPath(href);\n const pathPart = cut === -1 ? href : href.slice(0, cut);\n const tail = cut === -1 ? '' : href.slice(cut);\n const suffix = normalizePath(pathPart);\n const prefix = basePath === '/' ? '' : basePath;\n const path = suffix === '/' ? prefix || '/' : `${prefix}${suffix}`;\n return `${path}${tail}`;\n}\n\n/** The first `?` or `#`, or `-1` when the href is only a path. */\nfunction splitPath(href: string): number {\n const query = href.indexOf('?');\n const hash = href.indexOf('#');\n if (query === -1) return hash;\n if (hash === -1) return query;\n return Math.min(query, hash);\n}\n\nfunction safeHrefReason(reason: SafeHrefRejection): ResolveHrefReason {\n switch (reason) {\n case 'blank':\n case 'malformed':\n case 'protocol-relative':\n case 'forbidden-scheme':\n return reason;\n // `resolveSafeHref` never returns these. They belong to the narrower helpers that share its type.\n case 'absolute':\n case 'sign-in-route':\n return 'malformed';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":";;;;;;;AAWA,MAAM,cAAc;;;;;;AAOpB,SAAgB,sBACd,SACA,UACA,QACmB;CAEnB,MAAM,QAAiB;CACvB,IAAI,OAAO,UAAU,UAAU,OAAO,cAAc,SAAS,KAAK;CAClE,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO;EAAE,MAAM;EAAM,QAAQ;CAAc;CAEjE,MAAM,OAAO,MAAM;CACnB,IAAI,OAAO,SAAS,UAAU;EAC5B,MAAM,QAAQ,QAAQ,UAAU,IAAI;EACpC,IAAI,UAAU,KAAA,GAAW,OAAO;GAAE,MAAM;GAAM,QAAQ;EAAe;EACrE,OAAO,aAAa,SAAS,OAAO,KAAK;CAC3C;CAEA,MAAM,WAAW,MAAM;CACvB,IAAI,OAAO,aAAa,UAAU,OAAO;EAAE,MAAM;EAAM,QAAQ;CAAc;CAE7E,MAAM,UAAU,cAAc,QAAQ,CAAC,CAAC,IAAI,QAAQ,KAAK,CAAC;CAC1D,MAAM,QAAQ,QAAQ;CACtB,IAAI,UAAU,KAAA,GAAW,OAAO;EAAE,MAAM;EAAM,QAAQ;CAAmB;CACzE,IAAI,QAAQ,SAAS,GAAG,OAAO;EAAE,MAAM;EAAM,QAAQ;CAAqB;CAC1E,OAAO,aAAa,SAAS,OAAO,KAAK;AAC3C;AAEA,MAAM,kCAAkB,IAAI,QAAgD;;AAG5E,SAAS,cAAc,UAAkD;CACvE,MAAM,SAAS,gBAAgB,IAAI,QAAQ;CAC3C,IAAI,QAAQ,OAAO;CACnB,MAAM,wBAAQ,IAAI,IAA6B;CAC/C,KAAK,MAAM,SAAS,OAAO,OAAO,QAAQ,GAAG;EAC3C,IAAI,CAAC,gBAAgB,KAAK,KAAK,MAAM,aAAa,KAAA,GAAW;EAC7D,MAAM,IAAI,MAAM,UAAU,CAAC,GAAI,MAAM,IAAI,MAAM,QAAQ,KAAK,CAAC,GAAI,KAAK,CAAC;CACzE;CACA,gBAAgB,IAAI,UAAU,KAAK;CACnC,OAAO;AACT;AAEA,SAAS,cAAc,SAAyB,KAAgC;CAC9E,MAAM,UAAU,IAAI,KAAK;CACzB,IAAI,QAAQ,WAAW,GAAG,GAAG,OAAO,EAAE,MAAM,QAAQ;CAEpD,MAAM,UAAU,gBAAgB,GAAG;CACnC,IAAI,CAAC,QAAQ,MAAM,OAAO;EAAE,MAAM;EAAM,QAAQ,eAAe,QAAQ,MAAM;CAAE;CAC/E,IAAI,QAAQ,KAAK,WAAW,GAAG,GAG7B,OAAO,EAAE,MAAM,eAAe,gBAAgB,QAAQ,MAAM,QAAQ,QAAQ,GAAG,QAAQ,QAAQ,EAAE;CAEnG,OAAO,EAAE,MAAM,QAAQ,KAAK;AAC9B;AAEA,SAAS,aACP,SACA,OACA,QACmB;CACnB,IAAI,MAAM,aAAa,KAAA,KAAa,CAAC,MAAM,SAAS,SAAS,QAAQ,SAAS,GAC5E,OAAO;EAAE,MAAM;EAAM,QAAQ;CAAmB;CAGlD,MAAM,SAAS,YAAY,YAAY,OAAO,QAAQ,SAAS,GAAG,OAAO,MAAM;CAC/E,IAAI,WAAW,KAAA,GAAW,OAAO;EAAE,MAAM;EAAM,QAAQ;CAAgB;CAEvE,OAAO,EAAE,MAAM,eAAe,WAAW,YAAY,QAAQ,OAAO,KAAK,GAAG,OAAO,IAAI,GAAG,QAAQ,QAAQ,EAAE;AAC9G;;;;;AAMA,SAAS,QAAQ,UAAoB,MAAyC;CAC5E,IAAI,CAAC,OAAO,OAAO,UAAU,IAAI,GAAG,OAAO,KAAA;CAC3C,MAAM,QAAiB,SAAS;CAChC,OAAO,gBAAgB,KAAK,IAAI,QAAQ,KAAA;AAC1C;AAEA,SAAS,gBAAgB,OAAwC;CAC/D,OAAO,SAAS,KAAK,KAAK,OAAO,MAAM,YAAY;AACrD;AAEA,SAAS,YAAY,OAAsB,WAA2B;CACpE,MAAM,UAAU,MAAM;CACtB,IAAI,YAAY,KAAA,KAAa,CAAC,OAAO,OAAO,SAAS,SAAS,GAAG,OAAO,MAAM;CAC9E,OAAO,QAAQ,cAAc,MAAM;AACrC;AAEA,SAAS,YAAY,SAAiB,QAAqC;CACzE,MAAM,QAAQ,SAAS,MAAM,IAAI,SAAS,KAAA;CAC1C,IAAI,OAAO;CACX,IAAI,OAAO;CAEX,KAAK,MAAM,SAAS,QAAQ,SAAS,WAAW,GAAG;EACjD,MAAM,QAAQ,MAAM,SAAS;EAC7B,QAAQ,QAAQ,MAAM,MAAM,KAAK;EAEjC,MAAM,SAAS,UAAU,OAAO,KAAK;EACrC,IAAI,WAAW,KAAA,GAAW,OAAO,KAAA;EACjC,IAAI,WAAW,MACT;OAAA,KAAK,SAAS,GAAG,GAAG,OAAO,KAAK,MAAM,GAAG,EAAE;EAAA,OAE/C,QAAQ;EAGV,OAAO,QAAQ,MAAM,EAAE,CAAC;CAC1B;CAEA,OAAO,OAAO,QAAQ,MAAM,IAAI;AAClC;;;;;AAMA,SAAS,UAAU,OAAyB,OAAuE;CACjH,MAAM,GAAG,cAAc,cAAc,cAAc;CACnD,IAAI,iBAAiB,KAAA,GAAW;EAC9B,MAAM,SAAS,aAAa,QAAQ,aAAa;EACjD,IAAI,WAAW,KAAA,GAAW,OAAO,KAAA;EACjC,OAAO,OAAO,OAAO,OAAO,OAAO;CACrC;CACA,IAAI,iBAAiB,KAAA,GAAW,OAAO,aAAa,QAAQ,aAAa;CACzE,IAAI,eAAe,KAAA,GAAW,OAAO,WAAW,QAAQ,WAAW;CACnE,OAAO;AACT;;AAGA,SAAS,WAAW,OAAoC;CACtD,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG,OAAO,KAAA;CAC5D,OAAO,mBAAmB,KAAK;AACjC;;;;;AAMA,SAAS,aAAa,OAAoC;CACxD,IAAI,OAAO,UAAU,UAAU;EAC7B,IAAI,MAAM,WAAW,GAAG,OAAO,KAAA;EAC/B,OAAO,mBAAmB,KAAK;CACjC;CACA,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG,OAAO,KAAA;CAExD,MAAM,WAAqB,CAAC;CAC5B,KAAK,MAAM,WAAW,OAAO;EAC3B,IAAI,OAAO,YAAY,YAAY,QAAQ,WAAW,GAAG,OAAO,KAAA;EAChE,SAAS,KAAK,mBAAmB,OAAO,CAAC;CAC3C;CACA,OAAO,SAAS,KAAK,GAAG;AAC1B;;AAGA,SAAS,aAAa,OAA4E;CAChG,IAAI,UAAU,KAAA,KAAa,UAAU,MAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAI,OAAO,EAAE,MAAM,KAAK;CAC7G,MAAM,OAAO,aAAa,KAAK;CAC/B,IAAI,SAAS,KAAA,GAAW,OAAO,KAAA;CAC/B,OAAO;EAAE,MAAM;EAAO;CAAK;AAC7B;AAEA,SAAS,YAAY,MAAc,OAAwB;CACzD,IAAI,CAAC,SAAS,KAAK,GAAG,OAAO;CAE7B,MAAM,SAAS,IAAI,gBAAgB;CACnC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;EAChD,MAAM,SAAoB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;EAC/D,KAAK,MAAM,QAAQ,QACjB,IAAI,OAAO,SAAS,UAAU,OAAO,OAAO,KAAK,IAAI;CAEzD;CACA,MAAM,OAAO,OAAO,SAAS;CAC7B,OAAO,KAAK,WAAW,IAAI,OAAO,GAAG,KAAK,GAAG;AAC/C;AAEA,SAAS,WAAW,MAAc,MAAuB;CACvD,IAAI,OAAO,SAAS,YAAY,KAAK,WAAW,KAAK,SAAS,KAAK,OAAO;CAE1E,OAAO,GAAG,OADO,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI;AAErD;;;;;;AAOA,SAAS,eAAe,MAAc,UAA0B;CAC9D,MAAM,MAAM,UAAU,IAAI;CAC1B,MAAM,WAAW,QAAQ,KAAK,OAAO,KAAK,MAAM,GAAG,GAAG;CACtD,MAAM,OAAO,QAAQ,KAAK,KAAK,KAAK,MAAM,GAAG;CAC7C,MAAM,SAAS,cAAc,QAAQ;CACrC,MAAM,SAAS,aAAa,MAAM,KAAK;CAEvC,OAAO,GADM,WAAW,MAAM,UAAU,MAAM,GAAG,SAAS,WACzC;AACnB;;AAGA,SAAS,UAAU,MAAsB;CACvC,MAAM,QAAQ,KAAK,QAAQ,GAAG;CAC9B,MAAM,OAAO,KAAK,QAAQ,GAAG;CAC7B,IAAI,UAAU,IAAI,OAAO;CACzB,IAAI,SAAS,IAAI,OAAO;CACxB,OAAO,KAAK,IAAI,OAAO,IAAI;AAC7B;AAEA,SAAS,eAAe,QAA8C;CACpE,QAAQ,QAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,oBACH,OAAO;EAET,KAAK;EACL,KAAK,iBACH,OAAO;CACX;AACF;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E"}
@@ -0,0 +1,11 @@
1
+ import { ReactNode } from "react";
2
+ //#region src/sdk/navigation/route-identity-provider.d.ts
3
+ export type RouteIdentityProviderProps = Readonly<{
4
+ /** The page name: the key of the route map. */
5
+ name: string;
6
+ children: ReactNode;
7
+ }>;
8
+ /** The route marker the generator wraps around each page's JSX. */
9
+ export declare function RouteIdentityProvider({ name, children }: RouteIdentityProviderProps): import("react/jsx-runtime").JSX.Element;
10
+ //#endregion
11
+ //# sourceMappingURL=route-identity-provider.d.ts.map
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { createContext, useContext } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/sdk/navigation/route-identity-provider.tsx
5
+ const Context = createContext(null);
6
+ /** The route marker the generator wraps around each page's JSX. */
7
+ function RouteIdentityProvider({ name, children }) {
8
+ return /* @__PURE__ */ jsx(Context.Provider, {
9
+ value: name,
10
+ children
11
+ });
12
+ }
13
+ /** The nearest marker's page name, or `null` outside one (a layout, for example). */
14
+ function useRouteIdentityName() {
15
+ return useContext(Context);
16
+ }
17
+ //#endregion
18
+ export { RouteIdentityProvider, useRouteIdentityName };
19
+
20
+ //# sourceMappingURL=route-identity-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-identity-provider.js","names":[],"sources":["../../../src/sdk/navigation/route-identity-provider.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, type ReactNode, useContext } from 'react';\n\nexport type RouteIdentityProviderProps = Readonly<{\n /** The page name: the key of the route map. */\n name: string;\n children: ReactNode;\n}>;\n\nconst Context = createContext<string | null>(null);\n\n/** The route marker the generator wraps around each page's JSX. */\nexport function RouteIdentityProvider({ name, children }: RouteIdentityProviderProps) {\n return <Context.Provider value={name}>{children}</Context.Provider>;\n}\n\n/** The nearest marker's page name, or `null` outside one (a layout, for example). */\nexport function useRouteIdentityName(): string | null {\n return useContext(Context);\n}\n"],"mappings":";;;;AAUA,MAAM,UAAU,cAA6B,IAAI;;AAGjD,SAAgB,sBAAsB,EAAE,MAAM,YAAwC;CACpF,OAAO,oBAAC,QAAQ,UAAT;EAAkB,OAAO;EAAO;CAA2B,CAAA;AACpE;;AAGA,SAAgB,uBAAsC;CACpD,OAAO,WAAW,OAAO;AAC3B"}
@@ -0,0 +1,19 @@
1
+ import { RouteMap } from "./types.js";
2
+ import { ReactNode } from "react";
3
+ //#region src/sdk/navigation/route-map-provider.d.ts
4
+ /** The generated resolver's `toLogicalPath`: the path under a binding's base path. */
5
+ export type ToLogicalPath = (entry: {
6
+ basePath: string;
7
+ }, pathname: string) => string;
8
+ export type RouteMapProviderProps = Readonly<{
9
+ routeMap: RouteMap;
10
+ toLogicalPath: ToLogicalPath;
11
+ children: ReactNode;
12
+ }>;
13
+ /**
14
+ * Publishes the generated route map and `toLogicalPath` to the Client tree. `toLogicalPath` is a prop
15
+ * because the SDK cannot import the generated resolver and must not reimplement the prefix rule.
16
+ */
17
+ export declare function RouteMapProvider({ routeMap, toLogicalPath, children }: RouteMapProviderProps): import("react/jsx-runtime").JSX.Element;
18
+ //#endregion
19
+ //# sourceMappingURL=route-map-provider.d.ts.map