fontdue-js 2.28.0 → 3.0.0-alpha10

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 (499) hide show
  1. package/.babelrc.cjs +72 -0
  2. package/README.md +639 -93
  3. package/dist/__generated__/AddToCartBannerQuery.graphql.js +1 -8
  4. package/dist/__generated__/AddToCartBanner_item.graphql.js +1 -8
  5. package/dist/__generated__/AddToCartBanner_order.graphql.js +1 -8
  6. package/dist/__generated__/AddressFieldsRefetchQuery.graphql.js +1 -8
  7. package/dist/__generated__/AddressFields_viewer.graphql.js +3 -11
  8. package/dist/__generated__/BuyButtonIDQuery.graphql.js +1 -8
  9. package/dist/__generated__/BuyButtonSlugQuery.graphql.js +1 -8
  10. package/dist/__generated__/BuyButton_collection.graphql.js +1 -8
  11. package/dist/__generated__/CartButtonQuery.graphql.js +1 -8
  12. package/dist/__generated__/CartButton_order.graphql.js +1 -8
  13. package/dist/__generated__/CartItemAdditionalLicenses_licenses.graphql.js +1 -8
  14. package/dist/__generated__/CartItemAdditionalLicenses_orderItem.graphql.js +1 -8
  15. package/dist/__generated__/CartItemLicense_selection.graphql.js +1 -8
  16. package/dist/__generated__/CartItemProduct_product.graphql.js +1 -8
  17. package/dist/__generated__/CartItemVariable_selection.graphql.js +1 -8
  18. package/dist/__generated__/CartItemVariable_variable.graphql.js +1 -8
  19. package/dist/__generated__/CartItem_node.graphql.js +1 -8
  20. package/dist/__generated__/CartOrderCompleteOrderMutation.graphql.js +1 -8
  21. package/dist/__generated__/CartOrderRemoveDiscountMutation.graphql.js +1 -8
  22. package/dist/__generated__/CartOrderUpdateMutation.graphql.js +1 -8
  23. package/dist/__generated__/CartOrder_UpdateErrors.graphql.js +1 -8
  24. package/dist/__generated__/CartOrder_order.graphql.js +1 -8
  25. package/dist/__generated__/CartOrder_viewer.graphql.js +1 -8
  26. package/dist/__generated__/CartQuery.graphql.js +1 -8
  27. package/dist/__generated__/CartStateRemoveDiscountMutation.graphql.js +1 -8
  28. package/dist/__generated__/CartStateUpdateMutation.graphql.js +1 -8
  29. package/dist/__generated__/CartState_order.graphql.js +1 -8
  30. package/dist/__generated__/CartTotals_order.graphql.js +1 -8
  31. package/dist/__generated__/CharacterViewerIDQuery.graphql.js +1 -8
  32. package/dist/__generated__/CharacterViewerSlugQuery.graphql.js +1 -8
  33. package/dist/__generated__/CharacterViewerStyleRefetchQuery.graphql.js +1 -8
  34. package/dist/__generated__/CharacterViewer_collection.graphql.js +1 -8
  35. package/dist/__generated__/CharacterViewer_family.graphql.js +1 -8
  36. package/dist/__generated__/CharacterViewer_style.graphql.js +3 -11
  37. package/dist/__generated__/CheckoutUpdateCustomerMutation.graphql.js +1 -8
  38. package/dist/__generated__/CheckoutUpdateOrderMutation.graphql.js +1 -8
  39. package/dist/__generated__/Checkout_UpdateOrderErrors.graphql.js +1 -8
  40. package/dist/__generated__/Checkout_identity.graphql.js +1 -8
  41. package/dist/__generated__/Checkout_order.graphql.js +1 -8
  42. package/dist/__generated__/Checkout_viewer.graphql.js +1 -8
  43. package/dist/__generated__/CollectionAa_Query.graphql.js +1 -8
  44. package/dist/__generated__/CollectionAa_product.graphql.js +1 -8
  45. package/dist/__generated__/CouponCodeInputApplyCouponMutation.graphql.js +1 -8
  46. package/dist/__generated__/CouponText_coupon.graphql.js +1 -8
  47. package/dist/__generated__/CustomerLoginFormLoginMutation.graphql.js +1 -8
  48. package/dist/__generated__/CustomerLoginFormQuery.graphql.js +1 -8
  49. package/dist/__generated__/DownloadRefetchQuery.graphql.js +1 -8
  50. package/dist/__generated__/Download_order.graphql.js +1 -8
  51. package/dist/__generated__/FamilyList_node.graphql.js +1 -8
  52. package/dist/__generated__/Family_node.graphql.js +1 -8
  53. package/dist/__generated__/FontFamiliesQuery.graphql.js +1 -8
  54. package/dist/__generated__/FontStyle_fontStyle.graphql.js +1 -8
  55. package/dist/__generated__/FontdueAdminToolbarStaffQuery.graphql.d.ts +20 -0
  56. package/dist/__generated__/{TestModeBannerQuery.graphql.js → FontdueAdminToolbarStaffQuery.graphql.js} +11 -18
  57. package/dist/__generated__/FontdueAdminToolbarTokenMutation.graphql.d.ts +18 -0
  58. package/dist/__generated__/FontdueAdminToolbarTokenMutation.graphql.js +56 -0
  59. package/dist/__generated__/FontdueProviderQuery.graphql.d.ts +19 -0
  60. package/dist/__generated__/FontdueProviderQuery.graphql.js +140 -0
  61. package/dist/__generated__/IdentityBox_identity.graphql.js +1 -8
  62. package/dist/__generated__/License_node.graphql.js +1 -8
  63. package/dist/__generated__/NewsletterSignupQuery.graphql.js +1 -8
  64. package/dist/__generated__/NewsletterSignupUpdateCustomerMutation.graphql.js +1 -8
  65. package/dist/__generated__/NodePasswordFormAccessNodeMutation.graphql.js +1 -8
  66. package/dist/__generated__/NodePasswordFormIDQuery.graphql.js +1 -8
  67. package/dist/__generated__/NodePasswordFormSlugQuery.graphql.js +1 -8
  68. package/dist/__generated__/OrderVariableSelectionReduxRefetchQuery.graphql.js +1 -8
  69. package/dist/__generated__/OrderVariableSelectionRedux_viewer.graphql.js +3 -11
  70. package/dist/__generated__/OrderVariableSelection_variables.graphql.js +1 -8
  71. package/dist/__generated__/PrecartAddToCartMutation.graphql.js +1 -8
  72. package/dist/__generated__/PrecartClearCartMutation.graphql.js +1 -8
  73. package/dist/__generated__/PrecartQuery.graphql.js +1 -8
  74. package/dist/__generated__/Precart_collection.graphql.js +1 -8
  75. package/dist/__generated__/Precart_license.graphql.js +1 -8
  76. package/dist/__generated__/Precart_viewer.graphql.js +1 -8
  77. package/dist/__generated__/PriceBarSectionRefetchQuery.graphql.js +1 -8
  78. package/dist/__generated__/PriceBarSection_node.graphql.js +3 -11
  79. package/dist/__generated__/PriceBar_node.graphql.js +1 -8
  80. package/dist/__generated__/Price_price.graphql.js +1 -8
  81. package/dist/__generated__/SKUPrice_sku.graphql.js +1 -8
  82. package/dist/__generated__/SelectButton_sku.graphql.js +1 -8
  83. package/dist/__generated__/ServerConfigProvider_viewer.graphql.d.ts +23 -0
  84. package/dist/__generated__/ServerConfigProvider_viewer.graphql.js +57 -0
  85. package/dist/__generated__/ShareCartCreateSnapshotMutation.graphql.js +1 -8
  86. package/dist/__generated__/SpecimenLinkQuery.graphql.js +1 -8
  87. package/dist/__generated__/StoreModalBundleButton_bundle.graphql.js +1 -8
  88. package/dist/__generated__/StoreModalCartQuery.graphql.js +1 -8
  89. package/dist/__generated__/StoreModalCheckoutQuery.graphql.js +1 -8
  90. package/dist/__generated__/StoreModalContainerQuery.graphql.js +1 -8
  91. package/dist/__generated__/StoreModalDownloadRefetchQuery.graphql.js +1 -8
  92. package/dist/__generated__/StoreModalDownload_order.graphql.js +1 -8
  93. package/dist/__generated__/StoreModalFamilyButton_collection.graphql.js +1 -8
  94. package/dist/__generated__/StoreModalFamily_collection.graphql.js +1 -8
  95. package/dist/__generated__/StoreModalIndexItem_fontCollection.graphql.js +1 -8
  96. package/dist/__generated__/StoreModalIndexQuery.graphql.js +1 -8
  97. package/dist/__generated__/StoreModalOrderVariableSelection_order.graphql.js +1 -8
  98. package/dist/__generated__/StoreModalOrderVariableSelection_viewer.graphql.js +1 -8
  99. package/dist/__generated__/StoreModalProductContent_collection.graphql.js +3 -11
  100. package/dist/__generated__/StoreModalProductLicenseSelection_collection.graphql.js +1 -8
  101. package/dist/__generated__/StoreModalProductLicense_license.graphql.js +1 -8
  102. package/dist/__generated__/StoreModalProductQuery.graphql.js +1 -8
  103. package/dist/__generated__/StoreModalProductRefetchQuery.graphql.js +1 -8
  104. package/dist/__generated__/StoreModalProductSummaryAddToCartMutation.graphql.js +1 -8
  105. package/dist/__generated__/StoreModalProductSummaryClearCartMutation.graphql.js +1 -8
  106. package/dist/__generated__/StoreModalProductSummaryRefetchQuery.graphql.js +1 -8
  107. package/dist/__generated__/StoreModalProductSummary_viewer.graphql.js +3 -11
  108. package/dist/__generated__/StoreModalReviewIdentity_identity.graphql.js +1 -8
  109. package/dist/__generated__/StoreModalStyleButton_fontStyle.graphql.js +1 -8
  110. package/dist/__generated__/StoreModalUnifiedCheckoutCompleteOrderMutation.graphql.js +1 -8
  111. package/dist/__generated__/StoreModalUnifiedCheckoutUpdateCustomerMutation.graphql.js +1 -8
  112. package/dist/__generated__/StoreModalUnifiedCheckoutUpdateOrderMutation.graphql.js +1 -8
  113. package/dist/__generated__/StoreModalUnifiedCheckout_order.graphql.js +1 -8
  114. package/dist/__generated__/StoreModalUnifiedCheckout_viewer.graphql.js +1 -8
  115. package/dist/__generated__/StripeProviderCreateCheckoutSessionMutation.graphql.js +1 -8
  116. package/dist/__generated__/StripeProvider_viewer.graphql.js +1 -8
  117. package/dist/__generated__/TestFontsFormUpdateCustomerMutation.graphql.js +1 -8
  118. package/dist/__generated__/TestFontsForm_Query.graphql.js +1 -8
  119. package/dist/__generated__/TestModeBanner_viewer.graphql.d.ts +19 -0
  120. package/dist/__generated__/TestModeBanner_viewer.graphql.js +36 -0
  121. package/dist/__generated__/ThemeConfig_viewer.graphql.d.ts +19 -0
  122. package/dist/__generated__/ThemeConfig_viewer.graphql.js +36 -0
  123. package/dist/__generated__/TypeTesterFamiliesQuery.graphql.js +1 -8
  124. package/dist/__generated__/TypeTesterFamiliesStylesQuery.graphql.js +1 -8
  125. package/dist/__generated__/TypeTesterFeaturesButton_fontStyle.graphql.js +1 -8
  126. package/dist/__generated__/TypeTesterFeatures_fontStyle.graphql.js +1 -8
  127. package/dist/__generated__/TypeTesterFloatingToolbar_testers.graphql.js +1 -8
  128. package/dist/__generated__/TypeTesterStandaloneChangedStylesQuery.graphql.js +1 -8
  129. package/dist/__generated__/TypeTesterStandaloneQuery.graphql.js +1 -8
  130. package/dist/__generated__/TypeTesterStyleSelectData_fontStyle.graphql.js +1 -8
  131. package/dist/__generated__/TypeTesterStyleSelectData_fontStyleData.graphql.js +1 -8
  132. package/dist/__generated__/TypeTesterToolbar_fontStyle.graphql.js +1 -8
  133. package/dist/__generated__/TypeTesterVariableAxes_fontStyle.graphql.js +1 -8
  134. package/dist/__generated__/TypeTester_fontStyle.graphql.js +1 -8
  135. package/dist/__generated__/TypeTestersChangedStylesQuery.graphql.js +1 -8
  136. package/dist/__generated__/TypeTestersIDQuery.graphql.js +1 -8
  137. package/dist/__generated__/TypeTestersRefetchQuery.graphql.js +1 -8
  138. package/dist/__generated__/TypeTestersSlugQuery.graphql.js +1 -8
  139. package/dist/__generated__/TypeTesters_collection.graphql.js +3 -11
  140. package/dist/__generated__/VariableTableAmounts_option.graphql.js +1 -8
  141. package/dist/__generated__/VariableTableAmounts_variable.graphql.js +1 -8
  142. package/dist/__generated__/orderTrackingUpdateOrderTrackingMutation.graphql.js +1 -8
  143. package/dist/__generated__/productState_Query.graphql.js +1 -8
  144. package/dist/__generated__/productState_bundle.graphql.js +1 -8
  145. package/dist/__generated__/productState_collection.graphql.js +1 -8
  146. package/dist/__generated__/productState_collectionBundle.graphql.js +1 -8
  147. package/dist/__generated__/productState_node.graphql.js +1 -8
  148. package/dist/__generated__/productState_sku.graphql.js +1 -8
  149. package/dist/__generated__/useFeaturesData_fontStyle.graphql.js +1 -8
  150. package/dist/__generated__/useFontStyle_fontStyle.graphql.js +1 -8
  151. package/dist/__generated__/useTotalStyles_fontCollection.graphql.js +1 -8
  152. package/dist/__tests__/collectionBundleSelection.test.js +221 -222
  153. package/dist/__tests__/fontLoader.test.js +24 -26
  154. package/dist/__tests__/licenseExclusions.test.js +27 -30
  155. package/dist/__tests__/networkFetch.test.js +66 -0
  156. package/dist/__tests__/nextAdapter.test.js +447 -0
  157. package/dist/components/AddToCartBanner/index.js +19 -29
  158. package/dist/components/BuyButton/index.d.ts +29 -6
  159. package/dist/components/BuyButton/index.js +98 -57
  160. package/dist/components/BuyButton/index.server.d.ts +9 -2
  161. package/dist/components/BuyButton/index.server.js +20 -17
  162. package/dist/components/BuyingOptions/index.d.ts +9 -0
  163. package/dist/components/BuyingOptions/index.js +4 -12
  164. package/dist/components/Cart/AddressFields.d.ts +2 -2
  165. package/dist/components/Cart/AddressFields.js +25 -35
  166. package/dist/components/Cart/CartItem/CartItemAdditionalLicenses.d.ts +2 -2
  167. package/dist/components/Cart/CartItem/CartItemAdditionalLicenses.js +9 -16
  168. package/dist/components/Cart/CartItem/CartItemLicense.d.ts +2 -2
  169. package/dist/components/Cart/CartItem/CartItemLicense.js +15 -24
  170. package/dist/components/Cart/CartItem/CartItemProduct.d.ts +1 -1
  171. package/dist/components/Cart/CartItem/CartItemProduct.js +16 -23
  172. package/dist/components/Cart/CartItem/CartItemVariable.d.ts +3 -3
  173. package/dist/components/Cart/CartItem/CartItemVariable.js +16 -23
  174. package/dist/components/Cart/CartItem/VariableTextInput.js +13 -21
  175. package/dist/components/Cart/CartItem/index.d.ts +2 -2
  176. package/dist/components/Cart/CartItem/index.js +18 -27
  177. package/dist/components/Cart/CartOrder.d.ts +2 -2
  178. package/dist/components/Cart/CartOrder.js +102 -113
  179. package/dist/components/Cart/CartState.d.ts +3 -3
  180. package/dist/components/Cart/CartState.js +18 -25
  181. package/dist/components/Cart/CartTotals.d.ts +1 -1
  182. package/dist/components/Cart/CartTotals.js +31 -38
  183. package/dist/components/Cart/Checkout.d.ts +3 -3
  184. package/dist/components/Cart/Checkout.js +109 -118
  185. package/dist/components/Cart/CheckoutSteps.js +1 -8
  186. package/dist/components/Cart/CouponCodeInput.js +22 -32
  187. package/dist/components/Cart/CustomerFields.d.ts +1 -1
  188. package/dist/components/Cart/CustomerFields.js +21 -31
  189. package/dist/components/Cart/Download.d.ts +1 -1
  190. package/dist/components/Cart/Download.js +17 -27
  191. package/dist/components/Cart/EmptyCart.js +15 -23
  192. package/dist/components/Cart/IdentityBox.d.ts +1 -1
  193. package/dist/components/Cart/IdentityBox.js +12 -19
  194. package/dist/components/Cart/ShareCart.js +24 -32
  195. package/dist/components/Cart/index.js +13 -21
  196. package/dist/components/Cart/injectRelayEnvironment.js +5 -13
  197. package/dist/components/Cart/orderTracking.js +8 -15
  198. package/dist/components/Cart/types.d.ts +1 -1
  199. package/dist/components/Cart/types.js +1 -5
  200. package/dist/components/Cart/utils.js +2 -9
  201. package/dist/components/CartButton/index.d.ts +5 -8
  202. package/dist/components/CartButton/index.js +53 -62
  203. package/dist/components/CharacterViewer/StyleSelect.d.ts +1 -1
  204. package/dist/components/CharacterViewer/StyleSelect.js +10 -17
  205. package/dist/components/CharacterViewer/index.d.ts +29 -6
  206. package/dist/components/CharacterViewer/index.js +150 -102
  207. package/dist/components/CharacterViewer/index.server.d.ts +9 -2
  208. package/dist/components/CharacterViewer/index.server.js +21 -17
  209. package/dist/components/Checkbox/index.js +9 -19
  210. package/dist/components/CollectionAa/index.d.ts +1 -1
  211. package/dist/components/CollectionAa/index.js +12 -21
  212. package/dist/components/ComponentsContext.d.ts +1 -1
  213. package/dist/components/ComponentsContext.js +4 -10
  214. package/dist/components/ConfigContext.d.ts +13 -12
  215. package/dist/components/ConfigContext.js +29 -11
  216. package/dist/components/ConsentBanner/consent.js +6 -17
  217. package/dist/components/ConsentBanner/index.js +19 -29
  218. package/dist/components/CookieNotification/index.d.ts +13 -0
  219. package/dist/components/CookieNotification/index.js +23 -31
  220. package/dist/components/CorsErrorModal.js +13 -20
  221. package/dist/components/CouponText/index.d.ts +1 -1
  222. package/dist/components/CouponText/index.js +9 -18
  223. package/dist/components/CustomerLoginForm/index.js +37 -38
  224. package/dist/components/Family/FamilyList.d.ts +1 -1
  225. package/dist/components/Family/FamilyList.js +10 -17
  226. package/dist/components/Family/index.d.ts +1 -1
  227. package/dist/components/Family/index.js +37 -46
  228. package/dist/components/FontFamilies/index.js +18 -28
  229. package/dist/components/FontStyle/index.d.ts +2 -2
  230. package/dist/components/FontStyle/index.js +8 -15
  231. package/dist/components/FontdueAdminToolbar/index.d.ts +2 -0
  232. package/dist/components/FontdueAdminToolbar/index.js +146 -0
  233. package/dist/components/FontdueContextProvider/index.d.ts +18 -0
  234. package/dist/components/FontdueContextProvider/index.js +148 -0
  235. package/dist/components/FontdueProvider/index.d.ts +19 -3
  236. package/dist/components/FontdueProvider/index.js +75 -13
  237. package/dist/components/FontdueProvider/index.server.d.ts +6 -3
  238. package/dist/components/FontdueProvider/index.server.js +37 -21
  239. package/dist/components/Icons/Align.js +13 -22
  240. package/dist/components/Icons/ArrowDownRight.js +5 -13
  241. package/dist/components/Icons/ArrowLeft.js +5 -13
  242. package/dist/components/Icons/ArrowRight.js +5 -13
  243. package/dist/components/Icons/CarrotDown.js +5 -13
  244. package/dist/components/Icons/CarrotUp.js +5 -13
  245. package/dist/components/Icons/Cart.js +7 -15
  246. package/dist/components/Icons/CartNew.js +7 -15
  247. package/dist/components/Icons/Check.js +5 -13
  248. package/dist/components/Icons/Checkbox.js +5 -13
  249. package/dist/components/Icons/CheckboxChecked.js +5 -13
  250. package/dist/components/Icons/CheckboxCrossed.js +6 -14
  251. package/dist/components/Icons/CircledCheck.js +6 -14
  252. package/dist/components/Icons/CircledInfo.js +6 -14
  253. package/dist/components/Icons/CircledMinus.js +6 -14
  254. package/dist/components/Icons/ColorPicker.js +5 -13
  255. package/dist/components/Icons/CreditCard.js +6 -14
  256. package/dist/components/Icons/DownArrow.js +5 -13
  257. package/dist/components/Icons/DownloadFonts.js +8 -16
  258. package/dist/components/Icons/FrowningFace.js +8 -16
  259. package/dist/components/Icons/License.js +5 -13
  260. package/dist/components/Icons/Receipt.js +8 -16
  261. package/dist/components/Icons/User.js +5 -13
  262. package/dist/components/Icons/X.js +5 -13
  263. package/dist/components/Icons/index.d.ts +23 -23
  264. package/dist/components/Icons/index.js +23 -167
  265. package/dist/components/NewsletterSignup/NewsletterSignupElement.d.ts +1 -1
  266. package/dist/components/NewsletterSignup/NewsletterSignupElement.js +4 -11
  267. package/dist/components/NewsletterSignup/index.d.ts +11 -6
  268. package/dist/components/NewsletterSignup/index.js +75 -60
  269. package/dist/components/NewsletterSignup/index.server.d.ts +7 -2
  270. package/dist/components/NewsletterSignup/index.server.js +17 -14
  271. package/dist/components/NodePasswordForm/index.js +25 -33
  272. package/dist/components/OrderVariableSelection/OrderVariableSelectionRedux.d.ts +1 -1
  273. package/dist/components/OrderVariableSelection/OrderVariableSelectionRedux.js +18 -27
  274. package/dist/components/OrderVariableSelection/index.d.ts +1 -1
  275. package/dist/components/OrderVariableSelection/index.js +28 -36
  276. package/dist/components/Precart/License.d.ts +1 -1
  277. package/dist/components/Precart/License.js +22 -30
  278. package/dist/components/Precart/index.js +64 -74
  279. package/dist/components/Price/index.d.ts +1 -1
  280. package/dist/components/Price/index.js +10 -20
  281. package/dist/components/PriceBar/PriceBarSection.d.ts +1 -1
  282. package/dist/components/PriceBar/PriceBarSection.js +23 -33
  283. package/dist/components/PriceBar/index.d.ts +1 -1
  284. package/dist/components/PriceBar/index.js +13 -23
  285. package/dist/components/Root/index.d.ts +1 -1
  286. package/dist/components/Root/index.js +41 -51
  287. package/dist/components/Root/productState.d.ts +1 -1
  288. package/dist/components/Root/productState.js +20 -29
  289. package/dist/components/SKUPrice/index.d.ts +2 -2
  290. package/dist/components/SKUPrice/index.js +12 -20
  291. package/dist/components/Select/index.js +9 -17
  292. package/dist/components/SelectButton/index.d.ts +2 -2
  293. package/dist/components/SelectButton/index.js +20 -29
  294. package/dist/components/ServerConfigProvider/index.d.ts +4 -2
  295. package/dist/components/ServerConfigProvider/index.js +12 -20
  296. package/dist/components/SpecimenLink/index.js +12 -20
  297. package/dist/components/StickyNav/index.js +16 -26
  298. package/dist/components/StoreModal/StoreModalBundleButton.d.ts +1 -1
  299. package/dist/components/StoreModal/StoreModalBundleButton.js +16 -23
  300. package/dist/components/StoreModal/StoreModalCart.d.ts +1 -1
  301. package/dist/components/StoreModal/StoreModalCart.js +29 -38
  302. package/dist/components/StoreModal/StoreModalCheckout.js +9 -17
  303. package/dist/components/StoreModal/StoreModalCheckoutContext.d.ts +1 -1
  304. package/dist/components/StoreModal/StoreModalCheckoutContext.js +6 -12
  305. package/dist/components/StoreModal/StoreModalContainer.js +25 -35
  306. package/dist/components/StoreModal/StoreModalDownload.d.ts +1 -1
  307. package/dist/components/StoreModal/StoreModalDownload.js +14 -24
  308. package/dist/components/StoreModal/StoreModalFamily.d.ts +1 -1
  309. package/dist/components/StoreModal/StoreModalFamily.js +14 -23
  310. package/dist/components/StoreModal/StoreModalFamilyButton.d.ts +1 -1
  311. package/dist/components/StoreModal/StoreModalFamilyButton.js +23 -30
  312. package/dist/components/StoreModal/StoreModalIndex.d.ts +1 -1
  313. package/dist/components/StoreModal/StoreModalIndex.js +9 -17
  314. package/dist/components/StoreModal/StoreModalIndexItem.d.ts +1 -1
  315. package/dist/components/StoreModal/StoreModalIndexItem.js +20 -30
  316. package/dist/components/StoreModal/StoreModalLicenseeIsBillingSelection.js +8 -17
  317. package/dist/components/StoreModal/StoreModalLoader.js +6 -15
  318. package/dist/components/StoreModal/StoreModalOrderVariableSelection.d.ts +3 -3
  319. package/dist/components/StoreModal/StoreModalOrderVariableSelection.js +12 -21
  320. package/dist/components/StoreModal/StoreModalProduct.d.ts +1 -1
  321. package/dist/components/StoreModal/StoreModalProduct.js +55 -65
  322. package/dist/components/StoreModal/StoreModalReviewIdentity.d.ts +1 -1
  323. package/dist/components/StoreModal/StoreModalReviewIdentity.js +6 -15
  324. package/dist/components/StoreModal/StoreModalRouter.js +12 -22
  325. package/dist/components/StoreModal/StoreModalStyleButton.d.ts +1 -1
  326. package/dist/components/StoreModal/StoreModalStyleButton.js +20 -27
  327. package/dist/components/StoreModal/index.d.ts +5 -1
  328. package/dist/components/StoreModal/index.js +24 -20
  329. package/dist/components/StoreModal/routes.d.ts +4 -4
  330. package/dist/components/StoreModal/routes.js +18 -26
  331. package/dist/components/StoreModal/types.js +1 -5
  332. package/dist/components/StoreModalProductLicenseSelection/LicenseElement.js +12 -22
  333. package/dist/components/StoreModalProductLicenseSelection/LicenseVariableElement.js +7 -15
  334. package/dist/components/StoreModalProductLicenseSelection/LicenseVariableRadioElement.js +9 -19
  335. package/dist/components/StoreModalProductLicenseSelection/StoreModalProductLicense.d.ts +1 -1
  336. package/dist/components/StoreModalProductLicenseSelection/StoreModalProductLicense.js +19 -28
  337. package/dist/components/StoreModalProductLicenseSelection/index.d.ts +1 -1
  338. package/dist/components/StoreModalProductLicenseSelection/index.js +10 -17
  339. package/dist/components/StoreModalProductSummary/index.d.ts +1 -1
  340. package/dist/components/StoreModalProductSummary/index.js +45 -55
  341. package/dist/components/StripeLogo.js +4 -11
  342. package/dist/components/StripeProvider/index.d.ts +1 -1
  343. package/dist/components/StripeProvider/index.js +19 -29
  344. package/dist/components/Switch/index.js +1 -7
  345. package/dist/components/TestFontsForm/TestFontsFormElement.js +4 -12
  346. package/dist/components/TestFontsForm/index.d.ts +11 -4
  347. package/dist/components/TestFontsForm/index.js +80 -65
  348. package/dist/components/TestFontsForm/index.server.d.ts +7 -2
  349. package/dist/components/TestFontsForm/index.server.js +17 -14
  350. package/dist/components/TestModeBanner/index.d.ts +4 -1
  351. package/dist/components/TestModeBanner/index.js +13 -27
  352. package/dist/components/TextField/index.js +9 -17
  353. package/dist/components/ThemeConfig/index.d.ts +3 -5
  354. package/dist/components/ThemeConfig/index.js +12 -36
  355. package/dist/components/Tracking/index.js +11 -18
  356. package/dist/components/TypeTester/TypeTesterAlignButtons.d.ts +1 -1
  357. package/dist/components/TypeTester/TypeTesterAlignButtons.js +8 -16
  358. package/dist/components/TypeTester/TypeTesterBullet.d.ts +1 -1
  359. package/dist/components/TypeTester/TypeTesterBullet.js +4 -12
  360. package/dist/components/TypeTester/TypeTesterContent.d.ts +2 -2
  361. package/dist/components/TypeTester/TypeTesterContent.js +22 -21
  362. package/dist/components/TypeTester/TypeTesterContext.d.ts +2 -2
  363. package/dist/components/TypeTester/TypeTesterContext.js +10 -17
  364. package/dist/components/TypeTester/TypeTesterEditAll.js +10 -20
  365. package/dist/components/TypeTester/TypeTesterFamilies.d.ts +1 -1
  366. package/dist/components/TypeTester/TypeTesterFamilies.js +26 -37
  367. package/dist/components/TypeTester/TypeTesterFeatures.d.ts +1 -1
  368. package/dist/components/TypeTester/TypeTesterFeatures.js +28 -37
  369. package/dist/components/TypeTester/TypeTesterFeaturesButton.d.ts +1 -1
  370. package/dist/components/TypeTester/TypeTesterFeaturesButton.js +20 -30
  371. package/dist/components/TypeTester/TypeTesterFitter.d.ts +1 -1
  372. package/dist/components/TypeTester/TypeTesterFitter.js +5 -13
  373. package/dist/components/TypeTester/TypeTesterFloatingToolbar.d.ts +1 -1
  374. package/dist/components/TypeTester/TypeTesterFloatingToolbar.js +19 -28
  375. package/dist/components/TypeTester/TypeTesterInput.js +12 -22
  376. package/dist/components/TypeTester/TypeTesterSlider.js +7 -16
  377. package/dist/components/TypeTester/TypeTesterStandalone.d.ts +20 -6
  378. package/dist/components/TypeTester/TypeTesterStandalone.js +49 -39
  379. package/dist/components/TypeTester/TypeTesterStandalone.server.d.ts +6 -2
  380. package/dist/components/TypeTester/TypeTesterStandalone.server.js +20 -16
  381. package/dist/components/TypeTester/TypeTesterStandaloneElement.js +7 -16
  382. package/dist/components/TypeTester/TypeTesterState.d.ts +2 -2
  383. package/dist/components/TypeTester/TypeTesterState.js +6 -14
  384. package/dist/components/TypeTester/TypeTesterStyleSelect.d.ts +1 -1
  385. package/dist/components/TypeTester/TypeTesterStyleSelect.js +9 -17
  386. package/dist/components/TypeTester/TypeTesterStyleSelectData.d.ts +3 -3
  387. package/dist/components/TypeTester/TypeTesterStyleSelectData.js +31 -40
  388. package/dist/components/TypeTester/TypeTesterToolbar.d.ts +2 -2
  389. package/dist/components/TypeTester/TypeTesterToolbar.js +29 -39
  390. package/dist/components/TypeTester/TypeTesterVariableAxes.d.ts +1 -1
  391. package/dist/components/TypeTester/TypeTesterVariableAxes.js +16 -24
  392. package/dist/components/TypeTester/features.js +1 -8
  393. package/dist/components/TypeTester/index.d.ts +2 -2
  394. package/dist/components/TypeTester/index.js +45 -55
  395. package/dist/components/TypeTester/types.js +3 -11
  396. package/dist/components/TypeTester/useFeaturesData.d.ts +1 -1
  397. package/dist/components/TypeTester/useFeaturesData.js +7 -15
  398. package/dist/components/TypeTester/useTypeTesterStyler.d.ts +3 -3
  399. package/dist/components/TypeTester/useTypeTesterStyler.js +6 -13
  400. package/dist/components/TypeTesters/TypeTestersElement.js +4 -12
  401. package/dist/components/TypeTesters/index.d.ts +22 -5
  402. package/dist/components/TypeTesters/index.js +118 -71
  403. package/dist/components/TypeTesters/index.server.d.ts +7 -2
  404. package/dist/components/TypeTesters/index.server.js +20 -17
  405. package/dist/components/UrlContext.js +6 -12
  406. package/dist/components/VariableTableAmounts/index.d.ts +2 -2
  407. package/dist/components/VariableTableAmounts/index.js +9 -16
  408. package/dist/components/elements/Button/index.js +3 -11
  409. package/dist/components/elements/EmptyCart/index.js +10 -20
  410. package/dist/components/elements/StoreModalCartLayout/index.js +10 -18
  411. package/dist/components/elements/StoreModalContainer/StoreModalContainerContext.js +3 -9
  412. package/dist/components/elements/StoreModalContainer/index.js +17 -27
  413. package/dist/components/elements/StoreModalDownloadLayout/index.js +7 -15
  414. package/dist/components/elements/StoreModalFamily/index.js +8 -16
  415. package/dist/components/elements/StoreModalFamilyButton/index.d.ts +1 -1
  416. package/dist/components/elements/StoreModalFamilyButton/index.js +11 -20
  417. package/dist/components/elements/StoreModalIndexItem/index.js +9 -17
  418. package/dist/components/elements/StoreModalLicenseeIsBillingIdentityElement.js +20 -29
  419. package/dist/components/elements/StoreModalLoadingScreen/index.js +4 -12
  420. package/dist/components/elements/StoreModalPageContainer/index.js +5 -13
  421. package/dist/components/elements/StoreModalStyleButton/index.d.ts +1 -1
  422. package/dist/components/elements/StoreModalStyleButton/index.js +10 -18
  423. package/dist/components/elements/StoreModalUnifiedCheckout.d.ts +2 -2
  424. package/dist/components/elements/StoreModalUnifiedCheckout.js +114 -122
  425. package/dist/components/useConsent.js +4 -9
  426. package/dist/components/useFont.d.ts +1 -1
  427. package/dist/components/useFont.js +8 -15
  428. package/dist/components/useFontStyle.d.ts +1 -1
  429. package/dist/components/useFontStyle.js +12 -20
  430. package/dist/components/useInterval.js +5 -12
  431. package/dist/components/useTotalStyles.d.ts +1 -1
  432. package/dist/components/useTotalStyles.js +4 -12
  433. package/dist/corsError.js +4 -14
  434. package/dist/data/unicodeData.js +1 -1
  435. package/dist/fontLoader.js +3 -11
  436. package/dist/fontdue.css +127 -12
  437. package/dist/global-shim.d.ts +1 -0
  438. package/dist/global-shim.js +8 -0
  439. package/dist/hooks/useAutofit.js +11 -19
  440. package/dist/hooks/useLicenseAndOrderVariables.d.ts +2 -2
  441. package/dist/hooks/useLicenseAndOrderVariables.js +7 -12
  442. package/dist/hooks/useRefetchOnLicenseChanges.d.ts +1 -1
  443. package/dist/hooks/useRefetchOnLicenseChanges.js +7 -13
  444. package/dist/hooks/useResizeObserver.d.ts +11 -0
  445. package/dist/hooks/useResizeObserver.js +23 -0
  446. package/dist/hooks.js +9 -16
  447. package/dist/index.d.ts +1 -0
  448. package/dist/index.js +1 -0
  449. package/dist/loadFontdueProviderQuery.d.ts +3 -0
  450. package/dist/loadFontdueProviderQuery.js +10 -0
  451. package/dist/next/config.d.ts +41 -0
  452. package/dist/next/config.js +193 -0
  453. package/dist/next/image-loader.d.ts +7 -0
  454. package/dist/next/image-loader.js +39 -0
  455. package/dist/next/index.d.ts +2 -0
  456. package/dist/next/index.js +10 -0
  457. package/dist/next/revalidate.d.ts +1 -0
  458. package/dist/next/revalidate.js +37 -0
  459. package/dist/next/tenant.d.ts +26 -0
  460. package/dist/next/tenant.js +169 -0
  461. package/dist/react-ranger.d.js +0 -1
  462. package/dist/react-ranger.js +17 -24
  463. package/dist/reducer.d.ts +5 -5
  464. package/dist/reducer.js +15 -36
  465. package/dist/relay/environment.d.ts +1 -0
  466. package/dist/relay/environment.js +74 -34
  467. package/dist/relay/loadSerializableQuery.d.ts +3 -1
  468. package/dist/relay/loadSerializableQuery.js +4 -8
  469. package/dist/relay/serverConfig.d.ts +16 -0
  470. package/dist/relay/serverConfig.js +38 -0
  471. package/dist/relay/useSerializablePreloadedQuery.d.ts +3 -3
  472. package/dist/relay/useSerializablePreloadedQuery.js +26 -22
  473. package/dist/retryImport.js +1 -7
  474. package/dist/scripts/updateUnicodeData.js +0 -2
  475. package/dist/utils.d.ts +2 -2
  476. package/dist/utils.js +14 -36
  477. package/dist/vanilla/FontStyle.js +3 -11
  478. package/dist/vanilla/TruncatedMarkdown.js +2 -9
  479. package/dist/vite.d.ts +2 -0
  480. package/dist/vite.js +141 -0
  481. package/package.json +13 -9
  482. package/scripts/addJsExtensionsBabelPlugin.cjs +62 -0
  483. package/types/globals.d.ts +3 -0
  484. package/types/next-cache.d.ts +6 -0
  485. package/types/next-navigation.d.ts +6 -0
  486. package/vitest.config.ts +4 -0
  487. package/dist/__generated__/ServerConfigProviderQuery.graphql.d.ts +0 -24
  488. package/dist/__generated__/ServerConfigProviderQuery.graphql.js +0 -108
  489. package/dist/__generated__/TestModeBannerQuery.graphql.d.ts +0 -20
  490. package/dist/__generated__/ThemeConfigQuery.graphql.d.ts +0 -20
  491. package/dist/__generated__/ThemeConfigQuery.graphql.js +0 -87
  492. package/dist/components/CartButton/index.server.d.ts +0 -3
  493. package/dist/components/CartButton/index.server.js +0 -18
  494. package/dist/components/FontdueProvider/FontdueProviderClientComponent.d.ts +0 -14
  495. package/dist/components/FontdueProvider/FontdueProviderClientComponent.js +0 -61
  496. package/dist/components/ThemeConfig/index.server.d.ts +0 -2
  497. package/dist/components/ThemeConfig/index.server.js +0 -17
  498. package/fontdue.css +0 -2733
  499. package/fontdue.css.map +0 -1
@@ -0,0 +1,447 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+
6
+ // The next adapter modules read process.env at module load, so each test
7
+ // group stubs the env and re-imports them fresh.
8
+ async function importTenant() {
9
+ return await import("../next/tenant.js");
10
+ }
11
+ async function importConfig() {
12
+ return await import("../next/config.js");
13
+ }
14
+ async function importRevalidate() {
15
+ return await import("../next/revalidate.js");
16
+ }
17
+ const revalidateTag = vi.fn();
18
+ vi.mock('next/cache', () => ({
19
+ revalidateTag: tag => revalidateTag(tag)
20
+ }));
21
+
22
+ // Next's notFound() throws a sentinel the framework catches; the mock does
23
+ // the same so tests can assert on it.
24
+ vi.mock('next/navigation', () => ({
25
+ notFound: () => {
26
+ throw new Error('NEXT_NOT_FOUND');
27
+ }
28
+ }));
29
+ beforeEach(() => {
30
+ vi.resetModules();
31
+ revalidateTag.mockClear();
32
+ vi.unstubAllEnvs();
33
+ vi.restoreAllMocks();
34
+ });
35
+ function stubSingleTenant() {
36
+ let url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'https://acme.fontdue.com';
37
+ vi.stubEnv('NEXT_PUBLIC_FONTDUE_URL', url);
38
+ vi.stubEnv('FONTDUE_MULTI_TENANT', '');
39
+ vi.stubEnv('FONTDUE_ORIGIN', '');
40
+ vi.stubEnv('FONTDUE_PROXY_SECRET', '');
41
+ }
42
+ function stubMultiTenant() {
43
+ let {
44
+ origin = '',
45
+ secret = ''
46
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
47
+ vi.stubEnv('NEXT_PUBLIC_FONTDUE_URL', '');
48
+ vi.stubEnv('FONTDUE_MULTI_TENANT', '1');
49
+ vi.stubEnv('FONTDUE_ORIGIN', origin);
50
+ vi.stubEnv('FONTDUE_PROXY_SECRET', secret);
51
+ }
52
+ describe('isValidDomain', () => {
53
+ it('accepts plain dotted hostnames and rejects everything else', async () => {
54
+ stubMultiTenant();
55
+ const {
56
+ isValidDomain
57
+ } = await importTenant();
58
+ expect(isValidDomain('acme.fontdue.com')).toBe(true);
59
+ expect(isValidDomain('a-b.example')).toBe(true);
60
+ expect(isValidDomain('localhost')).toBe(false); // no dot
61
+ expect(isValidDomain('acme.fontdue.com:3000')).toBe(false); // port
62
+ expect(isValidDomain('acme.fontdue.com/x')).toBe(false); // path
63
+ expect(isValidDomain('-bad.example')).toBe(false);
64
+ expect(isValidDomain('a'.repeat(254) + '.example')).toBe(false);
65
+ });
66
+ });
67
+ describe('fontdueEndpoint', () => {
68
+ it('single-tenant: targets NEXT_PUBLIC_FONTDUE_URL with no headers', async () => {
69
+ stubSingleTenant('https://acme.fontdue.com');
70
+ const {
71
+ fontdueEndpoint
72
+ } = await importTenant();
73
+ expect(fontdueEndpoint('acme.fontdue.com')).toEqual({
74
+ domain: 'acme.fontdue.com',
75
+ origin: 'https://acme.fontdue.com',
76
+ headers: {},
77
+ tags: ['graphql', 'graphql:acme.fontdue.com']
78
+ });
79
+ });
80
+ it('single-tenant: throws when NEXT_PUBLIC_FONTDUE_URL is missing', async () => {
81
+ vi.stubEnv('NEXT_PUBLIC_FONTDUE_URL', '');
82
+ vi.stubEnv('FONTDUE_MULTI_TENANT', '');
83
+ const {
84
+ fontdueEndpoint
85
+ } = await importTenant();
86
+ expect(() => fontdueEndpoint('acme.fontdue.com')).toThrow(/NEXT_PUBLIC_FONTDUE_URL/);
87
+ });
88
+ it('multi-tenant: forwards the host to FONTDUE_ORIGIN with the proxy secret', async () => {
89
+ stubMultiTenant({
90
+ origin: 'http://app:4000',
91
+ secret: 's3cret'
92
+ });
93
+ const {
94
+ fontdueEndpoint
95
+ } = await importTenant();
96
+ expect(fontdueEndpoint('acme.fontdue.com')).toEqual({
97
+ domain: 'acme.fontdue.com',
98
+ origin: 'http://app:4000',
99
+ headers: {
100
+ 'x-forwarded-host': 'acme.fontdue.com',
101
+ 'x-fontdue-proxy-secret': 's3cret'
102
+ },
103
+ tags: ['graphql', 'graphql:acme.fontdue.com']
104
+ });
105
+ });
106
+ it('multi-tenant: omits the secret header when unset', async () => {
107
+ stubMultiTenant({
108
+ origin: 'http://app:4000'
109
+ });
110
+ const {
111
+ fontdueEndpoint
112
+ } = await importTenant();
113
+ expect(fontdueEndpoint('acme.fontdue.com').headers).toEqual({
114
+ 'x-forwarded-host': 'acme.fontdue.com'
115
+ });
116
+ });
117
+ it('multi-tenant: falls back to the tenant public URL without FONTDUE_ORIGIN', async () => {
118
+ stubMultiTenant();
119
+ const {
120
+ fontdueEndpoint
121
+ } = await importTenant();
122
+ expect(fontdueEndpoint('acme.fontdue.com').origin).toBe('https://acme.fontdue.com');
123
+ });
124
+ });
125
+ describe('configureFontdueRender', () => {
126
+ it('rejects invalid domains with null and sets no config', async () => {
127
+ stubMultiTenant({
128
+ origin: 'http://app:4000'
129
+ });
130
+ const {
131
+ configureFontdueRender
132
+ } = await importTenant();
133
+ const {
134
+ getFontdueServerConfig
135
+ } = await import("../relay/serverConfig.js");
136
+ expect(configureFontdueRender('not a domain')).toBeNull();
137
+ expect(getFontdueServerConfig()).toBeUndefined();
138
+ });
139
+ it('sets the per-render server config and returns the endpoint', async () => {
140
+ stubMultiTenant({
141
+ origin: 'http://app:4000',
142
+ secret: 's3cret'
143
+ });
144
+ const {
145
+ configureFontdueRender
146
+ } = await importTenant();
147
+ const {
148
+ getFontdueServerConfig
149
+ } = await import("../relay/serverConfig.js");
150
+ const endpoint = configureFontdueRender('acme.fontdue.com');
151
+ expect(endpoint === null || endpoint === void 0 ? void 0 : endpoint.origin).toBe('http://app:4000');
152
+ // Outside an RSC render React.cache doesn't memoize, so the write is a
153
+ // no-op here — but the config passed must still be shaped correctly, so
154
+ // assert via fontdueServerConfig instead.
155
+ const {
156
+ fontdueServerConfig
157
+ } = await importTenant();
158
+ expect(fontdueServerConfig('acme.fontdue.com')).toEqual({
159
+ url: 'http://app:4000',
160
+ headers: {
161
+ 'x-forwarded-host': 'acme.fontdue.com',
162
+ 'x-fontdue-proxy-secret': 's3cret'
163
+ },
164
+ cacheTags: ['graphql:acme.fontdue.com'],
165
+ domain: 'acme.fontdue.com'
166
+ });
167
+ });
168
+ });
169
+ describe('prepareFontdueRender', () => {
170
+ const props = params => ({
171
+ params: Promise.resolve(params)
172
+ });
173
+ it('configures the render and returns the endpoint', async () => {
174
+ stubMultiTenant({
175
+ origin: 'http://app:4000'
176
+ });
177
+ const {
178
+ prepareFontdueRender
179
+ } = await importTenant();
180
+ const endpoint = await prepareFontdueRender(props({
181
+ domain: 'acme.fontdue.com',
182
+ slug: 'sans'
183
+ }));
184
+ expect(endpoint.origin).toBe('http://app:4000');
185
+ expect(endpoint.tags).toContain('graphql:acme.fontdue.com');
186
+ });
187
+ it('404s invalid or missing domains', async () => {
188
+ stubMultiTenant();
189
+ const {
190
+ prepareFontdueRender
191
+ } = await importTenant();
192
+ await expect(prepareFontdueRender(props({
193
+ domain: 'not a domain'
194
+ }))).rejects.toThrow('NEXT_NOT_FOUND');
195
+ await expect(prepareFontdueRender(props({
196
+ slug: 'sans'
197
+ }))).rejects.toThrow('NEXT_NOT_FOUND');
198
+ });
199
+ });
200
+ describe('currentFontdueEndpoint', () => {
201
+ it('multi-tenant: throws when no render config was set', async () => {
202
+ stubMultiTenant({
203
+ origin: 'http://app:4000'
204
+ });
205
+ const {
206
+ currentFontdueEndpoint
207
+ } = await importTenant();
208
+ expect(() => currentFontdueEndpoint()).toThrow(/prepareFontdueRender/);
209
+ });
210
+ it('single-tenant: derives the endpoint from NEXT_PUBLIC_FONTDUE_URL', async () => {
211
+ stubSingleTenant('https://acme.fontdue.com');
212
+ const {
213
+ currentFontdueEndpoint
214
+ } = await importTenant();
215
+ expect(currentFontdueEndpoint()).toEqual({
216
+ domain: 'acme.fontdue.com',
217
+ origin: 'https://acme.fontdue.com',
218
+ headers: {},
219
+ tags: ['graphql', 'graphql:acme.fontdue.com']
220
+ });
221
+ });
222
+ it('uses the render-configured domain when set', async () => {
223
+ stubMultiTenant({
224
+ origin: 'http://app:4000'
225
+ });
226
+ vi.doMock('../relay/serverConfig', async importActual => ({
227
+ ...(await importActual()),
228
+ getFontdueServerConfig: () => ({
229
+ domain: 'acme.fontdue.com'
230
+ })
231
+ }));
232
+ const {
233
+ currentFontdueEndpoint
234
+ } = await importTenant();
235
+ expect(currentFontdueEndpoint().headers['x-forwarded-host']).toBe('acme.fontdue.com');
236
+ vi.doUnmock('../relay/serverConfig');
237
+ });
238
+ });
239
+ describe('generateStaticParams', () => {
240
+ it('returns no build-time params (everything renders on demand)', async () => {
241
+ stubMultiTenant();
242
+ const {
243
+ generateStaticParams
244
+ } = await importTenant();
245
+ await expect(generateStaticParams()).resolves.toEqual([]);
246
+ });
247
+ });
248
+
249
+ // withFontdue detects the route-tree shape from the working directory; give
250
+ // it one with or without src/app/[domain].
251
+ function mockAppDir(_ref) {
252
+ let {
253
+ domainTree
254
+ } = _ref;
255
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'fontdue-app-'));
256
+ fs.mkdirSync(path.join(dir, domainTree ? 'src/app/[domain]' : 'src/app'), {
257
+ recursive: true
258
+ });
259
+ vi.spyOn(process, 'cwd').mockReturnValue(dir);
260
+ }
261
+ describe('withFontdue', () => {
262
+ beforeEach(() => mockAppDir({
263
+ domainTree: true
264
+ }));
265
+ it('throws when neither mode is configured', async () => {
266
+ vi.stubEnv('NEXT_PUBLIC_FONTDUE_URL', '');
267
+ vi.stubEnv('FONTDUE_MULTI_TENANT', '');
268
+ const {
269
+ withFontdue
270
+ } = await importConfig();
271
+ expect(() => withFontdue({})).toThrow(/NEXT_PUBLIC_FONTDUE_URL/);
272
+ });
273
+ it('single-tenant: rewrites every path under the constant domain', async () => {
274
+ stubSingleTenant('https://acme.fontdue.com');
275
+ const {
276
+ withFontdue
277
+ } = await importConfig();
278
+ const rewrites = await withFontdue({}).rewrites();
279
+ expect(rewrites.afterFiles).toEqual([]);
280
+ expect(rewrites.fallback).toEqual([]);
281
+ const destinations = rewrites.beforeFiles.map(r => r.destination);
282
+ expect(destinations).toEqual(['/acme.fontdue.com', '/acme.fontdue.com/robots.txt', '/acme.fontdue.com/sitemap.xml', '/acme.fontdue.com/:path']);
283
+ });
284
+ it('multi-tenant: emits forwarded-host rules before host rules, mutually exclusive', async () => {
285
+ stubMultiTenant();
286
+ const {
287
+ withFontdue
288
+ } = await importConfig();
289
+ const rewrites = await withFontdue({}).rewrites();
290
+ expect(rewrites.beforeFiles).toHaveLength(8);
291
+ const [forwarded, hostBased] = [rewrites.beforeFiles.slice(0, 4), rewrites.beforeFiles.slice(4)];
292
+ for (const rule of forwarded) {
293
+ var _rule$has;
294
+ expect((_rule$has = rule.has) === null || _rule$has === void 0 ? void 0 : _rule$has[0]).toMatchObject({
295
+ type: 'header',
296
+ key: 'x-forwarded-host'
297
+ });
298
+ expect(rule.missing).toBeUndefined();
299
+ }
300
+ for (const rule of hostBased) {
301
+ var _rule$has2, _rule$missing;
302
+ expect((_rule$has2 = rule.has) === null || _rule$has2 === void 0 ? void 0 : _rule$has2[0]).toMatchObject({
303
+ type: 'host'
304
+ });
305
+ expect((_rule$missing = rule.missing) === null || _rule$missing === void 0 ? void 0 : _rule$missing[0]).toMatchObject({
306
+ type: 'header',
307
+ key: 'x-forwarded-host'
308
+ });
309
+ }
310
+ });
311
+ it("chains the app's beforeFiles rules ahead of the tenant rules", async () => {
312
+ stubSingleTenant();
313
+ const {
314
+ withFontdue
315
+ } = await importConfig();
316
+ const userRule = {
317
+ source: '/old',
318
+ destination: '/new'
319
+ };
320
+ const config = withFontdue({
321
+ rewrites: async () => ({
322
+ beforeFiles: [userRule]
323
+ })
324
+ });
325
+ const rewrites = await config.rewrites();
326
+ expect(rewrites.beforeFiles[0]).toEqual(userRule);
327
+ expect(rewrites.beforeFiles).toHaveLength(5);
328
+ });
329
+ it("treats a plain-array rewrites() result as afterFiles, per Next's contract", async () => {
330
+ stubSingleTenant();
331
+ const {
332
+ withFontdue
333
+ } = await importConfig();
334
+ const userRule = {
335
+ source: '/old',
336
+ destination: '/new'
337
+ };
338
+ const rewrites = await withFontdue({
339
+ rewrites: async () => [userRule]
340
+ }).rewrites();
341
+ expect(rewrites.afterFiles).toEqual([userRule]);
342
+ expect(rewrites.beforeFiles).toHaveLength(4);
343
+ });
344
+ it('merges image settings, keeping app remotePatterns and overrides', async () => {
345
+ stubMultiTenant();
346
+ const {
347
+ withFontdue
348
+ } = await importConfig();
349
+ const config = withFontdue({
350
+ images: {
351
+ dangerouslyAllowSVG: false,
352
+ remotePatterns: [{
353
+ protocol: 'https',
354
+ hostname: 'cdn.example'
355
+ }]
356
+ }
357
+ });
358
+ expect(config.images.dangerouslyAllowSVG).toBe(false);
359
+ // NODE_ENV is 'test' here, i.e. not production → dev workaround active.
360
+ expect(config.images.unoptimized).toBe(true);
361
+ const hostnames = config.images.remotePatterns.map(p => p.hostname);
362
+ expect(hostnames).toContain('cdn.example');
363
+ expect(hostnames).toContain('*.fontdue.com');
364
+ expect(hostnames).toContain('**');
365
+ });
366
+ it('passes unrelated config through and defaults htmlLimitedBots', async () => {
367
+ stubSingleTenant();
368
+ const {
369
+ withFontdue
370
+ } = await importConfig();
371
+ const config = withFontdue({
372
+ reactStrictMode: true
373
+ });
374
+ expect(config.reactStrictMode).toBe(true);
375
+ expect(config.htmlLimitedBots).toEqual(/.*/);
376
+ expect(withFontdue({
377
+ htmlLimitedBots: /Googlebot/
378
+ }).htmlLimitedBots).toEqual(/Googlebot/);
379
+ });
380
+ it('single-tenant flat tree: installs no tenant rewrites', async () => {
381
+ mockAppDir({
382
+ domainTree: false
383
+ });
384
+ stubSingleTenant('https://acme.fontdue.com');
385
+ const {
386
+ withFontdue
387
+ } = await importConfig();
388
+ const userRule = {
389
+ source: '/old',
390
+ destination: '/new'
391
+ };
392
+ const rewrites = await withFontdue({
393
+ rewrites: async () => ({
394
+ beforeFiles: [userRule]
395
+ })
396
+ }).rewrites();
397
+ expect(rewrites.beforeFiles).toEqual([userRule]);
398
+ expect(rewrites.afterFiles).toEqual([]);
399
+ });
400
+ it('multi-tenant flat tree: refuses to start', async () => {
401
+ mockAppDir({
402
+ domainTree: false
403
+ });
404
+ stubMultiTenant();
405
+ const {
406
+ withFontdue
407
+ } = await importConfig();
408
+ expect(() => withFontdue({})).toThrow(/\[domain\]/);
409
+ });
410
+ });
411
+ describe('revalidate POST', () => {
412
+ it('multi-tenant: purges only the tenant tag', async () => {
413
+ stubMultiTenant();
414
+ const {
415
+ POST
416
+ } = await importRevalidate();
417
+ const response = await POST(new Request('http://internal/api/revalidate?domain=Acme.Fontdue.com', {
418
+ method: 'POST'
419
+ }));
420
+ expect(response.status).toBe(200);
421
+ expect(revalidateTag).toHaveBeenCalledExactlyOnceWith('graphql:acme.fontdue.com');
422
+ });
423
+ it('multi-tenant: 400s on a missing or invalid domain', async () => {
424
+ stubMultiTenant();
425
+ const {
426
+ POST
427
+ } = await importRevalidate();
428
+ for (const url of ['http://internal/api/revalidate', 'http://internal/api/revalidate?domain=not%20a%20domain']) {
429
+ const response = await POST(new Request(url, {
430
+ method: 'POST'
431
+ }));
432
+ expect(response.status).toBe(400);
433
+ }
434
+ expect(revalidateTag).not.toHaveBeenCalled();
435
+ });
436
+ it('single-tenant: purges the global graphql tag', async () => {
437
+ stubSingleTenant();
438
+ const {
439
+ POST
440
+ } = await importRevalidate();
441
+ const response = await POST(new Request('http://internal/api/revalidate', {
442
+ method: 'POST'
443
+ }));
444
+ expect(response.status).toBe(200);
445
+ expect(revalidateTag).toHaveBeenCalledExactlyOnceWith('graphql');
446
+ });
447
+ });
@@ -1,18 +1,9 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _AddToCartBannerQuery2 = _interopRequireDefault(require("../../__generated__/AddToCartBannerQuery.graphql"));
8
- var _AddToCartBanner_order2 = _interopRequireDefault(require("../../__generated__/AddToCartBanner_order.graphql"));
9
- var _AddToCartBanner_item2 = _interopRequireDefault(require("../../__generated__/AddToCartBanner_item.graphql"));
10
- var _react = _interopRequireWildcard(require("react"));
11
- var _reactRelay = require("react-relay");
12
- var _fastDeepEqual = _interopRequireDefault(require("fast-deep-equal"));
13
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
14
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
15
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
1
+ import _AddToCartBannerQuery from "../../__generated__/AddToCartBannerQuery.graphql.js";
2
+ import _AddToCartBanner_order from "../../__generated__/AddToCartBanner_order.graphql.js";
3
+ import _AddToCartBanner_item from "../../__generated__/AddToCartBanner_item.graphql.js";
4
+ import React, { useEffect, useState, useRef } from 'react';
5
+ import { graphql, useFragment, useLazyLoadQuery } from 'react-relay';
6
+ import equal from 'fast-deep-equal';
16
7
  const getOrderItemName = item => {
17
8
  var _item$sku;
18
9
  const product = item === null || item === void 0 ? void 0 : (_item$sku = item.sku) === null || _item$sku === void 0 ? void 0 : _item$sku.product;
@@ -30,31 +21,31 @@ const getOrderItemName = item => {
30
21
  if ('name' in product) return product.name;
31
22
  return null;
32
23
  };
33
- _AddToCartBanner_item2.default.hash && _AddToCartBanner_item2.default.hash !== "93905c08206c30255368dbb06f59ccec" && console.error("The definition of 'AddToCartBanner_item' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _AddToCartBanner_item2.default;
24
+ _AddToCartBanner_item.hash && _AddToCartBanner_item.hash !== "93905c08206c30255368dbb06f59ccec" && console.error("The definition of 'AddToCartBanner_item' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _AddToCartBanner_item;
34
25
  function AddToCartBanner(_ref) {
35
26
  var _order$orderItems, _order$orderItems2;
36
27
  let {
37
28
  order: orderKey
38
29
  } = _ref;
39
- const order = (0, _reactRelay.useFragment)((_AddToCartBanner_order2.default.hash && _AddToCartBanner_order2.default.hash !== "29516fe27686b4937b1856979f13d22b" && console.error("The definition of 'AddToCartBanner_order' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _AddToCartBanner_order2.default), orderKey);
40
- const [active, setActive] = (0, _react.useState)(false);
41
- const prevOrderItemIds = (0, _react.useRef)(order === null || order === void 0 ? void 0 : (_order$orderItems = order.orderItems) === null || _order$orderItems === void 0 ? void 0 : _order$orderItems.map(item => item.id));
42
- const newOrderItemIds = (0, _react.useRef)([]);
30
+ const order = useFragment((_AddToCartBanner_order.hash && _AddToCartBanner_order.hash !== "29516fe27686b4937b1856979f13d22b" && console.error("The definition of 'AddToCartBanner_order' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _AddToCartBanner_order), orderKey);
31
+ const [active, setActive] = useState(false);
32
+ const prevOrderItemIds = useRef(order === null || order === void 0 ? void 0 : (_order$orderItems = order.orderItems) === null || _order$orderItems === void 0 ? void 0 : _order$orderItems.map(item => item.id));
33
+ const newOrderItemIds = useRef([]);
43
34
  const newOrderItems = order === null || order === void 0 ? void 0 : (_order$orderItems2 = order.orderItems) === null || _order$orderItems2 === void 0 ? void 0 : _order$orderItems2.filter(item => {
44
35
  var _newOrderItemIds$curr;
45
36
  return (_newOrderItemIds$curr = newOrderItemIds.current) === null || _newOrderItemIds$curr === void 0 ? void 0 : _newOrderItemIds$curr.includes(item.id);
46
37
  });
47
- const timeoutRef = (0, _react.useRef)(undefined);
48
- (0, _react.useEffect)(() => {
38
+ const timeoutRef = useRef(undefined);
39
+ useEffect(() => {
49
40
  document.body.dataset.addToCartBannerOpen = `${active}`;
50
41
  }, [active]);
51
- (0, _react.useEffect)(() => {
42
+ useEffect(() => {
52
43
  var _order$orderItems3, _order$orderItems4, _prevOrderItemIds$cur;
53
44
  function setInactive() {
54
45
  setActive(false);
55
46
  }
56
47
  const orderItemIds = order === null || order === void 0 ? void 0 : (_order$orderItems3 = order.orderItems) === null || _order$orderItems3 === void 0 ? void 0 : _order$orderItems3.map(item => item.id);
57
- if ((0, _fastDeepEqual.default)(orderItemIds, prevOrderItemIds.current)) return;
48
+ if (equal(orderItemIds, prevOrderItemIds.current)) return;
58
49
  if (((order === null || order === void 0 ? void 0 : (_order$orderItems4 = order.orderItems) === null || _order$orderItems4 === void 0 ? void 0 : _order$orderItems4.length) ?? 0) > (((_prevOrderItemIds$cur = prevOrderItemIds.current) === null || _prevOrderItemIds$cur === void 0 ? void 0 : _prevOrderItemIds$cur.length) ?? 0)) {
59
50
  setActive(true);
60
51
  if (timeoutRef.current) clearTimeout(timeoutRef.current);
@@ -70,7 +61,7 @@ function AddToCartBanner(_ref) {
70
61
  };
71
62
  }, [order === null || order === void 0 ? void 0 : order.orderItems]);
72
63
  const itemText = (newOrderItems === null || newOrderItems === void 0 ? void 0 : newOrderItems.length) === 1 ? getOrderItemName(newOrderItems[0]) : `${newOrderItems === null || newOrderItems === void 0 ? void 0 : newOrderItems.length} items`;
73
- return /*#__PURE__*/_react.default.createElement("div", {
64
+ return /*#__PURE__*/React.createElement("div", {
74
65
  className: "add-to-cart-banner",
75
66
  "data-active": active
76
67
  }, "You added ", itemText, " to your cart");
@@ -78,10 +69,9 @@ function AddToCartBanner(_ref) {
78
69
  function AddToCartBannerQueryRenderer() {
79
70
  const {
80
71
  viewer
81
- } = (0, _reactRelay.useLazyLoadQuery)((_AddToCartBannerQuery2.default.hash && _AddToCartBannerQuery2.default.hash !== "0ece6678652384f7938caf18b2a40be9" && console.error("The definition of 'AddToCartBannerQuery' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _AddToCartBannerQuery2.default), {});
82
- return /*#__PURE__*/_react.default.createElement(AddToCartBanner, {
72
+ } = useLazyLoadQuery((_AddToCartBannerQuery.hash && _AddToCartBannerQuery.hash !== "0ece6678652384f7938caf18b2a40be9" && console.error("The definition of 'AddToCartBannerQuery' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _AddToCartBannerQuery), {});
73
+ return /*#__PURE__*/React.createElement(AddToCartBanner, {
83
74
  order: viewer.currentOrder
84
75
  });
85
76
  }
86
- var _default = AddToCartBannerQueryRenderer;
87
- exports.default = _default;
77
+ export default AddToCartBannerQueryRenderer;
@@ -1,17 +1,40 @@
1
1
  import React from 'react';
2
- import { BuyButtonIDQuery } from '../../__generated__/BuyButtonIDQuery.graphql';
3
- import { BuyButtonSlugQuery } from '../../__generated__/BuyButtonSlugQuery.graphql';
4
- import { SerializablePreloadedQuery } from '../../relay/loadSerializableQuery';
2
+ import { BuyButtonIDQuery } from '../../__generated__/BuyButtonIDQuery.graphql.js';
3
+ import { BuyButtonSlugQuery } from '../../__generated__/BuyButtonSlugQuery.graphql.js';
4
+ import { SerializablePreloadedQuery } from '../../relay/loadSerializableQuery.js';
5
+ import { Config } from '../ConfigContext.js';
5
6
  export interface BuyButton_props {
6
- collectionId?: string | null;
7
- collectionSlug?: string | null;
8
7
  collectionName?: string;
9
8
  label?: string;
10
9
  }
10
+ export type BuyButtonPreloadedQuery = SerializablePreloadedQuery<BuyButtonIDQuery> | SerializablePreloadedQuery<BuyButtonSlugQuery>;
11
+ export type LoadBuyButtonQueryVariables = {
12
+ collectionId: string;
13
+ collectionSlug?: never;
14
+ } | {
15
+ collectionId?: never;
16
+ collectionSlug: string;
17
+ };
18
+ export declare function loadBuyButtonQuery(variables: LoadBuyButtonQueryVariables): Promise<BuyButtonPreloadedQuery>;
11
19
  export declare function BuyButtonPreloadedIDQueryRenderer({ preloadedQuery, ...rest }: BuyButton_props & {
12
20
  preloadedQuery: SerializablePreloadedQuery<BuyButtonIDQuery>;
13
21
  }): React.JSX.Element;
14
22
  export declare function BuyButtonPreloadedSlugQueryRenderer({ preloadedQuery, ...rest }: BuyButton_props & {
15
23
  preloadedQuery: SerializablePreloadedQuery<BuyButtonSlugQuery>;
16
24
  }): React.JSX.Element;
17
- export default function BuyButton({ collectionId, collectionSlug, ...rest }: BuyButton_props): React.JSX.Element;
25
+ export type BuyButton_unifiedProps = BuyButton_props & {
26
+ config?: Config;
27
+ } & ({
28
+ preloadedQuery: BuyButtonPreloadedQuery;
29
+ collectionId?: never;
30
+ collectionSlug?: never;
31
+ } | {
32
+ preloadedQuery?: never;
33
+ collectionId: string;
34
+ collectionSlug?: never;
35
+ } | {
36
+ preloadedQuery?: never;
37
+ collectionId?: never;
38
+ collectionSlug: string;
39
+ });
40
+ export default function BuyButton(props: BuyButton_unifiedProps): React.JSX.Element;