@sixtyninecommerce/client 0.23.1 → 0.25.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 (299) hide show
  1. package/README.md +25 -0
  2. package/dist/admin/forms.js +19 -0
  3. package/dist/admin/forms.js.map +1 -1
  4. package/dist/admin/http.d.ts +9 -0
  5. package/dist/admin/http.d.ts.map +1 -1
  6. package/dist/admin/http.js +3 -0
  7. package/dist/admin/http.js.map +1 -1
  8. package/dist/admin/index.d.ts +63 -0
  9. package/dist/admin/index.d.ts.map +1 -1
  10. package/dist/admin/index.js +67 -0
  11. package/dist/admin/index.js.map +1 -1
  12. package/dist/admin/redirects.d.ts +6 -0
  13. package/dist/admin/redirects.d.ts.map +1 -1
  14. package/dist/admin/redirects.js +12 -0
  15. package/dist/admin/redirects.js.map +1 -1
  16. package/dist/admin/types.d.ts +63 -0
  17. package/dist/admin/types.d.ts.map +1 -1
  18. package/dist/cache-tags.d.ts +19 -0
  19. package/dist/cache-tags.d.ts.map +1 -1
  20. package/dist/cache-tags.js +19 -0
  21. package/dist/cache-tags.js.map +1 -1
  22. package/dist/client.d.ts +17 -0
  23. package/dist/client.d.ts.map +1 -1
  24. package/dist/client.js +17 -0
  25. package/dist/client.js.map +1 -1
  26. package/dist/commerce/age-verification.js +3 -3
  27. package/dist/commerce/age-verification.js.map +1 -1
  28. package/dist/commerce/branding.js +7 -0
  29. package/dist/commerce/branding.js.map +1 -1
  30. package/dist/commerce/cart.js +25 -0
  31. package/dist/commerce/cart.js.map +1 -1
  32. package/dist/commerce/checkout.d.ts +68 -0
  33. package/dist/commerce/checkout.d.ts.map +1 -1
  34. package/dist/commerce/checkout.js +83 -0
  35. package/dist/commerce/checkout.js.map +1 -1
  36. package/dist/commerce/customer.d.ts +58 -0
  37. package/dist/commerce/customer.d.ts.map +1 -1
  38. package/dist/commerce/customer.js +65 -0
  39. package/dist/commerce/customer.js.map +1 -1
  40. package/dist/commerce/index.d.ts +17 -1
  41. package/dist/commerce/index.d.ts.map +1 -1
  42. package/dist/commerce/pickup-location-parser.d.ts +18 -0
  43. package/dist/commerce/pickup-location-parser.d.ts.map +1 -1
  44. package/dist/commerce/pickup-location-parser.js +28 -0
  45. package/dist/commerce/pickup-location-parser.js.map +1 -1
  46. package/dist/commerce/placement-error.d.ts +52 -0
  47. package/dist/commerce/placement-error.d.ts.map +1 -1
  48. package/dist/commerce/placement-error.js +87 -0
  49. package/dist/commerce/placement-error.js.map +1 -1
  50. package/dist/commerce/products.d.ts +48 -0
  51. package/dist/commerce/products.d.ts.map +1 -1
  52. package/dist/commerce/products.js +95 -2
  53. package/dist/commerce/products.js.map +1 -1
  54. package/dist/commerce/queries.d.ts +114 -27
  55. package/dist/commerce/queries.d.ts.map +1 -1
  56. package/dist/commerce/queries.js +219 -1
  57. package/dist/commerce/queries.js.map +1 -1
  58. package/dist/commerce/quotes.js +33 -0
  59. package/dist/commerce/quotes.js.map +1 -1
  60. package/dist/commerce/saved-lists.d.ts +7 -7
  61. package/dist/commerce/saved-lists.d.ts.map +1 -1
  62. package/dist/commerce/saved-lists.js +1 -1
  63. package/dist/commerce/search.js +3 -0
  64. package/dist/commerce/search.js.map +1 -1
  65. package/dist/commerce/shipping.js +3 -3
  66. package/dist/commerce/shipping.js.map +1 -1
  67. package/dist/commerce/stock-notifications.d.ts +11 -0
  68. package/dist/commerce/stock-notifications.d.ts.map +1 -1
  69. package/dist/commerce/stock-notifications.js +11 -0
  70. package/dist/commerce/stock-notifications.js.map +1 -1
  71. package/dist/commerce/subscriptions.d.ts +32 -8
  72. package/dist/commerce/subscriptions.d.ts.map +1 -1
  73. package/dist/commerce/subscriptions.js +90 -2
  74. package/dist/commerce/subscriptions.js.map +1 -1
  75. package/dist/commerce/vat-validation.js +4 -4
  76. package/dist/commerce/vat-validation.js.map +1 -1
  77. package/dist/constants.d.ts +31 -0
  78. package/dist/constants.d.ts.map +1 -1
  79. package/dist/constants.js +32 -0
  80. package/dist/constants.js.map +1 -1
  81. package/dist/content/asset-urls.d.ts +50 -0
  82. package/dist/content/asset-urls.d.ts.map +1 -1
  83. package/dist/content/asset-urls.js +92 -0
  84. package/dist/content/asset-urls.js.map +1 -1
  85. package/dist/content/assets.d.ts +15 -0
  86. package/dist/content/assets.d.ts.map +1 -1
  87. package/dist/content/assets.js +15 -0
  88. package/dist/content/assets.js.map +1 -1
  89. package/dist/content/collection-pages.d.ts +5 -0
  90. package/dist/content/collection-pages.d.ts.map +1 -1
  91. package/dist/content/collection-pages.js +8 -0
  92. package/dist/content/collection-pages.js.map +1 -1
  93. package/dist/content/collections.d.ts +14 -0
  94. package/dist/content/collections.d.ts.map +1 -1
  95. package/dist/content/collections.js +16 -0
  96. package/dist/content/collections.js.map +1 -1
  97. package/dist/content/filtered-products.d.ts +18 -0
  98. package/dist/content/filtered-products.d.ts.map +1 -1
  99. package/dist/content/filtered-products.js +16 -0
  100. package/dist/content/filtered-products.js.map +1 -1
  101. package/dist/content/form-field-types.d.ts +6 -0
  102. package/dist/content/form-field-types.d.ts.map +1 -1
  103. package/dist/content/form-field-types.js +12 -0
  104. package/dist/content/form-field-types.js.map +1 -1
  105. package/dist/content/forms.d.ts +16 -0
  106. package/dist/content/forms.d.ts.map +1 -1
  107. package/dist/content/forms.js +23 -0
  108. package/dist/content/forms.js.map +1 -1
  109. package/dist/content/items.d.ts +26 -0
  110. package/dist/content/items.d.ts.map +1 -1
  111. package/dist/content/items.js +33 -0
  112. package/dist/content/items.js.map +1 -1
  113. package/dist/content/resolve.js +6 -0
  114. package/dist/content/resolve.js.map +1 -1
  115. package/dist/content/sitemap.d.ts +5 -0
  116. package/dist/content/sitemap.d.ts.map +1 -1
  117. package/dist/content/sitemap.js +5 -0
  118. package/dist/content/sitemap.js.map +1 -1
  119. package/dist/core/context.js +6 -0
  120. package/dist/core/context.js.map +1 -1
  121. package/dist/core/headers.js +2 -0
  122. package/dist/core/headers.js.map +1 -1
  123. package/dist/core/http.d.ts +8 -0
  124. package/dist/core/http.d.ts.map +1 -1
  125. package/dist/core/http.js +89 -1
  126. package/dist/core/http.js.map +1 -1
  127. package/dist/credit/credit-status.js +2 -2
  128. package/dist/credit/credit-status.js.map +1 -1
  129. package/dist/credit/payment-terms.js +2 -2
  130. package/dist/credit/payment-terms.js.map +1 -1
  131. package/dist/currency/exchange.d.ts +11 -0
  132. package/dist/currency/exchange.d.ts.map +1 -1
  133. package/dist/currency/exchange.js +11 -0
  134. package/dist/currency/exchange.js.map +1 -1
  135. package/dist/errors.d.ts +50 -2
  136. package/dist/errors.d.ts.map +1 -1
  137. package/dist/errors.js +50 -3
  138. package/dist/errors.js.map +1 -1
  139. package/dist/events/envelope.d.ts +36 -0
  140. package/dist/events/envelope.d.ts.map +1 -1
  141. package/dist/events/envelope.js +12 -0
  142. package/dist/events/envelope.js.map +1 -1
  143. package/dist/events/index.d.ts +13 -0
  144. package/dist/events/index.d.ts.map +1 -1
  145. package/dist/events/index.js +13 -0
  146. package/dist/events/index.js.map +1 -1
  147. package/dist/events/payloads.d.ts +19 -0
  148. package/dist/events/payloads.d.ts.map +1 -1
  149. package/dist/events/payloads.js +12 -0
  150. package/dist/events/payloads.js.map +1 -1
  151. package/dist/index.d.ts +8 -1
  152. package/dist/index.d.ts.map +1 -1
  153. package/dist/index.js +7 -0
  154. package/dist/index.js.map +1 -1
  155. package/dist/media/index.js +2 -0
  156. package/dist/media/index.js.map +1 -1
  157. package/dist/media/urls.d.ts +52 -0
  158. package/dist/media/urls.d.ts.map +1 -1
  159. package/dist/media/urls.js +38 -0
  160. package/dist/media/urls.js.map +1 -1
  161. package/dist/media/video.d.ts +16 -0
  162. package/dist/media/video.d.ts.map +1 -1
  163. package/dist/media/video.js +16 -0
  164. package/dist/media/video.js.map +1 -1
  165. package/dist/next/artifact-handler.d.ts +22 -0
  166. package/dist/next/artifact-handler.d.ts.map +1 -1
  167. package/dist/next/artifact-handler.js +22 -0
  168. package/dist/next/artifact-handler.js.map +1 -1
  169. package/dist/next/event-revalidate-handler.d.ts +67 -0
  170. package/dist/next/event-revalidate-handler.d.ts.map +1 -1
  171. package/dist/next/event-revalidate-handler.js +48 -0
  172. package/dist/next/event-revalidate-handler.js.map +1 -1
  173. package/dist/next/index.d.ts +6 -0
  174. package/dist/next/index.d.ts.map +1 -1
  175. package/dist/next/index.js +6 -0
  176. package/dist/next/index.js.map +1 -1
  177. package/dist/next/json-ld.d.ts +9 -0
  178. package/dist/next/json-ld.d.ts.map +1 -1
  179. package/dist/next/json-ld.js +9 -0
  180. package/dist/next/json-ld.js.map +1 -1
  181. package/dist/next/metadata.d.ts +18 -0
  182. package/dist/next/metadata.d.ts.map +1 -1
  183. package/dist/next/metadata.js +21 -0
  184. package/dist/next/metadata.js.map +1 -1
  185. package/dist/next/redirect-middleware.d.ts +39 -0
  186. package/dist/next/redirect-middleware.d.ts.map +1 -1
  187. package/dist/next/redirect-middleware.js +32 -0
  188. package/dist/next/redirect-middleware.js.map +1 -1
  189. package/dist/next/revalidate-handler.d.ts +30 -0
  190. package/dist/next/revalidate-handler.d.ts.map +1 -1
  191. package/dist/next/revalidate-handler.js +22 -0
  192. package/dist/next/revalidate-handler.js.map +1 -1
  193. package/dist/order-scope.d.ts +27 -0
  194. package/dist/order-scope.d.ts.map +1 -1
  195. package/dist/order-scope.js +29 -0
  196. package/dist/order-scope.js.map +1 -1
  197. package/dist/pricing/format.d.ts +17 -0
  198. package/dist/pricing/format.d.ts.map +1 -1
  199. package/dist/pricing/format.js +19 -0
  200. package/dist/pricing/format.js.map +1 -1
  201. package/dist/pricing/index.d.ts +8 -1
  202. package/dist/pricing/index.d.ts.map +1 -1
  203. package/dist/pricing/index.js +18 -2
  204. package/dist/pricing/index.js.map +1 -1
  205. package/dist/pricing/tax-display.d.ts +77 -0
  206. package/dist/pricing/tax-display.d.ts.map +1 -1
  207. package/dist/pricing/tax-display.js +85 -0
  208. package/dist/pricing/tax-display.js.map +1 -1
  209. package/dist/pricing/tiers.d.ts +9 -0
  210. package/dist/pricing/tiers.d.ts.map +1 -1
  211. package/dist/pricing/tiers.js +9 -0
  212. package/dist/pricing/tiers.js.map +1 -1
  213. package/dist/pricing/validation.d.ts +56 -1
  214. package/dist/pricing/validation.d.ts.map +1 -1
  215. package/dist/pricing/validation.js +61 -0
  216. package/dist/pricing/validation.js.map +1 -1
  217. package/dist/redirects/index.d.ts +1 -0
  218. package/dist/redirects/index.d.ts.map +1 -1
  219. package/dist/redirects/index.js +1 -0
  220. package/dist/redirects/index.js.map +1 -1
  221. package/dist/redirects/store.d.ts +20 -0
  222. package/dist/redirects/store.d.ts.map +1 -1
  223. package/dist/redirects/store.js +57 -0
  224. package/dist/redirects/store.js.map +1 -1
  225. package/dist/redirects/types.d.ts +24 -0
  226. package/dist/redirects/types.d.ts.map +1 -1
  227. package/dist/redirects/types.js +1 -0
  228. package/dist/redirects/types.js.map +1 -1
  229. package/dist/revalidation/event-plan.d.ts +48 -0
  230. package/dist/revalidation/event-plan.d.ts.map +1 -1
  231. package/dist/revalidation/event-plan.js +61 -0
  232. package/dist/revalidation/event-plan.js.map +1 -1
  233. package/dist/revalidation/event-verify.d.ts +25 -0
  234. package/dist/revalidation/event-verify.d.ts.map +1 -1
  235. package/dist/revalidation/event-verify.js +27 -0
  236. package/dist/revalidation/event-verify.js.map +1 -1
  237. package/dist/revalidation/types.d.ts +20 -0
  238. package/dist/revalidation/types.d.ts.map +1 -1
  239. package/dist/revalidation/types.js +10 -0
  240. package/dist/revalidation/types.js.map +1 -1
  241. package/dist/revalidation/url-context.d.ts +25 -0
  242. package/dist/revalidation/url-context.d.ts.map +1 -1
  243. package/dist/revalidation/url-context.js +17 -0
  244. package/dist/revalidation/url-context.js.map +1 -1
  245. package/dist/revalidation/verify.d.ts +8 -0
  246. package/dist/revalidation/verify.d.ts.map +1 -1
  247. package/dist/revalidation/verify.js +8 -0
  248. package/dist/revalidation/verify.js.map +1 -1
  249. package/dist/seo/ai.d.ts +17 -0
  250. package/dist/seo/ai.d.ts.map +1 -1
  251. package/dist/seo/ai.js +12 -0
  252. package/dist/seo/ai.js.map +1 -1
  253. package/dist/seo/alternates.js +13 -0
  254. package/dist/seo/alternates.js.map +1 -1
  255. package/dist/seo/artifacts.d.ts +13 -0
  256. package/dist/seo/artifacts.d.ts.map +1 -1
  257. package/dist/seo/artifacts.js +19 -0
  258. package/dist/seo/artifacts.js.map +1 -1
  259. package/dist/seo/canonical.d.ts +15 -0
  260. package/dist/seo/canonical.d.ts.map +1 -1
  261. package/dist/seo/canonical.js +24 -0
  262. package/dist/seo/canonical.js.map +1 -1
  263. package/dist/seo/index.js +6 -0
  264. package/dist/seo/index.js.map +1 -1
  265. package/dist/seo/json-ld.d.ts +13 -0
  266. package/dist/seo/json-ld.d.ts.map +1 -1
  267. package/dist/seo/json-ld.js +32 -0
  268. package/dist/seo/json-ld.js.map +1 -1
  269. package/dist/seo/locale-tag.d.ts +31 -0
  270. package/dist/seo/locale-tag.d.ts.map +1 -1
  271. package/dist/seo/locale-tag.js +31 -0
  272. package/dist/seo/locale-tag.js.map +1 -1
  273. package/dist/seo/meta-tags.d.ts +29 -0
  274. package/dist/seo/meta-tags.d.ts.map +1 -1
  275. package/dist/seo/meta-tags.js +28 -0
  276. package/dist/seo/meta-tags.js.map +1 -1
  277. package/dist/seo/metadata-parser.d.ts +24 -0
  278. package/dist/seo/metadata-parser.d.ts.map +1 -1
  279. package/dist/seo/metadata-parser.js +38 -0
  280. package/dist/seo/metadata-parser.js.map +1 -1
  281. package/dist/seo/metadata-types.d.ts +16 -0
  282. package/dist/seo/metadata-types.d.ts.map +1 -1
  283. package/dist/seo/product-path.d.ts +96 -0
  284. package/dist/seo/product-path.d.ts.map +1 -1
  285. package/dist/seo/product-path.js +96 -0
  286. package/dist/seo/product-path.js.map +1 -1
  287. package/dist/seo/robots.d.ts +17 -0
  288. package/dist/seo/robots.d.ts.map +1 -1
  289. package/dist/seo/robots.js +12 -0
  290. package/dist/seo/robots.js.map +1 -1
  291. package/dist/seo/types.d.ts +39 -0
  292. package/dist/seo/types.d.ts.map +1 -1
  293. package/dist/seo/url-builder.d.ts +31 -0
  294. package/dist/seo/url-builder.d.ts.map +1 -1
  295. package/dist/seo/url-builder.js +36 -0
  296. package/dist/seo/url-builder.js.map +1 -1
  297. package/dist/types.d.ts +1283 -2
  298. package/dist/types.d.ts.map +1 -1
  299. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/media/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEhG,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,cAAc,EACd,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,OAAO,EACP,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,WAAW,EACX,eAAe,EACf,iBAAiB,EAEjB,aAAa,GAId,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,iBAAiB,CAAC,GAAiB;IACjD,MAAM,UAAU,GAAG,6BAA6B,CAAC,GAAG,CAAC,CAAC;IAEtD,OAAO;QACL,QAAQ,EAAE,UAAU;QACpB,UAAU,CAAC,KAAK;YAGd,OAAO,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM;YAChC,OAAO,UAAU,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,sBAAsB,CAAC,KAAK,EAAE,OAAO;YACnC,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACpD,OAAO;gBACL,GAAG,IAAI;gBACP,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;gBACzB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACjB,CAAC,CAAC,IAAI,CAAC,MAAM;yBACR,KAAK,CAAC,IAAI,CAAC;yBACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wBACb,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;wBACzC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;wBACtC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;wBAC1C,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,UAAU,EAAE,CAAC;oBAC3C,CAAC,CAAC;yBACD,IAAI,CAAC,IAAI,CAAC;oBACf,CAAC,CAAC,EAAE;aACP,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/media/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEhG,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,cAAc,EACd,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,OAAO,EACP,iBAAiB,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,WAAW,EACX,eAAe,EACf,iBAAiB,EAEjB,aAAa,GAId,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,iBAAiB,CAAC,GAAiB;IACjD,MAAM,UAAU,GAAG,6BAA6B,CAAC,GAAG,CAAC,CAAC;IAEtD,OAAO;QACL,QAAQ,EAAE,UAAU;QACpB,UAAU,CAAC,KAAK;YACd,uEAAuE;YACvE,6DAA6D;YAC7D,OAAO,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM;YAChC,OAAO,UAAU,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,sBAAsB,CAAC,KAAK,EAAE,OAAO;YACnC,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACpD,OAAO;gBACL,GAAG,IAAI;gBACP,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;gBACzB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACjB,CAAC,CAAC,IAAI,CAAC,MAAM;yBACR,KAAK,CAAC,IAAI,CAAC;yBACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wBACb,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;wBACzC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;wBACtC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;wBAC1C,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,UAAU,EAAE,CAAC;oBAC3C,CAAC,CAAC;yBACD,IAAI,CAAC,IAAI,CAAC;oBACf,CAAC,CAAC,EAAE;aACP,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,13 @@
1
1
  import type { Asset, PresetName, ResponsiveImageData, StoreContext } from '../types.js';
2
+ /**
3
+ * Image preset definitions — must stay in sync with
4
+ * `@sixtynine-digital/commerce-shared/image-presets`. Drift is caught at test
5
+ * time by `media.spec.ts` (see "presets sync with shared package" suite),
6
+ * which imports the source-of-truth and asserts equality.
7
+ *
8
+ * The constants are inlined here because storefront-client is published to npm
9
+ * and the shared package is private to the monorepo.
10
+ */
2
11
  export declare const PRESETS: {
3
12
  readonly xxs: {
4
13
  readonly width: 50;
@@ -26,12 +35,55 @@ export declare const PRESETS: {
26
35
  };
27
36
  };
28
37
  export declare const DEFAULT_PRESET: PresetName;
38
+ /** MIME types that have generated presets (raster images only). */
29
39
  export declare const RASTER_MIME_TYPES: Set<string>;
30
40
  export declare function isRasterImage(mimeType: string): boolean;
41
+ /**
42
+ * Prepend CDN URL to a relative asset path.
43
+ * Returns the original if already absolute or empty.
44
+ */
31
45
  export declare function makeAssetUrl(cdnUrl: string, path: string): string;
46
+ /**
47
+ * Turn a stored asset path into an absolute URL.
48
+ *
49
+ * Assets are stored in R2 and the API returns STORAGE KEYS, not URLs —
50
+ * `assetUrlPrefix` is deliberately blank when R2 is configured, so that each
51
+ * channel can serve them from its own CDN domain. Prefixing is therefore the
52
+ * client's job, and this is the one place that knows how: prepend the CDN
53
+ * origin, and strip the `{channelCode}/` prefix when the channel serves from a
54
+ * domain that already scopes to it.
55
+ *
56
+ * Every surface that hands an asset URL to a consumer MUST go through this.
57
+ * The SEO module did not, which is how `og:image` came to be
58
+ * `rollz/source/26/…/xl/artboard-49__02.jpg` — a storage key that resolves to
59
+ * nothing against the site origin, so social cards and `Product.image` were
60
+ * broken for every product.
61
+ */
32
62
  export type AssetUrlResolver = (path: string | null | undefined) => string;
33
63
  export declare function createAssetUrlResolver(cdnUrl: string, channelPrefix: string | null): AssetUrlResolver;
64
+ /**
65
+ * The resolver for a given store context.
66
+ *
67
+ * The DERIVATION lives here, not just the stripping rule: `createMediaModule`
68
+ * and `createSeoModule` both need it, and a resolver whose arguments are worked
69
+ * out independently in two places is the same drift risk one layer up. If the
70
+ * prefix rule ever grows (a per-channel asset prefix, `{code}/content/`), it
71
+ * changes once.
72
+ */
34
73
  export declare function createContextAssetUrlResolver(ctx: StoreContext): AssetUrlResolver;
74
+ /**
75
+ * Get the URL for a specific preset from an asset's presets object.
76
+ * Falls back to the asset source if presets are not available.
77
+ */
35
78
  export declare function getPresetUrl(asset: Asset, preset: PresetName, format?: 'original' | 'webp'): string;
79
+ /**
80
+ * Build responsive image data for use in <img> or <picture> elements.
81
+ * Returns srcSet with widths matching preset dimensions.
82
+ *
83
+ * `width`/`height` are the asset's REAL intrinsic dimensions when the SDK
84
+ * selected them (so the `<img>` reserves the correct box and avoids CLS). When
85
+ * the asset carries no dimensions they fall back to the square DEFAULT_PRESET
86
+ * box — a last resort, not the reported aspect ratio.
87
+ */
36
88
  export declare function getResponsiveImageData(asset: Asset, presets?: PresetName[]): ResponsiveImageData;
37
89
  //# sourceMappingURL=urls.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../src/media/urls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAWxF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;CAOV,CAAC;AAEX,eAAO,MAAM,cAAc,EAAE,UAAgB,CAAC;AAG9C,eAAO,MAAM,iBAAiB,aAU5B,CAAC;AAEH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvD;AAMD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjE;AAkBD,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,CAAC;AAE3E,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,gBAAgB,CAUlB;AAWD,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,YAAY,GAAG,gBAAgB,CAEjF;AAMD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,UAAU,EAClB,MAAM,GAAE,UAAU,GAAG,MAAe,GACnC,MAAM,CAQR;AAWD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,GAAG,mBAAmB,CA+ChG"}
1
+ {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../src/media/urls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExF;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;CAOV,CAAC;AAEX,eAAO,MAAM,cAAc,EAAE,UAAgB,CAAC;AAE9C,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,aAU5B,CAAC;AAEH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjE;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,CAAC;AAE3E,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,gBAAgB,CAUlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,YAAY,GAAG,gBAAgB,CAEjF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,UAAU,EAClB,MAAM,GAAE,UAAU,GAAG,MAAe,GACnC,MAAM,CAQR;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,GAAG,mBAAmB,CA+ChG"}
@@ -1,3 +1,12 @@
1
+ /**
2
+ * Image preset definitions — must stay in sync with
3
+ * `@sixtynine-digital/commerce-shared/image-presets`. Drift is caught at test
4
+ * time by `media.spec.ts` (see "presets sync with shared package" suite),
5
+ * which imports the source-of-truth and asserts equality.
6
+ *
7
+ * The constants are inlined here because storefront-client is published to npm
8
+ * and the shared package is private to the monorepo.
9
+ */
1
10
  export const PRESETS = {
2
11
  xxs: { width: 50, height: 50 },
3
12
  xs: { width: 150, height: 150 },
@@ -7,6 +16,7 @@ export const PRESETS = {
7
16
  xl: { width: 1800, height: 1800 },
8
17
  };
9
18
  export const DEFAULT_PRESET = 'm';
19
+ /** MIME types that have generated presets (raster images only). */
10
20
  export const RASTER_MIME_TYPES = new Set([
11
21
  'image/jpeg',
12
22
  'image/png',
@@ -21,6 +31,10 @@ export const RASTER_MIME_TYPES = new Set([
21
31
  export function isRasterImage(mimeType) {
22
32
  return RASTER_MIME_TYPES.has(mimeType);
23
33
  }
34
+ /**
35
+ * Prepend CDN URL to a relative asset path.
36
+ * Returns the original if already absolute or empty.
37
+ */
24
38
  export function makeAssetUrl(cdnUrl, path) {
25
39
  if (!path)
26
40
  return '';
@@ -41,9 +55,22 @@ export function createAssetUrlResolver(cdnUrl, channelPrefix) {
41
55
  return makeAssetUrl(cdnUrl, clean);
42
56
  };
43
57
  }
58
+ /**
59
+ * The resolver for a given store context.
60
+ *
61
+ * The DERIVATION lives here, not just the stripping rule: `createMediaModule`
62
+ * and `createSeoModule` both need it, and a resolver whose arguments are worked
63
+ * out independently in two places is the same drift risk one layer up. If the
64
+ * prefix rule ever grows (a per-channel asset prefix, `{code}/content/`), it
65
+ * changes once.
66
+ */
44
67
  export function createContextAssetUrlResolver(ctx) {
45
68
  return createAssetUrlResolver(ctx.cdnUrl, ctx.channelCdnDomain ? `${ctx.channel.code}/` : null);
46
69
  }
70
+ /**
71
+ * Get the URL for a specific preset from an asset's presets object.
72
+ * Falls back to the asset source if presets are not available.
73
+ */
47
74
  export function getPresetUrl(asset, preset, format = 'webp') {
48
75
  const presets = asset.presets;
49
76
  if (!presets)
@@ -53,10 +80,21 @@ export function getPresetUrl(asset, preset, format = 'webp') {
53
80
  return asset.source;
54
81
  return format === 'webp' ? presetData.webpUrl : presetData.url;
55
82
  }
83
+ /**
84
+ * Build responsive image data for use in <img> or <picture> elements.
85
+ * Returns srcSet with widths matching preset dimensions.
86
+ *
87
+ * `width`/`height` are the asset's REAL intrinsic dimensions when the SDK
88
+ * selected them (so the `<img>` reserves the correct box and avoids CLS). When
89
+ * the asset carries no dimensions they fall back to the square DEFAULT_PRESET
90
+ * box — a last resort, not the reported aspect ratio.
91
+ */
56
92
  export function getResponsiveImageData(asset, presets) {
57
93
  const selectedPresets = presets ?? ['s', 'm', 'l', 'xl'];
58
94
  const alt = asset.customFields?.altText ?? asset.name ?? '';
59
95
  const defaultSize = PRESETS[DEFAULT_PRESET];
96
+ // Prefer the asset's real dimensions; fall back to the preset box only when
97
+ // absent. `0` is not a valid dimension, so treat it as absent too.
60
98
  const width = typeof asset.width === 'number' && asset.width > 0 ? asset.width : defaultSize.width;
61
99
  const height = typeof asset.height === 'number' && asset.height > 0 ? asset.height : defaultSize.height;
62
100
  if (!asset.presets) {
@@ -1 +1 @@
1
- {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/media/urls.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/media/urls.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Video embed helpers for storefront rendering.
3
+ * Types and parsing utilities inlined from commerce-shared to keep the client zero-dep.
4
+ */
1
5
  export type VideoProvider = 'youtube' | 'vimeo';
2
6
  export type VideoSource = VideoProvider | 'upload' | 'external';
3
7
  export interface ParsedVideo {
@@ -9,17 +13,29 @@ export interface VideoValue {
9
13
  url: string;
10
14
  video_id?: string;
11
15
  }
16
+ /** Parse a video URL and extract the provider and video ID. */
12
17
  export declare function parseVideoUrl(url: string): ParsedVideo | null;
18
+ /** Get a privacy-friendly embed URL for a video provider and ID. */
13
19
  export declare function getEmbedUrl(provider: VideoProvider, videoId: string): string;
20
+ /**
21
+ * Validate that a URL points to a directly-playable video file (HTTPS + known
22
+ * extension). Used for the "external" source — videos hosted outside our
23
+ * asset library on a stable CDN.
24
+ */
14
25
  export declare function parseDirectVideoUrl(url: string): {
15
26
  url: string;
16
27
  } | null;
28
+ /** Get a thumbnail URL for a video. Vimeo requires an oEmbed API call so returns null. */
17
29
  export declare function getThumbnailUrl(provider: VideoProvider, videoId: string): string | null;
18
30
  interface VideoEmbedOptions {
19
31
  autoplay?: boolean;
20
32
  loop?: boolean;
21
33
  muted?: boolean;
22
34
  }
35
+ /**
36
+ * Generate ready-to-use HTML for embedding a video.
37
+ * Returns an iframe for YouTube/Vimeo or a video element for uploads.
38
+ */
23
39
  export declare function getVideoEmbedHtml(value: VideoValue, options?: VideoEmbedOptions): string;
24
40
  export {};
25
41
  //# sourceMappingURL=video.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/media/video.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC;AAChD,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAkBD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAe7D;AAGD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO5E;AAOD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAavE;AAGD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOvF;AAED,UAAU,iBAAiB;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAyCxF"}
1
+ {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/media/video.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC;AAChD,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAiBD,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAe7D;AAED,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO5E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAavE;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOvF;AAED,UAAU,iBAAiB;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAyCxF"}
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Video embed helpers for storefront rendering.
3
+ * Types and parsing utilities inlined from commerce-shared to keep the client zero-dep.
4
+ */
1
5
  const DIRECT_VIDEO_EXTENSIONS = ['.mp4', '.webm', '.ogv', '.ogg', '.mov', '.m4v'];
2
6
  const YOUTUBE_PATTERNS = [
3
7
  /(?:youtube\.com\/watch\?.*v=)([a-zA-Z0-9_-]{11})/,
@@ -10,6 +14,7 @@ const VIMEO_PATTERNS = [
10
14
  /player\.vimeo\.com\/video\/(\d+)/,
11
15
  /vimeo\.com\/(?:channels\/[\w-]+\/|groups\/[\w-]+\/videos\/)?(\d+)/,
12
16
  ];
17
+ /** Parse a video URL and extract the provider and video ID. */
13
18
  export function parseVideoUrl(url) {
14
19
  if (!url || typeof url !== 'string')
15
20
  return null;
@@ -26,6 +31,7 @@ export function parseVideoUrl(url) {
26
31
  }
27
32
  return null;
28
33
  }
34
+ /** Get a privacy-friendly embed URL for a video provider and ID. */
29
35
  export function getEmbedUrl(provider, videoId) {
30
36
  switch (provider) {
31
37
  case 'youtube':
@@ -34,6 +40,11 @@ export function getEmbedUrl(provider, videoId) {
34
40
  return `https://player.vimeo.com/video/${videoId}`;
35
41
  }
36
42
  }
43
+ /**
44
+ * Validate that a URL points to a directly-playable video file (HTTPS + known
45
+ * extension). Used for the "external" source — videos hosted outside our
46
+ * asset library on a stable CDN.
47
+ */
37
48
  export function parseDirectVideoUrl(url) {
38
49
  if (!url || typeof url !== 'string')
39
50
  return null;
@@ -52,6 +63,7 @@ export function parseDirectVideoUrl(url) {
52
63
  return null;
53
64
  return { url: trimmed };
54
65
  }
66
+ /** Get a thumbnail URL for a video. Vimeo requires an oEmbed API call so returns null. */
55
67
  export function getThumbnailUrl(provider, videoId) {
56
68
  switch (provider) {
57
69
  case 'youtube':
@@ -60,6 +72,10 @@ export function getThumbnailUrl(provider, videoId) {
60
72
  return null;
61
73
  }
62
74
  }
75
+ /**
76
+ * Generate ready-to-use HTML for embedding a video.
77
+ * Returns an iframe for YouTube/Vimeo or a video element for uploads.
78
+ */
63
79
  export function getVideoEmbedHtml(value, options) {
64
80
  const { autoplay = false, loop = false, muted = false } = options ?? {};
65
81
  if ((value.source === 'youtube' || value.source === 'vimeo') && value.video_id) {
@@ -1 +1 @@
1
- {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/media/video.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/media/video.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,31 @@
1
+ /**
2
+ * Route-handler factory that proxies a platform SEO artifact onto the
3
+ * storefront's own origin (fetch-and-serve — hosting-adapter-independent,
4
+ * unlike next.config rewrites).
5
+ *
6
+ * Two deliberate header behaviors:
7
+ * - The inbound client User-Agent is NOT forwarded — the platform host blocks
8
+ * known crawler UAs, and it must see the storefront server, not Googlebot.
9
+ * - X-Robots-Tag from the platform host is dropped; Cache-Control is replaced
10
+ * with the storefront's own policy.
11
+ */
1
12
  import type { StorefrontClient } from '../types.js';
2
13
  export type SeoArtifact = 'sitemap' | 'sitemap-child' | 'robots' | 'llms-txt' | 'indexnow-key';
3
14
  export interface SeoArtifactHandlerOptions {
15
+ /** Cache-Control served to crawlers/CDN. */
4
16
  cacheControl?: string;
17
+ /** Upstream fetch timeout. Default 15s. */
5
18
  timeoutMs?: number;
6
19
  }
20
+ /**
21
+ * Usage (App Router):
22
+ * ```ts
23
+ * // src/app/sitemap.xml/route.ts
24
+ * export const GET = createSeoArtifactHandler(getClient(), 'sitemap');
25
+ * // src/app/sitemaps/[name]/route.ts
26
+ * export const GET = createSeoArtifactHandler(getClient(), 'sitemap-child');
27
+ * ```
28
+ */
7
29
  export declare function createSeoArtifactHandler(client: StorefrontClient | Promise<StorefrontClient>, artifact: SeoArtifact, options?: SeoArtifactHandlerOptions): (request: Request, context?: {
8
30
  params?: Promise<{
9
31
  name?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-handler.d.ts","sourceRoot":"","sources":["../../src/next/artifact-handler.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,CAAC;AAE/F,MAAM,WAAW,yBAAyB;IAExC,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+BD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,EACpD,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE,yBAAyB,GAClC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,CAoD5F"}
1
+ {"version":3,"file":"artifact-handler.d.ts","sourceRoot":"","sources":["../../src/next/artifact-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,CAAC;AAE/F,MAAM,WAAW,yBAAyB;IACxC,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,EACpD,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE,yBAAyB,GAClC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,CAoD5F"}
@@ -1,3 +1,14 @@
1
+ /**
2
+ * Route-handler factory that proxies a platform SEO artifact onto the
3
+ * storefront's own origin (fetch-and-serve — hosting-adapter-independent,
4
+ * unlike next.config rewrites).
5
+ *
6
+ * Two deliberate header behaviors:
7
+ * - The inbound client User-Agent is NOT forwarded — the platform host blocks
8
+ * known crawler UAs, and it must see the storefront server, not Googlebot.
9
+ * - X-Robots-Tag from the platform host is dropped; Cache-Control is replaced
10
+ * with the storefront's own policy.
11
+ */
1
12
  import { SEO_ARTIFACT_TAG } from '../cache-tags.js';
2
13
  const DEFAULT_CACHE_CONTROL = 'public, max-age=300, s-maxage=3600, stale-while-revalidate=86400';
3
14
  const DEFAULT_TIMEOUT_MS = 15_000;
@@ -18,6 +29,15 @@ function upstreamUrl(client, artifact, childName) {
18
29
  return client.seo.indexnowKeyUrl();
19
30
  }
20
31
  }
32
+ /**
33
+ * Usage (App Router):
34
+ * ```ts
35
+ * // src/app/sitemap.xml/route.ts
36
+ * export const GET = createSeoArtifactHandler(getClient(), 'sitemap');
37
+ * // src/app/sitemaps/[name]/route.ts
38
+ * export const GET = createSeoArtifactHandler(getClient(), 'sitemap-child');
39
+ * ```
40
+ */
21
41
  export function createSeoArtifactHandler(client, artifact, options) {
22
42
  const cacheControl = options?.cacheControl ?? DEFAULT_CACHE_CONTROL;
23
43
  const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
@@ -30,6 +50,8 @@ export function createSeoArtifactHandler(client, artifact, options) {
30
50
  const ifNoneMatch = request.headers.get('if-none-match');
31
51
  if (ifNoneMatch)
32
52
  headers['If-None-Match'] = ifNoneMatch;
53
+ // Tagged so the `seo-artifact` purge both revalidation handlers issue
54
+ // reaches a cached upstream fetch; before this tag, nothing carried it.
33
55
  const init = {
34
56
  headers,
35
57
  signal: AbortSignal.timeout(timeoutMs),
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-handler.js","sourceRoot":"","sources":["../../src/next/artifact-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"artifact-handler.js","sourceRoot":"","sources":["../../src/next/artifact-handler.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,81 @@
1
+ /**
2
+ * Route-handler factory for the storefront's `/api/revalidate/events`
3
+ * endpoint: the receiver for a platform EVENT subscription
4
+ * (Dashboard → Settings → Event Subscriptions). Framework functions are
5
+ * INJECTED, so this package never imports `next`.
6
+ *
7
+ * What each answer makes the platform's dispatcher do:
8
+ * - 200 — delivered (also for an event this SDK does not act on: skipping
9
+ * is an acceptance, and the subscription's cursor moves on);
10
+ * - 401 — bad signature or stale/missing `delivered_at`; counts toward the
11
+ * subscription being auto-disabled after 20 in a row;
12
+ * - 400 — a signed body that is not a valid envelope/payload; dead-lettered;
13
+ * - 500 — `revalidatePath`/`revalidateTag` threw; retried with backoff.
14
+ *
15
+ * A path event whose URLs cannot be composed (the URL context cannot be read
16
+ * or is unusable, or `toRoutePath` throws or returns a non-path) is NOT a 5xx:
17
+ * it revalidates the whole site instead and answers 200 with `degraded`.
18
+ *
19
+ * Stateless by design: revalidating twice is harmless, and a replay is bounded
20
+ * by the `delivered_at` window, so there is no dedupe store to run.
21
+ */
1
22
  import type { PlatformEventEnvelope } from '../events/envelope.js';
2
23
  import { type RevalidationPlan, type RevalidationPlanOptions } from '../revalidation/event-plan.js';
3
24
  import { type UrlContext, type UrlContextSource } from '../revalidation/url-context.js';
4
25
  export interface EventRevalidateHandlerOptions extends RevalidationPlanOptions {
26
+ /** The subscription's signing secret, shown once when it was created. Server-only env. */
5
27
  secret: string;
28
+ /** Pass `revalidatePath` from 'next/cache'. */
6
29
  revalidatePath(path: string, type?: 'page' | 'layout'): void;
30
+ /**
31
+ * Pass `revalidateTag` from 'next/cache'. Required: product and collection
32
+ * events revalidate by tag alone. It is called with the tag only — if your
33
+ * Next version's `revalidateTag` takes a cache-profile argument, pass a
34
+ * wrapper that supplies one.
35
+ */
7
36
  revalidateTag(tag: string): void;
37
+ /**
38
+ * The channel's URL rule set and languages, used to compose each event path
39
+ * per locale — typically `urlContextFromClient(client)`.
40
+ */
8
41
  urls: UrlContext | UrlContextSource;
42
+ /** Reject deliveries whose `delivered_at` is further than this from now. Default 300s. */
9
43
  toleranceSeconds?: number;
44
+ /**
45
+ * Observe every delivery answered 200 — skipped (`plan.skipped`) and degraded
46
+ * (`plan.degraded`) ones included. Not called for a delivery answered 401,
47
+ * 400 or 500. If it throws, the error goes to `onError` and the answer stays
48
+ * 200.
49
+ */
10
50
  onEvent?(envelope: PlatformEventEnvelope, plan: RevalidationPlan): void | Promise<void>;
51
+ /**
52
+ * Called with the error for:
53
+ * - a delivery answered 400 because its payload is off-contract;
54
+ * - a delivery answered 500 because `revalidatePath`/`revalidateTag` threw;
55
+ * - the first URL-mapping failure of a streak — that delivery is answered
56
+ * 200 with `degraded: 'url_mapping_failed'`, and the streak ends when a path
57
+ * event maps again;
58
+ * - an `onEvent` that threw.
59
+ *
60
+ * Not called for signature, replay-window or envelope refusals (401/400).
61
+ * Default: `console.error`.
62
+ */
11
63
  onError?(error: unknown, envelope: PlatformEventEnvelope): void;
12
64
  }
65
+ /**
66
+ * Usage (App Router):
67
+ * ```ts
68
+ * // src/app/api/revalidate/events/route.ts
69
+ * import { revalidatePath, revalidateTag } from 'next/cache';
70
+ * import { createEventRevalidateHandler, urlContextFromClient } from '@sixtyninecommerce/client/next';
71
+ *
72
+ * export const POST = createEventRevalidateHandler({
73
+ * secret: process.env.REVALIDATE_EVENTS_SECRET!,
74
+ * revalidatePath,
75
+ * revalidateTag,
76
+ * urls: urlContextFromClient(getClient()), // a client or a client promise
77
+ * });
78
+ * ```
79
+ */
13
80
  export declare function createEventRevalidateHandler(options: EventRevalidateHandlerOptions): (request: Request) => Promise<Response>;
14
81
  //# sourceMappingURL=event-revalidate-handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-revalidate-handler.d.ts","sourceRoot":"","sources":["../../src/next/event-revalidate-handler.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAE7B,MAAM,+BAA+B,CAAC;AAKvC,OAAO,EACL,KAAK,UAAU,EACf,KAAK,gBAAgB,EAEtB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,6BAA8B,SAAQ,uBAAuB;IAE5E,MAAM,EAAE,MAAM,CAAC;IAEf,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;IAO7D,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAKjC,IAAI,EAAE,UAAU,GAAG,gBAAgB,CAAC;IAEpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAO1B,OAAO,CAAC,CAAC,QAAQ,EAAE,qBAAqB,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAaxF,OAAO,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACjE;AA+BD,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,6BAA6B,GACrC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAwGzC"}
1
+ {"version":3,"file":"event-revalidate-handler.d.ts","sourceRoot":"","sources":["../../src/next/event-revalidate-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAE7B,MAAM,+BAA+B,CAAC;AAKvC,OAAO,EACL,KAAK,UAAU,EACf,KAAK,gBAAgB,EAEtB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,6BAA8B,SAAQ,uBAAuB;IAC5E,0FAA0F;IAC1F,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC7D;;;;;OAKG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,IAAI,EAAE,UAAU,GAAG,gBAAgB,CAAC;IACpC,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,OAAO,CAAC,CAAC,QAAQ,EAAE,qBAAqB,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACjE;AAgBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,6BAA6B,GACrC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAwGzC"}
@@ -1,3 +1,24 @@
1
+ /**
2
+ * Route-handler factory for the storefront's `/api/revalidate/events`
3
+ * endpoint: the receiver for a platform EVENT subscription
4
+ * (Dashboard → Settings → Event Subscriptions). Framework functions are
5
+ * INJECTED, so this package never imports `next`.
6
+ *
7
+ * What each answer makes the platform's dispatcher do:
8
+ * - 200 — delivered (also for an event this SDK does not act on: skipping
9
+ * is an acceptance, and the subscription's cursor moves on);
10
+ * - 401 — bad signature or stale/missing `delivered_at`; counts toward the
11
+ * subscription being auto-disabled after 20 in a row;
12
+ * - 400 — a signed body that is not a valid envelope/payload; dead-lettered;
13
+ * - 500 — `revalidatePath`/`revalidateTag` threw; retried with backoff.
14
+ *
15
+ * A path event whose URLs cannot be composed (the URL context cannot be read
16
+ * or is unusable, or `toRoutePath` throws or returns a non-path) is NOT a 5xx:
17
+ * it revalidates the whole site instead and answers 200 with `degraded`.
18
+ *
19
+ * Stateless by design: revalidating twice is harmless, and a replay is bounded
20
+ * by the `delivered_at` window, so there is no dedupe store to run.
21
+ */
1
22
  import { classifyEvent, EventPayloadError, planFromIntent, resolveMaxPaths, } from '../revalidation/event-plan.js';
2
23
  import { DEFAULT_EVENT_TOLERANCE_SECONDS, verifyEventDelivery, } from '../revalidation/event-verify.js';
3
24
  import { urlContextFromChannelSettings, } from '../revalidation/url-context.js';
@@ -10,6 +31,21 @@ function json(status, body) {
10
31
  function defaultOnError(error, envelope) {
11
32
  console.error(`[@sixtyninecommerce/client] event revalidation failed for ${envelope.type} ${envelope.id}:`, error);
12
33
  }
34
+ /**
35
+ * Usage (App Router):
36
+ * ```ts
37
+ * // src/app/api/revalidate/events/route.ts
38
+ * import { revalidatePath, revalidateTag } from 'next/cache';
39
+ * import { createEventRevalidateHandler, urlContextFromClient } from '@sixtyninecommerce/client/next';
40
+ *
41
+ * export const POST = createEventRevalidateHandler({
42
+ * secret: process.env.REVALIDATE_EVENTS_SECRET!,
43
+ * revalidatePath,
44
+ * revalidateTag,
45
+ * urls: urlContextFromClient(getClient()), // a client or a client promise
46
+ * });
47
+ * ```
48
+ */
13
49
  export function createEventRevalidateHandler(options) {
14
50
  const toleranceSeconds = options.toleranceSeconds ?? DEFAULT_EVENT_TOLERANCE_SECONDS;
15
51
  if (!Number.isFinite(toleranceSeconds) || toleranceSeconds <= 0) {
@@ -21,9 +57,15 @@ export function createEventRevalidateHandler(options) {
21
57
  throw new TypeError('urls is required — pass urlContextFromClient(client) or a UrlContext');
22
58
  }
23
59
  const report = options.onError ?? defaultOnError;
60
+ // The rule set the last `channel.url_settings_changed` delivery carried. It
61
+ // is newer than anything `urls` can return: the client's channel snapshot is
62
+ // taken at startup, and a static UrlContext never changes.
24
63
  let adopted = null;
25
64
  const resolveUrls = async () => adopted ?? (typeof source === 'function' ? await source() : source);
26
65
  const planOptions = { maxPaths, toRoutePath: options.toRoutePath };
66
+ // Path events whose URLs could not be composed since the last one that could.
67
+ // Only the first of such a streak is reported, so a broken URL source does not
68
+ // flood the log; every one of them is still visible through `onEvent`.
27
69
  let mappingFailures = 0;
28
70
  const planPaths = async (intent, envelope) => {
29
71
  try {
@@ -32,6 +74,9 @@ export function createEventRevalidateHandler(options) {
32
74
  return plan;
33
75
  }
34
76
  catch (error) {
77
+ // Never a 5xx: delivery is ordered, so a failure that cannot clear would
78
+ // stall the subscription on this event for good without ever tripping the
79
+ // auto-disable. The whole site needs no URL at all.
35
80
  if (mappingFailures === 0)
36
81
  report(error, envelope);
37
82
  mappingFailures += 1;
@@ -40,6 +85,8 @@ export function createEventRevalidateHandler(options) {
40
85
  };
41
86
  return async (request) => {
42
87
  if (!options.secret) {
88
+ // 500, not 401: the storefront is misconfigured, and a 401 streak would
89
+ // get the subscription auto-disabled rather than retried once fixed.
43
90
  return json(500, { error: 'revalidation secret is not configured' });
44
91
  }
45
92
  let rawBody;
@@ -85,6 +132,7 @@ export function createEventRevalidateHandler(options) {
85
132
  await options.onEvent(envelope, plan);
86
133
  }
87
134
  catch (error) {
135
+ // The revalidation happened; an observer must not turn it into a retry.
88
136
  report(error, envelope);
89
137
  }
90
138
  }
@@ -1 +1 @@
1
- {"version":3,"file":"event-revalidate-handler.js","sourceRoot":"","sources":["../../src/next/event-revalidate-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-revalidate-handler.js","sourceRoot":"","sources":["../../src/next/event-revalidate-handler.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,9 @@
1
+ /**
2
+ * `@sixtyninecommerce/client/next` — Next.js App Router adapters. Zero `next`
3
+ * imports by design: `toNextMetadata` returns a structurally-compatible
4
+ * object, and both revalidation handlers take `revalidatePath`/`revalidateTag`
5
+ * as injected functions.
6
+ */
1
7
  export type { RevalidationDegradedReason, RevalidationPlan, RevalidationPlanOptions, RevalidationSkipReason, } from '../revalidation/event-plan.js';
2
8
  export type { RevalidateWebhookPayload } from '../revalidation/types.js';
3
9
  export type { UrlContext, UrlContextSource } from '../revalidation/url-context.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"AAOA,YAAY,EACV,0BAA0B,EAC1B,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,YAAY,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAClE,YAAY,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC9F,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,0BAA0B,EAC1B,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,YAAY,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAClE,YAAY,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnE,YAAY,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC9F,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -1,3 +1,9 @@
1
+ /**
2
+ * `@sixtyninecommerce/client/next` — Next.js App Router adapters. Zero `next`
3
+ * imports by design: `toNextMetadata` returns a structurally-compatible
4
+ * object, and both revalidation handlers take `revalidatePath`/`revalidateTag`
5
+ * as injected functions.
6
+ */
1
7
  export { urlContextFromClient } from '../revalidation/url-context.js';
2
8
  export { verifyWebhookSignature } from '../revalidation/verify.js';
3
9
  export { createSeoArtifactHandler } from './artifact-handler.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}