@vtex/faststore 0.0.8 → 0.0.11

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 (568) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/README.md +0 -1
  3. package/dist/actions.json +48 -1
  4. package/dist/catalog.json +1397 -1594
  5. package/dist/cli/index.d.ts +66 -28
  6. package/dist/cli/index.js +7371 -512
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/cli/server-runtime.js +41 -60
  9. package/dist/cli/server-runtime.js.map +1 -1
  10. package/dist/client.d.ts +3 -3
  11. package/dist/client.js +2 -2
  12. package/dist/components.d.ts +67 -56
  13. package/dist/components.js +64 -53
  14. package/dist/content-types.json +5886 -555
  15. package/dist/core/dist/define-component.d.ts +7 -2
  16. package/dist/core/dist/define-content-type.d.ts +50 -2
  17. package/dist/core/dist/define-content-type.js +107 -3
  18. package/dist/core/dist/define-content-type.js.map +1 -1
  19. package/dist/core/dist/index.d.ts +2 -2
  20. package/dist/docs/access-code-field.md +1 -1
  21. package/dist/docs/access-code-sign-in.md +126 -77
  22. package/dist/docs/account-address-book.md +210 -95
  23. package/dist/docs/account-entry-point.md +4 -4
  24. package/dist/docs/account-menu.md +16 -17
  25. package/dist/docs/account-saved-cards.md +306 -0
  26. package/dist/docs/alert-dialog.md +3 -1
  27. package/dist/docs/avatar.md +4 -2
  28. package/dist/docs/billing-address.md +99 -30
  29. package/dist/docs/binding-switcher.md +157 -0
  30. package/dist/docs/buy-button.md +7 -8
  31. package/dist/docs/card-entry.md +42 -29
  32. package/dist/docs/card-summary.md +185 -0
  33. package/dist/docs/cardholder-document.md +5 -3
  34. package/dist/docs/carousel.md +5 -4
  35. package/dist/docs/cart-destination.md +251 -0
  36. package/dist/docs/cart-item.md +48 -15
  37. package/dist/docs/cart-totalizer.md +8 -6
  38. package/dist/docs/cart.md +240 -39
  39. package/dist/docs/challenge-return.md +135 -0
  40. package/dist/docs/client-preferences-fieldset.md +10 -5
  41. package/dist/docs/client-preferences.md +31 -8
  42. package/dist/docs/client-profile-fieldset.md +20 -6
  43. package/dist/docs/client-profile.md +12 -3
  44. package/dist/docs/copy-text.md +9 -7
  45. package/dist/docs/document-field.md +1 -1
  46. package/dist/docs/email-field.md +2 -1
  47. package/dist/docs/email-identification.md +12 -2
  48. package/dist/docs/footer-copyright.md +4 -2
  49. package/dist/docs/footer-social.md +1 -1
  50. package/dist/docs/form.md +54 -18
  51. package/dist/docs/free-shipping-progress.md +18 -13
  52. package/dist/docs/identity-edit.md +8 -2
  53. package/dist/docs/identity-summary.md +18 -5
  54. package/dist/docs/incentives.md +2 -2
  55. package/dist/docs/installments.md +46 -32
  56. package/dist/docs/logo.md +1 -1
  57. package/dist/docs/my-account-profile.md +16 -11
  58. package/dist/docs/navigation-link.md +5 -3
  59. package/dist/docs/order-cancel.md +3 -1
  60. package/dist/docs/order-delivery-address.md +7 -5
  61. package/dist/docs/order-delivery-group.md +1 -3
  62. package/dist/docs/order-details-back.md +1 -1
  63. package/dist/docs/order-details-header.md +1 -4
  64. package/dist/docs/order-invoice-download.md +60 -0
  65. package/dist/docs/order-list-row.md +1 -1
  66. package/dist/docs/order-list-search.md +13 -20
  67. package/dist/docs/order-list-views.md +11 -17
  68. package/dist/docs/order-list.md +12 -5
  69. package/dist/docs/order-payment.md +9 -7
  70. package/dist/docs/order-placed-date.md +1 -1
  71. package/dist/docs/order-placed-payment-summary.md +28 -15
  72. package/dist/docs/order-placed.md +49 -14
  73. package/dist/docs/order-progress.md +1 -1
  74. package/dist/docs/order-status-badge.md +20 -9
  75. package/dist/docs/order-summary.md +2 -2
  76. package/dist/docs/order-tracking-link.md +58 -0
  77. package/dist/docs/payment-method-badges.md +32 -6
  78. package/dist/docs/payment-methods.md +2 -2
  79. package/dist/docs/payment.md +36 -17
  80. package/dist/docs/phone-field.md +4 -4
  81. package/dist/docs/place-order.md +84 -36
  82. package/dist/docs/postal-code-field.md +3 -1
  83. package/dist/docs/pricing.md +21 -23
  84. package/dist/docs/product-gallery.md +19 -20
  85. package/dist/docs/product-information.md +14 -10
  86. package/dist/docs/product-list.md +7 -6
  87. package/dist/docs/product-shelf.md +7 -1
  88. package/dist/docs/promotion.md +4 -2
  89. package/dist/docs/region.md +23 -15
  90. package/dist/docs/save-card.md +7 -6
  91. package/dist/docs/saved-cards.md +65 -36
  92. package/dist/docs/select.md +3 -4
  93. package/dist/docs/shipping-address.md +57 -21
  94. package/dist/docs/shipping-simulator.md +53 -15
  95. package/dist/docs/sign-in-disclosure.md +176 -0
  96. package/dist/docs/sign-in-form.md +78 -47
  97. package/dist/docs/sign-in-redirect.md +5 -3
  98. package/dist/docs/sign-in.md +173 -0
  99. package/dist/docs/toast.md +45 -16
  100. package/dist/docs/variant-selector.md +15 -11
  101. package/dist/graphql/types.d.ts +4 -14
  102. package/dist/index.d.ts +3 -2
  103. package/dist/internal/client.d.ts +4 -3
  104. package/dist/internal/client.js +5 -2
  105. package/dist/internal/server.d.ts +10 -5
  106. package/dist/internal/server.js +9 -4
  107. package/dist/matter/access-code-sign-in/access-code-sign-in.d.ts +250 -66
  108. package/dist/matter/access-code-sign-in/access-code-sign-in.js +459 -188
  109. package/dist/matter/access-code-sign-in/access-code-sign-in.js.map +1 -1
  110. package/dist/matter/account-address-book/account-address-book-delete.d.ts +78 -40
  111. package/dist/matter/account-address-book/account-address-book-delete.js +86 -50
  112. package/dist/matter/account-address-book/account-address-book-delete.js.map +1 -1
  113. package/dist/matter/account-address-book/account-address-book-deliverability.d.ts +21 -4
  114. package/dist/matter/account-address-book/account-address-book-deliverability.js +45 -17
  115. package/dist/matter/account-address-book/account-address-book-deliverability.js.map +1 -1
  116. package/dist/matter/account-address-book/account-address-book-form-parts.d.ts +74 -19
  117. package/dist/matter/account-address-book/account-address-book-form-parts.js +77 -26
  118. package/dist/matter/account-address-book/account-address-book-form-parts.js.map +1 -1
  119. package/dist/matter/account-address-book/account-address-book-profile-notice.d.ts +27 -6
  120. package/dist/matter/account-address-book/account-address-book-profile-notice.js +55 -28
  121. package/dist/matter/account-address-book/account-address-book-profile-notice.js.map +1 -1
  122. package/dist/matter/account-address-book/account-address-book.d.ts +67 -14
  123. package/dist/matter/account-address-book/account-address-book.js +74 -33
  124. package/dist/matter/account-address-book/account-address-book.js.map +1 -1
  125. package/dist/matter/account-address-book/account-address-country-switch.js +3 -3
  126. package/dist/matter/account-address-book/account-address-country-switch.js.map +1 -1
  127. package/dist/matter/account-address-book/account-address-country.d.ts +66 -20
  128. package/dist/matter/account-address-book/account-address-country.js +83 -49
  129. package/dist/matter/account-address-book/account-address-country.js.map +1 -1
  130. package/dist/matter/account-address-book/account-address-form-context.d.ts +8 -4
  131. package/dist/matter/account-address-book/account-address-form-context.js.map +1 -1
  132. package/dist/matter/account-address-book/account-address-form.d.ts +468 -45
  133. package/dist/matter/account-address-book/account-address-form.js +518 -155
  134. package/dist/matter/account-address-book/account-address-form.js.map +1 -1
  135. package/dist/matter/account-address-book/account-address-record.d.ts +27 -6
  136. package/dist/matter/account-address-book/account-address-record.js +32 -17
  137. package/dist/matter/account-address-book/account-address-record.js.map +1 -1
  138. package/dist/matter/account-menu/account-menu.d.ts +34 -17
  139. package/dist/matter/account-menu/account-menu.js +46 -54
  140. package/dist/matter/account-menu/account-menu.js.map +1 -1
  141. package/dist/matter/account-menu-identity/account-menu-identity.js +1 -1
  142. package/dist/matter/account-saved-cards/account-saved-cards.d.ts +463 -0
  143. package/dist/matter/account-saved-cards/account-saved-cards.js +1011 -0
  144. package/dist/matter/account-saved-cards/account-saved-cards.js.map +1 -0
  145. package/dist/matter/billing-address/billing-address.d.ts +156 -74
  146. package/dist/matter/billing-address/billing-address.js +227 -156
  147. package/dist/matter/billing-address/billing-address.js.map +1 -1
  148. package/dist/matter/breadcrumb/breadcrumb.d.ts +21 -3
  149. package/dist/matter/breadcrumb/breadcrumb.js +24 -9
  150. package/dist/matter/breadcrumb/breadcrumb.js.map +1 -1
  151. package/dist/matter/buy-button/buy-button.d.ts +8 -11
  152. package/dist/matter/buy-button/buy-button.js +10 -19
  153. package/dist/matter/buy-button/buy-button.js.map +1 -1
  154. package/dist/matter/card-entry/card-capture.js +12 -4
  155. package/dist/matter/card-entry/card-capture.js.map +1 -1
  156. package/dist/matter/card-entry/card-entry.d.ts +123 -32
  157. package/dist/matter/card-entry/card-entry.js +348 -221
  158. package/dist/matter/card-entry/card-entry.js.map +1 -1
  159. package/dist/matter/cart/cart-namespace.d.ts +11 -1
  160. package/dist/matter/cart/cart-namespace.js +11 -1
  161. package/dist/matter/cart/cart-namespace.js.map +1 -1
  162. package/dist/matter/cart/cart.d.ts +416 -45
  163. package/dist/matter/cart/cart.js +782 -101
  164. package/dist/matter/cart/cart.js.map +1 -1
  165. package/dist/matter/cart-destination/cart-destination.d.ts +233 -0
  166. package/dist/matter/cart-destination/cart-destination.js +703 -0
  167. package/dist/matter/cart-destination/cart-destination.js.map +1 -0
  168. package/dist/matter/cart-item/cart-item.d.ts +145 -16
  169. package/dist/matter/cart-item/cart-item.js +230 -54
  170. package/dist/matter/cart-item/cart-item.js.map +1 -1
  171. package/dist/matter/cart-item-compositions/cart-item-compositions.js +1 -1
  172. package/dist/matter/cart-item-compositions/cart-item-compositions.js.map +1 -1
  173. package/dist/matter/cart-item-customizations/cart-item-customizations.js +1 -1
  174. package/dist/matter/cart-item-customizations/cart-item-customizations.js.map +1 -1
  175. package/dist/matter/cart-item-discounts/cart-item-discounts.js +1 -1
  176. package/dist/matter/cart-item-discounts/cart-item-discounts.js.map +1 -1
  177. package/dist/matter/cart-item-seller-info/cart-item-seller-info.js +1 -1
  178. package/dist/matter/cart-item-seller-info/cart-item-seller-info.js.map +1 -1
  179. package/dist/matter/cart-item-variations/cart-item-variations.js +1 -1
  180. package/dist/matter/cart-item-variations/cart-item-variations.js.map +1 -1
  181. package/dist/matter/cart-totalizer/cart-totalizer.d.ts +43 -9
  182. package/dist/matter/cart-totalizer/cart-totalizer.js +49 -19
  183. package/dist/matter/cart-totalizer/cart-totalizer.js.map +1 -1
  184. package/dist/matter/challenge-return/challenge-return.d.ts +62 -0
  185. package/dist/matter/challenge-return/challenge-return.js +241 -0
  186. package/dist/matter/challenge-return/challenge-return.js.map +1 -0
  187. package/dist/matter/client-preferences/client-preferences-fieldset.d.ts +86 -17
  188. package/dist/matter/client-preferences/client-preferences-fieldset.js +126 -54
  189. package/dist/matter/client-preferences/client-preferences-fieldset.js.map +1 -1
  190. package/dist/matter/client-preferences/client-preferences.d.ts +50 -7
  191. package/dist/matter/client-preferences/client-preferences.js +84 -15
  192. package/dist/matter/client-preferences/client-preferences.js.map +1 -1
  193. package/dist/matter/client-profile/client-profile.d.ts +44 -9
  194. package/dist/matter/client-profile/client-profile.js +64 -24
  195. package/dist/matter/client-profile/client-profile.js.map +1 -1
  196. package/dist/matter/client-profile-form/client-profile-fieldset.d.ts +119 -22
  197. package/dist/matter/client-profile-form/client-profile-fieldset.js +161 -73
  198. package/dist/matter/client-profile-form/client-profile-fieldset.js.map +1 -1
  199. package/dist/matter/delivery-options/delivery-options-accordion.d.ts +49 -4
  200. package/dist/matter/delivery-options/delivery-options-accordion.js +67 -14
  201. package/dist/matter/delivery-options/delivery-options-accordion.js.map +1 -1
  202. package/dist/matter/delivery-options/delivery-options-controller.d.ts +69 -9
  203. package/dist/matter/delivery-options/delivery-options-controller.js +80 -14
  204. package/dist/matter/delivery-options/delivery-options-controller.js.map +1 -1
  205. package/dist/matter/delivery-options/delivery-options.d.ts +37 -2
  206. package/dist/matter/delivery-options/delivery-options.js +75 -12
  207. package/dist/matter/delivery-options/delivery-options.js.map +1 -1
  208. package/dist/matter/delivery-options/use-delivery-option-selection.d.ts +1 -0
  209. package/dist/matter/delivery-options/use-delivery-option-selection.js +1 -1
  210. package/dist/matter/delivery-options/use-delivery-option-selection.js.map +1 -1
  211. package/dist/matter/email-identification/email-identification.d.ts +25 -3
  212. package/dist/matter/email-identification/email-identification.js +49 -12
  213. package/dist/matter/email-identification/email-identification.js.map +1 -1
  214. package/dist/matter/free-shipping-progress/free-shipping-progress.d.ts +85 -10
  215. package/dist/matter/free-shipping-progress/free-shipping-progress.js +153 -53
  216. package/dist/matter/free-shipping-progress/free-shipping-progress.js.map +1 -1
  217. package/dist/matter/identity-edit/identity-edit.d.ts +52 -10
  218. package/dist/matter/identity-edit/identity-edit.js +47 -19
  219. package/dist/matter/identity-edit/identity-edit.js.map +1 -1
  220. package/dist/matter/identity-summary/identity-summary.d.ts +76 -22
  221. package/dist/matter/identity-summary/identity-summary.js +95 -45
  222. package/dist/matter/identity-summary/identity-summary.js.map +1 -1
  223. package/dist/matter/installments/installments-select.d.ts +98 -16
  224. package/dist/matter/installments/installments-select.js +156 -48
  225. package/dist/matter/installments/installments-select.js.map +1 -1
  226. package/dist/matter/installments/installments.d.ts +96 -16
  227. package/dist/matter/installments/installments.js +115 -40
  228. package/dist/matter/installments/installments.js.map +1 -1
  229. package/dist/matter/installments/use-installments-selection.d.ts +1 -0
  230. package/dist/matter/installments/use-installments-selection.js +8 -3
  231. package/dist/matter/installments/use-installments-selection.js.map +1 -1
  232. package/dist/matter/my-account-profile/my-account-profile.d.ts +358 -103
  233. package/dist/matter/my-account-profile/my-account-profile.js +370 -174
  234. package/dist/matter/my-account-profile/my-account-profile.js.map +1 -1
  235. package/dist/matter/order-cancel/order-cancel.d.ts +65 -19
  236. package/dist/matter/order-cancel/order-cancel.js +118 -51
  237. package/dist/matter/order-cancel/order-cancel.js.map +1 -1
  238. package/dist/matter/order-delivery-address/order-delivery-address.d.ts +8 -18
  239. package/dist/matter/order-delivery-address/order-delivery-address.js +14 -23
  240. package/dist/matter/order-delivery-address/order-delivery-address.js.map +1 -1
  241. package/dist/matter/order-delivery-group/order-delivery-group.d.ts +40 -24
  242. package/dist/matter/order-delivery-group/order-delivery-group.js +64 -74
  243. package/dist/matter/order-delivery-group/order-delivery-group.js.map +1 -1
  244. package/dist/matter/order-details-header/order-details-header.d.ts +32 -15
  245. package/dist/matter/order-details-header/order-details-header.js +66 -58
  246. package/dist/matter/order-details-header/order-details-header.js.map +1 -1
  247. package/dist/matter/order-invoice-download/order-invoice-download.d.ts +78 -0
  248. package/dist/matter/order-invoice-download/order-invoice-download.js +173 -0
  249. package/dist/matter/order-invoice-download/order-invoice-download.js.map +1 -0
  250. package/dist/matter/order-list/order-list.d.ts +164 -19
  251. package/dist/matter/order-list/order-list.js +229 -87
  252. package/dist/matter/order-list/order-list.js.map +1 -1
  253. package/dist/matter/order-list-row/order-list-row.d.ts +6 -1
  254. package/dist/matter/order-list-row/order-list-row.js +3 -2
  255. package/dist/matter/order-list-row/order-list-row.js.map +1 -1
  256. package/dist/matter/order-list-search/order-list-search.d.ts +18 -26
  257. package/dist/matter/order-list-search/order-list-search.js +30 -69
  258. package/dist/matter/order-list-search/order-list-search.js.map +1 -1
  259. package/dist/matter/order-list-views/order-list-views.d.ts +15 -22
  260. package/dist/matter/order-list-views/order-list-views.js +22 -68
  261. package/dist/matter/order-list-views/order-list-views.js.map +1 -1
  262. package/dist/matter/order-payment/order-payment.d.ts +33 -10
  263. package/dist/matter/order-payment/order-payment.js +44 -39
  264. package/dist/matter/order-payment/order-payment.js.map +1 -1
  265. package/dist/matter/order-placed/order-placed-deliveries.d.ts +144 -12
  266. package/dist/matter/order-placed/order-placed-deliveries.js +115 -40
  267. package/dist/matter/order-placed/order-placed-deliveries.js.map +1 -1
  268. package/dist/matter/order-placed/order-placed.d.ts +198 -31
  269. package/dist/matter/order-placed/order-placed.js +230 -139
  270. package/dist/matter/order-placed/order-placed.js.map +1 -1
  271. package/dist/matter/order-placed-date/order-placed-date.d.ts +5 -8
  272. package/dist/matter/order-placed-date/order-placed-date.js +7 -8
  273. package/dist/matter/order-placed-date/order-placed-date.js.map +1 -1
  274. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.d.ts +90 -17
  275. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js +93 -117
  276. package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js.map +1 -1
  277. package/dist/matter/order-progress/order-progress.d.ts +19 -8
  278. package/dist/matter/order-progress/order-progress.js +37 -45
  279. package/dist/matter/order-progress/order-progress.js.map +1 -1
  280. package/dist/matter/order-summary/order-summary.d.ts +19 -9
  281. package/dist/matter/order-summary/order-summary.js +38 -44
  282. package/dist/matter/order-summary/order-summary.js.map +1 -1
  283. package/dist/matter/order-tracking-link/order-tracking-link.d.ts +43 -0
  284. package/dist/matter/order-tracking-link/order-tracking-link.js +107 -0
  285. package/dist/matter/order-tracking-link/order-tracking-link.js.map +1 -0
  286. package/dist/matter/payment/payment-card-capture.js +17 -10
  287. package/dist/matter/payment/payment-card-capture.js.map +1 -1
  288. package/dist/matter/payment/payment-controller.d.ts +4 -2
  289. package/dist/matter/payment/payment-controller.js +30 -9
  290. package/dist/matter/payment/payment-controller.js.map +1 -1
  291. package/dist/matter/payment/payment-method-badges.js +1 -1
  292. package/dist/matter/payment/payment.d.ts +69 -19
  293. package/dist/matter/payment/payment.js +101 -35
  294. package/dist/matter/payment/payment.js.map +1 -1
  295. package/dist/matter/payment/use-payment-method-selection.d.ts +25 -4
  296. package/dist/matter/payment/use-payment-method-selection.js +94 -32
  297. package/dist/matter/payment/use-payment-method-selection.js.map +1 -1
  298. package/dist/matter/payment/use-payment-submit-gate.d.ts +14 -3
  299. package/dist/matter/payment/use-payment-submit-gate.js +47 -8
  300. package/dist/matter/payment/use-payment-submit-gate.js.map +1 -1
  301. package/dist/matter/place-order/place-order.d.ts +171 -57
  302. package/dist/matter/place-order/place-order.js +376 -185
  303. package/dist/matter/place-order/place-order.js.map +1 -1
  304. package/dist/matter/pricing/pricing.d.ts +152 -13
  305. package/dist/matter/pricing/pricing.js +153 -52
  306. package/dist/matter/pricing/pricing.js.map +1 -1
  307. package/dist/matter/product-information/product-information.d.ts +27 -4
  308. package/dist/matter/product-information/product-information.js +32 -15
  309. package/dist/matter/product-information/product-information.js.map +1 -1
  310. package/dist/matter/product-list/product-list.d.ts +24 -6
  311. package/dist/matter/product-list/product-list.js +32 -26
  312. package/dist/matter/product-list/product-list.js.map +1 -1
  313. package/dist/matter/product-shelf/product-shelf.d.ts +8 -3
  314. package/dist/matter/product-shelf/product-shelf.js +111 -10
  315. package/dist/matter/product-shelf/product-shelf.js.map +1 -1
  316. package/dist/matter/region/region.d.ts +33 -16
  317. package/dist/matter/region/region.js +59 -52
  318. package/dist/matter/region/region.js.map +1 -1
  319. package/dist/matter/save-card/save-card.d.ts +43 -8
  320. package/dist/matter/save-card/save-card.js +61 -23
  321. package/dist/matter/save-card/save-card.js.map +1 -1
  322. package/dist/matter/saved-cards/saved-cards.d.ts +113 -21
  323. package/dist/matter/saved-cards/saved-cards.js +349 -77
  324. package/dist/matter/saved-cards/saved-cards.js.map +1 -1
  325. package/dist/matter/shipping-address/address-payload.js +25 -0
  326. package/dist/matter/shipping-address/address-payload.js.map +1 -0
  327. package/dist/matter/shipping-address/country-descriptors.js +71 -71
  328. package/dist/matter/shipping-address/country-descriptors.js.map +1 -1
  329. package/dist/matter/shipping-address/library-country-descriptors.js +136 -0
  330. package/dist/matter/shipping-address/library-country-descriptors.js.map +1 -0
  331. package/dist/matter/shipping-address/shipping-address.d.ts +312 -45
  332. package/dist/matter/shipping-address/shipping-address.js +443 -188
  333. package/dist/matter/shipping-address/shipping-address.js.map +1 -1
  334. package/dist/matter/shipping-simulator/shipping-simulator.d.ts +251 -25
  335. package/dist/matter/shipping-simulator/shipping-simulator.js +261 -51
  336. package/dist/matter/shipping-simulator/shipping-simulator.js.map +1 -1
  337. package/dist/matter/sign-in/sign-in.d.ts +108 -0
  338. package/dist/matter/sign-in/sign-in.js +285 -0
  339. package/dist/matter/sign-in/sign-in.js.map +1 -0
  340. package/dist/matter/sign-in-disclosure/sign-in-disclosure.d.ts +81 -0
  341. package/dist/matter/sign-in-disclosure/sign-in-disclosure.js +232 -0
  342. package/dist/matter/sign-in-disclosure/sign-in-disclosure.js.map +1 -0
  343. package/dist/matter/sign-in-form/sign-in-form.d.ts +93 -62
  344. package/dist/matter/sign-in-form/sign-in-form.js +134 -144
  345. package/dist/matter/sign-in-form/sign-in-form.js.map +1 -1
  346. package/dist/particles/binding-switcher/binding-switcher.d.ts +59 -0
  347. package/dist/particles/binding-switcher/binding-switcher.js +194 -0
  348. package/dist/particles/binding-switcher/binding-switcher.js.map +1 -0
  349. package/dist/particles/card-summary/card-network.d.ts +17 -0
  350. package/dist/particles/card-summary/card-network.js +25 -0
  351. package/dist/particles/card-summary/card-network.js.map +1 -0
  352. package/dist/particles/card-summary/card-summary.d.ts +113 -0
  353. package/dist/particles/card-summary/card-summary.js +221 -0
  354. package/dist/particles/card-summary/card-summary.js.map +1 -0
  355. package/dist/particles/carousel/carousel.d.ts +99 -11
  356. package/dist/particles/carousel/carousel.js +103 -35
  357. package/dist/particles/carousel/carousel.js.map +1 -1
  358. package/dist/particles/copy-text/copy-text.js +5 -15
  359. package/dist/particles/copy-text/copy-text.js.map +1 -1
  360. package/dist/particles/dialog/dialog.d.ts +14 -6
  361. package/dist/particles/dialog/dialog.js +6 -3
  362. package/dist/particles/dialog/dialog.js.map +1 -1
  363. package/dist/particles/drawer/drawer.js +1 -1
  364. package/dist/particles/drawer/drawer.js.map +1 -1
  365. package/dist/particles/email-field/email-field.d.ts +2 -1
  366. package/dist/particles/email-field/email-field.js +2 -1
  367. package/dist/particles/email-field/email-field.js.map +1 -1
  368. package/dist/particles/footer-link-group/footer-link-group.js +1 -0
  369. package/dist/particles/footer-link-group/footer-link-group.js.map +1 -1
  370. package/dist/particles/footer-social/footer-social.d.ts +1 -1
  371. package/dist/particles/footer-social/footer-social.js +1 -1
  372. package/dist/particles/footer-social/footer-social.js.map +1 -1
  373. package/dist/particles/form/form.d.ts +85 -13
  374. package/dist/particles/form/form.js +91 -42
  375. package/dist/particles/form/form.js.map +1 -1
  376. package/dist/particles/gallery/gallery.d.ts +129 -12
  377. package/dist/particles/gallery/gallery.js +121 -34
  378. package/dist/particles/gallery/gallery.js.map +1 -1
  379. package/dist/particles/incentives/incentives.d.ts +1 -1
  380. package/dist/particles/incentives/incentives.js +1 -1
  381. package/dist/particles/incentives/incentives.js.map +1 -1
  382. package/dist/particles/order-details-back/order-details-back.d.ts +5 -3
  383. package/dist/particles/order-details-back/order-details-back.js +8 -10
  384. package/dist/particles/order-details-back/order-details-back.js.map +1 -1
  385. package/dist/particles/order-status-badge/order-status-badge.d.ts +3 -3
  386. package/dist/particles/order-status-badge/order-status-badge.js +4 -20
  387. package/dist/particles/order-status-badge/order-status-badge.js.map +1 -1
  388. package/dist/particles/password-field/password-field.d.ts +1 -1
  389. package/dist/particles/password-field/password-field.js +2 -4
  390. package/dist/particles/password-field/password-field.js.map +1 -1
  391. package/dist/particles/payment-methods/payment-methods.d.ts +1 -1
  392. package/dist/particles/payment-methods/payment-methods.js +1 -1
  393. package/dist/particles/payment-methods/payment-methods.js.map +1 -1
  394. package/dist/particles/phone-field/phone-field.d.ts +4 -4
  395. package/dist/particles/phone-field/phone-field.js +8 -11
  396. package/dist/particles/phone-field/phone-field.js.map +1 -1
  397. package/dist/particles/spinner/spinner.d.ts +24 -4
  398. package/dist/particles/spinner/spinner.js +25 -9
  399. package/dist/particles/spinner/spinner.js.map +1 -1
  400. package/dist/particles/switch/switch.d.ts +4 -1
  401. package/dist/particles/switch/switch.js +3 -1
  402. package/dist/particles/switch/switch.js.map +1 -1
  403. package/dist/particles/toast/toast.d.ts +49 -9
  404. package/dist/particles/toast/toast.js +81 -15
  405. package/dist/particles/toast/toast.js.map +1 -1
  406. package/dist/schema.graphql +461 -89
  407. package/dist/sdk/actions/index.d.ts +3 -1
  408. package/dist/sdk/actions/index.js +3 -1
  409. package/dist/sdk/actions/locale-action-provider.d.ts +16 -0
  410. package/dist/sdk/actions/locale-action-provider.js +20 -0
  411. package/dist/sdk/actions/locale-action-provider.js.map +1 -0
  412. package/dist/sdk/actions/saved-card-action-provider.d.ts +12 -0
  413. package/dist/sdk/actions/saved-card-action-provider.js +16 -0
  414. package/dist/sdk/actions/saved-card-action-provider.js.map +1 -0
  415. package/dist/sdk/actions/types.d.ts +6 -2
  416. package/dist/sdk/address/address-fields.js +4 -4
  417. package/dist/sdk/address/address-fields.js.map +1 -1
  418. package/dist/sdk/address/constants.js +1 -6
  419. package/dist/sdk/address/constants.js.map +1 -1
  420. package/dist/sdk/address/messages.js +44 -44
  421. package/dist/sdk/address/messages.js.map +1 -1
  422. package/dist/sdk/address/postal-code.js +15 -2
  423. package/dist/sdk/address/postal-code.js.map +1 -1
  424. package/dist/sdk/address/types.d.ts +5 -3
  425. package/dist/sdk/address/validate-address.js +3 -3
  426. package/dist/sdk/address/validate-address.js.map +1 -1
  427. package/dist/sdk/analytics/use-analytics-actions.d.ts +1 -1
  428. package/dist/sdk/analytics/use-analytics-actions.js.map +1 -1
  429. package/dist/sdk/cache/storefront-cache.js +2 -1
  430. package/dist/sdk/cache/storefront-cache.js.map +1 -1
  431. package/dist/sdk/cart/operations.d.ts +2 -1
  432. package/dist/sdk/cart/operations.js +55 -1
  433. package/dist/sdk/cart/operations.js.map +1 -1
  434. package/dist/sdk/cart/optimistic.d.ts +30 -7
  435. package/dist/sdk/cart/optimistic.js +78 -41
  436. package/dist/sdk/cart/optimistic.js.map +1 -1
  437. package/dist/sdk/cart/use-cart-actions.d.ts +7 -0
  438. package/dist/sdk/cart/use-cart-actions.js +61 -15
  439. package/dist/sdk/cart/use-cart-actions.js.map +1 -1
  440. package/dist/sdk/cart/use-cart-sync-sales-channel.js +70 -0
  441. package/dist/sdk/cart/use-cart-sync-sales-channel.js.map +1 -0
  442. package/dist/sdk/data/index.js +2 -2
  443. package/dist/sdk/data/reactive-list-item-data-provider.js +2 -2
  444. package/dist/sdk/generated/gql.js +16 -12
  445. package/dist/sdk/generated/gql.js.map +1 -1
  446. package/dist/sdk/generated/graphql.d.ts +197 -51
  447. package/dist/sdk/generated/graphql.js +2318 -91
  448. package/dist/sdk/generated/graphql.js.map +1 -1
  449. package/dist/sdk/i18n/format-error-code.js +23 -0
  450. package/dist/sdk/i18n/format-error-code.js.map +1 -0
  451. package/dist/sdk/i18n/message-formatter.d.ts +22 -0
  452. package/dist/sdk/i18n/message-formatter.js +140 -0
  453. package/dist/sdk/i18n/message-formatter.js.map +1 -0
  454. package/dist/sdk/i18n/use-message-formatter.d.ts +8 -0
  455. package/dist/sdk/i18n/use-message-formatter.js +18 -0
  456. package/dist/sdk/i18n/use-message-formatter.js.map +1 -0
  457. package/dist/sdk/identity/use-identity-actions.js.map +1 -1
  458. package/dist/sdk/locale/binding-switch-provider.d.ts +13 -0
  459. package/dist/sdk/locale/binding-switch-provider.js +20 -0
  460. package/dist/sdk/locale/binding-switch-provider.js.map +1 -0
  461. package/dist/sdk/locale/use-locale-actions.d.ts +16 -0
  462. package/dist/sdk/locale/use-locale-actions.js +70 -0
  463. package/dist/sdk/locale/use-locale-actions.js.map +1 -0
  464. package/dist/sdk/navigation/binding-switch.d.ts +39 -0
  465. package/dist/sdk/navigation/binding-switch.js +129 -0
  466. package/dist/sdk/navigation/binding-switch.js.map +1 -0
  467. package/dist/sdk/navigation/decode-route-params.d.ts +11 -0
  468. package/dist/sdk/navigation/decode-route-params.js +32 -0
  469. package/dist/sdk/navigation/decode-route-params.js.map +1 -0
  470. package/dist/sdk/navigation/redirect.d.ts +2 -0
  471. package/dist/sdk/navigation/redirect.js +19 -1
  472. package/dist/sdk/navigation/redirect.js.map +1 -1
  473. package/dist/sdk/navigation/types.d.ts +13 -0
  474. package/dist/sdk/payment/bin-format.js +20 -0
  475. package/dist/sdk/payment/bin-format.js.map +1 -0
  476. package/dist/sdk/payment/challenge-return.js +37 -0
  477. package/dist/sdk/payment/challenge-return.js.map +1 -0
  478. package/dist/sdk/payment/confirmation-last-four.js +39 -0
  479. package/dist/sdk/payment/confirmation-last-four.js.map +1 -0
  480. package/dist/sdk/payment/gateway.d.ts +1 -1
  481. package/dist/sdk/payment/gateway.js +8 -2
  482. package/dist/sdk/payment/gateway.js.map +1 -1
  483. package/dist/sdk/payment/operations.d.ts +1 -0
  484. package/dist/sdk/payment/operations.js +28 -6
  485. package/dist/sdk/payment/operations.js.map +1 -1
  486. package/dist/sdk/payment/resumed-purchase.d.ts +1 -0
  487. package/dist/sdk/payment/resumed-purchase.js +119 -0
  488. package/dist/sdk/payment/resumed-purchase.js.map +1 -0
  489. package/dist/sdk/payment/security-code-mask.js +16 -23
  490. package/dist/sdk/payment/security-code-mask.js.map +1 -1
  491. package/dist/sdk/payment/submission-registry.js +6 -2
  492. package/dist/sdk/payment/submission-registry.js.map +1 -1
  493. package/dist/sdk/payment/use-payment-actions.d.ts +18 -3
  494. package/dist/sdk/payment/use-payment-actions.js +23 -3
  495. package/dist/sdk/payment/use-payment-actions.js.map +1 -1
  496. package/dist/sdk/payment/use-place-order.d.ts +10 -2
  497. package/dist/sdk/payment/use-place-order.js +138 -76
  498. package/dist/sdk/payment/use-place-order.js.map +1 -1
  499. package/dist/sdk/provider/storefront-provider.d.ts +1 -7
  500. package/dist/sdk/provider/storefront-provider.js +4 -11
  501. package/dist/sdk/provider/storefront-provider.js.map +1 -1
  502. package/dist/sdk/saved-cards/operations.d.ts +16 -0
  503. package/dist/sdk/saved-cards/operations.js +41 -0
  504. package/dist/sdk/saved-cards/operations.js.map +1 -0
  505. package/dist/sdk/saved-cards/use-saved-card-actions.d.ts +26 -0
  506. package/dist/sdk/saved-cards/use-saved-card-actions.js +86 -0
  507. package/dist/sdk/saved-cards/use-saved-card-actions.js.map +1 -0
  508. package/dist/sdk/seo/entity-landing.d.ts +24 -0
  509. package/dist/sdk/seo/entity-landing.js +30 -0
  510. package/dist/sdk/seo/entity-landing.js.map +1 -0
  511. package/dist/sdk/seo/page-alternates.d.ts +8 -5
  512. package/dist/sdk/seo/page-alternates.js +11 -14
  513. package/dist/sdk/seo/page-alternates.js.map +1 -1
  514. package/dist/sdk/seo/search-landing.d.ts +42 -0
  515. package/dist/sdk/seo/search-landing.js +85 -0
  516. package/dist/sdk/seo/search-landing.js.map +1 -0
  517. package/dist/sdk/session/mock-session.d.ts +9 -0
  518. package/dist/sdk/session/mock-session.js +31 -0
  519. package/dist/sdk/session/mock-session.js.map +1 -0
  520. package/dist/sdk/session/read-server-session.d.ts +3 -0
  521. package/dist/sdk/session/read-server-session.js +5 -0
  522. package/dist/sdk/session/read-server-session.js.map +1 -1
  523. package/dist/sdk/session/return-path-segment.d.ts +10 -0
  524. package/dist/sdk/session/return-path-segment.js +15 -0
  525. package/dist/sdk/session/return-path-segment.js.map +1 -0
  526. package/dist/sdk/session/use-session-actions.js.map +1 -1
  527. package/dist/sdk/shipping/shipping-operations.d.ts +1 -1
  528. package/dist/sdk/shipping/shipping-operations.js +13 -0
  529. package/dist/sdk/shipping/shipping-operations.js.map +1 -1
  530. package/dist/sdk/shipping/use-cart-shipping-simulation.js.map +1 -1
  531. package/dist/sdk/shipping/use-shipping-actions.js.map +1 -1
  532. package/dist/sdk/shipping/use-shipping-simulation.js.map +1 -1
  533. package/dist/sdk/state/cart.d.ts +9 -2
  534. package/dist/sdk/state/cart.js +9 -2
  535. package/dist/sdk/state/cart.js.map +1 -1
  536. package/dist/utils/safe-href.d.ts +2 -0
  537. package/package.json +4 -3
  538. package/skills/storefront-asset/SKILL.md +2 -2
  539. package/skills/storefront-asset/references/api-side.md +27 -14
  540. package/skills/storefront-asset/references/findings.md +5 -2
  541. package/src/styles/tailwind.css +9 -2
  542. package/dist/matter/shipping-address/country-descriptors.d.ts +0 -1
  543. package/dist/message-locales.json +0 -7
  544. package/dist/sdk/i18n/client.d.ts +0 -4
  545. package/dist/sdk/i18n/client.js +0 -4
  546. package/dist/sdk/i18n/locales.d.ts +0 -8
  547. package/dist/sdk/i18n/locales.js +0 -57
  548. package/dist/sdk/i18n/locales.js.map +0 -1
  549. package/dist/sdk/i18n/messages/en-US.js +0 -164
  550. package/dist/sdk/i18n/messages/en-US.js.map +0 -1
  551. package/dist/sdk/i18n/messages/en-US.json +0 -159
  552. package/dist/sdk/i18n/messages/en-US.json.d.ts +0 -163
  553. package/dist/sdk/i18n/messages/es-ES.js +0 -164
  554. package/dist/sdk/i18n/messages/es-ES.js.map +0 -1
  555. package/dist/sdk/i18n/messages/es-ES.json +0 -159
  556. package/dist/sdk/i18n/messages/pt-BR.js +0 -164
  557. package/dist/sdk/i18n/messages/pt-BR.js.map +0 -1
  558. package/dist/sdk/i18n/messages/pt-BR.json +0 -159
  559. package/dist/sdk/i18n/provider.d.ts +0 -1
  560. package/dist/sdk/i18n/provider.js +0 -30
  561. package/dist/sdk/i18n/provider.js.map +0 -1
  562. package/dist/sdk/i18n/server.d.ts +0 -28
  563. package/dist/sdk/i18n/server.js +0 -59
  564. package/dist/sdk/i18n/server.js.map +0 -1
  565. package/dist/utils/resolve-authored-copy.js +0 -18
  566. package/dist/utils/resolve-authored-copy.js.map +0 -1
  567. package/dist/utils/substitute-template.js +0 -33
  568. package/dist/utils/substitute-template.js.map +0 -1
@@ -0,0 +1,23 @@
1
+ import { logMessageEvent } from "./message-formatter.js";
2
+ import { ownValue } from "../../utils/own-value.js";
3
+ //#region src/sdk/i18n/format-error-code.ts
4
+ /**
5
+ * Words an upstream error from the component's own `$content`: the message field `fields` names for its
6
+ * `code`, or `fallbackField` for a code the map does not know (a newer server, or a code minted outside
7
+ * the map). The error's own `message` is an English diagnostic, so it is never shown; an unknown code
8
+ * logs `message.unknown-code` with the content type's id instead.
9
+ */
10
+ function formatErrorCode(contentType, fields, error, format, fallbackField) {
11
+ const field = error.code == null ? void 0 : ownValue(fields, error.code);
12
+ if (field !== void 0) return format(field);
13
+ logMessageEvent("message.unknown-code", {
14
+ contentTypeId: contentType.id,
15
+ code: error.code ?? null,
16
+ field: fallbackField
17
+ });
18
+ return format(fallbackField);
19
+ }
20
+ //#endregion
21
+ export { formatErrorCode };
22
+
23
+ //# sourceMappingURL=format-error-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-error-code.js","names":[],"sources":["../../../src/sdk/i18n/format-error-code.ts"],"sourcesContent":["import type { ContentTypeDefinition } from '@vtex/fs-core';\nimport { ownValue } from '../../utils/own-value.js';\nimport { logMessageEvent } from './message-formatter.js';\n\n/**\n * Words an upstream error from the component's own `$content`: the message field `fields` names for its\n * `code`, or `fallbackField` for a code the map does not know (a newer server, or a code minted outside\n * the map). The error's own `message` is an English diagnostic, so it is never shown; an unknown code\n * logs `message.unknown-code` with the content type's id instead.\n */\nexport function formatErrorCode<F extends string>(\n contentType: Pick<ContentTypeDefinition, 'id'>,\n fields: Readonly<Record<string, F>>,\n error: { code?: string | null },\n format: (field: F) => string,\n fallbackField: NoInfer<F>,\n): string {\n const field = error.code == null ? undefined : ownValue(fields, error.code);\n if (field !== undefined) return format(field);\n logMessageEvent('message.unknown-code', {\n contentTypeId: contentType.id,\n code: error.code ?? null,\n field: fallbackField,\n });\n return format(fallbackField);\n}\n"],"mappings":";;;;;;;;;AAUA,SAAgB,gBACd,aACA,QACA,OACA,QACA,eACQ;CACR,MAAM,QAAQ,MAAM,QAAQ,OAAO,KAAA,IAAY,SAAS,QAAQ,MAAM,IAAI;CAC1E,IAAI,UAAU,KAAA,GAAW,OAAO,OAAO,KAAK;CAC5C,gBAAgB,wBAAwB;EACtC,eAAe,YAAY;EAC3B,MAAM,MAAM,QAAQ;EACpB,OAAO;CACT,CAAC;CACD,OAAO,OAAO,aAAa;AAC7B"}
@@ -0,0 +1,22 @@
1
+ import { ContentTypeDefinition, ContentValue, MessageArguments, MessageFieldName, MessageTagName } from "../../core/dist/define-content-type.js";
2
+ import "../../core/dist/index.js";
3
+ import { ReactNode } from "react";
4
+ //#region src/sdk/i18n/message-formatter.d.ts
5
+ type MessageProperty<T extends ContentTypeDefinition, K> = K extends keyof T['schema']['properties'] ? T['schema']['properties'][K] : never;
6
+ /** Optional when the message declares no arguments, required otherwise. */
7
+ type ArgumentsParameter<P> = MessageArguments<P> extends Record<string, never> ? [args?: MessageArguments<P>] : [args: MessageArguments<P>];
8
+ /** Formats the message fields of one component's `$content`, typed by their message contract. */
9
+ export type MessageFormatter<T extends ContentTypeDefinition> = {
10
+ format<K extends MessageFieldName<T>>(field: K, ...args: ArgumentsParameter<MessageProperty<T, K>>): string;
11
+ rich<K extends MessageFieldName<T>>(field: K, args: MessageArguments<MessageProperty<T, K>>, tags: Record<MessageTagName<MessageProperty<T, K>>, (chunks: ReactNode[]) => ReactNode>): ReactNode;
12
+ };
13
+ /**
14
+ * The message formatter for a content type and its `$content`, in `locale`. Pure and side-neutral, so a
15
+ * Server Component formats without React context. Both methods are total: a missing message renders
16
+ * `''` and an invalid one renders the authored string, each logging an error (an optional message,
17
+ * `messageOptional`, renders `''` unwritten without logging). Without a locale (a
18
+ * Server Component rendered with no compiler-injected `$locale`) every message is invalid.
19
+ */
20
+ export declare function createMessageFormatter<T extends ContentTypeDefinition>(locale: string | undefined, contentType: T, content: ContentValue<T> | undefined): MessageFormatter<T>;
21
+ //#endregion
22
+ //# sourceMappingURL=message-formatter.d.ts.map
@@ -0,0 +1,140 @@
1
+ import { Children, Fragment, createElement } from "react";
2
+ import { TYPE, createNumberElement } from "@formatjs/icu-messageformat-parser";
3
+ import { FormatError, IntlMessageFormat } from "intl-messageformat";
4
+ //#region src/sdk/i18n/message-formatter.ts
5
+ /**
6
+ * The message formatter for a content type and its `$content`, in `locale`. Pure and side-neutral, so a
7
+ * Server Component formats without React context. Both methods are total: a missing message renders
8
+ * `''` and an invalid one renders the authored string, each logging an error (an optional message,
9
+ * `messageOptional`, renders `''` unwritten without logging). Without a locale (a
10
+ * Server Component rendered with no compiler-injected `$locale`) every message is invalid.
11
+ */
12
+ function createMessageFormatter(locale, contentType, content) {
13
+ function resolve(field, values) {
14
+ const message = content?.[field];
15
+ const fields = {
16
+ contentTypeId: contentType.id,
17
+ field,
18
+ locale
19
+ };
20
+ if (typeof message !== "string" || message.trim() === "") {
21
+ if (!isOptionalMessage(contentType, field)) logMessageEvent("message.missing", {
22
+ ...fields,
23
+ reason: typeof message === "string" ? "blank" : "absent"
24
+ });
25
+ return "";
26
+ }
27
+ if (!locale) {
28
+ logMessageEvent("message.invalid", {
29
+ ...fields,
30
+ reason: "missing-locale"
31
+ });
32
+ return message;
33
+ }
34
+ try {
35
+ return formatIcu(locale, message, values);
36
+ } catch (error) {
37
+ logMessageEvent("message.invalid", {
38
+ ...fields,
39
+ reason: invalidReason(error)
40
+ });
41
+ return message;
42
+ }
43
+ }
44
+ return {
45
+ format(field, ...[args]) {
46
+ return joinText(resolve(field, withoutPrototype(args)));
47
+ },
48
+ rich(field, args, tags) {
49
+ const values = withoutPrototype(args);
50
+ for (const [name, tag] of Object.entries(tags)) values[name] = (chunks) => tag(Children.toArray(chunks));
51
+ const result = resolve(field, values);
52
+ if (typeof result === "string") return result;
53
+ return createElement(Fragment, null, ...Array.isArray(result) ? result : [result]);
54
+ }
55
+ };
56
+ }
57
+ /**
58
+ * `intl-messageformat` renders a plain argument as `String(value)`, and a name can be both a plural
59
+ * selector and a plain argument in one message. So a plain argument holding a number is rewritten to
60
+ * a `number` element, which formats with `Intl.NumberFormat` in `locale`, and selectors stay raw.
61
+ */
62
+ function formatIcu(locale, message, values) {
63
+ return compiledMessage(locale, message, Object.keys(values).filter((name) => typeof values[name] === "number")).format(values);
64
+ }
65
+ /**
66
+ * Parsing dominates a format call, and the same authored message renders on every row and every
67
+ * render, so the compiled message is kept per locale and set of number arguments. Authored
68
+ * copy is finite; the cap only guards against unbounded templates.
69
+ */
70
+ const COMPILED_MESSAGES = /* @__PURE__ */ new Map();
71
+ const COMPILED_MESSAGES_LIMIT = 1e3;
72
+ function compiledMessage(locale, message, numberArguments) {
73
+ const key = [
74
+ locale,
75
+ numberArguments.join(","),
76
+ message
77
+ ].join("\0");
78
+ const cached = COMPILED_MESSAGES.get(key);
79
+ if (cached) return cached;
80
+ const parsed = new IntlMessageFormat(message, locale);
81
+ const compiled = numberArguments.length === 0 ? parsed : new IntlMessageFormat(localizeNumberArguments(parsed.getAst(), new Set(numberArguments)), locale);
82
+ if (COMPILED_MESSAGES.size >= COMPILED_MESSAGES_LIMIT) COMPILED_MESSAGES.clear();
83
+ COMPILED_MESSAGES.set(key, compiled);
84
+ return compiled;
85
+ }
86
+ /**
87
+ * The argument values in an object with no prototype, so a message argument named after an
88
+ * `Object.prototype` member (`{toString}`, `{constructor}`) is a missing value, not an inherited one.
89
+ */
90
+ function withoutPrototype(values) {
91
+ return Object.assign(Object.create(null), values);
92
+ }
93
+ /** Whether the content type declares `field` a message a store may leave unwritten. */
94
+ function isOptionalMessage(contentType, field) {
95
+ return contentType.schema.properties[field]?.messageOptional === true;
96
+ }
97
+ /** Without tag functions every part is a string, and `intl-messageformat` joins them into one. */
98
+ function joinText(result) {
99
+ return Array.isArray(result) ? result.join("") : result;
100
+ }
101
+ function localizeNumberArguments(elements, numberArguments) {
102
+ return elements.map((element) => {
103
+ switch (element.type) {
104
+ case TYPE.argument: return numberArguments.has(element.value) ? createNumberElement(element.value) : element;
105
+ case TYPE.plural:
106
+ case TYPE.select: return {
107
+ ...element,
108
+ options: Object.fromEntries(Object.entries(element.options).map(([key, option]) => [key, {
109
+ ...option,
110
+ value: localizeNumberArguments(option.value, numberArguments)
111
+ }]))
112
+ };
113
+ case TYPE.tag: return {
114
+ ...element,
115
+ children: localizeNumberArguments(element.children, numberArguments)
116
+ };
117
+ default: return element;
118
+ }
119
+ });
120
+ }
121
+ /**
122
+ * A code or kind name, never an error message: `InvalidValueError`'s message embeds the argument
123
+ * value, which can carry shopper data.
124
+ */
125
+ function invalidReason(error) {
126
+ if (error instanceof FormatError) return error.code;
127
+ if (error instanceof SyntaxError) return error.message;
128
+ return error instanceof Error ? error.name : "unknown";
129
+ }
130
+ /** One log line in every environment. Never the message text or an argument value. */
131
+ function logMessageEvent(event, fields) {
132
+ console.error("[message]", {
133
+ ...fields,
134
+ event
135
+ });
136
+ }
137
+ //#endregion
138
+ export { createMessageFormatter, logMessageEvent };
139
+
140
+ //# sourceMappingURL=message-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-formatter.js","names":[],"sources":["../../../src/sdk/i18n/message-formatter.ts"],"sourcesContent":["import { createNumberElement, type MessageFormatElement, TYPE } from '@formatjs/icu-messageformat-parser';\nimport type {\n ContentTypeDefinition,\n ContentValue,\n MessageArguments,\n MessageFieldName,\n MessageTagName,\n} from '@vtex/fs-core';\nimport { FormatError, type FormatXMLElementFn, IntlMessageFormat, type PrimitiveType } from 'intl-messageformat';\nimport { Children, createElement, Fragment, type ReactNode } from 'react';\n\ntype MessageProperty<T extends ContentTypeDefinition, K> = K extends keyof T['schema']['properties']\n ? T['schema']['properties'][K]\n : never;\n\n/** Optional when the message declares no arguments, required otherwise. */\ntype ArgumentsParameter<P> =\n MessageArguments<P> extends Record<string, never> ? [args?: MessageArguments<P>] : [args: MessageArguments<P>];\n\n/** `R` is what a tag renders: `ReactNode` for rich messages, `string` when there are no tags. */\ntype MessageValues<R = ReactNode> = Record<string, PrimitiveType | R | FormatXMLElementFn<R>>;\n\ntype FormatResult<R> = string | R | (string | R)[];\n\ntype MessageEvent = 'message.missing' | 'message.invalid' | 'message.unknown-code';\n\n/** Formats the message fields of one component's `$content`, typed by their message contract. */\nexport type MessageFormatter<T extends ContentTypeDefinition> = {\n format<K extends MessageFieldName<T>>(field: K, ...args: ArgumentsParameter<MessageProperty<T, K>>): string;\n rich<K extends MessageFieldName<T>>(\n field: K,\n args: MessageArguments<MessageProperty<T, K>>,\n tags: Record<MessageTagName<MessageProperty<T, K>>, (chunks: ReactNode[]) => ReactNode>,\n ): ReactNode;\n};\n\n/**\n * The message formatter for a content type and its `$content`, in `locale`. Pure and side-neutral, so a\n * Server Component formats without React context. Both methods are total: a missing message renders\n * `''` and an invalid one renders the authored string, each logging an error (an optional message,\n * `messageOptional`, renders `''` unwritten without logging). Without a locale (a\n * Server Component rendered with no compiler-injected `$locale`) every message is invalid.\n */\nexport function createMessageFormatter<T extends ContentTypeDefinition>(\n locale: string | undefined,\n contentType: T,\n content: ContentValue<T> | undefined,\n): MessageFormatter<T> {\n function resolve<R>(field: string, values: MessageValues<R>): FormatResult<R> {\n const message = (content as Record<string, unknown> | undefined)?.[field];\n const fields = { contentTypeId: contentType.id, field, locale };\n if (typeof message !== 'string' || message.trim() === '') {\n if (!isOptionalMessage(contentType, field)) {\n logMessageEvent('message.missing', { ...fields, reason: typeof message === 'string' ? 'blank' : 'absent' });\n }\n return '';\n }\n if (!locale) {\n logMessageEvent('message.invalid', { ...fields, reason: 'missing-locale' });\n return message;\n }\n try {\n return formatIcu(locale, message, values);\n } catch (error) {\n logMessageEvent('message.invalid', { ...fields, reason: invalidReason(error) });\n return message;\n }\n }\n\n return {\n format(field, ...[args]) {\n return joinText(resolve<string>(field, withoutPrototype(args)));\n },\n rich(field, args, tags) {\n const values: MessageValues = withoutPrototype(args);\n for (const [name, tag] of Object.entries<(chunks: ReactNode[]) => ReactNode>(tags)) {\n values[name] = (chunks: ReactNode[]) => tag(Children.toArray(chunks));\n }\n const result = resolve<ReactNode>(field, values);\n if (typeof result === 'string') {\n return result;\n }\n // Positional children, so React asks for no keys.\n return createElement(Fragment, null, ...(Array.isArray(result) ? result : [result]));\n },\n };\n}\n\n/**\n * `intl-messageformat` renders a plain argument as `String(value)`, and a name can be both a plural\n * selector and a plain argument in one message. So a plain argument holding a number is rewritten to\n * a `number` element, which formats with `Intl.NumberFormat` in `locale`, and selectors stay raw.\n */\nfunction formatIcu<R>(locale: string, message: string, values: MessageValues<R>): FormatResult<R> {\n const numberArguments = Object.keys(values).filter((name) => typeof values[name] === 'number');\n return compiledMessage(locale, message, numberArguments).format<R>(values);\n}\n\n/**\n * Parsing dominates a format call, and the same authored message renders on every row and every\n * render, so the compiled message is kept per locale and set of number arguments. Authored\n * copy is finite; the cap only guards against unbounded templates.\n */\nconst COMPILED_MESSAGES = new Map<string, IntlMessageFormat>();\nconst COMPILED_MESSAGES_LIMIT = 1000;\n\nfunction compiledMessage(locale: string, message: string, numberArguments: readonly string[]): IntlMessageFormat {\n const key = [locale, numberArguments.join(','), message].join('\\u0000');\n const cached = COMPILED_MESSAGES.get(key);\n if (cached) return cached;\n const parsed = new IntlMessageFormat(message, locale);\n const compiled =\n numberArguments.length === 0\n ? parsed\n : new IntlMessageFormat(localizeNumberArguments(parsed.getAst(), new Set(numberArguments)), locale);\n if (COMPILED_MESSAGES.size >= COMPILED_MESSAGES_LIMIT) COMPILED_MESSAGES.clear();\n COMPILED_MESSAGES.set(key, compiled);\n return compiled;\n}\n\n/**\n * The argument values in an object with no prototype, so a message argument named after an\n * `Object.prototype` member (`{toString}`, `{constructor}`) is a missing value, not an inherited one.\n */\nfunction withoutPrototype<V>(values: Readonly<Record<string, V>> | undefined): Record<string, V> {\n return Object.assign(Object.create(null), values);\n}\n\n/** Whether the content type declares `field` a message a store may leave unwritten. */\nfunction isOptionalMessage(contentType: ContentTypeDefinition, field: string): boolean {\n const property = (contentType.schema.properties as Record<string, { messageOptional?: boolean } | undefined>)[field];\n return property?.messageOptional === true;\n}\n\n/** Without tag functions every part is a string, and `intl-messageformat` joins them into one. */\nfunction joinText(result: FormatResult<string>): string {\n return Array.isArray(result) ? result.join('') : result;\n}\n\nfunction localizeNumberArguments(\n elements: MessageFormatElement[],\n numberArguments: ReadonlySet<string>,\n): MessageFormatElement[] {\n return elements.map((element) => {\n switch (element.type) {\n case TYPE.argument:\n return numberArguments.has(element.value) ? createNumberElement(element.value) : element;\n case TYPE.plural:\n case TYPE.select:\n return {\n ...element,\n options: Object.fromEntries(\n Object.entries(element.options).map(([key, option]) => [\n key,\n { ...option, value: localizeNumberArguments(option.value, numberArguments) },\n ]),\n ),\n };\n case TYPE.tag:\n return { ...element, children: localizeNumberArguments(element.children, numberArguments) };\n default:\n return element;\n }\n });\n}\n\n/**\n * A code or kind name, never an error message: `InvalidValueError`'s message embeds the argument\n * value, which can carry shopper data.\n */\nfunction invalidReason(error: unknown): string {\n if (error instanceof FormatError) return error.code;\n // The parser throws a `SyntaxError` whose message is its `ErrorKind` name.\n if (error instanceof SyntaxError) return error.message;\n return error instanceof Error ? error.name : 'unknown';\n}\n\n/** One log line in every environment. Never the message text or an argument value. */\nexport function logMessageEvent(event: MessageEvent, fields: Record<string, unknown>): void {\n // `event` spreads last so a `fields` key of the same name cannot displace the discriminator.\n console.error('[message]', { ...fields, event });\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { ContentTypeDefinition, ContentValue } from "../../core/dist/define-content-type.js";
2
+ import "../../core/dist/index.js";
3
+ import { MessageFormatter } from "./message-formatter.js";
4
+ //#region src/sdk/i18n/use-message-formatter.d.ts
5
+ /** The message formatter for a Client Component, in the locale `StorefrontProvider` published. */
6
+ export declare function useMessageFormatter<T extends ContentTypeDefinition>(contentType: T, content: ContentValue<T> | undefined): MessageFormatter<T>;
7
+ //#endregion
8
+ //# sourceMappingURL=use-message-formatter.d.ts.map
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import { useStorefrontContext } from "../context/storefront-context.js";
3
+ import { createMessageFormatter } from "./message-formatter.js";
4
+ import { useMemo } from "react";
5
+ //#region src/sdk/i18n/use-message-formatter.ts
6
+ /** The message formatter for a Client Component, in the locale `StorefrontProvider` published. */
7
+ function useMessageFormatter(contentType, content) {
8
+ const { locale } = useStorefrontContext();
9
+ return useMemo(() => createMessageFormatter(locale, contentType, content), [
10
+ locale,
11
+ contentType,
12
+ content
13
+ ]);
14
+ }
15
+ //#endregion
16
+ export { useMessageFormatter };
17
+
18
+ //# sourceMappingURL=use-message-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-message-formatter.js","names":[],"sources":["../../../src/sdk/i18n/use-message-formatter.ts"],"sourcesContent":["'use client';\n\nimport type { ContentTypeDefinition, ContentValue } from '@vtex/fs-core';\nimport { useMemo } from 'react';\nimport { useStorefrontContext } from '../context/storefront-context.js';\nimport { createMessageFormatter, type MessageFormatter } from './message-formatter.js';\n\n/** The message formatter for a Client Component, in the locale `StorefrontProvider` published. */\nexport function useMessageFormatter<T extends ContentTypeDefinition>(\n contentType: T,\n content: ContentValue<T> | undefined,\n): MessageFormatter<T> {\n const { locale } = useStorefrontContext();\n return useMemo(() => createMessageFormatter(locale, contentType, content), [locale, contentType, content]);\n}\n"],"mappings":";;;;;;AAQA,SAAgB,oBACd,aACA,SACqB;CACrB,MAAM,EAAE,WAAW,qBAAqB;CACxC,OAAO,cAAc,uBAAuB,QAAQ,aAAa,OAAO,GAAG;EAAC;EAAQ;EAAa;CAAO,CAAC;AAC3G"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-identity-actions.js","names":[],"sources":["../../../src/sdk/identity/use-identity-actions.ts"],"sourcesContent":["'use client';\n\nimport { CombinedGraphQLErrors } from '@apollo/client/errors';\nimport { useMutation } from '@apollo/client/react';\nimport { defineActions } from '@vtex/fs-core';\nimport { useCallback, useMemo } from 'react';\nimport { loggableErrorName } from '../../utils/loggable-error-name.js';\nimport {\n CLIENT_PREFERENCES_UPDATE,\n CLIENT_PROFILE_UPDATE,\n type ClientPreferenceKey,\n type ClientProfileUserError,\n CUSTOMER_PROFILE_UPDATE,\n type CustomerProfileUpdateInput,\n type CustomerProfileUserError,\n} from './operations.js';\n\n/**\n * The `identity` action namespace — the context-free owner of the shopper-profile,\n * consent-preference, and persistent-profile writes\n * (specs/fspg-859-email-field.md, specs/consent-opt-in-component.md,\n * docs/storefront-core/reference-free-particle-model.md § Write side — actions,\n * docs/storefront-core/adr-0010-actions-own-the-write-side.md).\n *\n * It mirrors `useCartActions`: a component anywhere in the tree dispatches the write through the\n * compiler-injected `$actions.identity.*` prop, and the handler calls the corresponding mutation.\n * Every write is **async / pessimistic** (Decision 1): the caller awaits the persisted result. Each\n * call returns its `userErrors` (empty on success) so the caller can surface server-side failures\n * inline; the returned entity self-updates the normalized cache and every reactive subscriber.\n *\n * The first two writes target the cart's sibling identity entities; `customerProfileUpdate` targets\n * the shopper's account profile, which needs no cart at all.\n */\n\n/**\n * Payload for the profile write. Callers persist only the fields they own; other fields are\n * untouched. The payload is passed through to `ClientProfileUpdateInput` unmapped, so this type\n * mirrors that input verbatim — a stacked field only needs a field to already exist here to reach\n * the wire.\n */\nexport type ClientProfileUpdatePayload = Readonly<{\n email?: string;\n firstName?: string;\n lastName?: string;\n phone?: string;\n document?: string;\n}>;\n\n/** Payload for the preferences write — one opt-in flag; the other flag is left untouched. */\nexport type ClientPreferencesUpdatePayload = Readonly<Partial<Record<ClientPreferenceKey, boolean>>>;\n\n/**\n * Payload for the persistent-profile write. Mirrors `CustomerProfileUpdateInput` verbatim and is\n * forwarded unmapped, so an omitted field stays untouched upstream and an empty string erases.\n */\nexport type CustomerProfileUpdatePayload = CustomerProfileUpdateInput;\n\nexport type IdentityActions = Readonly<{\n /**\n * Persist the provided profile fields (partial) to the active cart's `clientProfileData`.\n * Async — awaits the mutation before resolving. Returns the resulting `userErrors` (empty on\n * success).\n */\n clientProfileUpdate: (payload: ClientProfileUpdatePayload) => Promise<readonly ClientProfileUserError[]>;\n /**\n * Persist the provided consent opt-in flag(s) (partial) to the shopper's `ClientPreferences`\n * entity (order-form-backed). Async — awaits the mutation before resolving. Writes ONLY the\n * requested field. Returns the resulting `userErrors` (empty on success).\n */\n clientPreferencesUpdate: (payload: ClientPreferencesUpdatePayload) => Promise<readonly ClientProfileUserError[]>;\n /**\n * Persist the provided profile fields (partial) to the shopper's persistent, cart-independent\n * account profile. Async — awaits the mutation before resolving. Sends exactly the fields it is\n * given: an omitted field is left untouched, an empty string erases. Returns the resulting\n * `userErrors` (empty on success).\n */\n customerProfileUpdate: (payload: CustomerProfileUpdatePayload) => Promise<readonly CustomerProfileUserError[]>;\n}>;\n\nconst NETWORK_PROFILE_ERROR: ClientProfileUserError = {\n code: 'NETWORK_ERROR',\n message: 'Unable to save your details. Please try again.',\n};\n\nconst NETWORK_PREFERENCE_ERROR: ClientProfileUserError = {\n code: 'NETWORK_ERROR',\n message: 'Unable to save your preference. Please try again.',\n};\n\nconst NETWORK_CUSTOMER_PROFILE_ERROR: CustomerProfileUserError = {\n code: 'NETWORK_ERROR',\n message: 'Unable to save your profile. Please try again.',\n};\n\nconst UNAUTHORIZED_CUSTOMER_PROFILE_ERROR: CustomerProfileUserError = {\n code: 'UNAUTHORIZED',\n message: 'Your session has expired. Please sign in again.',\n};\n\n/**\n * The profile write answers an anonymous or expired session with a top-level `UNAUTHORIZED`, never\n * a `userError` (the read answers an anonymous one with a null profile instead). Collapsing it into\n * `NETWORK_ERROR` would offer a retry that cannot succeed, so it gets its own code and the caller can\n * send the shopper back to sign-in.\n */\nfunction toCustomerProfileError(error: unknown): CustomerProfileUserError {\n if (CombinedGraphQLErrors.is(error)) {\n const unauthorized = error.errors.some(({ extensions }) => extensions?.code === 'UNAUTHORIZED');\n if (unauthorized) return UNAUTHORIZED_CUSTOMER_PROFILE_ERROR;\n }\n return NETWORK_CUSTOMER_PROFILE_ERROR;\n}\n\n/**\n * The `identity` namespace hook. Registered with the first-party action registry via `identityActions`\n * below; the compiler-emitted `IdentityActionProvider` calls it and threads the narrowed methods into\n * each consumer's `$actions.identity`.\n */\nexport function useIdentityActions(): IdentityActions {\n const [profileMutation] = useMutation(CLIENT_PROFILE_UPDATE);\n const [preferencesMutation] = useMutation(CLIENT_PREFERENCES_UPDATE);\n const [customerProfileMutation] = useMutation(CUSTOMER_PROFILE_UPDATE);\n\n const clientProfileUpdate = useCallback<IdentityActions['clientProfileUpdate']>(\n async (payload) => {\n try {\n const result = await profileMutation({ variables: { input: payload } });\n return result.data?.clientProfileUpdate?.userErrors ?? [];\n } catch (error) {\n // Log only the error name — the message can echo the submitted email (PII).\n console.error('[identity.clientProfileUpdate] clientProfileUpdate failed', loggableErrorName(error));\n return [NETWORK_PROFILE_ERROR];\n }\n },\n [profileMutation],\n );\n\n const clientPreferencesUpdate = useCallback<IdentityActions['clientPreferencesUpdate']>(\n async (payload) => {\n try {\n const result = await preferencesMutation({ variables: { input: payload } });\n return result.data?.clientPreferencesUpdate?.userErrors ?? [];\n } catch (error) {\n // Log only the error name — mirrors the profile write's PII-safe logging.\n console.error('[identity.clientPreferencesUpdate] clientPreferencesUpdate failed', loggableErrorName(error));\n return [NETWORK_PREFERENCE_ERROR];\n }\n },\n [preferencesMutation],\n );\n\n const customerProfileUpdate = useCallback<IdentityActions['customerProfileUpdate']>(\n async (payload) => {\n try {\n // Forwarded unmapped: an empty string is an explicit erase and must survive to the wire.\n const result = await customerProfileMutation({ variables: { input: payload } });\n return result.data?.customerProfileUpdate?.userErrors ?? [];\n } catch (error) {\n // Log only the error name — the message can echo a submitted profile value (PII).\n console.error('[identity.customerProfileUpdate] customerProfileUpdate failed', loggableErrorName(error));\n return [toCustomerProfileError(error)];\n }\n },\n [customerProfileMutation],\n );\n\n return useMemo(\n () => ({ clientProfileUpdate, clientPreferencesUpdate, customerProfileUpdate }),\n [clientProfileUpdate, clientPreferencesUpdate, customerProfileUpdate],\n );\n}\n\n/**\n * Declares the `identity` action namespace — the single source of truth for its method/payload\n * metadata, runtime provider, and `use` hook (mirrors `cartActions`). The native catalog builder\n * (`scripts/build-catalog.mjs`) statically reads this call to emit `actions.json`; at runtime\n * `IdentityActionProvider` calls `useIdentityActions` directly.\n */\nexport const identityActions = defineActions({\n namespace: 'identity',\n description:\n 'Mutation-backed writes against the shopper identity entities (client profile, consent preferences, account profile).',\n provider: { name: 'IdentityActionProvider', importPath: '@vtex/faststore/internal/client' },\n methods: {\n clientProfileUpdate: {\n description:\n 'Persist profile fields (partial) to the active cart (async strategy). Sending email flips Session.isIdentified.',\n payload: [\n { name: 'email', type: 'string', optional: true },\n { name: 'firstName', type: 'string', optional: true },\n { name: 'lastName', type: 'string', optional: true },\n { name: 'phone', type: 'string', optional: true },\n { name: 'document', type: 'string', optional: true },\n ],\n },\n clientPreferencesUpdate: {\n description:\n 'Persist consent opt-in flags (partial) to the active cart (async strategy). Writes only the provided flag(s).',\n payload: [\n { name: 'optinNewsLetter', type: 'boolean', optional: true },\n { name: 'savePersonalData', type: 'boolean', optional: true },\n ],\n },\n customerProfileUpdate: {\n description:\n 'Persist profile fields (partial) to the persistent account profile, not the cart (async strategy). Omitted fields are untouched; an empty string erases.',\n payload: [\n { name: 'firstName', type: 'string', optional: true },\n { name: 'lastName', type: 'string', optional: true },\n { name: 'homePhone', type: 'string', optional: true },\n { name: 'mobilePhone', type: 'string', optional: true },\n { name: 'document', type: 'string', optional: true },\n { name: 'documentType', type: 'string', optional: true },\n { name: 'birthDate', type: 'string', optional: true },\n { name: 'gender', type: 'string', optional: true },\n ],\n },\n },\n use: useIdentityActions,\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-identity-actions.js","names":[],"sources":["../../../src/sdk/identity/use-identity-actions.ts"],"sourcesContent":["'use client';\n\nimport { CombinedGraphQLErrors } from '@apollo/client/errors';\nimport { useMutation } from '@apollo/client/react';\nimport { defineActions } from '@vtex/fs-core';\nimport { useCallback, useMemo } from 'react';\nimport { loggableErrorName } from '../../utils/loggable-error-name.js';\nimport {\n CLIENT_PREFERENCES_UPDATE,\n CLIENT_PROFILE_UPDATE,\n type ClientPreferenceKey,\n type ClientProfileUserError,\n CUSTOMER_PROFILE_UPDATE,\n type CustomerProfileUpdateInput,\n type CustomerProfileUserError,\n} from './operations.js';\n\n/**\n * The `identity` action namespace — the context-free owner of the shopper-profile,\n * consent-preference, and persistent-profile writes\n * (specs/fspg-859-email-field.md, specs/consent-opt-in-component.md,\n * docs/storefront-core/reference-free-particle-model.md § Write side — actions,\n * docs/storefront-core/adr-0010-actions-own-the-write-side.md).\n *\n * It mirrors `useCartActions`: a component anywhere in the tree dispatches the write through the\n * compiler-injected `$actions.identity.*` prop, and the handler calls the corresponding mutation.\n * Every write is **async / pessimistic** (Decision 1): the caller awaits the persisted result. Each\n * call returns its `userErrors` (empty on success) so the caller can surface server-side failures\n * inline; the returned entity self-updates the normalized cache and every reactive subscriber.\n *\n * The first two writes target the cart's sibling identity entities; `customerProfileUpdate` targets\n * the shopper's account profile, which needs no cart at all.\n */\n\n/**\n * Payload for the profile write. Callers persist only the fields they own; other fields are\n * untouched. The payload is passed through to `ClientProfileUpdateInput` unmapped, so this type\n * mirrors that input verbatim — a stacked field only needs a field to already exist here to reach\n * the wire.\n */\nexport type ClientProfileUpdatePayload = Readonly<{\n email?: string;\n firstName?: string;\n lastName?: string;\n phone?: string;\n document?: string;\n}>;\n\n/** Payload for the preferences write — one opt-in flag; the other flag is left untouched. */\nexport type ClientPreferencesUpdatePayload = Readonly<Partial<Record<ClientPreferenceKey, boolean>>>;\n\n/**\n * Payload for the persistent-profile write. Mirrors `CustomerProfileUpdateInput` verbatim and is\n * forwarded unmapped, so an omitted field stays untouched upstream and an empty string erases.\n */\nexport type CustomerProfileUpdatePayload = CustomerProfileUpdateInput;\n\nexport type IdentityActions = Readonly<{\n /**\n * Persist the provided profile fields (partial) to the active cart's `clientProfileData`.\n * Async — awaits the mutation before resolving. Returns the resulting `userErrors` (empty on\n * success).\n */\n clientProfileUpdate: (payload: ClientProfileUpdatePayload) => Promise<readonly ClientProfileUserError[]>;\n /**\n * Persist the provided consent opt-in flag(s) (partial) to the shopper's `ClientPreferences`\n * entity (order-form-backed). Async — awaits the mutation before resolving. Writes ONLY the\n * requested field. Returns the resulting `userErrors` (empty on success).\n */\n clientPreferencesUpdate: (payload: ClientPreferencesUpdatePayload) => Promise<readonly ClientProfileUserError[]>;\n /**\n * Persist the provided profile fields (partial) to the shopper's persistent, cart-independent\n * account profile. Async — awaits the mutation before resolving. Sends exactly the fields it is\n * given: an omitted field is left untouched, an empty string erases. Returns the resulting\n * `userErrors` (empty on success).\n */\n customerProfileUpdate: (payload: CustomerProfileUpdatePayload) => Promise<readonly CustomerProfileUserError[]>;\n}>;\n\n// A diagnostic message: components word this code from their own `$content`.\nconst NETWORK_PROFILE_ERROR: ClientProfileUserError = {\n code: 'NETWORK_ERROR',\n message: 'Unable to save your details. Please try again.',\n};\n\n// A diagnostic message: components word this code from their own `$content`.\nconst NETWORK_PREFERENCE_ERROR: ClientProfileUserError = {\n code: 'NETWORK_ERROR',\n message: 'Unable to save your preference. Please try again.',\n};\n\n// A diagnostic message: components word this code from their own `$content`.\nconst NETWORK_CUSTOMER_PROFILE_ERROR: CustomerProfileUserError = {\n code: 'NETWORK_ERROR',\n message: 'Unable to save your profile. Please try again.',\n};\n\n// A diagnostic message: components word this code from their own `$content`.\nconst UNAUTHORIZED_CUSTOMER_PROFILE_ERROR: CustomerProfileUserError = {\n code: 'UNAUTHORIZED',\n message: 'Your session has expired. Please sign in again.',\n};\n\n/**\n * The profile write answers an anonymous or expired session with a top-level `UNAUTHORIZED`, never\n * a `userError` (the read answers an anonymous one with a null profile instead). Collapsing it into\n * `NETWORK_ERROR` would offer a retry that cannot succeed, so it gets its own code and the caller can\n * send the shopper back to sign-in.\n */\nfunction toCustomerProfileError(error: unknown): CustomerProfileUserError {\n if (CombinedGraphQLErrors.is(error)) {\n const unauthorized = error.errors.some(({ extensions }) => extensions?.code === 'UNAUTHORIZED');\n if (unauthorized) return UNAUTHORIZED_CUSTOMER_PROFILE_ERROR;\n }\n return NETWORK_CUSTOMER_PROFILE_ERROR;\n}\n\n/**\n * The `identity` namespace hook. Registered with the first-party action registry via `identityActions`\n * below; the compiler-emitted `IdentityActionProvider` calls it and threads the narrowed methods into\n * each consumer's `$actions.identity`.\n */\nexport function useIdentityActions(): IdentityActions {\n const [profileMutation] = useMutation(CLIENT_PROFILE_UPDATE);\n const [preferencesMutation] = useMutation(CLIENT_PREFERENCES_UPDATE);\n const [customerProfileMutation] = useMutation(CUSTOMER_PROFILE_UPDATE);\n\n const clientProfileUpdate = useCallback<IdentityActions['clientProfileUpdate']>(\n async (payload) => {\n try {\n const result = await profileMutation({ variables: { input: payload } });\n return result.data?.clientProfileUpdate?.userErrors ?? [];\n } catch (error) {\n // Log only the error name — the message can echo the submitted email (PII).\n console.error('[identity.clientProfileUpdate] clientProfileUpdate failed', loggableErrorName(error));\n return [NETWORK_PROFILE_ERROR];\n }\n },\n [profileMutation],\n );\n\n const clientPreferencesUpdate = useCallback<IdentityActions['clientPreferencesUpdate']>(\n async (payload) => {\n try {\n const result = await preferencesMutation({ variables: { input: payload } });\n return result.data?.clientPreferencesUpdate?.userErrors ?? [];\n } catch (error) {\n // Log only the error name — mirrors the profile write's PII-safe logging.\n console.error('[identity.clientPreferencesUpdate] clientPreferencesUpdate failed', loggableErrorName(error));\n return [NETWORK_PREFERENCE_ERROR];\n }\n },\n [preferencesMutation],\n );\n\n const customerProfileUpdate = useCallback<IdentityActions['customerProfileUpdate']>(\n async (payload) => {\n try {\n // Forwarded unmapped: an empty string is an explicit erase and must survive to the wire.\n const result = await customerProfileMutation({ variables: { input: payload } });\n return result.data?.customerProfileUpdate?.userErrors ?? [];\n } catch (error) {\n // Log only the error name — the message can echo a submitted profile value (PII).\n console.error('[identity.customerProfileUpdate] customerProfileUpdate failed', loggableErrorName(error));\n return [toCustomerProfileError(error)];\n }\n },\n [customerProfileMutation],\n );\n\n return useMemo(\n () => ({ clientProfileUpdate, clientPreferencesUpdate, customerProfileUpdate }),\n [clientProfileUpdate, clientPreferencesUpdate, customerProfileUpdate],\n );\n}\n\n/**\n * Declares the `identity` action namespace — the single source of truth for its method/payload\n * metadata, runtime provider, and `use` hook (mirrors `cartActions`). The native catalog builder\n * (`scripts/build-catalog.mjs`) statically reads this call to emit `actions.json`; at runtime\n * `IdentityActionProvider` calls `useIdentityActions` directly.\n */\nexport const identityActions = defineActions({\n namespace: 'identity',\n description:\n 'Mutation-backed writes against the shopper identity entities (client profile, consent preferences, account profile).',\n provider: { name: 'IdentityActionProvider', importPath: '@vtex/faststore/internal/client' },\n methods: {\n clientProfileUpdate: {\n description:\n 'Persist profile fields (partial) to the active cart (async strategy). Sending email flips Session.isIdentified.',\n payload: [\n { name: 'email', type: 'string', optional: true },\n { name: 'firstName', type: 'string', optional: true },\n { name: 'lastName', type: 'string', optional: true },\n { name: 'phone', type: 'string', optional: true },\n { name: 'document', type: 'string', optional: true },\n ],\n },\n clientPreferencesUpdate: {\n description:\n 'Persist consent opt-in flags (partial) to the active cart (async strategy). Writes only the provided flag(s).',\n payload: [\n { name: 'optinNewsLetter', type: 'boolean', optional: true },\n { name: 'savePersonalData', type: 'boolean', optional: true },\n ],\n },\n customerProfileUpdate: {\n description:\n 'Persist profile fields (partial) to the persistent account profile, not the cart (async strategy). Omitted fields are untouched; an empty string erases.',\n payload: [\n { name: 'firstName', type: 'string', optional: true },\n { name: 'lastName', type: 'string', optional: true },\n { name: 'homePhone', type: 'string', optional: true },\n { name: 'mobilePhone', type: 'string', optional: true },\n { name: 'document', type: 'string', optional: true },\n { name: 'documentType', type: 'string', optional: true },\n { name: 'birthDate', type: 'string', optional: true },\n { name: 'gender', type: 'string', optional: true },\n ],\n },\n },\n use: useIdentityActions,\n});\n"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { BindingSwitchRequest, BindingSwitchResult } from "../navigation/binding-switch.js";
2
+ import { ReactNode } from "react";
3
+ //#region src/sdk/locale/binding-switch-provider.d.ts
4
+ export type SwitchBinding = (request: BindingSwitchRequest) => Promise<BindingSwitchResult>;
5
+ export type BindingSwitchProviderProps = Readonly<{
6
+ /** The app's `switchBinding` server action. The package cannot import the generated binding table. */
7
+ switchBinding: SwitchBinding;
8
+ children: ReactNode;
9
+ }>;
10
+ /** Hands the generated app's `switchBinding` server action to `locale.set`. */
11
+ export declare function BindingSwitchProvider({ switchBinding, children }: BindingSwitchProviderProps): import("react/jsx-runtime").JSX.Element;
12
+ //#endregion
13
+ //# sourceMappingURL=binding-switch-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/locale/binding-switch-provider.tsx
5
+ const Context = createContext(null);
6
+ /** Hands the generated app's `switchBinding` server action to `locale.set`. */
7
+ function BindingSwitchProvider({ switchBinding, children }) {
8
+ return /* @__PURE__ */ jsx(Context.Provider, {
9
+ value: switchBinding,
10
+ children
11
+ });
12
+ }
13
+ /** The provided server action, or `null` outside a `BindingSwitchProvider`. */
14
+ function useSwitchBinding() {
15
+ return useContext(Context);
16
+ }
17
+ //#endregion
18
+ export { BindingSwitchProvider, useSwitchBinding };
19
+
20
+ //# sourceMappingURL=binding-switch-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding-switch-provider.js","names":[],"sources":["../../../src/sdk/locale/binding-switch-provider.tsx"],"sourcesContent":["'use client';\n\nimport { createContext, type ReactNode, useContext } from 'react';\nimport type { BindingSwitchRequest, BindingSwitchResult } from '../navigation/binding-switch.js';\n\nexport type SwitchBinding = (request: BindingSwitchRequest) => Promise<BindingSwitchResult>;\n\nexport type BindingSwitchProviderProps = Readonly<{\n /** The app's `switchBinding` server action. The package cannot import the generated binding table. */\n switchBinding: SwitchBinding;\n children: ReactNode;\n}>;\n\nconst Context = createContext<SwitchBinding | null>(null);\n\n/** Hands the generated app's `switchBinding` server action to `locale.set`. */\nexport function BindingSwitchProvider({ switchBinding, children }: BindingSwitchProviderProps) {\n return <Context.Provider value={switchBinding}>{children}</Context.Provider>;\n}\n\n/** The provided server action, or `null` outside a `BindingSwitchProvider`. */\nexport function useSwitchBinding(): SwitchBinding | null {\n return useContext(Context);\n}\n"],"mappings":";;;;AAaA,MAAM,UAAU,cAAoC,IAAI;;AAGxD,SAAgB,sBAAsB,EAAE,eAAe,YAAwC;CAC7F,OAAO,oBAAC,QAAQ,UAAT;EAAkB,OAAO;EAAgB;CAA2B,CAAA;AAC7E;;AAGA,SAAgB,mBAAyC;CACvD,OAAO,WAAW,OAAO;AAC3B"}
@@ -0,0 +1,16 @@
1
+ import "../../core/dist/index.js";
2
+ //#region src/sdk/locale/use-locale-actions.d.ts
3
+ /**
4
+ * The `locale` action namespace. `set` switches the whole binding (locale, currency, sales channel):
5
+ * the app's server action decides the equivalent URL, or the no-equivalent fallback, and the browser
6
+ * goes there with a document navigation. `set` always resolves, never navigates on an error, and
7
+ * resolves `true` only when it started the navigation.
8
+ */
9
+ export type LocaleActions = Readonly<{
10
+ /** Switches to the binding `bindingId` names. `true` once the navigation starts; `false` after logging. */
11
+ set: (payload: {
12
+ bindingId: string;
13
+ }) => Promise<boolean>;
14
+ }>;
15
+ //#endregion
16
+ //# sourceMappingURL=use-locale-actions.d.ts.map
@@ -0,0 +1,70 @@
1
+ "use client";
2
+ import { defineActions } from "../../core/dist/actions/registry.js";
3
+ import "../../core/dist/index.js";
4
+ import { useStorefrontContext } from "../context/storefront-context.js";
5
+ import { useStorefrontRoute } from "../navigation/use-storefront-route.js";
6
+ import { loggableErrorName } from "../../utils/loggable-error-name.js";
7
+ import { useSwitchBinding } from "./binding-switch-provider.js";
8
+ import { useCallback, useMemo } from "react";
9
+ //#region src/sdk/locale/use-locale-actions.ts
10
+ /**
11
+ * The `locale` namespace hook. Reads the route at call time: `search` and `hash` come from
12
+ * `location`, because `useStorefrontRoute().search` is `null` during hydration. The page name is
13
+ * not sent: a layout has none, and the server derives the page from the path and params.
14
+ */
15
+ function useLocaleActions() {
16
+ const switchBinding = useSwitchBinding();
17
+ const { params, path } = useStorefrontRoute();
18
+ const { bindingId: currentBindingId } = useStorefrontContext();
19
+ const set = useCallback(async ({ bindingId }) => {
20
+ if (!switchBinding) {
21
+ console.error("[locale.set] no BindingSwitchProvider");
22
+ return false;
23
+ }
24
+ try {
25
+ const { url } = await switchBinding({
26
+ bindingId,
27
+ currentBindingId,
28
+ params,
29
+ path,
30
+ search: globalThis.location.search,
31
+ hash: globalThis.location.hash
32
+ });
33
+ if (url === null) {
34
+ console.error("[locale.set] no URL for the binding");
35
+ return false;
36
+ }
37
+ globalThis.location.assign(url);
38
+ return true;
39
+ } catch (error) {
40
+ console.error("[locale.set] switchBinding failed", loggableErrorName(error));
41
+ return false;
42
+ }
43
+ }, [
44
+ switchBinding,
45
+ currentBindingId,
46
+ params,
47
+ path
48
+ ]);
49
+ return useMemo(() => ({ set }), [set]);
50
+ }
51
+ defineActions({
52
+ namespace: "locale",
53
+ description: "Switches the whole binding (locale, currency, sales channel) by a document navigation to the equivalent URL, or to the destination home with a notice.",
54
+ provider: {
55
+ name: "LocaleActionProvider",
56
+ importPath: "@vtex/faststore/internal/client"
57
+ },
58
+ methods: { set: {
59
+ description: "Switch to another binding: navigates to the equivalent URL of the current page, or to the destination home with fs_notice=no-equivalent.",
60
+ payload: [{
61
+ name: "bindingId",
62
+ type: "string"
63
+ }]
64
+ } },
65
+ use: useLocaleActions
66
+ });
67
+ //#endregion
68
+ export { useLocaleActions };
69
+
70
+ //# sourceMappingURL=use-locale-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-locale-actions.js","names":[],"sources":["../../../src/sdk/locale/use-locale-actions.ts"],"sourcesContent":["'use client';\n\nimport { defineActions } from '@vtex/fs-core';\nimport { useCallback, useMemo } from 'react';\nimport { loggableErrorName } from '../../utils/loggable-error-name.js';\nimport { useStorefrontContext } from '../context/storefront-context.js';\nimport { useStorefrontRoute } from '../navigation/use-storefront-route.js';\nimport { useSwitchBinding } from './binding-switch-provider.js';\n\n/**\n * The `locale` action namespace. `set` switches the whole binding (locale, currency, sales channel):\n * the app's server action decides the equivalent URL, or the no-equivalent fallback, and the browser\n * goes there with a document navigation. `set` always resolves, never navigates on an error, and\n * resolves `true` only when it started the navigation.\n */\nexport type LocaleActions = Readonly<{\n /** Switches to the binding `bindingId` names. `true` once the navigation starts; `false` after logging. */\n set: (payload: { bindingId: string }) => Promise<boolean>;\n}>;\n\n/**\n * The `locale` namespace hook. Reads the route at call time: `search` and `hash` come from\n * `location`, because `useStorefrontRoute().search` is `null` during hydration. The page name is\n * not sent: a layout has none, and the server derives the page from the path and params.\n */\nexport function useLocaleActions(): LocaleActions {\n const switchBinding = useSwitchBinding();\n const { params, path } = useStorefrontRoute();\n const { bindingId: currentBindingId } = useStorefrontContext();\n\n const set = useCallback<LocaleActions['set']>(\n async ({ bindingId }) => {\n if (!switchBinding) {\n console.error('[locale.set] no BindingSwitchProvider');\n return false;\n }\n try {\n const { url } = await switchBinding({\n bindingId,\n currentBindingId,\n params,\n path,\n search: globalThis.location.search,\n hash: globalThis.location.hash,\n });\n if (url === null) {\n console.error('[locale.set] no URL for the binding');\n return false;\n }\n globalThis.location.assign(url);\n return true;\n } catch (error) {\n console.error('[locale.set] switchBinding failed', loggableErrorName(error));\n return false;\n }\n },\n [switchBinding, currentBindingId, params, path],\n );\n\n return useMemo(() => ({ set }), [set]);\n}\n\n/**\n * Declares the `locale` action namespace. The native catalog builder reads this call to emit\n * `actions.json`; at runtime `LocaleActionProvider` calls `useLocaleActions` directly.\n */\nexport const localeActions = defineActions({\n namespace: 'locale',\n description:\n 'Switches the whole binding (locale, currency, sales channel) by a document navigation to the equivalent URL, or to the destination home with a notice.',\n provider: { name: 'LocaleActionProvider', importPath: '@vtex/faststore/internal/client' },\n methods: {\n set: {\n description:\n 'Switch to another binding: navigates to the equivalent URL of the current page, or to the destination home with fs_notice=no-equivalent.',\n payload: [{ name: 'bindingId', type: 'string' }],\n },\n },\n use: useLocaleActions,\n});\n"],"mappings":";;;;;;;;;;;;;;AAyBA,SAAgB,mBAAkC;CAChD,MAAM,gBAAgB,iBAAiB;CACvC,MAAM,EAAE,QAAQ,SAAS,mBAAmB;CAC5C,MAAM,EAAE,WAAW,qBAAqB,qBAAqB;CAE7D,MAAM,MAAM,YACV,OAAO,EAAE,gBAAgB;EACvB,IAAI,CAAC,eAAe;GAClB,QAAQ,MAAM,uCAAuC;GACrD,OAAO;EACT;EACA,IAAI;GACF,MAAM,EAAE,QAAQ,MAAM,cAAc;IAClC;IACA;IACA;IACA;IACA,QAAQ,WAAW,SAAS;IAC5B,MAAM,WAAW,SAAS;GAC5B,CAAC;GACD,IAAI,QAAQ,MAAM;IAChB,QAAQ,MAAM,qCAAqC;IACnD,OAAO;GACT;GACA,WAAW,SAAS,OAAO,GAAG;GAC9B,OAAO;EACT,SAAS,OAAO;GACd,QAAQ,MAAM,qCAAqC,kBAAkB,KAAK,CAAC;GAC3E,OAAO;EACT;CACF,GACA;EAAC;EAAe;EAAkB;EAAQ;CAAI,CAChD;CAEA,OAAO,eAAe,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC;AACvC;AAM6B,cAAc;CACzC,WAAW;CACX,aACE;CACF,UAAU;EAAE,MAAM;EAAwB,YAAY;CAAkC;CACxF,SAAS,EACP,KAAK;EACH,aACE;EACF,SAAS,CAAC;GAAE,MAAM;GAAa,MAAM;EAAS,CAAC;CACjD,EACF;CACA,KAAK;AACP,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { RouteMap } from "./types.js";
2
+ import { AlternateBinding } from "../seo/page-alternates.js";
3
+ import { ApolloClient } from "@apollo/client";
4
+ //#region src/sdk/navigation/binding-switch.d.ts
5
+ export type BindingSwitchRequest = {
6
+ /** Destination binding id. */
7
+ bindingId: string;
8
+ /** The binding the shopper is on. */
9
+ currentBindingId: string;
10
+ params: Record<string, string | string[]>;
11
+ /** Decoded logical path of the current page. */
12
+ path: string;
13
+ /** `location.search`: `''` or `'?…'`. */
14
+ search: string;
15
+ /** `location.hash`: `''` or `'#…'`. */
16
+ hash: string;
17
+ };
18
+ export type BindingSwitchResult = {
19
+ url: string | null;
20
+ };
21
+ export type ResolveBindingSwitchOptions = {
22
+ request: BindingSwitchRequest;
23
+ knownBindingId: (candidate: string | null | undefined) => string | null;
24
+ bindings: readonly AlternateBinding[];
25
+ routeMap: RouteMap;
26
+ buildUrl: (bindingId: string, logicalPath: string) => string;
27
+ clientFor: (bindingId: string) => ApolloClient;
28
+ };
29
+ /**
30
+ * The equivalent URL of the current page in the destination binding, or the destination's home with
31
+ * `fs_notice=no-equivalent` when none exists or the lookup fails. The page is the one route-map
32
+ * entry whose href in the current binding equals the logical path; none or several take the
33
+ * fallback. Every URL is built by `buildUrl` from an id `knownBindingId` accepted; an undeclared
34
+ * destination resolves `{ url: null }`. The request comes off the wire, so each field is read as
35
+ * unchecked. Never throws for an expected outcome, writes no cookie, and reads no request header.
36
+ */
37
+ export declare function resolveBindingSwitch({ request, knownBindingId, bindings, routeMap, buildUrl, clientFor }: ResolveBindingSwitchOptions): Promise<BindingSwitchResult>;
38
+ //#endregion
39
+ //# sourceMappingURL=binding-switch.d.ts.map
@@ -0,0 +1,129 @@
1
+ import { resolveStorefrontHref } from "./resolve-storefront-href.js";
2
+ import { CATALOG_ROUTE_ALTERNATES_QUERY, catalogClusterPaths, encodePath } from "../seo/page-alternates.js";
3
+ import { decodeRouteParams } from "./decode-route-params.js";
4
+ //#region src/sdk/navigation/binding-switch.ts
5
+ /** Bounds the `catalogRoute` lookup: a slow API takes the no-equivalent fallback instead of stalling the switch. */
6
+ const BINDING_SWITCH_LOOKUP_TIMEOUT_MS = 3e3;
7
+ const CATALOG_STANDARDS = /* @__PURE__ */ new Set([
8
+ "product",
9
+ "category",
10
+ "brand",
11
+ "collection"
12
+ ]);
13
+ const NO_EQUIVALENT_QUERY = "?fs_notice=no-equivalent";
14
+ /**
15
+ * The equivalent URL of the current page in the destination binding, or the destination's home with
16
+ * `fs_notice=no-equivalent` when none exists or the lookup fails. The page is the one route-map
17
+ * entry whose href in the current binding equals the logical path; none or several take the
18
+ * fallback. Every URL is built by `buildUrl` from an id `knownBindingId` accepted; an undeclared
19
+ * destination resolves `{ url: null }`. The request comes off the wire, so each field is read as
20
+ * unchecked. Never throws for an expected outcome, writes no cookie, and reads no request header.
21
+ */
22
+ async function resolveBindingSwitch({ request, knownBindingId, bindings, routeMap, buildUrl, clientFor }) {
23
+ const destination = knownBindingId(stringOr(request.bindingId, null));
24
+ if (destination === null) {
25
+ console.error("[locale.set] unknown binding");
26
+ return { url: null };
27
+ }
28
+ const fallback = { url: `${buildUrl(destination, "/")}${NO_EQUIVALENT_QUERY}` };
29
+ const path = stringOr(request.path, "");
30
+ const params = decodeRouteParams(paramsOf(request.params));
31
+ const page = pageMatchingPath(routeMap, stringOr(request.currentBindingId, ""), path, params);
32
+ const entry = page === void 0 ? void 0 : ownEntry(routeMap, page);
33
+ if (page === void 0 || entry === void 0) return fallback;
34
+ if (entry.bindings !== void 0 && !entry.bindings.includes(destination)) return fallback;
35
+ const tail = `${searchOf(request.search)}${hashOf(request.hash)}`;
36
+ if (entry.standard !== void 0 && CATALOG_STANDARDS.has(entry.standard)) {
37
+ const current = knownBindingId(stringOr(request.currentBindingId, null));
38
+ if (current === null || path === "" || path === "/") return fallback;
39
+ const paths = await catalogClusterPaths(bindings, async () => {
40
+ const { data, error } = await clientFor(current).query({
41
+ query: CATALOG_ROUTE_ALTERNATES_QUERY,
42
+ variables: { path },
43
+ errorPolicy: "all",
44
+ fetchPolicy: "no-cache",
45
+ context: { fetchOptions: { signal: AbortSignal.timeout(BINDING_SWITCH_LOOKUP_TIMEOUT_MS) } }
46
+ });
47
+ return {
48
+ data,
49
+ error
50
+ };
51
+ });
52
+ const variantPath = paths && Object.hasOwn(paths, destination) ? paths[destination] : void 0;
53
+ if (variantPath === void 0) return fallback;
54
+ return { url: `${buildUrl(destination, encodePath(variantPath))}${tail}` };
55
+ }
56
+ const { href } = resolveStorefrontHref({
57
+ bindingId: destination,
58
+ basePath: "/"
59
+ }, routeMap, {
60
+ page,
61
+ params
62
+ });
63
+ if (href === null) return fallback;
64
+ return { url: `${buildUrl(destination, href)}${tail}` };
65
+ }
66
+ function stringOr(value, empty) {
67
+ return typeof value === "string" ? value : empty;
68
+ }
69
+ function paramsOf(value) {
70
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? value : {};
71
+ }
72
+ /**
73
+ * The single page whose href in the current binding is this logical path. A miss and a tie are both
74
+ * no page: the switch falls back instead of guessing. An entry that cannot be resolved (a missing
75
+ * param, a binding it does not serve) is skipped.
76
+ */
77
+ function pageMatchingPath(routeMap, bindingId, path, params) {
78
+ const matches = [];
79
+ for (const name of Object.keys(routeMap)) {
80
+ const { href } = resolveStorefrontHref({
81
+ bindingId,
82
+ basePath: "/"
83
+ }, routeMap, {
84
+ page: name,
85
+ params
86
+ });
87
+ if (href === null || !sameDecodedPath(href, path)) continue;
88
+ matches.push(name);
89
+ }
90
+ return matches.length === 1 ? matches[0] : void 0;
91
+ }
92
+ /**
93
+ * `resolveStorefrontHref` percent-encodes params, so the href is decoded once. The request path is
94
+ * compared as it arrived first, so a decoded slug like `100%-off` or `%41` is not decoded again; an
95
+ * encoded path still matches through its decoded form.
96
+ */
97
+ function sameDecodedPath(href, path) {
98
+ const decodedHref = decodeOrNull(href);
99
+ if (decodedHref === null) return false;
100
+ return decodedHref === path || decodedHref === decodeOrNull(path);
101
+ }
102
+ function decodeOrNull(text) {
103
+ try {
104
+ return decodeURIComponent(text);
105
+ } catch {
106
+ return null;
107
+ }
108
+ }
109
+ function ownEntry(routeMap, page) {
110
+ return Object.hasOwn(routeMap, page) ? routeMap[page] : void 0;
111
+ }
112
+ /** Kept verbatim when it is only a query: a leading `?`, no `#`, and no control character. */
113
+ function searchOf(search) {
114
+ const text = stringOr(search, "");
115
+ if (text.length < 2 || !text.startsWith("?")) return "";
116
+ for (const char of text) {
117
+ const code = char.codePointAt(0) ?? 0;
118
+ if (char === "#" || code < 32 || code === 127) return "";
119
+ }
120
+ return text;
121
+ }
122
+ function hashOf(hash) {
123
+ const text = stringOr(hash, "");
124
+ return text.startsWith("#") && text.length > 1 ? text : "";
125
+ }
126
+ //#endregion
127
+ export { resolveBindingSwitch };
128
+
129
+ //# sourceMappingURL=binding-switch.js.map