@occluze/tether 0.6.7 → 0.7.0

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 (250) hide show
  1. package/README.md +11 -11
  2. package/dist/esm/astro.js +2 -2
  3. package/dist/esm/chunks/account-UIPWJQ3Y.js +1 -0
  4. package/dist/esm/chunks/account-pages-6ROA6Y4V.js +1 -0
  5. package/dist/esm/chunks/analytics-2V632IRV.js +1 -0
  6. package/dist/esm/chunks/chunk-4GCXM764.js +1 -0
  7. package/dist/esm/chunks/chunk-56FCLJJD.js +1 -0
  8. package/dist/esm/chunks/chunk-5Z5O3767.js +1 -0
  9. package/dist/esm/chunks/chunk-6OZJCAGZ.js +1 -0
  10. package/dist/esm/chunks/chunk-A5SYCVQM.js +1 -0
  11. package/dist/esm/chunks/chunk-BA4LQJJQ.js +1 -0
  12. package/dist/esm/chunks/chunk-BFTZR4OB.js +4 -0
  13. package/dist/esm/chunks/chunk-C5JYQCWH.js +1 -0
  14. package/dist/esm/chunks/chunk-E5YO6274.js +1 -0
  15. package/dist/esm/chunks/chunk-MPDWM2NN.js +1 -0
  16. package/dist/esm/chunks/chunk-T44MUL4Y.js +1 -0
  17. package/dist/esm/chunks/chunk-YLUULATY.js +1 -0
  18. package/dist/esm/chunks/diagnose-3FEKRIEK.js +14 -0
  19. package/dist/esm/chunks/extras-6POFBNOP.js +1 -0
  20. package/dist/esm/chunks/markets-ui-FD6NI2OG.js +1 -0
  21. package/dist/esm/chunks/search-UJ73YBQ5.js +1 -0
  22. package/dist/esm/index.js +1 -1
  23. package/dist/esm/server.js +2 -1
  24. package/dist/presets/barba.esm.js +55 -39
  25. package/dist/tether.account-pages.js +781 -495
  26. package/dist/tether.account-pages.min.js +1 -1
  27. package/dist/tether.account.js +462 -381
  28. package/dist/tether.account.min.js +1 -1
  29. package/dist/tether.analytics.js +299 -194
  30. package/dist/tether.analytics.min.js +1 -1
  31. package/dist/tether.diagnose.js +354 -262
  32. package/dist/tether.diagnose.min.js +2 -2
  33. package/dist/tether.extras.js +82 -45
  34. package/dist/tether.extras.min.js +1 -1
  35. package/dist/tether.js +3653 -2116
  36. package/dist/tether.markets.js +238 -150
  37. package/dist/tether.markets.min.js +1 -1
  38. package/dist/tether.min.js +3 -3
  39. package/dist/tether.min.js.map +4 -4
  40. package/dist/tether.search.js +207 -136
  41. package/dist/tether.search.min.js +1 -1
  42. package/dist/types/server/src/shared/account-orders.d.ts +44 -0
  43. package/dist/types/server/src/shared/account-routes.d.ts +153 -0
  44. package/dist/types/server/src/shared/api-versions.d.ts +13 -0
  45. package/dist/types/server/src/shared/error-message.d.ts +2 -0
  46. package/dist/types/server/src/shared/json.d.ts +25 -0
  47. package/dist/types/server/src/shared/market-codes.d.ts +16 -0
  48. package/dist/types/src/account/addresses-view.d.ts +5 -0
  49. package/dist/types/src/account/answers.d.ts +40 -0
  50. package/dist/types/src/account/markup.d.ts +19 -0
  51. package/dist/types/src/account/operations.d.ts +41 -0
  52. package/dist/types/src/account/order-lines.d.ts +13 -0
  53. package/dist/types/src/account/order-list.d.ts +12 -0
  54. package/dist/types/src/account/order-page.d.ts +6 -0
  55. package/dist/types/src/account/page-answers.d.ts +182 -0
  56. package/dist/types/src/account/page-events.d.ts +2 -0
  57. package/dist/types/src/account/server-client.d.ts +60 -0
  58. package/dist/types/src/account/subscriptions-view.d.ts +2 -0
  59. package/dist/types/src/account-api.d.ts +18 -0
  60. package/dist/types/src/account-marks.d.ts +15 -0
  61. package/dist/types/src/account-pages.d.ts +8 -0
  62. package/dist/types/src/account.d.ts +64 -0
  63. package/dist/types/src/amounts.d.ts +12 -0
  64. package/dist/types/src/analytics-shopify.d.ts +41 -0
  65. package/dist/types/src/analytics.d.ts +2 -0
  66. package/dist/types/src/api-version.d.ts +28 -0
  67. package/dist/types/src/astro.d.ts +42 -0
  68. package/dist/types/src/cart/cart-shape.d.ts +43 -0
  69. package/dist/types/src/cart/checkout.d.ts +16 -0
  70. package/dist/types/src/cart/drawer.d.ts +18 -0
  71. package/dist/types/src/cart/mutations.d.ts +79 -0
  72. package/dist/types/src/cart/render.d.ts +17 -0
  73. package/dist/types/src/cart/store.d.ts +182 -0
  74. package/dist/types/src/cart.d.ts +106 -0
  75. package/dist/types/src/client.d.ts +100 -0
  76. package/dist/types/src/collection.d.ts +25 -0
  77. package/dist/types/src/config-sections.d.ts +40 -0
  78. package/dist/types/src/config.d.ts +185 -0
  79. package/dist/types/src/controls/cart-controls.d.ts +2 -0
  80. package/dist/types/src/controls/discount.d.ts +2 -0
  81. package/dist/types/src/controls/extras.d.ts +5 -0
  82. package/dist/types/src/controls/navigation.d.ts +12 -0
  83. package/dist/types/src/diagnose-markup.d.ts +19 -0
  84. package/dist/types/src/diagnose.d.ts +60 -0
  85. package/dist/types/src/dom.d.ts +75 -0
  86. package/dist/types/src/extras.d.ts +21 -0
  87. package/dist/types/src/fragments.d.ts +158 -0
  88. package/dist/types/src/globals.d.ts +15 -0
  89. package/dist/types/src/images.d.ts +20 -0
  90. package/dist/types/src/index.d.ts +167 -0
  91. package/dist/types/src/initial.d.ts +56 -0
  92. package/dist/types/src/lazy.d.ts +28 -0
  93. package/dist/types/src/loader.d.ts +84 -0
  94. package/dist/types/src/market-codes.d.ts +6 -0
  95. package/dist/types/src/markets-ui.d.ts +32 -0
  96. package/dist/types/src/markets.d.ts +72 -0
  97. package/dist/types/src/markup.d.ts +131 -0
  98. package/dist/types/src/mounting.d.ts +46 -0
  99. package/dist/types/src/page-market.d.ts +27 -0
  100. package/dist/types/src/presets/barba.d.ts +56 -0
  101. package/dist/types/src/product-events.d.ts +2 -0
  102. package/dist/types/src/product-render.d.ts +17 -0
  103. package/dist/types/src/product-shape.d.ts +88 -0
  104. package/dist/types/src/product-state.d.ts +110 -0
  105. package/dist/types/src/product.d.ts +66 -0
  106. package/dist/types/src/repeaters.d.ts +16 -0
  107. package/dist/types/src/search.d.ts +33 -0
  108. package/dist/types/src/selling-plans.d.ts +64 -0
  109. package/dist/types/src/server.d.ts +88 -0
  110. package/dist/types/src/shopify-values.d.ts +46 -0
  111. package/dist/types/src/status.d.ts +33 -0
  112. package/dist/types/src/storage.d.ts +12 -0
  113. package/dist/types/src/store-html.d.ts +39 -0
  114. package/dist/types/src/storefront/catalog.d.ts +38 -0
  115. package/dist/types/src/storefront/json-ld.d.ts +20 -0
  116. package/dist/types/src/variant-render.d.ts +14 -0
  117. package/package.json +42 -22
  118. package/src/account/addresses-view.ts +58 -0
  119. package/src/account/answers.ts +79 -0
  120. package/src/account/markup.ts +36 -0
  121. package/src/account/operations.ts +145 -0
  122. package/src/account/order-lines.ts +75 -0
  123. package/src/account/order-list.ts +107 -0
  124. package/src/account/order-page.ts +137 -0
  125. package/src/account/page-answers.ts +317 -0
  126. package/src/account/page-events.ts +253 -0
  127. package/src/account/server-client.ts +183 -0
  128. package/src/account/subscriptions-view.ts +115 -0
  129. package/src/account-api.ts +98 -0
  130. package/src/account-marks.ts +35 -0
  131. package/src/account-pages.ts +81 -0
  132. package/src/account.ts +284 -0
  133. package/src/amounts.ts +64 -0
  134. package/src/analytics-shopify.ts +246 -0
  135. package/src/analytics.ts +315 -0
  136. package/src/api-version.ts +79 -0
  137. package/src/astro.ts +272 -0
  138. package/src/cart/cart-shape.ts +25 -0
  139. package/src/cart/checkout.ts +101 -0
  140. package/src/cart/drawer.ts +125 -0
  141. package/src/cart/mutations.ts +237 -0
  142. package/src/cart/render.ts +266 -0
  143. package/src/cart/store.ts +279 -0
  144. package/src/cart.ts +345 -0
  145. package/src/client.ts +391 -0
  146. package/src/collection.ts +175 -0
  147. package/src/config-sections.ts +284 -0
  148. package/src/config.ts +480 -0
  149. package/src/controls/cart-controls.ts +123 -0
  150. package/src/controls/discount.ts +75 -0
  151. package/src/controls/extras.ts +54 -0
  152. package/src/controls/navigation.ts +77 -0
  153. package/src/diagnose-markup.ts +298 -0
  154. package/src/diagnose.ts +294 -0
  155. package/src/dom.ts +268 -0
  156. package/src/extras.ts +136 -0
  157. package/src/fragments.ts +261 -0
  158. package/src/globals.d.ts +15 -0
  159. package/src/images.ts +91 -0
  160. package/src/index.ts +415 -0
  161. package/src/initial.ts +101 -0
  162. package/src/lazy-iife.ts +197 -0
  163. package/src/lazy.ts +42 -0
  164. package/src/loader.ts +363 -0
  165. package/src/market-codes.ts +6 -0
  166. package/src/markets-ui.ts +227 -0
  167. package/src/markets.ts +246 -0
  168. package/src/markup.ts +127 -0
  169. package/src/mounting.ts +264 -0
  170. package/src/page-market.ts +110 -0
  171. package/src/part-integrity.ts +7 -0
  172. package/src/parts/account-pages.ts +7 -0
  173. package/src/parts/account.ts +7 -0
  174. package/src/parts/analytics.ts +7 -0
  175. package/src/parts/diagnose.ts +7 -0
  176. package/src/parts/extras.ts +7 -0
  177. package/src/parts/markets.ts +7 -0
  178. package/src/parts/search.ts +7 -0
  179. package/src/presets/barba.ts +194 -0
  180. package/src/product-events.ts +115 -0
  181. package/src/product-render.ts +218 -0
  182. package/src/product-shape.ts +49 -0
  183. package/src/product-state.ts +318 -0
  184. package/src/product.ts +308 -0
  185. package/src/repeaters.ts +161 -0
  186. package/src/search.ts +305 -0
  187. package/src/selling-plans.ts +145 -0
  188. package/src/server.ts +211 -0
  189. package/src/shopify-values.ts +91 -0
  190. package/src/status.ts +106 -0
  191. package/src/storage.ts +34 -0
  192. package/src/store-html.ts +359 -0
  193. package/src/storefront/catalog.ts +196 -0
  194. package/src/storefront/json-ld.ts +144 -0
  195. package/src/variant-render.ts +139 -0
  196. package/dist/esm/chunks/account-Q6E2TFEV.js +0 -1
  197. package/dist/esm/chunks/account-pages-UZXR4R5F.js +0 -1
  198. package/dist/esm/chunks/analytics-IJBKATUP.js +0 -1
  199. package/dist/esm/chunks/chunk-4QJKLPYR.js +0 -1
  200. package/dist/esm/chunks/chunk-64TUD3QR.js +0 -1
  201. package/dist/esm/chunks/chunk-AJLPU2JC.js +0 -4
  202. package/dist/esm/chunks/chunk-FIOZPPC5.js +0 -1
  203. package/dist/esm/chunks/chunk-K2YEQAIH.js +0 -1
  204. package/dist/esm/chunks/chunk-KIDH76B7.js +0 -1
  205. package/dist/esm/chunks/chunk-PAYT5ZD7.js +0 -1
  206. package/dist/esm/chunks/chunk-RREHGH4A.js +0 -1
  207. package/dist/esm/chunks/chunk-SSJT43CJ.js +0 -1
  208. package/dist/esm/chunks/chunk-VC46IEJQ.js +0 -1
  209. package/dist/esm/chunks/diagnose-3WVAWNTX.js +0 -14
  210. package/dist/esm/chunks/extras-7I7WJX35.js +0 -1
  211. package/dist/esm/chunks/markets-ui-545XLFTE.js +0 -1
  212. package/dist/esm/chunks/search-NILMGYXG.js +0 -1
  213. package/src/account-pages.js +0 -318
  214. package/src/account.js +0 -385
  215. package/src/analytics.js +0 -232
  216. package/src/api-version.js +0 -35
  217. package/src/astro.js +0 -101
  218. package/src/cart.js +0 -559
  219. package/src/client.js +0 -131
  220. package/src/collection.js +0 -114
  221. package/src/config.js +0 -85
  222. package/src/diagnose.js +0 -246
  223. package/src/dom.js +0 -288
  224. package/src/extras.js +0 -63
  225. package/src/fragments.js +0 -144
  226. package/src/index.js +0 -395
  227. package/src/initial.js +0 -75
  228. package/src/lazy-iife.js +0 -46
  229. package/src/lazy.js +0 -18
  230. package/src/loader.js +0 -198
  231. package/src/markets-ui.js +0 -90
  232. package/src/markets.js +0 -133
  233. package/src/mounting.js +0 -154
  234. package/src/parts/account-pages.js +0 -3
  235. package/src/parts/account.js +0 -3
  236. package/src/parts/analytics.js +0 -3
  237. package/src/parts/diagnose.js +0 -3
  238. package/src/parts/extras.js +0 -3
  239. package/src/parts/markets.js +0 -3
  240. package/src/parts/search.js +0 -3
  241. package/src/presets/barba.js +0 -100
  242. package/src/product.js +0 -570
  243. package/src/search.js +0 -153
  244. package/src/selling-plans.js +0 -94
  245. package/src/server.js +0 -252
  246. package/src/status.js +0 -66
  247. package/types/astro.d.ts +0 -17
  248. package/types/barba.d.ts +0 -16
  249. package/types/index.d.ts +0 -426
  250. package/types/server.d.ts +0 -110
@@ -1,4 +1,4 @@
1
- (()=>{var j=Object.defineProperty;var R=(e,t)=>{for(var o in t)j(e,o,{get:t[o],enumerable:!0})};var P={};R(P,{apiVersionStatus:()=>E,checkMarkup:()=>O,diagnose:()=>se,didYouMean:()=>w});var B=window.Tether.__core["config.js"],{DEFAULTS:ce,cfg:l,configure:ue,isConfigured:T,log:de,reportError:pe,warn:me}=B;var z=window.Tether.__core["client.js"],{TetherError:he,endpoint:C,gql:v,request:ge,unwrap:ye,withContext:be}=z;var G=window.Tether.__core["dom.js"],{attr:f,busy:$e,cdnUrl:ke,dataKey:Se,emit:ve,formatDate:Ee,formatMoney:xe,formatPercent:Pe,get:g,has:Te,hasTemplate:_,imageUrl:Ce,notifyLayoutChanged:_e,parseJSONAttr:Ae,productUrl:qe,qsa:d,readText:Ue,repeat:Me,repeatKeyed:De,sameImage:Ne,scoped:Ve,sel:c,setImage:Ie,setSelected:Le,setText:Oe,setTextTracked:je,show:Re,toAttributes:Be,watchImages:ze}=G;var Y=window.Tether.__core["loader.js"],{clearProductCache:Ye,getProduct:A,getProducts:He,getRecommendations:Ke,hydrateProducts:We,normalizeProductKey:Fe,primeProduct:Je,refreshProducts:Ze,takeStale:Xe}=Y;var H=window.Tether.__core["selling-plans.js"],{GID:et,allPlans:q,allocationFor:tt,findPlan:ot,hasPlans:nt,planAdjustment:rt,planCheckoutCharge:at,planPrice:st,planSavings:it,plansForVariant:lt,toGid:ct}=H;var K=window.Tether.__core["status.js"],{STATUS_KEYS:dt,boundary:U,isNotFound:pt,ownedBy:mt,resolveProductKey:$,setScopeStatus:ft}=K;var D=e=>{let t=/^(\d{4})-(01|04|07|10)$/.exec(String(e||""));return t?{y:+t[1],m:+t[2]}:null},W=(e,t)=>`${e}-${String(t).padStart(2,"0")}`;function M(e,t=1){let o=D(e);if(!o)throw new Error(`not a quarterly Shopify API version: ${e}`);let a=o.y*4+(o.m-1)/3+t;return W(Math.floor(a/4),a%4*3+1)}function E(e,t=new Date){if(e==="unstable")return{version:e,ok:!1,note:'"unstable" changes without notice: pin a dated version such as 2026-07'};let o=D(e);if(!o)return{version:e,ok:!1,note:"not a quarterly version (YYYY-01, -04, -07 or -10)"};let a=new Date(Date.UTC(o.y,o.m-1,1)),n=new Date(Date.UTC(o.y+1,o.m-1,1)),p=(n-t)/(30.44*24*3600*1e3),i=`supported until about ${n.toISOString().slice(0,7)}`;return a>t?i="not released yet (release candidate at best)":p<=0?i="no longer supported: Shopify falls back to the oldest supported version. Upgrade (see README)":p<3&&(i=`${i}: plan the upgrade to ${M(e)} or later (see README)`),{version:e,ok:a<=t&&p>0,monthsLeft:Math.round(p),next:M(e),note:i}}var F=/^[A-Z]{2}$/,J=new Set(["PT_BR","PT_PT","ZH_CN","ZH_TW"]),Z=()=>`${l.prefix}:market:${l.domain}`,X=()=>({document:typeof document<"u"?document:null,location:typeof window<"u"?window.location:null,storage:(()=>{try{return window.localStorage}catch{return null}})(),global:typeof window<"u"?window:{}});function Q(e){let t=String(e||"").trim().toUpperCase();return F.test(t)&&t!=="XX"&&t!=="T1"?t:null}function ee(e){let t=String(e||"").trim().replace("-","_").toUpperCase();if(!t)return null;if(J.has(t))return t;let o=t.split("_")[0];return/^[A-Z]{2,3}$/.test(o)?o:null}function te(e,t){if(!e||!t)return null;let o=String(e.cookie||"").split(";").map(a=>a.trim()).find(a=>a.startsWith(`${t}=`));return o?decodeURIComponent(o.slice(t.length+1)):null}var x=(e,t)=>{if(!e||!t)return null;let o=String(t).toLowerCase(),a=Object.keys(e).find(n=>n.toLowerCase()===o);return a?e[a]:null},oe={saved(e,t){if(e.remember===!1||!t.storage)return null;try{return JSON.parse(t.storage.getItem(Z())||"null")}catch{return null}},server(e,t){let o=p=>t.document?.querySelector?.(`meta[name="${p}"]`)?.getAttribute("content"),a=t.global.TETHER_COUNTRY||o("tether-country")||te(t.document,e.cookie||"tether_country"),n=t.global.TETHER_LANGUAGE||o("tether-language");return{country:a,language:n}},webflow(e,t){let o=(t.location?.pathname||"/").split("/").filter(Boolean)[0],a=x(e.locales,o);if(a)return a;let n=t.document?.documentElement?.getAttribute("lang");if(!n)return null;let p=x(e.locales,n)||x(e.locales,n.split("-")[0]);if(p)return{locale:n,...p};if(e.locales&&e.strict)return null;let i=n.split("-")[1];return{language:n,country:i&&i.length===2?i:null,locale:n}}};function N(e=l.markets,t=X()){let o=e||{};if(o.detect===!1)return{};let a=o.detect?o.detect===!0?["saved","server","webflow"]:[].concat(o.detect):["saved"];e=o;let n={sources:{}};return a.forEach(p=>{let i=oe[p]?.(e,t);if(!i)return;let b={country:Q(i.country),language:ee(i.language),locale:i.locale||null};Object.entries(b).forEach(([r,s])=>{s&&!n[r]&&(n[r]=s,n.sources[r]=p)})}),n}var V=new Set(["in-stock","out-of-stock","backorder","low-stock","plenty-in-stock","on-sale","not-on-sale","has-variants","single-variant","subscription-available","subscription-unavailable","subscription-only","one-time-available","subscription-selected","one-time-selected","has-savings","loading","ready","error","not-found","cart-empty","cart-filled","cart-has-subscription","cart-no-subscription","cart-has-discount","cart-error","cart-warning","list-empty","list-filled","search-empty","search-results","logged-in","logged-out","orders-empty","orders-loading","addresses-loading","addresses-empty","addresses-error","subscriptions-loading","subscriptions-empty","subscriptions-error"]),I=new Set(["title","description","description-text","vendor","type","handle","published-at","price","total-price","compare-at-price","unit-price","min-price","max-price","discount-percentage","discount-amount","variant-title","variant-id","sku","barcode","stock","quantity","featured-image","variant-image","images","tags","link","url","one-time-price","subscription-price","subscription-savings","subscription-savings-amount","checkout-charge","plan-name","plan-description","plan-group","option-value","swatch","image"]),L=new Set(`account account-bind account-link account-login account-logout add-label add-to-cart adding-text
1
+ (()=>{var H=Object.defineProperty;var L=(e,n)=>{for(var t in n)H(e,t,{get:n[t],enumerable:!0})};var P={};L(P,{apiVersionStatus:()=>b,checkMarkup:()=>w,diagnose:()=>we,didYouMean:()=>h});var Y=window.Tether.__core["config.ts"],[a,E,Ee,Se,$e,Re,ve]=Y;var G=window.Tether.__core["client.ts"],[S,$,Te,R,_e]=G;var B=window.Tether.__core["dom.ts"],[Ne,p,De,xe,Ve,Oe,m,Ue,v,Ce,Ie,qe,d,He,l,Le,Ye,Ge]=B;var Q=window.Tether.__core["loader.ts"],[Qe,A]=Q;var K=window.Tether.__core["selling-plans.ts"],[T]=K;var j=window.Tether.__core["status.ts"],[_,f]=j;var W=/^(\d{4})-(01|04|07|10)$/;function N(e){let n=W.exec(typeof e=="string"?e:"");return n?{year:Number(n[1]),month:Number(n[2])}:null}var z=(e,n)=>`${e}-${String(n).padStart(2,"0")}`;function M(e,n=1){let t=N(e);if(!t)throw new Error(`not a quarterly Shopify API version: ${e}`);let r=t.year*4+(t.month-1)/3+n;return z(Math.floor(r/4),r%4*3+1)}function b(e,n=new Date){if(e==="unstable")return{version:e,ok:!1,note:'"unstable" changes without notice: pin a dated version such as 2026-07'};let t=N(e);if(!t)return{version:e,ok:!1,note:"not a quarterly version (YYYY-01, -04, -07 or -10)"};let r=new Date(Date.UTC(t.year,t.month-1,1)),s=new Date(Date.UTC(t.year,t.month-1+12,1)),o=(s.getTime()-n.getTime())/2630016e3,i=r<=n,c=`supported until about ${s.toISOString().slice(0,7)}`;return i?o<=0?c="no longer supported: Shopify falls back to the oldest supported version. Upgrade (see README)":o<3&&(c=`${c}: plan the upgrade to ${M(e)} or later (see README)`):c="not released yet (release candidate at best)",{version:e,ok:i&&o>0,monthsLeft:Math.round(o),next:M(e),note:c}}var F=window.Tether.__core["lazy.ts"],[D]=F;var x=new Set(["in-stock","out-of-stock","backorder","low-stock","plenty-in-stock","on-sale","not-on-sale","has-variants","single-variant","subscription-available","subscription-unavailable","subscription-only","one-time-available","subscription-selected","one-time-selected","has-savings","loading","ready","error","not-found","cart-empty","cart-filled","cart-has-subscription","cart-no-subscription","cart-has-discount","cart-error","cart-warning","list-empty","list-filled","search-empty","search-results","logged-in","logged-out","orders-empty","orders-loading","addresses-loading","addresses-empty","addresses-error","subscriptions-loading","subscriptions-empty","subscriptions-error"]),V=new Set(["title","description","description-text","vendor","type","handle","published-at","price","total-price","compare-at-price","unit-price","min-price","max-price","discount-percentage","discount-amount","variant-title","variant-id","sku","barcode","stock","quantity","featured-image","variant-image","images","tags","link","url","one-time-price","subscription-price","subscription-savings","subscription-savings-amount","checkout-charge","plan-name","plan-description","plan-group","option-value","swatch","image"]),O=new Set(`account account-bind account-link account-login account-logout add-label add-to-cart adding-text
2
2
  always-enabled bind cart-checkout-charge cart-clear cart-close cart-count cart-discounts cart-drawer cart-label cart-lines
3
3
  cart-note cart-open cart-subtotal cart-total cart-warning checkout code collection collection-bind countries country
4
4
  country-bind country-label country-select default-plan default-purchase discount discount-code discount-form discount-input
@@ -11,4 +11,4 @@
11
11
  plan-value product products purchase purchase-mode qty qty-minus qty-plus quantity recommendations reverse search
12
12
  search-bind search-collections search-input search-limit search-min search-products search-queries search-results
13
13
  search-state show soldout-text sort state subscribe-text variant variant-select variant-url max-width max-height crop
14
- sig label hydrated busy`.split(/\s+/).filter(Boolean));function ne(e,t){let o=Array.from({length:e.length+1},(a,n)=>[n,...Array(t.length).fill(0)]);for(let a=1;a<=t.length;a++)o[0][a]=a;for(let a=1;a<=e.length;a++)for(let n=1;n<=t.length;n++)o[a][n]=Math.min(o[a-1][n]+1,o[a][n-1]+1,o[a-1][n-1]+(e[a-1]===t[n-1]?0:1));return o[e.length][t.length]}function w(e,t,o=""){let a=null,n=1/0;for(let p of t){let i=ne(String(e),p);i<n&&(n=i,a=p)}return a&&n<=Math.max(2,Math.floor(String(e).length/4))?` Did you mean "${o}${a}"?`:""}var re=e=>e?`${String(e).slice(0,4)}\u2026${String(e).slice(-4)} (${String(e).length} chars)`:"(missing)";function ae(e){let t=e.id?`#${e.id}`:"",o=e.className&&typeof e.className=="string"?`.${e.className.trim().split(/\s+/).slice(0,2).join(".")}`:"";return`<${e.tagName.toLowerCase()}${t}${o}>`}function O(e=document){let t=[],o=(r,s,u)=>t.push({level:r,message:s,element:u?ae(u):void 0,el:u}),a=r=>!!r.closest(c("product")),n=`${c("collection")},${c("products")},${c("recommendations")}`;d(e,c("product")).forEach(r=>{if(r.closest(n)&&r.closest(c("list")))return;let{key:s,fromUrl:u,raw:y}=$(r);y?u&&!s&&o("warn",`${f("product")}="${y}" but this URL has no value for it (e.g. ?handle=my-product).`,r):o("error",`${f("product")} has no value. Bind it to the Shopify handle (CMS field), or use "url:handle".`,r)}),["bind","option-list","option","variant-select","add-to-cart","purchase","plan-list","plan","qty","line-attribute"].forEach(r=>{d(e,c(r)).forEach(s=>{a(s)||r==="line-attribute"&&s.closest(c("group"))||o("warn",`${f(r)} outside any ${f("product")}: it does nothing here.`,s)})}),d(e,c("group-add")).forEach(r=>{r.closest(c("group"))||o("warn",`${f("group-add")} outside a ${f("group")}.`,r)}),["option-list","plan-list","cart-lines","list"].forEach(r=>d(e,c(r)).forEach(s=>{!s.firstElementChild&&!_(s)&&o("warn",`${f(r)} without a template child: put one example element inside it.`,s)})),d(e,n).forEach(r=>{d(r,c("list")).length||o("error",`List without a ${f("list")} child: products have nowhere to render.`,r)}),d(e,c("show")).forEach(r=>{let s=g(r,"show");V.has(s)||o("warn",`Unknown ${f("show")}="${s}".${w(s,V)}`,r)}),d(e,c("bind")).forEach(r=>{let s=g(r,"bind")||"";!s||I.has(s)||/^image:\d+$/.test(s)||s.startsWith("metafield:")||o("warn",`Unknown ${f("bind")}="${s}": it stays empty.${w(s,I)}`,r)});let i=`${l.prefix}-`,b=new Set;return d(e,"*").forEach(r=>{for(let s of r.attributes){if(!s.name.startsWith(i))continue;let u=s.name.slice(i.length);L.has(u)||b.has(u)||(b.add(u),o("warn",`Unknown attribute ${s.name}: Tether ignores it.${w(u,L,i)}`,r))}}),d(e,c("bind")).forEach(r=>{let s=g(r,"bind")||"";if(!s.startsWith("metafield:"))return;let u=s.slice(10);(l.metafields||[]).some(h=>(typeof h=="string"?h:`${h.namespace}.${h.key}`)===u)||o("error",`${f("bind")}="${s}" but "${u}" is not in config.metafields, so it stays empty.`,r)}),d(e,c("cart-open")).length&&!d(e,c("cart-drawer")).length&&o("warn",`${f("cart-open")} exists but there is no ${f("cart-drawer")} on this page.`),d(e,c("cart-drawer")).length>1&&o("warn",`More than one ${f("cart-drawer")}.`),d(e,`[${f("state")}="error"]`).forEach(r=>{r.matches(U())&&o("error",`Scope failed to load (${g(r,"error")||"error"}).`,r)}),t}async function se({root:e=document,silent:t=!1,version:o,now:a=new Date}={}){let n={version:o,config:{domain:l.domain||"(missing)",token:re(l.token),apiVersion:l.apiVersion,endpoint:l.domain?C():null,country:l.country,language:l.language,locale:l.locale,markets:l.markets||null,prefix:l.prefix,productPath:l.productPath,metafields:l.metafields,autoMount:l.autoMount,observe:l.observe,onError:typeof l.onError=="function"},apiVersion:E(l.apiVersion,a),market:{country:l.country||null,language:l.language||null,locale:l.locale||null,detected:l.markets?.detect?N(l.markets):null},reachable:!1,shop:null,latencyMs:null,products:[],sellingPlans:[],problems:[]};if(!T())n.problems.push({level:"error",message:"TETHER_CONFIG needs domain and token."});else{let p=Date.now();try{let i=await v("query TetherDiagnose { shop { name primaryDomain { url } paymentSettings { currencyCode } } }",{},{context:!1});n.reachable=!0,n.shop={name:i.shop?.name,url:i.shop?.primaryDomain?.url,currency:i.shop?.paymentSettings?.currencyCode}}catch(i){n.problems.push({level:"error",message:`Storefront API not reachable: ${i.message||i.code||"unknown error"}`})}if(n.latencyMs=Date.now()-p,n.reachable){let i=[...new Set(d(e,c("product")).map(r=>$(r).key).filter(Boolean))].slice(0,20);(await Promise.allSettled(i.map(r=>A(r)))).forEach((r,s)=>{if(r.status==="fulfilled"){let u=r.value,y=q(u);n.products.push({key:i[s],handle:u.handle,title:u.title,plans:y.length,requiresSellingPlan:u.requiresSellingPlan}),y.forEach(h=>n.sellingPlans.push({product:u.handle,group:h.group?.name,plan:h.name,id:h.id})),d(e,c("product")).filter(h=>$(h).key===i[s]&&h.querySelector(c("add-to-cart"))).forEach(h=>{let k=new Set(d(h,`${c("option-list")},select${c("option")}`).map(m=>g(m,"option-list")||g(m,"option")));if(!k.size&&d(h,`select${c("variant-select")}`).length)return;let S=(u.options||[]).map(m=>m.name);l.language||[...k].filter(m=>m&&!S.includes(m)).forEach(m=>{n.problems.push({level:"warn",message:`Product "${u.handle}" has no option "${m}" (its options: ${S.join(", ")||"none"}).${w(m,S)}`})}),(u.options||[]).filter(m=>m.optionValues.length>1&&!k.has(m.name)).forEach(m=>{n.problems.push({level:"warn",message:`Product "${u.handle}": option "${m.name}" (${m.optionValues.length} values) has no tether-option-list, so visitors can't choose it.`})})})}else n.products.push({key:i[s],error:r.reason?.message}),n.problems.push({level:"error",message:`Product "${i[s]}": ${r.reason?.message||r.reason?.code||"not loaded"}. Is it published to the Headless channel?`})})}}return(!n.apiVersion.ok||(n.apiVersion.monthsLeft??99)<3)&&n.problems.push({level:n.apiVersion.ok?"warn":"error",message:`apiVersion ${l.apiVersion}: ${n.apiVersion.note}`}),typeof document<"u"&&n.problems.push(...O(e)),t||ie(n),n}function ie(e){let t=console,o=e.problems.filter(a=>a.level==="error").length;t.group?.(`[${l.prefix}] diagnose: ${o?`${o} error(s)`:"no errors"}, ${e.problems.length-o} warning(s)`),t.log("version",e.version,"| API",e.apiVersion.version,`(${e.apiVersion.note})`),t.log("config",e.config),e.market&&t.log("market",`in use: ${[e.market.country,e.market.language].filter(Boolean).join(" / ")||"the store default"}`,e.market.detected?`(detection picks ${JSON.stringify(e.market.detected)})`:""),t.log(e.reachable?`Storefront API reachable: ${e.shop?.name} (${e.latencyMs} ms)`:"Storefront API NOT reachable"),e.products.length&&(t.table||t.log)(e.products),e.sellingPlans.length?(t.table||t.log)(e.sellingPlans):e.reachable&&t.log("No selling plans on the products of this page."),e.problems.forEach(a=>(a.level==="error"?t.error:t.warn)(a.message,a.el||"")),t.groupEnd?.()}window.Tether.__parts.diagnose=P;})();
14
+ sig label hydrated busy`.split(/\s+/).filter(Boolean)),J=["bind","option-list","option","variant-select","add-to-cart","purchase","plan-list","plan","qty","line-attribute"],X=["option-list","plan-list","cart-lines","list"],y="metafield:",Z=/^image:\d+$/,ee=2;function te(e,n){let t=Array.from({length:n.length+1},(r,s)=>s);for(let r=1;r<=e.length;r++){let s=[r];for(let o=1;o<=n.length;o++){let i=(t[o-1]??0)+(e[r-1]===n[o-1]?0:1);s.push(Math.min((t[o]??0)+1,(s[o-1]??0)+1,i))}t=s}return t[n.length]??0}function h(e,n,t=""){let r=null,s=1/0;for(let i of n){let c=te(e,i);c<s&&(s=c,r=i)}let o=Math.max(2,Math.floor(e.length/4));return r!==null&&s<=o?` Did you mean "${t}${r}"?`:""}function ne(e){let n=e.id?`#${e.id}`:"",t=e.className&&typeof e.className=="string"?e.className.trim().split(/\s+/):[],r=t.length?`.${t.slice(0,ee).join(".")}`:"";return`<${e.tagName.toLowerCase()}${n}${r}>`}var U=()=>`${l("collection")},${l("products")},${l("recommendations")}`;function re(e,n){d(e,l("product")).forEach(t=>{if(t.closest(U())&&t.closest(l("list")))return;let{key:r,fromUrl:s,raw:o}=f(t);o?s&&!r&&n("warn",`${p("product")}="${o}" but this URL has no value for it (e.g. ?handle=my-product).`,t):n("error",`${p("product")} has no value. Bind it to the Shopify handle (CMS field), or use "url:handle".`,t)})}function oe(e,n){for(let t of J)d(e,l(t)).forEach(r=>{r.closest(l("product"))||t==="line-attribute"&&r.closest(l("group"))||n("warn",`${p(t)} outside any ${p("product")}: it does nothing here.`,r)});d(e,l("group-add")).forEach(t=>{t.closest(l("group"))||n("warn",`${p("group-add")} outside a ${p("group")}.`,t)});for(let t of X)d(e,l(t)).forEach(r=>{!r.firstElementChild&&!v(r)&&n("warn",`${p(t)} without a template child: put one example element inside it.`,r)});d(e,U()).forEach(t=>{d(t,l("list")).length||n("error",`List without a ${p("list")} child: products have nowhere to render.`,t)})}function se(e,n){d(e,l("show")).forEach(t=>{let r=m(t,"show")??"";x.has(r)||n("warn",`Unknown ${p("show")}="${r}".${h(r,x)}`,t)}),d(e,l("bind")).forEach(t=>{let r=m(t,"bind")||"";!r||V.has(r)||Z.test(r)||r.startsWith(y)||n("warn",`Unknown ${p("bind")}="${r}": it stays empty.${h(r,V)}`,t)})}function ie(e,n){d(e,l("bind")).forEach(t=>{let r=m(t,"bind")||"";if(!r.startsWith(y))return;let s=r.slice(y.length);a.metafields.some(i=>(typeof i=="string"?i:`${i.namespace}.${i.key}`)===s)||n("error",`${p("bind")}="${r}" but "${s}" is not in config.metafields, so it stays empty.`,t)})}function ae(e,n){let t=`${a.prefix}-`,r=new Set;d(e,"*").forEach(s=>{for(let{name:o}of s.attributes){if(!o.startsWith(t))continue;let i=o.slice(t.length);O.has(i)||r.has(i)||(r.add(i),n("warn",`Unknown attribute ${o}: Tether ignores it.${h(i,O,t)}`,s))}})}function ce(e,n){let t=d(e,l("cart-drawer")).length;d(e,l("cart-open")).length&&!t&&n("warn",`${p("cart-open")} exists but there is no ${p("cart-drawer")} on this page.`),t>1&&n("warn",`More than one ${p("cart-drawer")}.`),d(e,`[${p("state")}="error"]`).forEach(r=>{r.matches(_())&&n("error",`Scope failed to load (${m(r,"error")||"error"}).`,r)})}function w(e=document){let n=[],t=(r,s,o)=>{n.push(o?{level:r,message:s,element:ne(o),el:o}:{level:r,message:s})};return re(e,t),oe(e,t),se(e,t),ae(e,t),ie(e,t),ce(e,t),n}var le=20,ue=3,C=4;function de(e){return e?`${e.slice(0,C)}\u2026${e.slice(-C)} (${e.length} chars)`:"(missing)"}function I(e,n){if(e instanceof Error&&e.message)return e.message;let t=typeof e=="object"&&e!==null?Reflect.get(e,"code"):void 0;return typeof t=="string"&&t?t:n}function pe(){return{domain:a.domain||"(missing)",token:de(a.token),apiVersion:a.apiVersion,endpoint:a.domain?S():null,country:a.country,language:a.language,locale:a.locale,markets:a.markets,prefix:a.prefix,productPath:a.productPath,metafields:a.metafields,autoMount:a.autoMount,observe:a.observe,onError:typeof a.onError=="function"}}async function me(){return{country:a.country||null,language:a.language||null,locale:a.locale||null,detected:a.markets?.detect?(await D("markets")).detectMarket(a.markets):null}}function he({ok:e,monthsLeft:n,note:t}){return e&&(n===void 0||n>=ue)?null:{level:e?"warn":"error",message:`apiVersion ${a.apiVersion}: ${t}`}}var ge=R({shop:{name:"string",primaryDomain:{url:"string"},paymentSettings:{currencyCode:"string"}}});async function fe(){if(!E())return{kind:"not-configured"};let e=Date.now();try{let n=await $("query TetherDiagnose { shop { name primaryDomain { url } paymentSettings { currencyCode } } }",{},ge,{context:!1});return{kind:"reachable",shop:{name:n.shop.name,url:n.shop.primaryDomain.url,currency:n.shop.paymentSettings.currencyCode},latencyMs:Date.now()-e}}catch(n){return{kind:"unreachable",error:n,latencyMs:Date.now()-e}}}function be(e,n,t){let r=[],s=t.options.map(i=>i.name),o=d(e,l("product")).filter(i=>f(i).key===n&&i.querySelector(l("add-to-cart")));for(let i of o){let c=new Set(d(i,`${l("option-list")},select${l("option")}`).map(u=>m(u,"option-list")||m(u,"option")));if(!(!c.size&&d(i,`select${l("variant-select")}`).length)){if(!a.language)for(let u of c)!u||s.includes(u)||r.push({level:"warn",message:`Product "${t.handle}" has no option "${u}" (its options: ${s.join(", ")||"none"}).${h(u,s)}`});for(let u of t.options)u.optionValues.length<=1||c.has(u.name)||r.push({level:"warn",message:`Product "${t.handle}": option "${u.name}" (${u.optionValues.length} values) has no tether-option-list, so visitors can't choose it.`})}}return r}async function ye(e,n){let t=d(e,l("product")).map(o=>f(o).key),r=[...new Set(t.filter(o=>o!==null&&o!==""))].slice(0,le);(await Promise.allSettled(r.map(o=>A(o)))).forEach((o,i)=>{let c=r[i]??"";if(o.status==="rejected"){let g=I(o.reason,"not loaded");n.products.push({key:c,error:o.reason instanceof Error?o.reason.message:void 0}),n.problems.push({level:"error",message:`Product "${c}": ${g}. Is it published to the Headless channel?`});return}let u=o.value,k=T(u);n.products.push({key:c,handle:u.handle,title:u.title,plans:k.length,requiresSellingPlan:u.requiresSellingPlan});for(let g of k)n.sellingPlans.push({product:u.handle,group:g.group.name,plan:g.name,id:g.id});n.problems.push(...be(e,c,u))})}async function we({root:e=document,silent:n=!1,version:t="",now:r=new Date}={}){let s=await fe(),o={version:t,config:pe(),apiVersion:b(a.apiVersion,r),market:await me(),reachable:s.kind==="reachable",shop:s.kind==="reachable"?s.shop:null,latencyMs:s.kind==="not-configured"?null:s.latencyMs,products:[],sellingPlans:[],problems:[]};switch(s.kind){case"not-configured":o.problems.push({level:"error",message:"TETHER_CONFIG needs domain and token."});break;case"unreachable":o.problems.push({level:"error",message:`Storefront API not reachable: ${I(s.error,"unknown error")}`});break;case"reachable":await ye(e,o);break}let i=he(o.apiVersion);return i&&o.problems.push(i),typeof document<"u"&&o.problems.push(...w(e)),n||Pe(o),o}function Pe(e){let n=e.problems.filter(c=>c.level==="error").length,t=e.problems.length-n;console.group(`[${a.prefix}] diagnose: ${n?`${n} error(s)`:"no errors"}, ${t} warning(s)`),console.log("version",e.version,"| API",e.apiVersion.version,`(${e.apiVersion.note})`),console.log("config",e.config);let{country:r,language:s,detected:o}=e.market,i=[r,s].filter(Boolean).join(" / ")||"the store default";console.log("market",`in use: ${i}`,o?`(detection picks ${JSON.stringify(o)})`:""),console.log(e.shop?`Storefront API reachable: ${e.shop.name} (${e.latencyMs??0} ms)`:"Storefront API NOT reachable"),e.products.length&&console.table(e.products),e.sellingPlans.length?console.table(e.sellingPlans):e.reachable&&console.log("No selling plans on the products of this page.");for(let c of e.problems)c.level==="error"?console.error(c.message,c.el??""):console.warn(c.message,c.el??"");console.groupEnd()}var{Tether:q}=window;if(!q)throw new Error("tether.diagnose.js runs after the Tether script, which loads it");q.__parts.diagnose=P;})();
@@ -5,7 +5,7 @@
5
5
  __defProp(target, name, { get: all[name], enumerable: true });
6
6
  };
7
7
 
8
- // src/extras.js
8
+ // src/extras.ts
9
9
  var extras_exports = {};
10
10
  __export(extras_exports, {
11
11
  addGroup: () => addGroup,
@@ -13,33 +13,42 @@
13
13
  writeVariantUrl: () => writeVariantUrl
14
14
  });
15
15
 
16
- // tether-core:config.js
17
- var m = window.Tether.__core["config.js"];
18
- var { DEFAULTS, cfg, configure, isConfigured, log, reportError, warn } = m;
16
+ // tether-core:config.ts
17
+ var m = window.Tether.__core["config.ts"];
18
+ var [cfg, isConfigured, log, MARKET_SOURCES, parseMarkets, reportError, warn] = m;
19
19
 
20
- // tether-core:dom.js
21
- var m2 = window.Tether.__core["dom.js"];
22
- var { attr, busy, cdnUrl, dataKey, emit, formatDate, formatMoney, formatPercent, get, has, hasTemplate, imageUrl, notifyLayoutChanged, parseJSONAttr, productUrl, qsa, readText, repeat, repeatKeyed, sameImage, scoped, sel, setImage, setSelected, setText, setTextTracked, show, toAttributes, watchImages } = m2;
20
+ // tether-core:dom.ts
21
+ var m2 = window.Tether.__core["dom.ts"];
22
+ var [ANALYTICS_EVENTS, attr, attributesFromJson, emit, formatDate, formatMoney, get, has, hasTemplate, isOwnEvent, parseJSONAttr, productUrl, qsa, repeat, sel, setImage, setText, show] = m2;
23
23
 
24
- // tether-core:product.js
25
- var m3 = window.Tether.__core["product.js"];
26
- var { ProductScope, rememberOptionNames, scopes } = m3;
24
+ // tether-core:product.ts
25
+ var m3 = window.Tether.__core["product.ts"];
26
+ var [scopes] = m3;
27
27
 
28
- // tether-core:cart.js
29
- var m4 = window.Tether.__core["cart.js"];
30
- var { Cart, focusables, toLineInput } = m4;
28
+ // tether-core:cart.ts
29
+ var m4 = window.Tether.__core["cart.ts"];
30
+ var [Cart] = m4;
31
31
 
32
- // src/extras.js
33
- async function addGroup(btn) {
34
- const group = btn.closest(sel("group"));
32
+ // server/src/shared/json.ts
33
+ function isRecord(value) {
34
+ return value !== null && typeof value === "object" && !Array.isArray(value);
35
+ }
36
+
37
+ // src/extras.ts
38
+ function groupAttributes(group, name) {
39
+ const extra = attributesFromJson(parseJSONAttr(group, "line-attributes"));
40
+ return name ? [{ key: "_group", value: name }, ...extra] : extra;
41
+ }
42
+ async function addGroup(button) {
43
+ const group = button.closest(sel("group"));
35
44
  if (!group) return null;
36
45
  const name = get(group, "group");
37
- const extra = toAttributes(parseJSONAttr(group, "line-attributes"));
38
- const groupAttrs = name ? [{ key: "_group", value: name }, ...extra] : extra;
39
- const lines = qsa(group, sel("product")).map((el) => scopes.get(el)).filter((s) => s && s.variant?.availableForSale && s.quantity > 0).map((s) => {
40
- const l = s.getLine();
41
- l.attributes = [...l.attributes || [], ...groupAttrs];
42
- return l;
46
+ const attributes = groupAttributes(group, name);
47
+ const lines = qsa(group, sel("product")).flatMap((el) => {
48
+ const scope = scopes.get(el);
49
+ if (!scope?.variant?.availableForSale || scope.quantity <= 0) return [];
50
+ const line = scope.getLine();
51
+ return line ? [{ ...line, attributes: [...line.attributes ?? [], ...attributes] }] : [];
43
52
  });
44
53
  if (!lines.length) {
45
54
  warn("group-add: nothing selected");
@@ -49,39 +58,67 @@
49
58
  const cart = await Cart.add(lines);
50
59
  emit("group-added", { group: name, lines }, group);
51
60
  return cart;
52
- } catch (err) {
53
- reportError(err, "group add");
61
+ } catch (error) {
62
+ reportError(error, "group add");
63
+ return null;
64
+ }
65
+ }
66
+ function parseStoredMarket(text) {
67
+ let value;
68
+ try {
69
+ value = JSON.parse(text);
70
+ } catch {
54
71
  return null;
55
72
  }
73
+ if (!isRecord(value)) return null;
74
+ const { country, language, locale } = value;
75
+ if (typeof country !== "string" || !country) return null;
76
+ return {
77
+ country,
78
+ language: typeof language === "string" ? language : null,
79
+ locale: typeof locale === "string" ? locale : void 0
80
+ };
56
81
  }
57
- function onStorage(e) {
58
- if (e.key === cfg.storageKey || e.key === `${cfg.storageKey}:seen`) Cart.init();
59
- else if (e.key === `${cfg.prefix}:market:${cfg.domain}` && e.newValue) {
60
- try {
61
- const m5 = JSON.parse(e.newValue);
62
- if (m5?.country) window.Tether?.setCountry(m5.country, { language: m5.language ?? null, locale: m5.locale, remember: false }).catch(() => {
63
- });
64
- } catch {
65
- }
82
+ function onStorage(event) {
83
+ if (event.key === cfg.storageKey || event.key === `${cfg.storageKey}:seen`) {
84
+ Cart.init().catch((error) => {
85
+ reportError(error, "cart from another tab");
86
+ });
87
+ return;
66
88
  }
89
+ if (event.key !== `${cfg.prefix}:market:${cfg.domain}` || !event.newValue) return;
90
+ const market = parseStoredMarket(event.newValue);
91
+ const tether = Reflect.get(window, "Tether");
92
+ if (!market || !tether) return;
93
+ const options = { language: market.language, locale: market.locale, remember: false };
94
+ tether.setCountry(market.country, options).catch((error) => {
95
+ reportError(error, "market from another tab");
96
+ });
67
97
  }
68
98
  var urlKeys = /* @__PURE__ */ new WeakMap();
99
+ var numericId = (gid) => gid.split("/").pop() ?? gid;
100
+ function replaceUrlIfAllowed(url) {
101
+ try {
102
+ window.history.replaceState(window.history.state, "", url);
103
+ } catch {
104
+ }
105
+ }
69
106
  function writeVariantUrl(root, { variant, sellingPlanId }) {
70
- const key = `${variant.id}|${sellingPlanId || ""}`;
107
+ const key = `${variant.id}|${sellingPlanId ?? ""}`;
71
108
  const before = urlKeys.get(root);
72
109
  urlKeys.set(root, key);
73
110
  if (!before || before === key) return;
74
- if (!has(root, "variant-url") && !(cfg.variantUrl && document.querySelector(sel("product")) === root)) return;
75
- try {
76
- const u = new URL(window.location.href);
77
- u.searchParams.set("variant", variant.id.split("/").pop());
78
- if (sellingPlanId) u.searchParams.set("selling_plan", sellingPlanId.split("/").pop());
79
- else u.searchParams.delete("selling_plan");
80
- window.history.replaceState(window.history.state, "", u);
81
- } catch {
82
- }
111
+ const isMainProduct = cfg.variantUrl && document.querySelector(sel("product")) === root;
112
+ if (!has(root, "variant-url") && !isMainProduct) return;
113
+ const url = new URL(window.location.href);
114
+ url.searchParams.set("variant", numericId(variant.id));
115
+ if (sellingPlanId) url.searchParams.set("selling_plan", numericId(sellingPlanId));
116
+ else url.searchParams.delete("selling_plan");
117
+ replaceUrlIfAllowed(url);
83
118
  }
84
119
 
85
- // src/parts/extras.js
86
- window.Tether.__parts.extras = extras_exports;
120
+ // src/parts/extras.ts
121
+ var { Tether } = window;
122
+ if (!Tether) throw new Error("tether.extras.js runs after the Tether script, which loads it");
123
+ Tether.__parts.extras = extras_exports;
87
124
  })();
@@ -1 +1 @@
1
- (()=>{var b=Object.defineProperty;var S=(t,e)=>{for(var o in e)b(t,o,{get:e[o],enumerable:!0})};var l={};S(l,{addGroup:()=>C,onStorage:()=>K,writeVariantUrl:()=>L});var k=window.Tether.__core["config.js"],{DEFAULTS:j,cfg:n,configure:q,isConfigured:N,log:O,reportError:m,warn:d}=k;var U=window.Tether.__core["dom.js"],{attr:J,busy:P,cdnUrl:V,dataKey:D,emit:g,formatDate:F,formatMoney:I,formatPercent:M,get:f,has:w,hasTemplate:G,imageUrl:R,notifyLayoutChanged:W,parseJSONAttr:y,productUrl:z,qsa:h,readText:B,repeat:H,repeatKeyed:Q,sameImage:X,scoped:Y,sel:i,setImage:Z,setSelected:ee,setText:te,setTextTracked:re,show:oe,toAttributes:x,watchImages:ae}=U;var A=window.Tether.__core["product.js"],{ProductScope:se,rememberOptionNames:ce,scopes:_}=A;var v=window.Tether.__core["cart.js"],{Cart:u,focusables:pe,toLineInput:ue}=v;async function C(t){let e=t.closest(i("group"));if(!e)return null;let o=f(e,"group"),s=x(y(e,"line-attributes")),c=o?[{key:"_group",value:o},...s]:s,a=h(e,i("product")).map(r=>_.get(r)).filter(r=>r&&r.variant?.availableForSale&&r.quantity>0).map(r=>{let p=r.getLine();return p.attributes=[...p.attributes||[],...c],p});if(!a.length)return d("group-add: nothing selected"),null;try{let r=await u.add(a);return g("group-added",{group:o,lines:a},e),r}catch(r){return m(r,"group add"),null}}function K(t){if(t.key===n.storageKey||t.key===`${n.storageKey}:seen`)u.init();else if(t.key===`${n.prefix}:market:${n.domain}`&&t.newValue)try{let e=JSON.parse(t.newValue);e?.country&&window.Tether?.setCountry(e.country,{language:e.language??null,locale:e.locale,remember:!1}).catch(()=>{})}catch{}}var T=new WeakMap;function L(t,{variant:e,sellingPlanId:o}){let s=`${e.id}|${o||""}`,c=T.get(t);if(T.set(t,s),!(!c||c===s)&&!(!w(t,"variant-url")&&!(n.variantUrl&&document.querySelector(i("product"))===t)))try{let a=new URL(window.location.href);a.searchParams.set("variant",e.id.split("/").pop()),o?a.searchParams.set("selling_plan",o.split("/").pop()):a.searchParams.delete("selling_plan"),window.history.replaceState(window.history.state,"",a)}catch{}}window.Tether.__parts.extras=l;})();
1
+ (()=>{var E=Object.defineProperty;var A=(t,r)=>{for(var n in r)E(t,n,{get:r[n],enumerable:!0})};var f={};A(f,{addGroup:()=>U,onStorage:()=>I,writeVariantUrl:()=>P});var C=window.Tether.__core["config.ts"],[i,q,F,K,V,u,d]=C;var O=window.Tether.__core["dom.ts"],[z,D,g,m,G,W,w,y,Y,Z,h,v,k,B,l,H,Q,X]=O;var M=window.Tether.__core["product.ts"],[x]=M;var N=window.Tether.__core["cart.ts"],[p]=N;function T(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function R(t,r){let n=g(h(t,"line-attributes"));return r?[{key:"_group",value:r},...n]:n}async function U(t){let r=t.closest(l("group"));if(!r)return null;let n=w(r,"group"),o=R(r,n),e=k(r,l("product")).flatMap(a=>{let s=x.get(a);if(!s?.variant?.availableForSale||s.quantity<=0)return[];let c=s.getLine();return c?[{...c,attributes:[...c.attributes??[],...o]}]:[]});if(!e.length)return d("group-add: nothing selected"),null;try{let a=await p.add(e);return m("group-added",{group:n,lines:e},r),a}catch(a){return u(a,"group add"),null}}function L(t){let r;try{r=JSON.parse(t)}catch{return null}if(!T(r))return null;let{country:n,language:o,locale:e}=r;return typeof n!="string"||!n?null:{country:n,language:typeof o=="string"?o:null,locale:typeof e=="string"?e:void 0}}function I(t){if(t.key===i.storageKey||t.key===`${i.storageKey}:seen`){p.init().catch(e=>{u(e,"cart from another tab")});return}if(t.key!==`${i.prefix}:market:${i.domain}`||!t.newValue)return;let r=L(t.newValue),n=Reflect.get(window,"Tether");if(!r||!n)return;let o={language:r.language,locale:r.locale,remember:!1};n.setCountry(r.country,o).catch(e=>{u(e,"market from another tab")})}var b=new WeakMap,S=t=>t.split("/").pop()??t;function J(t){try{window.history.replaceState(window.history.state,"",t)}catch{}}function P(t,{variant:r,sellingPlanId:n}){let o=`${r.id}|${n??""}`,e=b.get(t);if(b.set(t,o),!e||e===o)return;let a=i.variantUrl&&document.querySelector(l("product"))===t;if(!y(t,"variant-url")&&!a)return;let s=new URL(window.location.href);s.searchParams.set("variant",S(r.id)),n?s.searchParams.set("selling_plan",S(n)):s.searchParams.delete("selling_plan"),J(s)}var{Tether:_}=window;if(!_)throw new Error("tether.extras.js runs after the Tether script, which loads it");_.__parts.extras=f;})();