@shopify/hydrogen 2026.4.5 → 2026.10.0-preview.2

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 (764) hide show
  1. package/README.md +73 -13
  2. package/bin/hydrogen.mjs +7 -0
  3. package/dist/cli/index.mjs +647 -0
  4. package/dist/client/client.d.mts +34 -0
  5. package/dist/client/client.mjs +206 -0
  6. package/dist/client/client.mjs.map +1 -0
  7. package/dist/client/errors.d.mts +48 -0
  8. package/dist/client/errors.mjs +52 -0
  9. package/dist/client/errors.mjs.map +1 -0
  10. package/dist/client/index.d.mts +4 -0
  11. package/dist/client/types.d.mts +147 -0
  12. package/dist/core/analytics/cart-tracker.d.mts +8 -0
  13. package/dist/core/analytics/cart-tracker.mjs +144 -0
  14. package/dist/core/analytics/cart-tracker.mjs.map +1 -0
  15. package/dist/core/analytics/events.d.mts +15 -0
  16. package/dist/core/analytics/events.mjs +15 -0
  17. package/dist/core/analytics/events.mjs.map +1 -0
  18. package/dist/core/analytics/index.d.mts +3 -0
  19. package/dist/core/analytics/types.d.mts +143 -0
  20. package/dist/core/analytics/utils/flatten-connection.d.mts +19 -0
  21. package/dist/core/analytics/utils/flatten-connection.mjs +25 -0
  22. package/dist/core/analytics/utils/flatten-connection.mjs.map +1 -0
  23. package/dist/core/cache/cache-status.mjs +17 -0
  24. package/dist/core/cache/cache-status.mjs.map +1 -0
  25. package/dist/core/cache/fetch-with-cache.d.mts +43 -0
  26. package/dist/core/cache/fetch-with-cache.mjs +188 -0
  27. package/dist/core/cache/fetch-with-cache.mjs.map +1 -0
  28. package/dist/core/cache/key.d.mts +6 -0
  29. package/dist/core/cache/key.mjs +27 -0
  30. package/dist/core/cache/key.mjs.map +1 -0
  31. package/dist/core/cache/run-with-cache.d.mts +36 -0
  32. package/dist/core/cache/run-with-cache.mjs +114 -0
  33. package/dist/core/cache/run-with-cache.mjs.map +1 -0
  34. package/dist/core/cache/store.d.mts +19 -0
  35. package/dist/core/cache/store.mjs +62 -0
  36. package/dist/core/cache/store.mjs.map +1 -0
  37. package/dist/core/cache/strategies.d.mts +39 -0
  38. package/dist/core/cache/strategies.mjs +70 -0
  39. package/dist/core/cache/strategies.mjs.map +1 -0
  40. package/dist/core/cart/actions.d.mts +50 -0
  41. package/dist/core/cart/actions.mjs +240 -0
  42. package/dist/core/cart/actions.mjs.map +1 -0
  43. package/dist/core/cart/attach-quantity-input.d.mts +5 -0
  44. package/dist/core/cart/attach-quantity-input.mjs +17 -0
  45. package/dist/core/cart/attach-quantity-input.mjs.map +1 -0
  46. package/dist/core/cart/buyer-identity-sync.d.mts +23 -0
  47. package/dist/core/cart/buyer-identity-sync.mjs +9 -0
  48. package/dist/core/cart/buyer-identity-sync.mjs.map +1 -0
  49. package/dist/core/cart/cart.d.mts +37 -0
  50. package/dist/core/cart/cart.mjs +1707 -0
  51. package/dist/core/cart/cart.mjs.map +1 -0
  52. package/dist/core/cart/cookie.d.mts +5 -0
  53. package/dist/core/cart/cookie.mjs +28 -0
  54. package/dist/core/cart/cookie.mjs.map +1 -0
  55. package/dist/core/cart/form.d.mts +130 -0
  56. package/dist/core/cart/form.mjs +75 -0
  57. package/dist/core/cart/form.mjs.map +1 -0
  58. package/dist/core/cart/get-cart.d.mts +25 -0
  59. package/dist/core/cart/get-cart.mjs +32 -0
  60. package/dist/core/cart/get-cart.mjs.map +1 -0
  61. package/dist/core/cart/index.d.mts +10 -0
  62. package/dist/core/cart/quantity.d.mts +10 -0
  63. package/dist/core/cart/quantity.mjs +14 -0
  64. package/dist/core/cart/quantity.mjs.map +1 -0
  65. package/dist/core/cart/queries.d.mts +4296 -0
  66. package/dist/core/cart/queries.mjs +70 -0
  67. package/dist/core/cart/queries.mjs.map +1 -0
  68. package/dist/core/cart/server-handlers.d.mts +82 -0
  69. package/dist/core/cart/server-handlers.mjs +322 -0
  70. package/dist/core/cart/server-handlers.mjs.map +1 -0
  71. package/dist/core/cart/state.d.mts +137 -0
  72. package/dist/core/cart/state.mjs +76 -0
  73. package/dist/core/cart/state.mjs.map +1 -0
  74. package/dist/core/cart/sync-quantity-inputs.mjs +16 -0
  75. package/dist/core/cart/sync-quantity-inputs.mjs.map +1 -0
  76. package/dist/core/collection/collection.d.mts +134 -0
  77. package/dist/core/collection/collection.mjs +170 -0
  78. package/dist/core/collection/collection.mjs.map +1 -0
  79. package/dist/core/collection/index.d.mts +6 -0
  80. package/dist/core/collection/reconciler.d.mts +32 -0
  81. package/dist/core/collection/reconciler.mjs +89 -0
  82. package/dist/core/collection/reconciler.mjs.map +1 -0
  83. package/dist/core/collection/state.d.mts +66 -0
  84. package/dist/core/collection/state.mjs +20 -0
  85. package/dist/core/collection/state.mjs.map +1 -0
  86. package/dist/core/collection/url.d.mts +71 -0
  87. package/dist/core/collection/url.mjs +376 -0
  88. package/dist/core/collection/url.mjs.map +1 -0
  89. package/dist/core/constants.d.mts +5 -0
  90. package/dist/core/constants.mjs +8 -0
  91. package/dist/core/constants.mjs.map +1 -0
  92. package/dist/core/headers.mjs +43 -0
  93. package/dist/core/headers.mjs.map +1 -0
  94. package/dist/core/index.d.mts +56 -0
  95. package/dist/core/index.mjs +45 -0
  96. package/dist/core/logging/logging.d.mts +21 -0
  97. package/dist/core/logging/logging.mjs +99 -0
  98. package/dist/core/logging/logging.mjs.map +1 -0
  99. package/dist/core/logging/types.d.mts +40 -0
  100. package/dist/core/logging/types.mjs +18 -0
  101. package/dist/core/logging/types.mjs.map +1 -0
  102. package/dist/core/money/cache.mjs +25 -0
  103. package/dist/core/money/cache.mjs.map +1 -0
  104. package/dist/core/money/format.d.mts +15 -0
  105. package/dist/core/money/format.mjs +243 -0
  106. package/dist/core/money/format.mjs.map +1 -0
  107. package/dist/core/money/types.d.mts +47 -0
  108. package/dist/core/observable.mjs +46 -0
  109. package/dist/core/observable.mjs.map +1 -0
  110. package/dist/core/predictive-search/constants.d.mts +5 -0
  111. package/dist/core/predictive-search/constants.mjs +6 -0
  112. package/dist/core/predictive-search/constants.mjs.map +1 -0
  113. package/dist/core/predictive-search/form.d.mts +31 -0
  114. package/dist/core/predictive-search/form.mjs +31 -0
  115. package/dist/core/predictive-search/form.mjs.map +1 -0
  116. package/dist/core/predictive-search/index.d.mts +6 -0
  117. package/dist/core/predictive-search/queries.d.mts +118 -0
  118. package/dist/core/predictive-search/queries.mjs +81 -0
  119. package/dist/core/predictive-search/queries.mjs.map +1 -0
  120. package/dist/core/predictive-search/search.d.mts +32 -0
  121. package/dist/core/predictive-search/search.mjs +74 -0
  122. package/dist/core/predictive-search/search.mjs.map +1 -0
  123. package/dist/core/predictive-search/server-handlers.d.mts +36 -0
  124. package/dist/core/predictive-search/server-handlers.mjs +113 -0
  125. package/dist/core/predictive-search/server-handlers.mjs.map +1 -0
  126. package/dist/core/predictive-search/store.d.mts +44 -0
  127. package/dist/core/predictive-search/store.mjs +224 -0
  128. package/dist/core/predictive-search/store.mjs.map +1 -0
  129. package/dist/core/predictive-search/url.d.mts +41 -0
  130. package/dist/core/predictive-search/url.mjs +71 -0
  131. package/dist/core/predictive-search/url.mjs.map +1 -0
  132. package/dist/core/product/accept-variant-id.mjs +98 -0
  133. package/dist/core/product/accept-variant-id.mjs.map +1 -0
  134. package/dist/core/product/form.d.mts +63 -0
  135. package/dist/core/product/form.mjs +44 -0
  136. package/dist/core/product/form.mjs.map +1 -0
  137. package/dist/core/product/index.d.mts +5 -0
  138. package/dist/core/product/options.d.mts +43 -0
  139. package/dist/core/product/options.mjs +296 -0
  140. package/dist/core/product/options.mjs.map +1 -0
  141. package/dist/core/product/product-form.d.mts +72 -0
  142. package/dist/core/product/product-form.mjs +158 -0
  143. package/dist/core/product/product-form.mjs.map +1 -0
  144. package/dist/core/product/state.d.mts +68 -0
  145. package/dist/core/product/url.d.mts +47 -0
  146. package/dist/core/product/url.mjs +69 -0
  147. package/dist/core/product/url.mjs.map +1 -0
  148. package/dist/core/request-context.d.mts +75 -0
  149. package/dist/core/request-context.mjs +141 -0
  150. package/dist/core/request-context.mjs.map +1 -0
  151. package/dist/core/request-routing/handle-shopify-redirects.d.mts +17 -0
  152. package/dist/core/request-routing/handle-shopify-redirects.mjs +31 -0
  153. package/dist/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
  154. package/dist/core/request-routing/handle-shopify-routes.d.mts +14 -0
  155. package/dist/core/request-routing/handle-shopify-routes.mjs +42 -0
  156. package/dist/core/request-routing/handle-shopify-routes.mjs.map +1 -0
  157. package/dist/core/request-routing/interceptors/admin-redirect.mjs +12 -0
  158. package/dist/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
  159. package/dist/core/request-routing/interceptors/ajax-api.mjs +16 -0
  160. package/dist/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
  161. package/dist/core/request-routing/interceptors/api-proxy.mjs +20 -0
  162. package/dist/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
  163. package/dist/core/request-routing/interceptors/checkout.mjs +58 -0
  164. package/dist/core/request-routing/interceptors/checkout.mjs.map +1 -0
  165. package/dist/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
  166. package/dist/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
  167. package/dist/core/request-routing/interceptors/proxy.mjs +73 -0
  168. package/dist/core/request-routing/interceptors/proxy.mjs.map +1 -0
  169. package/dist/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
  170. package/dist/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
  171. package/dist/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
  172. package/dist/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
  173. package/dist/core/request-routing/interceptors/standard-routes.mjs +19 -0
  174. package/dist/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
  175. package/dist/core/request-routing/interceptors/url-redirects.mjs +27 -0
  176. package/dist/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
  177. package/dist/core/request-routing/interceptors/well-known.mjs +22 -0
  178. package/dist/core/request-routing/interceptors/well-known.mjs.map +1 -0
  179. package/dist/core/request-routing/registered-routes.d.mts +7 -0
  180. package/dist/core/request-routing/registered-routes.mjs +72 -0
  181. package/dist/core/request-routing/registered-routes.mjs.map +1 -0
  182. package/dist/core/request-routing/route-types.d.mts +56 -0
  183. package/dist/core/request-routing/safe-apply-response-headers.mjs +16 -0
  184. package/dist/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
  185. package/dist/core/shop-pay/shop-pay.d.mts +102 -0
  186. package/dist/core/shop-pay/shop-pay.mjs +289 -0
  187. package/dist/core/shop-pay/shop-pay.mjs.map +1 -0
  188. package/dist/core/shopify-scripts/analytics.mjs +26 -0
  189. package/dist/core/shopify-scripts/analytics.mjs.map +1 -0
  190. package/dist/core/shopify-scripts/consent.mjs +17 -0
  191. package/dist/core/shopify-scripts/consent.mjs.map +1 -0
  192. package/dist/core/shopify-scripts/constants.mjs +19 -0
  193. package/dist/core/shopify-scripts/constants.mjs.map +1 -0
  194. package/dist/core/shopify-scripts/deprecated-cookies.mjs +97 -0
  195. package/dist/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
  196. package/dist/core/shopify-scripts/global.d.mts +1 -0
  197. package/dist/core/shopify-scripts/global.mjs +86 -0
  198. package/dist/core/shopify-scripts/global.mjs.map +1 -0
  199. package/dist/core/shopify-scripts/index.d.mts +27 -0
  200. package/dist/core/shopify-scripts/index.mjs +135 -0
  201. package/dist/core/shopify-scripts/index.mjs.map +1 -0
  202. package/dist/core/shopify-scripts/initialize.d.mts +18 -0
  203. package/dist/core/shopify-scripts/initialize.mjs +27 -0
  204. package/dist/core/shopify-scripts/initialize.mjs.map +1 -0
  205. package/dist/core/shopify-scripts/page-view.mjs +49 -0
  206. package/dist/core/shopify-scripts/page-view.mjs.map +1 -0
  207. package/dist/core/shopify-scripts/perfkit.mjs +33 -0
  208. package/dist/core/shopify-scripts/perfkit.mjs.map +1 -0
  209. package/dist/core/shopify-scripts/render.d.mts +1 -0
  210. package/dist/core/shopify-scripts/render.mjs +23 -0
  211. package/dist/core/shopify-scripts/render.mjs.map +1 -0
  212. package/dist/core/shopify-scripts/types.d.mts +76 -0
  213. package/dist/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
  214. package/dist/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
  215. package/dist/core/shopify-scripts/utils/inline-script.mjs +8 -0
  216. package/dist/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
  217. package/dist/core/shopify-scripts/utils/navigation.mjs +46 -0
  218. package/dist/core/shopify-scripts/utils/navigation.mjs.map +1 -0
  219. package/dist/core/shopify-scripts/utils/tracking-values.mjs +65 -0
  220. package/dist/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
  221. package/dist/core/shopify-scripts/utils/uuid.mjs +17 -0
  222. package/dist/core/shopify-scripts/utils/uuid.mjs.map +1 -0
  223. package/dist/core/shopify-scripts/webmcp.mjs +22 -0
  224. package/dist/core/shopify-scripts/webmcp.mjs.map +1 -0
  225. package/dist/core/standard-routes/build.d.mts +34 -0
  226. package/dist/core/standard-routes/build.mjs +54 -0
  227. package/dist/core/standard-routes/build.mjs.map +1 -0
  228. package/dist/core/standard-routes/defaults.mjs +31 -0
  229. package/dist/core/standard-routes/defaults.mjs.map +1 -0
  230. package/dist/core/standard-routes/match.mjs +108 -0
  231. package/dist/core/standard-routes/match.mjs.map +1 -0
  232. package/dist/core/standard-routes/path.mjs +58 -0
  233. package/dist/core/standard-routes/path.mjs.map +1 -0
  234. package/dist/core/standard-routes/redirects.mjs +51 -0
  235. package/dist/core/standard-routes/redirects.mjs.map +1 -0
  236. package/dist/core/standard-routes/types.d.mts +95 -0
  237. package/dist/core/url.mjs +42 -0
  238. package/dist/core/url.mjs.map +1 -0
  239. package/dist/core/utils/load-script.mjs +34 -0
  240. package/dist/core/utils/load-script.mjs.map +1 -0
  241. package/dist/core/utils/parse-gid.mjs +33 -0
  242. package/dist/core/utils/parse-gid.mjs.map +1 -0
  243. package/dist/core/utils/record.mjs +8 -0
  244. package/dist/core/utils/record.mjs.map +1 -0
  245. package/dist/customer-account/client.d.mts +50 -0
  246. package/dist/customer-account/client.mjs +239 -0
  247. package/dist/customer-account/client.mjs.map +1 -0
  248. package/dist/customer-account/errors.d.mts +28 -0
  249. package/dist/customer-account/errors.mjs +39 -0
  250. package/dist/customer-account/errors.mjs.map +1 -0
  251. package/dist/customer-account/graphql.d.mts +29 -0
  252. package/dist/customer-account/graphql.mjs +39 -0
  253. package/dist/customer-account/graphql.mjs.map +1 -0
  254. package/dist/customer-account/index.d.mts +7 -0
  255. package/dist/customer-account/index.mjs +7 -0
  256. package/dist/customer-account/session.d.mts +117 -0
  257. package/dist/customer-account/session.mjs +733 -0
  258. package/dist/customer-account/session.mjs.map +1 -0
  259. package/dist/customer-account/type-resolver.d.mts +11 -0
  260. package/dist/customer-account-api-types.d.ts +3269 -3270
  261. package/dist/customer-account.schema.json +50753 -1
  262. package/dist/development/_virtual/_@oxc-project_runtime@0.127.0/helpers/taggedTemplateLiteral.mjs +7 -0
  263. package/dist/development/client/client.d.mts +34 -0
  264. package/dist/development/client/client.mjs +206 -0
  265. package/dist/development/client/client.mjs.map +1 -0
  266. package/dist/development/client/errors.d.mts +48 -0
  267. package/dist/development/client/errors.mjs +57 -0
  268. package/dist/development/client/errors.mjs.map +1 -0
  269. package/dist/development/client/index.d.mts +4 -0
  270. package/dist/development/client/types.d.mts +147 -0
  271. package/dist/development/core/analytics/cart-tracker.d.mts +8 -0
  272. package/dist/development/core/analytics/cart-tracker.mjs +144 -0
  273. package/dist/development/core/analytics/cart-tracker.mjs.map +1 -0
  274. package/dist/development/core/analytics/events.d.mts +15 -0
  275. package/dist/development/core/analytics/events.mjs +15 -0
  276. package/dist/development/core/analytics/events.mjs.map +1 -0
  277. package/dist/development/core/analytics/index.d.mts +3 -0
  278. package/dist/development/core/analytics/types.d.mts +143 -0
  279. package/dist/development/core/analytics/utils/flatten-connection.d.mts +19 -0
  280. package/dist/development/core/analytics/utils/flatten-connection.mjs +25 -0
  281. package/dist/development/core/analytics/utils/flatten-connection.mjs.map +1 -0
  282. package/dist/development/core/cache/cache-status.mjs +17 -0
  283. package/dist/development/core/cache/cache-status.mjs.map +1 -0
  284. package/dist/development/core/cache/fetch-with-cache.d.mts +43 -0
  285. package/dist/development/core/cache/fetch-with-cache.mjs +188 -0
  286. package/dist/development/core/cache/fetch-with-cache.mjs.map +1 -0
  287. package/dist/development/core/cache/key.d.mts +6 -0
  288. package/dist/development/core/cache/key.mjs +27 -0
  289. package/dist/development/core/cache/key.mjs.map +1 -0
  290. package/dist/development/core/cache/run-with-cache.d.mts +36 -0
  291. package/dist/development/core/cache/run-with-cache.mjs +114 -0
  292. package/dist/development/core/cache/run-with-cache.mjs.map +1 -0
  293. package/dist/development/core/cache/store.d.mts +19 -0
  294. package/dist/development/core/cache/store.mjs +62 -0
  295. package/dist/development/core/cache/store.mjs.map +1 -0
  296. package/dist/development/core/cache/strategies.d.mts +39 -0
  297. package/dist/development/core/cache/strategies.mjs +70 -0
  298. package/dist/development/core/cache/strategies.mjs.map +1 -0
  299. package/dist/development/core/cart/actions.d.mts +50 -0
  300. package/dist/development/core/cart/actions.mjs +240 -0
  301. package/dist/development/core/cart/actions.mjs.map +1 -0
  302. package/dist/development/core/cart/attach-quantity-input.d.mts +5 -0
  303. package/dist/development/core/cart/attach-quantity-input.mjs +17 -0
  304. package/dist/development/core/cart/attach-quantity-input.mjs.map +1 -0
  305. package/dist/development/core/cart/buyer-identity-sync.d.mts +19 -0
  306. package/dist/development/core/cart/buyer-identity-sync.mjs +6 -0
  307. package/dist/development/core/cart/buyer-identity-sync.mjs.map +1 -0
  308. package/dist/development/core/cart/cart.d.mts +37 -0
  309. package/dist/development/core/cart/cart.mjs +1707 -0
  310. package/dist/development/core/cart/cart.mjs.map +1 -0
  311. package/dist/development/core/cart/cookie.d.mts +5 -0
  312. package/dist/development/core/cart/cookie.mjs +28 -0
  313. package/dist/development/core/cart/cookie.mjs.map +1 -0
  314. package/dist/development/core/cart/form.d.mts +130 -0
  315. package/dist/development/core/cart/form.mjs +75 -0
  316. package/dist/development/core/cart/form.mjs.map +1 -0
  317. package/dist/development/core/cart/get-cart.d.mts +25 -0
  318. package/dist/development/core/cart/get-cart.mjs +32 -0
  319. package/dist/development/core/cart/get-cart.mjs.map +1 -0
  320. package/dist/development/core/cart/index.d.mts +10 -0
  321. package/dist/development/core/cart/quantity.d.mts +10 -0
  322. package/dist/development/core/cart/quantity.mjs +14 -0
  323. package/dist/development/core/cart/quantity.mjs.map +1 -0
  324. package/dist/development/core/cart/queries.d.mts +4296 -0
  325. package/dist/development/core/cart/queries.mjs +70 -0
  326. package/dist/development/core/cart/queries.mjs.map +1 -0
  327. package/dist/development/core/cart/server-handlers.d.mts +82 -0
  328. package/dist/development/core/cart/server-handlers.mjs +322 -0
  329. package/dist/development/core/cart/server-handlers.mjs.map +1 -0
  330. package/dist/development/core/cart/state.d.mts +137 -0
  331. package/dist/development/core/cart/state.mjs +76 -0
  332. package/dist/development/core/cart/state.mjs.map +1 -0
  333. package/dist/development/core/cart/sync-quantity-inputs.mjs +16 -0
  334. package/dist/development/core/cart/sync-quantity-inputs.mjs.map +1 -0
  335. package/dist/development/core/collection/collection.d.mts +134 -0
  336. package/dist/development/core/collection/collection.mjs +170 -0
  337. package/dist/development/core/collection/collection.mjs.map +1 -0
  338. package/dist/development/core/collection/index.d.mts +6 -0
  339. package/dist/development/core/collection/reconciler.d.mts +32 -0
  340. package/dist/development/core/collection/reconciler.mjs +89 -0
  341. package/dist/development/core/collection/reconciler.mjs.map +1 -0
  342. package/dist/development/core/collection/state.d.mts +66 -0
  343. package/dist/development/core/collection/state.mjs +20 -0
  344. package/dist/development/core/collection/state.mjs.map +1 -0
  345. package/dist/development/core/collection/url.d.mts +71 -0
  346. package/dist/development/core/collection/url.mjs +376 -0
  347. package/dist/development/core/collection/url.mjs.map +1 -0
  348. package/dist/development/core/constants.mjs +7 -0
  349. package/dist/development/core/constants.mjs.map +1 -0
  350. package/dist/development/core/development.d.mts +56 -0
  351. package/dist/development/core/development.mjs +45 -0
  352. package/dist/development/core/headers.mjs +43 -0
  353. package/dist/development/core/headers.mjs.map +1 -0
  354. package/dist/development/core/index.d.mts +54 -0
  355. package/dist/development/core/logging/logging.d.mts +21 -0
  356. package/dist/development/core/logging/logging.mjs +99 -0
  357. package/dist/development/core/logging/logging.mjs.map +1 -0
  358. package/dist/development/core/logging/types.d.mts +40 -0
  359. package/dist/development/core/logging/types.mjs +18 -0
  360. package/dist/development/core/logging/types.mjs.map +1 -0
  361. package/dist/development/core/money/cache.mjs +25 -0
  362. package/dist/development/core/money/cache.mjs.map +1 -0
  363. package/dist/development/core/money/format.d.mts +15 -0
  364. package/dist/development/core/money/format.mjs +243 -0
  365. package/dist/development/core/money/format.mjs.map +1 -0
  366. package/dist/development/core/money/types.d.mts +47 -0
  367. package/dist/development/core/observable.mjs +46 -0
  368. package/dist/development/core/observable.mjs.map +1 -0
  369. package/dist/development/core/predictive-search/constants.d.mts +5 -0
  370. package/dist/development/core/predictive-search/constants.mjs +6 -0
  371. package/dist/development/core/predictive-search/constants.mjs.map +1 -0
  372. package/dist/development/core/predictive-search/form.d.mts +31 -0
  373. package/dist/development/core/predictive-search/form.mjs +31 -0
  374. package/dist/development/core/predictive-search/form.mjs.map +1 -0
  375. package/dist/development/core/predictive-search/index.d.mts +6 -0
  376. package/dist/development/core/predictive-search/queries.d.mts +118 -0
  377. package/dist/development/core/predictive-search/queries.mjs +81 -0
  378. package/dist/development/core/predictive-search/queries.mjs.map +1 -0
  379. package/dist/development/core/predictive-search/search.d.mts +32 -0
  380. package/dist/development/core/predictive-search/search.mjs +74 -0
  381. package/dist/development/core/predictive-search/search.mjs.map +1 -0
  382. package/dist/development/core/predictive-search/server-handlers.d.mts +36 -0
  383. package/dist/development/core/predictive-search/server-handlers.mjs +113 -0
  384. package/dist/development/core/predictive-search/server-handlers.mjs.map +1 -0
  385. package/dist/development/core/predictive-search/store.d.mts +44 -0
  386. package/dist/development/core/predictive-search/store.mjs +224 -0
  387. package/dist/development/core/predictive-search/store.mjs.map +1 -0
  388. package/dist/development/core/predictive-search/url.d.mts +41 -0
  389. package/dist/development/core/predictive-search/url.mjs +71 -0
  390. package/dist/development/core/predictive-search/url.mjs.map +1 -0
  391. package/dist/development/core/product/accept-variant-id.mjs +98 -0
  392. package/dist/development/core/product/accept-variant-id.mjs.map +1 -0
  393. package/dist/development/core/product/form.d.mts +63 -0
  394. package/dist/development/core/product/form.mjs +44 -0
  395. package/dist/development/core/product/form.mjs.map +1 -0
  396. package/dist/development/core/product/index.d.mts +5 -0
  397. package/dist/development/core/product/options.d.mts +43 -0
  398. package/dist/development/core/product/options.mjs +296 -0
  399. package/dist/development/core/product/options.mjs.map +1 -0
  400. package/dist/development/core/product/product-form.d.mts +72 -0
  401. package/dist/development/core/product/product-form.mjs +158 -0
  402. package/dist/development/core/product/product-form.mjs.map +1 -0
  403. package/dist/development/core/product/state.d.mts +68 -0
  404. package/dist/development/core/product/url.d.mts +47 -0
  405. package/dist/development/core/product/url.mjs +69 -0
  406. package/dist/development/core/product/url.mjs.map +1 -0
  407. package/dist/development/core/request-context.d.mts +75 -0
  408. package/dist/development/core/request-context.mjs +141 -0
  409. package/dist/development/core/request-context.mjs.map +1 -0
  410. package/dist/development/core/request-routing/handle-shopify-redirects.d.mts +17 -0
  411. package/dist/development/core/request-routing/handle-shopify-redirects.mjs +31 -0
  412. package/dist/development/core/request-routing/handle-shopify-redirects.mjs.map +1 -0
  413. package/dist/development/core/request-routing/handle-shopify-routes.d.mts +1 -0
  414. package/dist/development/core/request-routing/handle-shopify-routes.development.d.mts +11 -0
  415. package/dist/development/core/request-routing/handle-shopify-routes.development.mjs +16 -0
  416. package/dist/development/core/request-routing/handle-shopify-routes.development.mjs.map +1 -0
  417. package/dist/development/core/request-routing/handle-shopify-routes.mjs +42 -0
  418. package/dist/development/core/request-routing/handle-shopify-routes.mjs.map +1 -0
  419. package/dist/development/core/request-routing/interceptors/admin-redirect.mjs +12 -0
  420. package/dist/development/core/request-routing/interceptors/admin-redirect.mjs.map +1 -0
  421. package/dist/development/core/request-routing/interceptors/ajax-api.mjs +16 -0
  422. package/dist/development/core/request-routing/interceptors/ajax-api.mjs.map +1 -0
  423. package/dist/development/core/request-routing/interceptors/api-proxy.mjs +20 -0
  424. package/dist/development/core/request-routing/interceptors/api-proxy.mjs.map +1 -0
  425. package/dist/development/core/request-routing/interceptors/checkout.mjs +58 -0
  426. package/dist/development/core/request-routing/interceptors/checkout.mjs.map +1 -0
  427. package/dist/development/core/request-routing/interceptors/graphiql.mjs +46 -0
  428. package/dist/development/core/request-routing/interceptors/graphiql.mjs.map +1 -0
  429. package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs +23 -0
  430. package/dist/development/core/request-routing/interceptors/mcp-proxy.mjs.map +1 -0
  431. package/dist/development/core/request-routing/interceptors/proxy.mjs +73 -0
  432. package/dist/development/core/request-routing/interceptors/proxy.mjs.map +1 -0
  433. package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs +22 -0
  434. package/dist/development/core/request-routing/interceptors/query-param-redirect.mjs.map +1 -0
  435. package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs +27 -0
  436. package/dist/development/core/request-routing/interceptors/sfapi-proxy.mjs.map +1 -0
  437. package/dist/development/core/request-routing/interceptors/standard-routes.mjs +19 -0
  438. package/dist/development/core/request-routing/interceptors/standard-routes.mjs.map +1 -0
  439. package/dist/development/core/request-routing/interceptors/url-redirects.mjs +27 -0
  440. package/dist/development/core/request-routing/interceptors/url-redirects.mjs.map +1 -0
  441. package/dist/development/core/request-routing/interceptors/well-known.mjs +22 -0
  442. package/dist/development/core/request-routing/interceptors/well-known.mjs.map +1 -0
  443. package/dist/development/core/request-routing/registered-routes.d.mts +7 -0
  444. package/dist/development/core/request-routing/registered-routes.mjs +72 -0
  445. package/dist/development/core/request-routing/registered-routes.mjs.map +1 -0
  446. package/dist/development/core/request-routing/route-types.d.mts +56 -0
  447. package/dist/development/core/request-routing/safe-apply-response-headers.mjs +16 -0
  448. package/dist/development/core/request-routing/safe-apply-response-headers.mjs.map +1 -0
  449. package/dist/development/core/shop-pay/shop-pay.d.mts +102 -0
  450. package/dist/development/core/shop-pay/shop-pay.mjs +289 -0
  451. package/dist/development/core/shop-pay/shop-pay.mjs.map +1 -0
  452. package/dist/development/core/shopify-scripts/analytics.mjs +26 -0
  453. package/dist/development/core/shopify-scripts/analytics.mjs.map +1 -0
  454. package/dist/development/core/shopify-scripts/consent.mjs +17 -0
  455. package/dist/development/core/shopify-scripts/consent.mjs.map +1 -0
  456. package/dist/development/core/shopify-scripts/constants.mjs +19 -0
  457. package/dist/development/core/shopify-scripts/constants.mjs.map +1 -0
  458. package/dist/development/core/shopify-scripts/deprecated-cookies.mjs +97 -0
  459. package/dist/development/core/shopify-scripts/deprecated-cookies.mjs.map +1 -0
  460. package/dist/development/core/shopify-scripts/global.d.mts +1 -0
  461. package/dist/development/core/shopify-scripts/global.mjs +86 -0
  462. package/dist/development/core/shopify-scripts/global.mjs.map +1 -0
  463. package/dist/development/core/shopify-scripts/index.d.mts +27 -0
  464. package/dist/development/core/shopify-scripts/index.mjs +145 -0
  465. package/dist/development/core/shopify-scripts/index.mjs.map +1 -0
  466. package/dist/development/core/shopify-scripts/initialize.d.mts +18 -0
  467. package/dist/development/core/shopify-scripts/initialize.mjs +27 -0
  468. package/dist/development/core/shopify-scripts/initialize.mjs.map +1 -0
  469. package/dist/development/core/shopify-scripts/page-view.mjs +49 -0
  470. package/dist/development/core/shopify-scripts/page-view.mjs.map +1 -0
  471. package/dist/development/core/shopify-scripts/perfkit.mjs +33 -0
  472. package/dist/development/core/shopify-scripts/perfkit.mjs.map +1 -0
  473. package/dist/development/core/shopify-scripts/render.d.mts +1 -0
  474. package/dist/development/core/shopify-scripts/render.mjs +23 -0
  475. package/dist/development/core/shopify-scripts/render.mjs.map +1 -0
  476. package/dist/development/core/shopify-scripts/types.d.mts +76 -0
  477. package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs +43 -0
  478. package/dist/development/core/shopify-scripts/utils/cookie-domain.mjs.map +1 -0
  479. package/dist/development/core/shopify-scripts/utils/inline-script.mjs +8 -0
  480. package/dist/development/core/shopify-scripts/utils/inline-script.mjs.map +1 -0
  481. package/dist/development/core/shopify-scripts/utils/navigation.mjs +46 -0
  482. package/dist/development/core/shopify-scripts/utils/navigation.mjs.map +1 -0
  483. package/dist/development/core/shopify-scripts/utils/tracking-values.mjs +65 -0
  484. package/dist/development/core/shopify-scripts/utils/tracking-values.mjs.map +1 -0
  485. package/dist/development/core/shopify-scripts/utils/uuid.mjs +17 -0
  486. package/dist/development/core/shopify-scripts/utils/uuid.mjs.map +1 -0
  487. package/dist/development/core/shopify-scripts/webmcp.mjs +22 -0
  488. package/dist/development/core/shopify-scripts/webmcp.mjs.map +1 -0
  489. package/dist/development/core/standard-routes/build.d.mts +34 -0
  490. package/dist/development/core/standard-routes/build.mjs +54 -0
  491. package/dist/development/core/standard-routes/build.mjs.map +1 -0
  492. package/dist/development/core/standard-routes/defaults.mjs +31 -0
  493. package/dist/development/core/standard-routes/defaults.mjs.map +1 -0
  494. package/dist/development/core/standard-routes/match.mjs +108 -0
  495. package/dist/development/core/standard-routes/match.mjs.map +1 -0
  496. package/dist/development/core/standard-routes/path.mjs +58 -0
  497. package/dist/development/core/standard-routes/path.mjs.map +1 -0
  498. package/dist/development/core/standard-routes/redirects.mjs +51 -0
  499. package/dist/development/core/standard-routes/redirects.mjs.map +1 -0
  500. package/dist/development/core/standard-routes/types.d.mts +95 -0
  501. package/dist/development/core/types.d.mts +11 -0
  502. package/dist/development/core/url.mjs +42 -0
  503. package/dist/development/core/url.mjs.map +1 -0
  504. package/dist/development/core/utils/load-script.mjs +34 -0
  505. package/dist/development/core/utils/load-script.mjs.map +1 -0
  506. package/dist/development/core/utils/parse-gid.mjs +33 -0
  507. package/dist/development/core/utils/parse-gid.mjs.map +1 -0
  508. package/dist/development/customer-account/session.d.mts +46 -0
  509. package/dist/development/customer-account/session.mjs +21 -0
  510. package/dist/development/customer-account/session.mjs.map +1 -0
  511. package/dist/development/globals.d.mts +64 -0
  512. package/dist/development/graphql/generated/customer-account-api-types.d.mts +13 -0
  513. package/dist/development/graphql/generated/graphql-env.d.mts +19280 -0
  514. package/dist/development/graphql/generated/storefront-api-types.d.mts +47 -0
  515. package/dist/development/graphql/graphql.d.mts +40 -0
  516. package/dist/development/graphql/graphql.mjs +16 -0
  517. package/dist/development/graphql/graphql.mjs.map +1 -0
  518. package/dist/development/graphql/index.d.mts +2 -0
  519. package/dist/development/graphql/scalars.d.mts +15 -0
  520. package/dist/development/graphql/type-resolver.d.mts +229 -0
  521. package/dist/development/react/cart.d.mts +44 -0
  522. package/dist/development/react/cart.mjs +155 -0
  523. package/dist/development/react/cart.mjs.map +1 -0
  524. package/dist/development/react/collection.d.mts +91 -0
  525. package/dist/development/react/collection.mjs +129 -0
  526. package/dist/development/react/collection.mjs.map +1 -0
  527. package/dist/development/react/index.d.mts +13 -0
  528. package/dist/development/react/index.mjs +10 -0
  529. package/dist/development/react/predictive-search.d.mts +49 -0
  530. package/dist/development/react/predictive-search.mjs +133 -0
  531. package/dist/development/react/predictive-search.mjs.map +1 -0
  532. package/dist/development/react/product.d.mts +72 -0
  533. package/dist/development/react/product.mjs +127 -0
  534. package/dist/development/react/product.mjs.map +1 -0
  535. package/dist/development/react/shop-pay.d.mts +9 -0
  536. package/dist/development/react/shop-pay.mjs +16 -0
  537. package/dist/development/react/shop-pay.mjs.map +1 -0
  538. package/dist/development/react/shopify-scripts.d.mts +20 -0
  539. package/dist/development/react/shopify-scripts.mjs +39 -0
  540. package/dist/development/react/shopify-scripts.mjs.map +1 -0
  541. package/dist/development/vendor/standard-actions.d.mts +134 -0
  542. package/dist/development/vendor/standard-events.d.mts +1107 -0
  543. package/dist/development/vue/cart.d.mts +46 -0
  544. package/dist/development/vue/cart.mjs +122 -0
  545. package/dist/development/vue/cart.mjs.map +1 -0
  546. package/dist/development/vue/collection.d.mts +46 -0
  547. package/dist/development/vue/collection.mjs +108 -0
  548. package/dist/development/vue/collection.mjs.map +1 -0
  549. package/dist/development/vue/index.d.mts +11 -0
  550. package/dist/development/vue/index.mjs +8 -0
  551. package/dist/development/vue/predictive-search.d.mts +124 -0
  552. package/dist/development/vue/predictive-search.mjs +171 -0
  553. package/dist/development/vue/predictive-search.mjs.map +1 -0
  554. package/dist/development/vue/product.d.mts +57 -0
  555. package/dist/development/vue/product.mjs +167 -0
  556. package/dist/development/vue/product.mjs.map +1 -0
  557. package/dist/development/vue/shop-pay.d.mts +25 -0
  558. package/dist/development/vue/shop-pay.mjs +35 -0
  559. package/dist/development/vue/shop-pay.mjs.map +1 -0
  560. package/dist/development/vue/shopify-scripts.d.mts +127 -0
  561. package/dist/development/vue/shopify-scripts.mjs +79 -0
  562. package/dist/development/vue/shopify-scripts.mjs.map +1 -0
  563. package/dist/globals.d.mts +64 -0
  564. package/dist/graphql/generated/customer-account-api-types.d.mts +13 -0
  565. package/dist/graphql/generated/customer-account-graphql-env.d.mts +22170 -0
  566. package/dist/graphql/generated/graphql-env.d.mts +19280 -0
  567. package/dist/graphql/generated/storefront-api-types.d.mts +47 -0
  568. package/dist/graphql/graphql.d.mts +40 -0
  569. package/dist/graphql/graphql.mjs +16 -0
  570. package/dist/graphql/graphql.mjs.map +1 -0
  571. package/dist/graphql/index.d.mts +2 -0
  572. package/dist/graphql/scalars.d.mts +26 -0
  573. package/dist/graphql/type-resolver.d.mts +229 -0
  574. package/dist/react/cart.d.mts +44 -0
  575. package/dist/react/cart.mjs +155 -0
  576. package/dist/react/cart.mjs.map +1 -0
  577. package/dist/react/collection.d.mts +91 -0
  578. package/dist/react/collection.mjs +129 -0
  579. package/dist/react/collection.mjs.map +1 -0
  580. package/dist/react/index.d.mts +13 -0
  581. package/dist/react/index.mjs +10 -0
  582. package/dist/react/predictive-search.d.mts +49 -0
  583. package/dist/react/predictive-search.mjs +133 -0
  584. package/dist/react/predictive-search.mjs.map +1 -0
  585. package/dist/react/product.d.mts +72 -0
  586. package/dist/react/product.mjs +127 -0
  587. package/dist/react/product.mjs.map +1 -0
  588. package/dist/react/shop-pay.d.mts +9 -0
  589. package/dist/react/shop-pay.mjs +16 -0
  590. package/dist/react/shop-pay.mjs.map +1 -0
  591. package/dist/react/shopify-scripts.d.mts +20 -0
  592. package/dist/react/shopify-scripts.mjs +39 -0
  593. package/dist/react/shopify-scripts.mjs.map +1 -0
  594. package/dist/storefront-api-types.d.ts +2351 -2390
  595. package/dist/storefront.schema.json +41534 -1
  596. package/dist/ts-plugin/index.cjs +68 -0
  597. package/dist/ts-plugin/index.cjs.map +1 -0
  598. package/dist/ts-plugin/index.d.cts +4 -0
  599. package/dist/vendor/standard-actions.d.mts +134 -0
  600. package/dist/vendor/standard-events.d.mts +1107 -0
  601. package/dist/vite/certificate-prompt.mjs +24 -0
  602. package/dist/vite/certificate-prompt.mjs.map +1 -0
  603. package/dist/vite/index.d.mts +2 -0
  604. package/dist/vite/index.mjs +3 -0
  605. package/dist/vite/local-https.d.mts +47 -0
  606. package/dist/vite/local-https.mjs +276 -0
  607. package/dist/vite/local-https.mjs.map +1 -0
  608. package/dist/vite/mkcert.mjs +141 -0
  609. package/dist/vite/mkcert.mjs.map +1 -0
  610. package/dist/vue/cart.d.mts +46 -0
  611. package/dist/vue/cart.mjs +122 -0
  612. package/dist/vue/cart.mjs.map +1 -0
  613. package/dist/vue/collection.d.mts +46 -0
  614. package/dist/vue/collection.mjs +108 -0
  615. package/dist/vue/collection.mjs.map +1 -0
  616. package/dist/vue/index.d.mts +11 -0
  617. package/dist/vue/index.mjs +8 -0
  618. package/dist/vue/predictive-search.d.mts +124 -0
  619. package/dist/vue/predictive-search.mjs +171 -0
  620. package/dist/vue/predictive-search.mjs.map +1 -0
  621. package/dist/vue/product.d.mts +57 -0
  622. package/dist/vue/product.mjs +167 -0
  623. package/dist/vue/product.mjs.map +1 -0
  624. package/dist/vue/shop-pay.d.mts +25 -0
  625. package/dist/vue/shop-pay.mjs +35 -0
  626. package/dist/vue/shop-pay.mjs.map +1 -0
  627. package/dist/vue/shopify-scripts.d.mts +127 -0
  628. package/dist/vue/shopify-scripts.mjs +79 -0
  629. package/dist/vue/shopify-scripts.mjs.map +1 -0
  630. package/package.json +116 -86
  631. package/skills/hydrogen-analytics/SKILL.md +80 -0
  632. package/skills/hydrogen-analytics/references/react.md +160 -0
  633. package/skills/hydrogen-analytics/references/vue.md +80 -0
  634. package/skills/hydrogen-cart-drawer/SKILL.md +248 -0
  635. package/skills/hydrogen-cart-drawer/references/accessibility.md +109 -0
  636. package/skills/hydrogen-cart-drawer/references/css.md +67 -0
  637. package/skills/hydrogen-cart-ui/SKILL.md +224 -0
  638. package/skills/hydrogen-cart-ui/references/nextjs.md +89 -0
  639. package/skills/hydrogen-cart-ui/references/react.md +285 -0
  640. package/skills/hydrogen-cart-ui/references/vue.md +228 -0
  641. package/skills/hydrogen-collection-browser/SKILL.md +83 -0
  642. package/skills/hydrogen-collection-browser/references/nextjs.md +118 -0
  643. package/skills/hydrogen-collection-browser/references/nuxt.md +108 -0
  644. package/skills/hydrogen-collection-browser/references/react.md +301 -0
  645. package/skills/hydrogen-customer-account/SKILL.md +107 -0
  646. package/skills/hydrogen-image/SKILL.md +65 -0
  647. package/skills/hydrogen-local-https/SKILL.md +142 -0
  648. package/skills/hydrogen-markets/SKILL.md +221 -0
  649. package/skills/hydrogen-markets/references/nextjs.md +157 -0
  650. package/skills/hydrogen-money/SKILL.md +67 -0
  651. package/skills/hydrogen-oxygen/SKILL.md +245 -0
  652. package/skills/hydrogen-oxygen/references/react-router.md +230 -0
  653. package/skills/hydrogen-predictive-search/SKILL.md +130 -0
  654. package/skills/hydrogen-predictive-search/references/react.md +32 -0
  655. package/skills/hydrogen-predictive-search/references/vue.md +40 -0
  656. package/skills/hydrogen-request-handlers/SKILL.md +107 -0
  657. package/skills/hydrogen-request-handlers/references/frameworks.md +179 -0
  658. package/skills/hydrogen-request-handlers/references/nextjs.md +137 -0
  659. package/skills/hydrogen-request-handlers/references/nuxt.md +215 -0
  660. package/skills/hydrogen-routing/SKILL.md +171 -0
  661. package/skills/hydrogen-setup/SKILL.md +50 -0
  662. package/skills/hydrogen-setup/references/analytics.md +624 -0
  663. package/skills/hydrogen-setup/steps/1-inspect-app.md +62 -0
  664. package/skills/hydrogen-setup/steps/10-analytics.md +10 -0
  665. package/skills/hydrogen-setup/steps/11-verify.md +31 -0
  666. package/skills/hydrogen-setup/steps/2-scaffold.md +86 -0
  667. package/skills/hydrogen-setup/steps/3-build-home-page.md +37 -0
  668. package/skills/hydrogen-setup/steps/4-collection-and-search.md +14 -0
  669. package/skills/hydrogen-setup/steps/5-cart.md +10 -0
  670. package/skills/hydrogen-setup/steps/6-product-detail-page.md +416 -0
  671. package/skills/hydrogen-setup/steps/7-shopify-runtime-scripts.md +69 -0
  672. package/skills/hydrogen-setup/steps/8-cart-drawer-and-navbar.md +35 -0
  673. package/skills/hydrogen-setup/steps/9-account-page.md +54 -0
  674. package/skills/hydrogen-shop-pay/SKILL.md +79 -0
  675. package/skills/hydrogen-shop-pay/references/core.md +66 -0
  676. package/skills/hydrogen-shop-pay/references/react.md +50 -0
  677. package/skills/hydrogen-shop-pay/references/vue.md +39 -0
  678. package/skills/hydrogen-smoke-test/SKILL.md +205 -0
  679. package/skills/hydrogen-storefront-client/SKILL.md +322 -0
  680. package/skills/hydrogen-storefront-client/references/astro.md +125 -0
  681. package/skills/hydrogen-storefront-client/references/caching.md +25 -0
  682. package/skills/hydrogen-storefront-client/references/nextjs.md +121 -0
  683. package/skills/hydrogen-storefront-client/references/nuxt.md +121 -0
  684. package/skills/hydrogen-storefront-client/references/query-validation.md +95 -0
  685. package/skills/hydrogen-storefront-client/references/react-router.md +81 -0
  686. package/skills/hydrogen-storefront-client/references/solidstart.md +131 -0
  687. package/skills/hydrogen-storefront-client/references/sveltekit.md +169 -0
  688. package/skills/hydrogen-variant-form/SKILL.md +267 -0
  689. package/skills/hydrogen-variant-form/references/nextjs.md +207 -0
  690. package/skills/hydrogen-variant-form/references/nuxt.md +95 -0
  691. package/skills/hydrogen-variant-form/references/react.md +71 -0
  692. package/dist/dev/get-virtual-routes-H72465VB.js +0 -74
  693. package/dist/dev/hydrogen-routes.d.ts +0 -5
  694. package/dist/dev/hydrogen-routes.js +0 -25
  695. package/dist/development/get-virtual-routes-ACFZHU42.js +0 -71
  696. package/dist/development/get-virtual-routes-ACFZHU42.js.map +0 -1
  697. package/dist/development/index.cjs +0 -6978
  698. package/dist/development/index.cjs.map +0 -1
  699. package/dist/development/index.js +0 -6631
  700. package/dist/development/index.js.map +0 -1
  701. package/dist/development/log-seo-tags-IG37ONQ2.js +0 -74
  702. package/dist/development/log-seo-tags-IG37ONQ2.js.map +0 -1
  703. package/dist/development/react-router-preset.d.ts +0 -45
  704. package/dist/development/react-router-preset.js +0 -49
  705. package/dist/development/react-router-preset.js.map +0 -1
  706. package/dist/index.cjs +0 -1
  707. package/dist/oxygen/index.d.ts +0 -197
  708. package/dist/oxygen/index.js +0 -107
  709. package/dist/production/get-virtual-routes-ZZEGQQDV.js +0 -3
  710. package/dist/production/get-virtual-routes-ZZEGQQDV.js.map +0 -1
  711. package/dist/production/index.cjs +0 -1019
  712. package/dist/production/index.cjs.map +0 -1
  713. package/dist/production/index.d.cts +0 -3260
  714. package/dist/production/index.d.ts +0 -3260
  715. package/dist/production/index.js +0 -1019
  716. package/dist/production/index.js.map +0 -1
  717. package/dist/production/log-seo-tags-TY72EQWZ.js +0 -2
  718. package/dist/production/log-seo-tags-TY72EQWZ.js.map +0 -1
  719. package/dist/production/react-router-preset.d.ts +0 -45
  720. package/dist/production/react-router-preset.js +0 -11
  721. package/dist/react-router.d.ts +0 -75
  722. package/dist/vite/chunk-4O5OI3OO.js +0 -127
  723. package/dist/vite/chunk-FAQ7TVHC.js +0 -9
  724. package/dist/vite/chunk-QXBQVDMY.js +0 -68
  725. package/dist/vite/compat-date.d.ts +0 -3
  726. package/dist/vite/compat-date.js +0 -6
  727. package/dist/vite/get-virtual-routes.d.ts +0 -21
  728. package/dist/vite/get-virtual-routes.js +0 -74
  729. package/dist/vite/hydrogen-middleware.d.ts +0 -9
  730. package/dist/vite/hydrogen-middleware.js +0 -7
  731. package/dist/vite/plugin.d.ts +0 -22
  732. package/dist/vite/plugin.js +0 -171
  733. package/dist/vite/request-events.d.ts +0 -144
  734. package/dist/vite/request-events.js +0 -10
  735. package/dist/vite/types.d.ts +0 -5
  736. package/dist/vite/types.js +0 -0
  737. package/dist/vite/virtual-routes/assets/debug-network.css +0 -609
  738. package/dist/vite/virtual-routes/assets/favicon-dark.svg +0 -20
  739. package/dist/vite/virtual-routes/assets/favicon.svg +0 -28
  740. package/dist/vite/virtual-routes/assets/inter-variable-font.woff2 +0 -0
  741. package/dist/vite/virtual-routes/assets/jetbrainsmono-variable-font.woff2 +0 -0
  742. package/dist/vite/virtual-routes/assets/styles.css +0 -249
  743. package/dist/vite/virtual-routes/components/FlameChartWrapper.jsx +0 -123
  744. package/dist/vite/virtual-routes/components/HydrogenLogoBaseBW.jsx +0 -32
  745. package/dist/vite/virtual-routes/components/HydrogenLogoBaseColor.jsx +0 -47
  746. package/dist/vite/virtual-routes/components/IconBanner.jsx +0 -292
  747. package/dist/vite/virtual-routes/components/IconClose.jsx +0 -38
  748. package/dist/vite/virtual-routes/components/IconDiscard.jsx +0 -44
  749. package/dist/vite/virtual-routes/components/IconError.jsx +0 -61
  750. package/dist/vite/virtual-routes/components/IconGithub.jsx +0 -23
  751. package/dist/vite/virtual-routes/components/IconTwitter.jsx +0 -21
  752. package/dist/vite/virtual-routes/components/Layout.jsx +0 -7
  753. package/dist/vite/virtual-routes/components/RequestDetails.jsx +0 -171
  754. package/dist/vite/virtual-routes/components/RequestTable.jsx +0 -91
  755. package/dist/vite/virtual-routes/components/RequestWaterfall.jsx +0 -151
  756. package/dist/vite/virtual-routes/layout.jsx +0 -33
  757. package/dist/vite/virtual-routes/lib/useDebugNetworkServer.jsx +0 -178
  758. package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.jsx +0 -37
  759. package/dist/vite/virtual-routes/routes/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.tsx +0 -79
  760. package/dist/vite/virtual-routes/routes/graphiql.jsx +0 -5
  761. package/dist/vite/virtual-routes/routes/index.jsx +0 -265
  762. package/dist/vite/virtual-routes/routes/subrequest-profiler.jsx +0 -243
  763. package/dist/vite/virtual-routes/virtual-root-with-layout.jsx +0 -63
  764. package/dist/vite/virtual-routes/virtual-root.jsx +0 -67
@@ -0,0 +1,24 @@
1
+ import { createInterface } from "node:readline/promises";
2
+
3
+ //#region src/vite/certificate-prompt.ts
4
+ async function confirmCertificateInstallation(host) {
5
+ if (!process.stdin.isTTY || !process.stdout.isTTY) return false;
6
+ const readline = createInterface({
7
+ input: process.stdin,
8
+ output: process.stdout
9
+ });
10
+ try {
11
+ return acceptsCertificateInstallation(await readline.question(`To run HTTPS in development, Hydrogen needs to download mkcert, add a local certificate authority to your system trust store, and create a certificate for "${host}". Continue? [Y/n] `));
12
+ } finally {
13
+ readline.close();
14
+ }
15
+ }
16
+ /** @internal Exported for tests. */
17
+ function acceptsCertificateInstallation(answer) {
18
+ const response = answer.trim().toLowerCase();
19
+ return response === "" || response === "y" || response === "yes";
20
+ }
21
+
22
+ //#endregion
23
+ export { confirmCertificateInstallation };
24
+ //# sourceMappingURL=certificate-prompt.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certificate-prompt.mjs","names":[],"sources":["../../src/vite/certificate-prompt.ts"],"sourcesContent":["import { createInterface } from \"node:readline/promises\";\n\nexport async function confirmCertificateInstallation(host: string): Promise<boolean> {\n if (!process.stdin.isTTY || !process.stdout.isTTY) return false;\n\n const readline = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = await readline.question(\n `To run HTTPS in development, Hydrogen needs to download mkcert, add a local certificate authority to your system trust store, and create a certificate for \"${host}\". Continue? [Y/n] `,\n );\n\n return acceptsCertificateInstallation(answer);\n } finally {\n readline.close();\n }\n}\n\n/** @internal Exported for tests. */\nexport function acceptsCertificateInstallation(answer: string): boolean {\n const response = answer.trim().toLowerCase();\n return response === \"\" || response === \"y\" || response === \"yes\";\n}\n"],"mappings":";;;AAEA,eAAsB,+BAA+B,MAAgC;AACnF,KAAI,CAAC,QAAQ,MAAM,SAAS,CAAC,QAAQ,OAAO,MAAO,QAAO;CAE1D,MAAM,WAAW,gBAAgB;EAAE,OAAO,QAAQ;EAAO,QAAQ,QAAQ;EAAQ,CAAC;AAClF,KAAI;AAKF,SAAO,+BAA+B,MAJjB,SAAS,SAC5B,+JAA+J,KAAK,qBACrK,CAE4C;WACrC;AACR,WAAS,OAAO;;;;AAKpB,SAAgB,+BAA+B,QAAyB;CACtE,MAAM,WAAW,OAAO,MAAM,CAAC,aAAa;AAC5C,QAAO,aAAa,MAAM,aAAa,OAAO,aAAa"}
@@ -0,0 +1,2 @@
1
+ import { LOCAL_HTTPS_DEFAULTS, LocalHttpsDevServerConfig, LocalHttpsOptions, LocalHttpsPlugin, ProvisionLocalHttpsOptions, localHttps, provisionLocalHttps } from "./local-https.mjs";
2
+ export { LOCAL_HTTPS_DEFAULTS, LocalHttpsDevServerConfig, LocalHttpsOptions, LocalHttpsPlugin, ProvisionLocalHttpsOptions, localHttps, provisionLocalHttps };
@@ -0,0 +1,3 @@
1
+ import { LOCAL_HTTPS_DEFAULTS, localHttps, provisionLocalHttps } from "./local-https.mjs";
2
+
3
+ export { LOCAL_HTTPS_DEFAULTS, localHttps, provisionLocalHttps };
@@ -0,0 +1,47 @@
1
+ import { Plugin } from "vite";
2
+
3
+ //#region src/vite/local-https.d.ts
4
+ declare const LOCAL_HTTPS_DEFAULTS: {
5
+ readonly host: "local.tryhydrogen.dev";
6
+ readonly port: 5173;
7
+ };
8
+ /** Options for Hydrogen's local HTTPS Vite plugin. */
9
+ type LocalHttpsOptions = {
10
+ /** Enable trusted local HTTPS for the dev server. */enabled: boolean; /** Local hostname registered in Shopify admin. Defaults to `local.tryhydrogen.dev`. */
11
+ host?: string; /** Local port registered in Shopify admin. Defaults to `5173`. */
12
+ port?: number; /** Certificate file path. Defaults to Hydrogen's mkcert path under `~/.shopify/hydrogen/certs`. */
13
+ certPath?: string | URL; /** Private key file path. Defaults to Hydrogen's mkcert path under `~/.shopify/hydrogen/certs`. */
14
+ keyPath?: string | URL;
15
+ };
16
+ type LocalHttpsPlugin = Plugin & {
17
+ api: {
18
+ /** Returns host, port, and TLS file paths for frameworks that terminate HTTPS outside Vite. */getDevServerConfig(): LocalHttpsDevServerConfig | undefined;
19
+ };
20
+ };
21
+ type LocalHttpsDevServerConfig = {
22
+ host: string;
23
+ port: number;
24
+ https: {
25
+ cert: string;
26
+ key: string;
27
+ };
28
+ };
29
+ /**
30
+ * Configures Vite for trusted local HTTPS on Hydrogen's default development host.
31
+ */
32
+ declare function localHttps(options: LocalHttpsOptions): LocalHttpsPlugin;
33
+ type ProvisionLocalHttpsOptions = Omit<LocalHttpsOptions, "enabled" | "port">;
34
+ /**
35
+ * Downloads a pinned, checksum-verified mkcert release and generates the
36
+ * trusted local certificate files when they do not exist yet. The Vite plugin
37
+ * runs this automatically on `vite dev`; call it directly for frameworks that
38
+ * read certificate paths before Vite starts or from setup scripts.
39
+ */
40
+ declare function provisionLocalHttps(options?: ProvisionLocalHttpsOptions): Promise<{
41
+ host: string;
42
+ certPath: string;
43
+ keyPath: string;
44
+ }>;
45
+ //#endregion
46
+ export { LOCAL_HTTPS_DEFAULTS, LocalHttpsDevServerConfig, LocalHttpsOptions, LocalHttpsPlugin, ProvisionLocalHttpsOptions, localHttps, provisionLocalHttps };
47
+ //# sourceMappingURL=local-https.d.mts.map
@@ -0,0 +1,276 @@
1
+ import { CUSTOMER_ACCOUNT_PATHS } from "../core/url.mjs";
2
+ import { confirmCertificateInstallation } from "./certificate-prompt.mjs";
3
+ import { provisionCertificates } from "./mkcert.mjs";
4
+ import { existsSync, readFileSync } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ import { dirname, isAbsolute, join, resolve } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+
9
+ //#region src/vite/local-https.ts
10
+ const LOCAL_HTTPS_DEFAULTS = {
11
+ host: "local.tryhydrogen.dev",
12
+ port: 5173
13
+ };
14
+ const HEADER_PAIR_SIZE = 2;
15
+ const HTTP1_ONLY_RESPONSE_HEADERS = new Set([
16
+ "connection",
17
+ "keep-alive",
18
+ "proxy-authenticate",
19
+ "proxy-authorization",
20
+ "te",
21
+ "trailer",
22
+ "transfer-encoding",
23
+ "upgrade"
24
+ ]);
25
+ const emittedMissingCertificateWarnings = /* @__PURE__ */ new Set();
26
+ const loggedCustomerAccountSettings = /* @__PURE__ */ new Set();
27
+ /**
28
+ * Configures Vite for trusted local HTTPS on Hydrogen's default development host.
29
+ */
30
+ function localHttps(options) {
31
+ const settings = options.enabled ? resolveLocalHttpsSettings(options) : void 0;
32
+ let certificateFiles;
33
+ const getCertificateFiles = () => {
34
+ if (!settings) return;
35
+ certificateFiles ??= readCertificateFiles(settings);
36
+ return certificateFiles;
37
+ };
38
+ const getDevServerConfig = () => {
39
+ if (!settings || !checkCertificateFiles(settings)) return;
40
+ getCertificateFiles();
41
+ return {
42
+ host: settings.host,
43
+ port: settings.port,
44
+ https: {
45
+ cert: settings.certPath,
46
+ key: settings.keyPath
47
+ }
48
+ };
49
+ };
50
+ return {
51
+ name: "hydrogen-local-https",
52
+ api: { getDevServerConfig },
53
+ async config(_config, env) {
54
+ if (settings && env.command === "serve" && !env.isPreview) {
55
+ if (!await ensureCertificateFiles(settings)) return;
56
+ } else if (settings && !checkCertificateFiles(settings)) return;
57
+ const certificates = getCertificateFiles();
58
+ if (!settings || !certificates) return;
59
+ return { server: {
60
+ allowedHosts: [settings.host],
61
+ host: settings.host,
62
+ port: settings.port,
63
+ strictPort: true,
64
+ https: {
65
+ ALPNProtocols: ["http/1.1"],
66
+ cert: certificates.cert,
67
+ key: certificates.key
68
+ },
69
+ hmr: {
70
+ host: settings.host,
71
+ protocol: "wss"
72
+ }
73
+ } };
74
+ },
75
+ configureServer(server) {
76
+ if (!settings || !checkCertificateFiles(settings)) return;
77
+ getCertificateFiles();
78
+ configureLocalHttpsServer(server, settings);
79
+ }
80
+ };
81
+ }
82
+ /**
83
+ * Downloads a pinned, checksum-verified mkcert release and generates the
84
+ * trusted local certificate files when they do not exist yet. The Vite plugin
85
+ * runs this automatically on `vite dev`; call it directly for frameworks that
86
+ * read certificate paths before Vite starts or from setup scripts.
87
+ */
88
+ async function provisionLocalHttps(options = {}) {
89
+ const settings = resolveLocalHttpsSettings({
90
+ enabled: true,
91
+ ...options
92
+ });
93
+ if (!certificateFilesExist(settings)) await provisionCertificates(settings);
94
+ return {
95
+ host: settings.host,
96
+ certPath: settings.certPath,
97
+ keyPath: settings.keyPath
98
+ };
99
+ }
100
+ function resolveLocalHttpsSettings(options) {
101
+ const host = options.host ?? LOCAL_HTTPS_DEFAULTS.host;
102
+ const certificateDirectory = join(homedir(), ".shopify", "hydrogen", "certs");
103
+ return {
104
+ host,
105
+ port: options.port ?? LOCAL_HTTPS_DEFAULTS.port,
106
+ certPath: resolveCertificatePath(options.certPath ?? join(certificateDirectory, `${host}.pem`)),
107
+ keyPath: resolveCertificatePath(options.keyPath ?? join(certificateDirectory, `${host}-key.pem`))
108
+ };
109
+ }
110
+ function resolveCertificatePath(path) {
111
+ if (path instanceof URL) return fileURLToPath(path);
112
+ if (path === "~") return homedir();
113
+ if (path.startsWith("~/")) return resolve(homedir(), path.slice(2));
114
+ return isAbsolute(path) ? path : resolve(path);
115
+ }
116
+ function certificateFilesExist(settings) {
117
+ return existsSync(settings.certPath) && existsSync(settings.keyPath);
118
+ }
119
+ async function ensureCertificateFiles(settings) {
120
+ if (certificateFilesExist(settings)) return true;
121
+ if (isContinuousIntegration()) return checkCertificateFiles(settings, "Automatic certificate provisioning is skipped in CI environments (the CI environment variable is set).");
122
+ if (!await confirmCertificateInstallation(settings.host)) return checkCertificateFiles(settings, "Automatic certificate provisioning requires confirmation in an interactive terminal.");
123
+ try {
124
+ await provisionCertificates(settings);
125
+ return true;
126
+ } catch (error) {
127
+ return checkCertificateFiles(settings, `Automatic certificate provisioning failed:\n ${error instanceof Error ? error.message : String(error)}`);
128
+ }
129
+ }
130
+ function isContinuousIntegration() {
131
+ const ci = process.env.CI;
132
+ return ci !== void 0 && ci !== "" && ci !== "false" && ci !== "0";
133
+ }
134
+ function checkCertificateFiles(settings, provisioningNote) {
135
+ const missingPaths = [settings.certPath, settings.keyPath].filter((path) => !existsSync(path));
136
+ if (missingPaths.length === 0) return true;
137
+ const warning = formatMissingCertificateWarning(settings, missingPaths, provisioningNote);
138
+ if (!emittedMissingCertificateWarnings.has(warning)) {
139
+ emittedMissingCertificateWarnings.add(warning);
140
+ process.emitWarning(warning, { type: "HydrogenLocalHttpsWarning" });
141
+ }
142
+ return false;
143
+ }
144
+ function formatMissingCertificateWarning({ certPath, host, keyPath }, missingPaths, provisioningNote) {
145
+ const certificateDirectories = [...new Set([dirname(certPath), dirname(keyPath)])];
146
+ const provisioningFailure = provisioningNote === void 0 ? [] : ["", provisioningNote];
147
+ return [
148
+ "Local HTTPS is disabled because certificate files are missing:",
149
+ ...missingPaths.map((path) => ` ${path}`),
150
+ ...provisioningFailure,
151
+ "",
152
+ "Expected certificate files:",
153
+ ` Certificate: ${certPath}`,
154
+ ` Private key: ${keyPath}`,
155
+ "",
156
+ "Run the automatic setup:",
157
+ " npx hydrogen certs install",
158
+ "",
159
+ "Or install and configure mkcert, then generate the certificate:",
160
+ " macOS: brew install mkcert",
161
+ " mkcert -install",
162
+ ` mkdir -p ${certificateDirectories.map(shellQuote).join(" ")}`,
163
+ ` mkcert -cert-file ${shellQuote(certPath)} -key-file ${shellQuote(keyPath)} ${shellQuote(host)}`
164
+ ].join("\n");
165
+ }
166
+ function readCertificateFiles(settings) {
167
+ return {
168
+ cert: readCertificateFile(settings, "certificate", settings.certPath),
169
+ key: readCertificateFile(settings, "private key", settings.keyPath)
170
+ };
171
+ }
172
+ function readCertificateFile(settings, label, path) {
173
+ try {
174
+ return readFileSync(path);
175
+ } catch (error) {
176
+ throw new Error(formatCertificateReadError(settings, label, path, error), { cause: error });
177
+ }
178
+ }
179
+ function formatCertificateReadError({ certPath, host, keyPath }, label, path, error) {
180
+ const certificateDirectories = [...new Set([dirname(certPath), dirname(keyPath)])];
181
+ const reason = error instanceof Error ? error.message : String(error);
182
+ return [
183
+ `Local HTTPS requires a readable ${label} file:`,
184
+ ` ${path}`,
185
+ `Reason: ${reason}`,
186
+ "",
187
+ "Expected certificate files:",
188
+ ` Certificate: ${certPath}`,
189
+ ` Private key: ${keyPath}`,
190
+ "",
191
+ "Install and configure mkcert, then generate the certificate:",
192
+ " macOS: brew install mkcert",
193
+ " mkcert -install",
194
+ ` mkdir -p ${certificateDirectories.map(shellQuote).join(" ")}`,
195
+ ` mkcert -cert-file ${shellQuote(certPath)} -key-file ${shellQuote(keyPath)} ${shellQuote(host)}`
196
+ ].join("\n");
197
+ }
198
+ function shellQuote(value) {
199
+ return `'${value.replaceAll("'", `'\\''`)}'`;
200
+ }
201
+ function configureLocalHttpsServer(server, settings) {
202
+ const resolveBoundPort = () => {
203
+ const address = server.httpServer?.address();
204
+ return address && typeof address === "object" ? address.port : settings.port;
205
+ };
206
+ server.middlewares.use((request, response, next) => {
207
+ request.headers["x-forwarded-host"] ??= request.headers.host ?? `${settings.host}:${resolveBoundPort()}`;
208
+ request.headers["x-forwarded-proto"] ??= "https";
209
+ stripHttp1OnlyResponseHeaders(response);
210
+ next();
211
+ });
212
+ const logSettings = () => {
213
+ const port = resolveBoundPort();
214
+ const settingsKey = `${settings.host}:${port}`;
215
+ if (loggedCustomerAccountSettings.has(settingsKey)) return;
216
+ loggedCustomerAccountSettings.add(settingsKey);
217
+ server.config.logger.info(formatCustomerAccountSettings({
218
+ host: settings.host,
219
+ port
220
+ }));
221
+ };
222
+ if (server.httpServer) server.httpServer.once("listening", logSettings);
223
+ else logSettings();
224
+ }
225
+ function formatCustomerAccountSettings({ host, port }) {
226
+ const origin = `https://${host}`;
227
+ const portfulOrigin = `${origin}:${port}`;
228
+ return [
229
+ "",
230
+ "Customer Account API — make sure these values are configured for your storefront:",
231
+ "",
232
+ ` Callback URI(s) (required): ${portfulOrigin}${CUSTOMER_ACCOUNT_PATHS.authorize}`,
233
+ ` JavaScript origin(s): ${origin}`,
234
+ ` Logout URI: ${portfulOrigin}`,
235
+ ""
236
+ ].join("\n");
237
+ }
238
+ function stripHttp1OnlyResponseHeaders(response) {
239
+ const originalWriteHead = response.writeHead.bind(response);
240
+ response.writeHead = (statusCode, statusMessageOrHeaders, headers) => {
241
+ removeStoredHttp1OnlyHeaders(response);
242
+ if (typeof statusMessageOrHeaders === "string") return originalWriteHead(statusCode, statusMessageOrHeaders, sanitizeWriteHeadHeaders(headers));
243
+ return originalWriteHead(statusCode, sanitizeWriteHeadHeaders(statusMessageOrHeaders));
244
+ };
245
+ }
246
+ function removeStoredHttp1OnlyHeaders(response) {
247
+ for (const header of HTTP1_ONLY_RESPONSE_HEADERS) response.removeHeader(header);
248
+ }
249
+ function sanitizeWriteHeadHeaders(headers) {
250
+ if (Array.isArray(headers)) return sanitizeHeaderArray(headers);
251
+ if (headers) return sanitizeHeaderObject(headers);
252
+ return headers;
253
+ }
254
+ function sanitizeHeaderObject(headers) {
255
+ const sanitizedHeaders = {};
256
+ for (const [name, value] of Object.entries(headers)) if (!isHttp1OnlyHeader(name)) sanitizedHeaders[name] = value;
257
+ return sanitizedHeaders;
258
+ }
259
+ function sanitizeHeaderArray(headers) {
260
+ const sanitizedHeaders = [];
261
+ for (let index = 0; index < headers.length; index += HEADER_PAIR_SIZE) {
262
+ const name = headers[index];
263
+ const value = headers[index + 1];
264
+ if (typeof name === "string" && isHttp1OnlyHeader(name)) continue;
265
+ sanitizedHeaders.push(name);
266
+ if (value !== void 0) sanitizedHeaders.push(value);
267
+ }
268
+ return sanitizedHeaders;
269
+ }
270
+ function isHttp1OnlyHeader(name) {
271
+ return HTTP1_ONLY_RESPONSE_HEADERS.has(name.toLowerCase());
272
+ }
273
+
274
+ //#endregion
275
+ export { LOCAL_HTTPS_DEFAULTS, localHttps, provisionLocalHttps };
276
+ //# sourceMappingURL=local-https.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-https.mjs","names":[],"sources":["../../src/vite/local-https.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport type { OutgoingHttpHeader, OutgoingHttpHeaders, ServerResponse } from \"node:http\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { ConfigEnv, Plugin, ViteDevServer } from \"vite\";\n\nimport { CUSTOMER_ACCOUNT_PATHS } from \"../core/url\";\nimport { confirmCertificateInstallation } from \"./certificate-prompt\";\nimport { provisionCertificates } from \"./mkcert\";\n\nexport const LOCAL_HTTPS_DEFAULTS = {\n host: \"local.tryhydrogen.dev\",\n port: 5_173,\n} as const;\n\nconst HEADER_PAIR_SIZE = 2;\nconst HTTP1_ONLY_RESPONSE_HEADERS = new Set([\n \"connection\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n]);\nconst emittedMissingCertificateWarnings = new Set<string>();\nconst loggedCustomerAccountSettings = new Set<string>();\n\n/** Options for Hydrogen's local HTTPS Vite plugin. */\nexport type LocalHttpsOptions = {\n /** Enable trusted local HTTPS for the dev server. */\n enabled: boolean;\n /** Local hostname registered in Shopify admin. Defaults to `local.tryhydrogen.dev`. */\n host?: string;\n /** Local port registered in Shopify admin. Defaults to `5173`. */\n port?: number;\n /** Certificate file path. Defaults to Hydrogen's mkcert path under `~/.shopify/hydrogen/certs`. */\n certPath?: string | URL;\n /** Private key file path. Defaults to Hydrogen's mkcert path under `~/.shopify/hydrogen/certs`. */\n keyPath?: string | URL;\n};\n\nexport type LocalHttpsPlugin = Plugin & {\n api: {\n /** Returns host, port, and TLS file paths for frameworks that terminate HTTPS outside Vite. */\n getDevServerConfig(): LocalHttpsDevServerConfig | undefined;\n };\n};\n\nexport type LocalHttpsDevServerConfig = {\n host: string;\n port: number;\n https: {\n cert: string;\n key: string;\n };\n};\n\n/**\n * Configures Vite for trusted local HTTPS on Hydrogen's default development host.\n */\nexport function localHttps(options: LocalHttpsOptions): LocalHttpsPlugin {\n const settings = options.enabled ? resolveLocalHttpsSettings(options) : undefined;\n let certificateFiles: LocalHttpsCertificateFiles | undefined;\n\n const getCertificateFiles = () => {\n if (!settings) return;\n\n certificateFiles ??= readCertificateFiles(settings);\n return certificateFiles;\n };\n\n const getDevServerConfig = () => {\n if (!settings || !checkCertificateFiles(settings)) return;\n\n getCertificateFiles();\n\n return {\n host: settings.host,\n port: settings.port,\n https: {\n cert: settings.certPath,\n key: settings.keyPath,\n },\n };\n };\n\n return {\n name: \"hydrogen-local-https\",\n api: { getDevServerConfig },\n async config(_config: unknown, env: ConfigEnv) {\n if (settings && env.command === \"serve\" && !env.isPreview) {\n const certificatesAvailable = await ensureCertificateFiles(settings);\n if (!certificatesAvailable) return;\n } else if (settings && !checkCertificateFiles(settings)) {\n return;\n }\n\n const certificates = getCertificateFiles();\n if (!settings || !certificates) return;\n\n return {\n server: {\n allowedHosts: [settings.host],\n host: settings.host,\n port: settings.port,\n strictPort: true,\n https: {\n // Several framework dev servers fail when Vite negotiates HTTP/2.\n ALPNProtocols: [\"http/1.1\"],\n cert: certificates.cert,\n key: certificates.key,\n },\n hmr: {\n host: settings.host,\n protocol: \"wss\",\n },\n },\n };\n },\n configureServer(server) {\n if (!settings || !checkCertificateFiles(settings)) return;\n\n getCertificateFiles();\n configureLocalHttpsServer(server, settings);\n },\n };\n}\n\nexport type ProvisionLocalHttpsOptions = Omit<LocalHttpsOptions, \"enabled\" | \"port\">;\n\n/**\n * Downloads a pinned, checksum-verified mkcert release and generates the\n * trusted local certificate files when they do not exist yet. The Vite plugin\n * runs this automatically on `vite dev`; call it directly for frameworks that\n * read certificate paths before Vite starts or from setup scripts.\n */\nexport async function provisionLocalHttps(options: ProvisionLocalHttpsOptions = {}) {\n const settings = resolveLocalHttpsSettings({ enabled: true, ...options });\n\n if (!certificateFilesExist(settings)) {\n await provisionCertificates(settings);\n }\n\n return {\n host: settings.host,\n certPath: settings.certPath,\n keyPath: settings.keyPath,\n };\n}\n\ntype LocalHttpsSettings = {\n host: string;\n port: number;\n certPath: string;\n keyPath: string;\n};\n\ntype LocalHttpsCertificateFiles = {\n cert: Buffer;\n key: Buffer;\n};\n\nfunction resolveLocalHttpsSettings(options: LocalHttpsOptions): LocalHttpsSettings {\n const host = options.host ?? LOCAL_HTTPS_DEFAULTS.host;\n const certificateDirectory = join(homedir(), \".shopify\", \"hydrogen\", \"certs\");\n\n return {\n host,\n port: options.port ?? LOCAL_HTTPS_DEFAULTS.port,\n certPath: resolveCertificatePath(options.certPath ?? join(certificateDirectory, `${host}.pem`)),\n keyPath: resolveCertificatePath(\n options.keyPath ?? join(certificateDirectory, `${host}-key.pem`),\n ),\n };\n}\n\nfunction resolveCertificatePath(path: string | URL) {\n if (path instanceof URL) return fileURLToPath(path);\n if (path === \"~\") return homedir();\n if (path.startsWith(\"~/\")) return resolve(homedir(), path.slice(2));\n return isAbsolute(path) ? path : resolve(path);\n}\n\nfunction certificateFilesExist(settings: LocalHttpsSettings) {\n return existsSync(settings.certPath) && existsSync(settings.keyPath);\n}\n\nasync function ensureCertificateFiles(settings: LocalHttpsSettings): Promise<boolean> {\n if (certificateFilesExist(settings)) return true;\n\n // Installing the mkcert certificate authority needs an interactive trust\n // prompt on first run, which hangs or fails on CI runners.\n if (isContinuousIntegration()) {\n return checkCertificateFiles(\n settings,\n \"Automatic certificate provisioning is skipped in CI environments (the CI environment variable is set).\",\n );\n }\n\n if (!(await confirmCertificateInstallation(settings.host))) {\n return checkCertificateFiles(\n settings,\n \"Automatic certificate provisioning requires confirmation in an interactive terminal.\",\n );\n }\n\n try {\n await provisionCertificates(settings);\n return true;\n } catch (error) {\n return checkCertificateFiles(\n settings,\n `Automatic certificate provisioning failed:\\n ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nfunction isContinuousIntegration() {\n const ci = process.env.CI;\n return ci !== undefined && ci !== \"\" && ci !== \"false\" && ci !== \"0\";\n}\n\nfunction checkCertificateFiles(settings: LocalHttpsSettings, provisioningNote?: string) {\n const missingPaths = [settings.certPath, settings.keyPath].filter((path) => !existsSync(path));\n if (missingPaths.length === 0) return true;\n\n const warning = formatMissingCertificateWarning(settings, missingPaths, provisioningNote);\n if (!emittedMissingCertificateWarnings.has(warning)) {\n emittedMissingCertificateWarnings.add(warning);\n process.emitWarning(warning, { type: \"HydrogenLocalHttpsWarning\" });\n }\n return false;\n}\n\nfunction formatMissingCertificateWarning(\n { certPath, host, keyPath }: LocalHttpsSettings,\n missingPaths: string[],\n provisioningNote?: string,\n) {\n const certificateDirectories = [...new Set([dirname(certPath), dirname(keyPath)])];\n const provisioningFailure = provisioningNote === undefined ? [] : [\"\", provisioningNote];\n\n return [\n \"Local HTTPS is disabled because certificate files are missing:\",\n ...missingPaths.map((path) => ` ${path}`),\n ...provisioningFailure,\n \"\",\n \"Expected certificate files:\",\n ` Certificate: ${certPath}`,\n ` Private key: ${keyPath}`,\n \"\",\n \"Run the automatic setup:\",\n \" npx hydrogen certs install\",\n \"\",\n \"Or install and configure mkcert, then generate the certificate:\",\n \" macOS: brew install mkcert\",\n \" mkcert -install\",\n ` mkdir -p ${certificateDirectories.map(shellQuote).join(\" \")}`,\n ` mkcert -cert-file ${shellQuote(certPath)} -key-file ${shellQuote(keyPath)} ${shellQuote(host)}`,\n ].join(\"\\n\");\n}\n\nfunction readCertificateFiles(settings: LocalHttpsSettings): LocalHttpsCertificateFiles {\n return {\n cert: readCertificateFile(settings, \"certificate\", settings.certPath),\n key: readCertificateFile(settings, \"private key\", settings.keyPath),\n };\n}\n\nfunction readCertificateFile(settings: LocalHttpsSettings, label: string, path: string) {\n try {\n return readFileSync(path);\n } catch (error) {\n throw new Error(formatCertificateReadError(settings, label, path, error), { cause: error });\n }\n}\n\nfunction formatCertificateReadError(\n { certPath, host, keyPath }: LocalHttpsSettings,\n label: string,\n path: string,\n error: unknown,\n) {\n const certificateDirectories = [...new Set([dirname(certPath), dirname(keyPath)])];\n const reason = error instanceof Error ? error.message : String(error);\n\n return [\n `Local HTTPS requires a readable ${label} file:`,\n ` ${path}`,\n `Reason: ${reason}`,\n \"\",\n \"Expected certificate files:\",\n ` Certificate: ${certPath}`,\n ` Private key: ${keyPath}`,\n \"\",\n \"Install and configure mkcert, then generate the certificate:\",\n \" macOS: brew install mkcert\",\n \" mkcert -install\",\n ` mkdir -p ${certificateDirectories.map(shellQuote).join(\" \")}`,\n ` mkcert -cert-file ${shellQuote(certPath)} -key-file ${shellQuote(keyPath)} ${shellQuote(host)}`,\n ].join(\"\\n\");\n}\n\nfunction shellQuote(value: string) {\n return `'${value.replaceAll(\"'\", `'\\\\''`)}'`;\n}\n\nfunction configureLocalHttpsServer(server: ViteDevServer, settings: LocalHttpsSettings) {\n // The configured port is only a fallback: frameworks that own the listener\n // (or auto-incremented ports) can bind somewhere else, and the Customer\n // Account URLs registered in admin must match the port actually served.\n const resolveBoundPort = () => {\n const address = server.httpServer?.address();\n return address && typeof address === \"object\" ? address.port : settings.port;\n };\n\n server.middlewares.use((request, response, next) => {\n request.headers[\"x-forwarded-host\"] ??=\n request.headers.host ?? `${settings.host}:${resolveBoundPort()}`;\n request.headers[\"x-forwarded-proto\"] ??= \"https\";\n stripHttp1OnlyResponseHeaders(response);\n next();\n });\n\n const logSettings = () => {\n const port = resolveBoundPort();\n const settingsKey = `${settings.host}:${port}`;\n if (loggedCustomerAccountSettings.has(settingsKey)) return;\n loggedCustomerAccountSettings.add(settingsKey);\n server.config.logger.info(formatCustomerAccountSettings({ host: settings.host, port }));\n };\n\n if (server.httpServer) {\n server.httpServer.once(\"listening\", logSettings);\n } else {\n logSettings();\n }\n}\n\nfunction formatCustomerAccountSettings({ host, port }: Pick<LocalHttpsSettings, \"host\" | \"port\">) {\n const origin = `https://${host}`;\n const portfulOrigin = `${origin}:${port}`;\n\n return [\n \"\",\n \"Customer Account API — make sure these values are configured for your storefront:\",\n \"\",\n ` Callback URI(s) (required): ${portfulOrigin}${CUSTOMER_ACCOUNT_PATHS.authorize}`,\n // Shopify's server-side validation rejects JavaScript origins containing a port.\n ` JavaScript origin(s): ${origin}`,\n ` Logout URI: ${portfulOrigin}`,\n \"\",\n ].join(\"\\n\");\n}\n\nfunction stripHttp1OnlyResponseHeaders(response: ServerResponse) {\n const originalWriteHead = response.writeHead.bind(response);\n\n response.writeHead = (\n statusCode: number,\n statusMessageOrHeaders?: string | OutgoingHttpHeaders | OutgoingHttpHeader[],\n headers?: OutgoingHttpHeaders | OutgoingHttpHeader[],\n ) => {\n removeStoredHttp1OnlyHeaders(response);\n\n if (typeof statusMessageOrHeaders === \"string\") {\n return originalWriteHead(\n statusCode,\n statusMessageOrHeaders,\n sanitizeWriteHeadHeaders(headers),\n );\n }\n\n return originalWriteHead(statusCode, sanitizeWriteHeadHeaders(statusMessageOrHeaders));\n };\n}\n\nfunction removeStoredHttp1OnlyHeaders(response: ServerResponse) {\n for (const header of HTTP1_ONLY_RESPONSE_HEADERS) {\n response.removeHeader(header);\n }\n}\n\nfunction sanitizeWriteHeadHeaders(headers: OutgoingHttpHeaders | OutgoingHttpHeader[] | undefined) {\n if (Array.isArray(headers)) return sanitizeHeaderArray(headers);\n if (headers) return sanitizeHeaderObject(headers);\n return headers;\n}\n\nfunction sanitizeHeaderObject(headers: OutgoingHttpHeaders) {\n const sanitizedHeaders: OutgoingHttpHeaders = {};\n\n for (const [name, value] of Object.entries(headers)) {\n if (!isHttp1OnlyHeader(name)) sanitizedHeaders[name] = value;\n }\n\n return sanitizedHeaders;\n}\n\nfunction sanitizeHeaderArray(headers: OutgoingHttpHeader[]) {\n const sanitizedHeaders: OutgoingHttpHeader[] = [];\n\n for (let index = 0; index < headers.length; index += HEADER_PAIR_SIZE) {\n const name = headers[index];\n const value = headers[index + 1];\n if (typeof name === \"string\" && isHttp1OnlyHeader(name)) continue;\n\n sanitizedHeaders.push(name);\n if (value !== undefined) sanitizedHeaders.push(value);\n }\n\n return sanitizedHeaders;\n}\n\nfunction isHttp1OnlyHeader(name: string) {\n return HTTP1_ONLY_RESPONSE_HEADERS.has(name.toLowerCase());\n}\n"],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ import { consoleLogger, getLogger } from "../core/logging/logging.mjs";
2
+ import { existsSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ import { spawn } from "node:child_process";
6
+ import { createHash } from "node:crypto";
7
+ import { chmod, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
8
+
9
+ //#region src/vite/mkcert.ts
10
+ const log = getLogger("local-https");
11
+ function confirm(message) {
12
+ consoleLogger.info(`☑️ ${message}`);
13
+ }
14
+ const MKCERT_VERSION = "v1.4.4";
15
+ const MKCERT_RELEASE_BASE_URL = `https://github.com/FiloSottile/mkcert/releases/download/${MKCERT_VERSION}`;
16
+ const EXECUTABLE_MODE = 493;
17
+ const SUCCESS_EXIT_CODE = 0;
18
+ const DOWNLOAD_TIMEOUT_MS = 6e4;
19
+ const MKCERT_BINARIES = {
20
+ "darwin-arm64": {
21
+ assetName: `mkcert-${MKCERT_VERSION}-darwin-arm64`,
22
+ sha256: "c8af0df44bce04359794dad8ea28d750437411d632748049d08644ffb66a60c6"
23
+ },
24
+ "darwin-x64": {
25
+ assetName: `mkcert-${MKCERT_VERSION}-darwin-amd64`,
26
+ sha256: "a32dfab51f1845d51e810db8e47dcf0e6b51ae3422426514bf5a2b8302e97d4e"
27
+ },
28
+ "linux-arm64": {
29
+ assetName: `mkcert-${MKCERT_VERSION}-linux-arm64`,
30
+ sha256: "b98f2cc69fd9147fe4d405d859c57504571adec0d3611c3eefd04107c7ac00d0"
31
+ },
32
+ "linux-x64": {
33
+ assetName: `mkcert-${MKCERT_VERSION}-linux-amd64`,
34
+ sha256: "6d31c65b03972c6dc4a14ab429f2928300518b26503f58723e532d1b0a3bbb52"
35
+ },
36
+ "win32-arm64": {
37
+ assetName: `mkcert-${MKCERT_VERSION}-windows-arm64.exe`,
38
+ sha256: "793747256c562622d40127c8080df26add2fb44c50906ce9db63b42a5280582e"
39
+ },
40
+ "win32-x64": {
41
+ assetName: `mkcert-${MKCERT_VERSION}-windows-amd64.exe`,
42
+ sha256: "d2660b50a9ed59eada480750561c96abc2ed4c9a38c6a24d93e30e0977631398"
43
+ }
44
+ };
45
+ /** @internal Exported for tests. */
46
+ function resolveMkcertBinary(platform, arch) {
47
+ const binary = MKCERT_BINARIES[`${platform}-${arch}`];
48
+ if (!binary) return void 0;
49
+ return {
50
+ ...binary,
51
+ url: `${MKCERT_RELEASE_BASE_URL}/${binary.assetName}`
52
+ };
53
+ }
54
+ function sha256Hex(bytes) {
55
+ return createHash("sha256").update(bytes).digest("hex");
56
+ }
57
+ /** @internal Exported for tests. */
58
+ async function downloadVerified(options) {
59
+ let bytes;
60
+ try {
61
+ const response = await fetch(options.url, { signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS) });
62
+ if (!response.ok) throw new Error(`mkcert download failed with status ${response.status}: ${options.url}`);
63
+ bytes = new Uint8Array(await response.arrayBuffer());
64
+ } catch (error) {
65
+ if (error instanceof Error && error.name === "TimeoutError") throw new Error(`mkcert download timed out after ${DOWNLOAD_TIMEOUT_MS / 1e3}s: ${options.url}`, { cause: error });
66
+ throw error;
67
+ }
68
+ const digest = sha256Hex(bytes);
69
+ if (digest !== options.sha256) throw new Error(`mkcert download did not match the pinned SHA-256 checksum; refusing to run it.\n URL: ${options.url}\n Expected: ${options.sha256}\n Received: ${digest}`);
70
+ await mkdir(dirname(options.destination), { recursive: true });
71
+ const temporaryPath = `${options.destination}.tmp-${process.pid}`;
72
+ try {
73
+ await writeFile(temporaryPath, bytes, { mode: EXECUTABLE_MODE });
74
+ await chmod(temporaryPath, EXECUTABLE_MODE);
75
+ await rename(temporaryPath, options.destination);
76
+ } catch (error) {
77
+ await rm(temporaryPath, { force: true });
78
+ throw error;
79
+ }
80
+ }
81
+ async function ensureMkcertBinary() {
82
+ const binary = resolveMkcertBinary(process.platform, process.arch);
83
+ if (!binary) throw new Error(`Automatic mkcert download is not available for ${process.platform}-${process.arch}. Install mkcert manually and generate the certificate.`);
84
+ const binaryPath = join(homedir(), ".shopify", "hydrogen", "mkcert", binary.assetName);
85
+ if (existsSync(binaryPath) && sha256Hex(await readFile(binaryPath)) === binary.sha256) return binaryPath;
86
+ log.info(`downloading mkcert ${MKCERT_VERSION}…`);
87
+ await downloadVerified({
88
+ url: binary.url,
89
+ sha256: binary.sha256,
90
+ destination: binaryPath
91
+ });
92
+ confirm(`mkcert ${MKCERT_VERSION} downloaded`);
93
+ return binaryPath;
94
+ }
95
+ function runMkcert(binaryPath, args) {
96
+ return new Promise((resolve, reject) => {
97
+ const child = spawn(binaryPath, args, { stdio: [
98
+ "inherit",
99
+ "pipe",
100
+ "pipe"
101
+ ] });
102
+ let output = "";
103
+ const collect = (chunk) => {
104
+ output += chunk.toString();
105
+ };
106
+ child.stdout?.on("data", collect);
107
+ child.stderr?.on("data", collect);
108
+ child.on("error", reject);
109
+ child.on("close", (code, signal) => {
110
+ if (code === SUCCESS_EXIT_CODE) {
111
+ resolve(output);
112
+ return;
113
+ }
114
+ const reason = signal ? `mkcert was killed by ${signal}` : `mkcert exited with code ${code}`;
115
+ reject(new Error(output.trim() === "" ? reason : `${reason}\n${output.trim()}`));
116
+ });
117
+ });
118
+ }
119
+ async function provisionCertificates(settings) {
120
+ const binaryPath = await ensureMkcertBinary();
121
+ await mkdir(dirname(settings.certPath), { recursive: true });
122
+ await mkdir(dirname(settings.keyPath), { recursive: true });
123
+ log.info("generating a trusted local certificate; mkcert may prompt for your password.");
124
+ confirm((await runMkcert(binaryPath, [
125
+ "-install",
126
+ "-cert-file",
127
+ settings.certPath,
128
+ "-key-file",
129
+ settings.keyPath,
130
+ settings.host
131
+ ])).includes("The local CA is already installed") ? "The local CA is already installed in the system trust store" : "The local CA is now installed in the system trust store");
132
+ confirm(`Created a new certificate for "${settings.host}"`);
133
+ log.info("verifying certificates…");
134
+ const missingPaths = [settings.certPath, settings.keyPath].filter((path) => !existsSync(path));
135
+ if (missingPaths.length > 0) throw new Error(`mkcert did not create the expected files: ${missingPaths.join(", ")}`);
136
+ confirm("local https certificates ready");
137
+ }
138
+
139
+ //#endregion
140
+ export { provisionCertificates };
141
+ //# sourceMappingURL=mkcert.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mkcert.mjs","names":[],"sources":["../../src/vite/mkcert.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { chmod, mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport { consoleLogger, getLogger } from \"../core/logging\";\n\nconst log = getLogger(\"local-https\");\n\n// Step confirmations print unprefixed on purpose: they are terminal output for\n// an interactive provisioning flow, not subsystem log entries.\nfunction confirm(message: string) {\n consoleLogger.info(`☑️ ${message}`);\n}\n\n// mkcert is pinned to an exact release and verified against SHA-256 checksums\n// so that a compromised or replaced \"latest\" release can never execute.\n// Checksums are sourced from the Hermit (cashapp/hermit-packages, mkcert.hcl)\n// and Scoop (ScoopInstaller/Extras, bucket/mkcert.json) package registries.\nconst MKCERT_VERSION = \"v1.4.4\";\nconst MKCERT_RELEASE_BASE_URL = `https://github.com/FiloSottile/mkcert/releases/download/${MKCERT_VERSION}`;\nconst EXECUTABLE_MODE = 0o755;\nconst SUCCESS_EXIT_CODE = 0;\nconst DOWNLOAD_TIMEOUT_MS = 60_000;\n\nconst MKCERT_BINARIES: Record<string, { assetName: string; sha256: string }> = {\n \"darwin-arm64\": {\n assetName: `mkcert-${MKCERT_VERSION}-darwin-arm64`,\n sha256: \"c8af0df44bce04359794dad8ea28d750437411d632748049d08644ffb66a60c6\",\n },\n \"darwin-x64\": {\n assetName: `mkcert-${MKCERT_VERSION}-darwin-amd64`,\n sha256: \"a32dfab51f1845d51e810db8e47dcf0e6b51ae3422426514bf5a2b8302e97d4e\",\n },\n \"linux-arm64\": {\n assetName: `mkcert-${MKCERT_VERSION}-linux-arm64`,\n sha256: \"b98f2cc69fd9147fe4d405d859c57504571adec0d3611c3eefd04107c7ac00d0\",\n },\n \"linux-x64\": {\n assetName: `mkcert-${MKCERT_VERSION}-linux-amd64`,\n sha256: \"6d31c65b03972c6dc4a14ab429f2928300518b26503f58723e532d1b0a3bbb52\",\n },\n \"win32-arm64\": {\n assetName: `mkcert-${MKCERT_VERSION}-windows-arm64.exe`,\n sha256: \"793747256c562622d40127c8080df26add2fb44c50906ce9db63b42a5280582e\",\n },\n \"win32-x64\": {\n assetName: `mkcert-${MKCERT_VERSION}-windows-amd64.exe`,\n sha256: \"d2660b50a9ed59eada480750561c96abc2ed4c9a38c6a24d93e30e0977631398\",\n },\n};\n\nexport type MkcertBinary = {\n assetName: string;\n sha256: string;\n url: string;\n};\n\n/** @internal Exported for tests. */\nexport function resolveMkcertBinary(platform: string, arch: string): MkcertBinary | undefined {\n const binary = MKCERT_BINARIES[`${platform}-${arch}`];\n if (!binary) return undefined;\n\n return { ...binary, url: `${MKCERT_RELEASE_BASE_URL}/${binary.assetName}` };\n}\n\nfunction sha256Hex(bytes: Uint8Array): string {\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\n\n/** @internal Exported for tests. */\nexport async function downloadVerified(options: {\n url: string;\n sha256: string;\n destination: string;\n}): Promise<void> {\n let bytes: Uint8Array;\n try {\n const response = await fetch(options.url, {\n signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS),\n });\n if (!response.ok) {\n throw new Error(`mkcert download failed with status ${response.status}: ${options.url}`);\n }\n\n bytes = new Uint8Array(await response.arrayBuffer());\n } catch (error) {\n if (error instanceof Error && error.name === \"TimeoutError\") {\n throw new Error(\n `mkcert download timed out after ${DOWNLOAD_TIMEOUT_MS / 1_000}s: ${options.url}`,\n { cause: error },\n );\n }\n throw error;\n }\n const digest = sha256Hex(bytes);\n if (digest !== options.sha256) {\n throw new Error(\n `mkcert download did not match the pinned SHA-256 checksum; refusing to run it.\\n` +\n ` URL: ${options.url}\\n` +\n ` Expected: ${options.sha256}\\n` +\n ` Received: ${digest}`,\n );\n }\n\n await mkdir(dirname(options.destination), { recursive: true });\n\n // Write-then-rename keeps concurrent dev servers from ever spawning a\n // partially written binary: rename is atomic on the same filesystem.\n const temporaryPath = `${options.destination}.tmp-${process.pid}`;\n try {\n await writeFile(temporaryPath, bytes, { mode: EXECUTABLE_MODE });\n await chmod(temporaryPath, EXECUTABLE_MODE);\n await rename(temporaryPath, options.destination);\n } catch (error) {\n await rm(temporaryPath, { force: true });\n throw error;\n }\n}\n\nasync function ensureMkcertBinary(): Promise<string> {\n const binary = resolveMkcertBinary(process.platform, process.arch);\n if (!binary) {\n throw new Error(\n `Automatic mkcert download is not available for ${process.platform}-${process.arch}. ` +\n \"Install mkcert manually and generate the certificate.\",\n );\n }\n\n const binaryPath = join(homedir(), \".shopify\", \"hydrogen\", \"mkcert\", binary.assetName);\n if (existsSync(binaryPath) && sha256Hex(await readFile(binaryPath)) === binary.sha256) {\n return binaryPath;\n }\n\n log.info(`downloading mkcert ${MKCERT_VERSION}…`);\n await downloadVerified({ url: binary.url, sha256: binary.sha256, destination: binaryPath });\n confirm(`mkcert ${MKCERT_VERSION} downloaded`);\n\n return binaryPath;\n}\n\nfunction runMkcert(binaryPath: string, args: string[]): Promise<string> {\n return new Promise((resolve, reject) => {\n // stdin stays inherited so sudo can prompt on the terminal (sudo talks to\n // the tty directly, not to the piped streams). mkcert's verbose output is\n // captured instead of shown, and surfaced only when the command fails.\n const child = spawn(binaryPath, args, { stdio: [\"inherit\", \"pipe\", \"pipe\"] });\n\n let output = \"\";\n const collect = (chunk: Buffer) => {\n output += chunk.toString();\n };\n child.stdout?.on(\"data\", collect);\n child.stderr?.on(\"data\", collect);\n\n child.on(\"error\", reject);\n child.on(\"close\", (code, signal) => {\n if (code === SUCCESS_EXIT_CODE) {\n resolve(output);\n return;\n }\n\n const reason = signal ? `mkcert was killed by ${signal}` : `mkcert exited with code ${code}`;\n reject(new Error(output.trim() === \"\" ? reason : `${reason}\\n${output.trim()}`));\n });\n });\n}\n\nexport type ProvisionSettings = {\n host: string;\n certPath: string;\n keyPath: string;\n};\n\nexport async function provisionCertificates(settings: ProvisionSettings): Promise<void> {\n const binaryPath = await ensureMkcertBinary();\n\n await mkdir(dirname(settings.certPath), { recursive: true });\n await mkdir(dirname(settings.keyPath), { recursive: true });\n\n log.info(\"generating a trusted local certificate; mkcert may prompt for your password.\");\n const mkcertOutput = await runMkcert(binaryPath, [\n \"-install\",\n \"-cert-file\",\n settings.certPath,\n \"-key-file\",\n settings.keyPath,\n settings.host,\n ]);\n confirm(\n mkcertOutput.includes(\"The local CA is already installed\")\n ? \"The local CA is already installed in the system trust store\"\n : \"The local CA is now installed in the system trust store\",\n );\n confirm(`Created a new certificate for \"${settings.host}\"`);\n\n log.info(\"verifying certificates…\");\n const missingPaths = [settings.certPath, settings.keyPath].filter((path) => !existsSync(path));\n if (missingPaths.length > 0) {\n throw new Error(`mkcert did not create the expected files: ${missingPaths.join(\", \")}`);\n }\n confirm(\"local https certificates ready\");\n}\n\nexport async function uninstallCertificateAuthority(): Promise<void> {\n const binaryPath = await ensureMkcertBinary();\n\n log.info(\"removing the local certificate authority; mkcert may prompt for your password.\");\n await runMkcert(binaryPath, [\"-uninstall\"]);\n confirm(\"The local CA was removed from the system trust stores\");\n}\n"],"mappings":";;;;;;;;;AASA,MAAM,MAAM,UAAU,cAAc;AAIpC,SAAS,QAAQ,SAAiB;AAChC,eAAc,KAAK,MAAM,UAAU;;AAOrC,MAAM,iBAAiB;AACvB,MAAM,0BAA0B,2DAA2D;AAC3F,MAAM,kBAAkB;AACxB,MAAM,oBAAoB;AAC1B,MAAM,sBAAsB;AAE5B,MAAM,kBAAyE;CAC7E,gBAAgB;EACd,WAAW,UAAU,eAAe;EACpC,QAAQ;EACT;CACD,cAAc;EACZ,WAAW,UAAU,eAAe;EACpC,QAAQ;EACT;CACD,eAAe;EACb,WAAW,UAAU,eAAe;EACpC,QAAQ;EACT;CACD,aAAa;EACX,WAAW,UAAU,eAAe;EACpC,QAAQ;EACT;CACD,eAAe;EACb,WAAW,UAAU,eAAe;EACpC,QAAQ;EACT;CACD,aAAa;EACX,WAAW,UAAU,eAAe;EACpC,QAAQ;EACT;CACF;;AASD,SAAgB,oBAAoB,UAAkB,MAAwC;CAC5F,MAAM,SAAS,gBAAgB,GAAG,SAAS,GAAG;AAC9C,KAAI,CAAC,OAAQ,QAAO;AAEpB,QAAO;EAAE,GAAG;EAAQ,KAAK,GAAG,wBAAwB,GAAG,OAAO;EAAa;;AAG7E,SAAS,UAAU,OAA2B;AAC5C,QAAO,WAAW,SAAS,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM;;;AAIzD,eAAsB,iBAAiB,SAIrB;CAChB,IAAI;AACJ,KAAI;EACF,MAAM,WAAW,MAAM,MAAM,QAAQ,KAAK,EACxC,QAAQ,YAAY,QAAQ,oBAAoB,EACjD,CAAC;AACF,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,sCAAsC,SAAS,OAAO,IAAI,QAAQ,MAAM;AAG1F,UAAQ,IAAI,WAAW,MAAM,SAAS,aAAa,CAAC;UAC7C,OAAO;AACd,MAAI,iBAAiB,SAAS,MAAM,SAAS,eAC3C,OAAM,IAAI,MACR,mCAAmC,sBAAsB,IAAM,KAAK,QAAQ,OAC5E,EAAE,OAAO,OAAO,CACjB;AAEH,QAAM;;CAER,MAAM,SAAS,UAAU,MAAM;AAC/B,KAAI,WAAW,QAAQ,OACrB,OAAM,IAAI,MACR,+FACiB,QAAQ,IAAI,gBACZ,QAAQ,OAAO,gBACf,SAClB;AAGH,OAAM,MAAM,QAAQ,QAAQ,YAAY,EAAE,EAAE,WAAW,MAAM,CAAC;CAI9D,MAAM,gBAAgB,GAAG,QAAQ,YAAY,OAAO,QAAQ;AAC5D,KAAI;AACF,QAAM,UAAU,eAAe,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAChE,QAAM,MAAM,eAAe,gBAAgB;AAC3C,QAAM,OAAO,eAAe,QAAQ,YAAY;UACzC,OAAO;AACd,QAAM,GAAG,eAAe,EAAE,OAAO,MAAM,CAAC;AACxC,QAAM;;;AAIV,eAAe,qBAAsC;CACnD,MAAM,SAAS,oBAAoB,QAAQ,UAAU,QAAQ,KAAK;AAClE,KAAI,CAAC,OACH,OAAM,IAAI,MACR,kDAAkD,QAAQ,SAAS,GAAG,QAAQ,KAAK,yDAEpF;CAGH,MAAM,aAAa,KAAK,SAAS,EAAE,YAAY,YAAY,UAAU,OAAO,UAAU;AACtF,KAAI,WAAW,WAAW,IAAI,UAAU,MAAM,SAAS,WAAW,CAAC,KAAK,OAAO,OAC7E,QAAO;AAGT,KAAI,KAAK,sBAAsB,eAAe,GAAG;AACjD,OAAM,iBAAiB;EAAE,KAAK,OAAO;EAAK,QAAQ,OAAO;EAAQ,aAAa;EAAY,CAAC;AAC3F,SAAQ,UAAU,eAAe,aAAa;AAE9C,QAAO;;AAGT,SAAS,UAAU,YAAoB,MAAiC;AACtE,QAAO,IAAI,SAAS,SAAS,WAAW;EAItC,MAAM,QAAQ,MAAM,YAAY,MAAM,EAAE,OAAO;GAAC;GAAW;GAAQ;GAAO,EAAE,CAAC;EAE7E,IAAI,SAAS;EACb,MAAM,WAAW,UAAkB;AACjC,aAAU,MAAM,UAAU;;AAE5B,QAAM,QAAQ,GAAG,QAAQ,QAAQ;AACjC,QAAM,QAAQ,GAAG,QAAQ,QAAQ;AAEjC,QAAM,GAAG,SAAS,OAAO;AACzB,QAAM,GAAG,UAAU,MAAM,WAAW;AAClC,OAAI,SAAS,mBAAmB;AAC9B,YAAQ,OAAO;AACf;;GAGF,MAAM,SAAS,SAAS,wBAAwB,WAAW,2BAA2B;AACtF,UAAO,IAAI,MAAM,OAAO,MAAM,KAAK,KAAK,SAAS,GAAG,OAAO,IAAI,OAAO,MAAM,GAAG,CAAC;IAChF;GACF;;AASJ,eAAsB,sBAAsB,UAA4C;CACtF,MAAM,aAAa,MAAM,oBAAoB;AAE7C,OAAM,MAAM,QAAQ,SAAS,SAAS,EAAE,EAAE,WAAW,MAAM,CAAC;AAC5D,OAAM,MAAM,QAAQ,SAAS,QAAQ,EAAE,EAAE,WAAW,MAAM,CAAC;AAE3D,KAAI,KAAK,+EAA+E;AASxF,UACE,MATyB,UAAU,YAAY;EAC/C;EACA;EACA,SAAS;EACT;EACA,SAAS;EACT,SAAS;EACV,CAAC,EAEa,SAAS,oCAAoC,GACtD,gEACA,0DACL;AACD,SAAQ,kCAAkC,SAAS,KAAK,GAAG;AAE3D,KAAI,KAAK,0BAA0B;CACnC,MAAM,eAAe,CAAC,SAAS,UAAU,SAAS,QAAQ,CAAC,QAAQ,SAAS,CAAC,WAAW,KAAK,CAAC;AAC9F,KAAI,aAAa,SAAS,EACxB,OAAM,IAAI,MAAM,6CAA6C,aAAa,KAAK,KAAK,GAAG;AAEzF,SAAQ,iCAAiC"}
@@ -0,0 +1,46 @@
1
+ import { CartData, CartState } from "../core/cart/state.mjs";
2
+ import { CartStore, CreateCartStoreOptions } from "../core/cart/cart.mjs";
3
+ import { CartFormRegister } from "../core/cart/form.mjs";
4
+ import { CartDataFromHandlers } from "../core/cart/server-handlers.mjs";
5
+ import { ComputedRef, PropType, ShallowRef } from "vue";
6
+
7
+ //#region src/vue/cart.d.ts
8
+ type TypedUseCart<TData extends CartData> = {
9
+ (): Readonly<ShallowRef<CartState<TData>>>;
10
+ <S>(selector: (state: CartState<TData>) => S, isEqual?: (a: S, b: S) => boolean): Readonly<ShallowRef<S>>;
11
+ };
12
+ type TypedUseOptionalCart<TData extends CartData> = <S>(selector: (state: CartState<TData>) => S, isEqual?: (a: S, b: S) => boolean) => Readonly<ShallowRef<S | undefined>>;
13
+ type CartInitialData<TData extends CartData = CartData> = CreateCartStoreOptions<TData>["initialData"];
14
+ type TypedCartProvider<TData extends CartData> = {
15
+ new (): {
16
+ $props: {
17
+ initialData?: CartInitialData<TData>;
18
+ };
19
+ };
20
+ };
21
+ /** Actions for reconciling cart state after updates outside Standard Actions. */
22
+ type CartActions = Pick<CartStore, "refresh">;
23
+ type TypedCartComponents<TData extends CartData> = {
24
+ CartProvider: TypedCartProvider<TData>;
25
+ useCart: TypedUseCart<TData>;
26
+ useOptionalCart: TypedUseOptionalCart<TData>;
27
+ useCartActions: typeof useCartActions;
28
+ useCartForm: typeof useCartForm;
29
+ };
30
+ declare function useCartActions(): CartActions;
31
+ declare function useCartAnalytics(): void;
32
+ declare function useCartForm(): {
33
+ formProps: (opts?: {
34
+ beforeSubmit?: (e: Event) => void;
35
+ afterSubmit?: (e: Event) => void;
36
+ }) => Record<string, unknown>;
37
+ register: CartFormRegister;
38
+ isPending: {
39
+ initial: ComputedRef<boolean>;
40
+ lines: (lineId?: string) => boolean;
41
+ };
42
+ };
43
+ declare function createCartComponents<THandlers>(): TypedCartComponents<CartDataFromHandlers<THandlers>>;
44
+ //#endregion
45
+ export { CartActions, createCartComponents, useCartActions, useCartAnalytics };
46
+ //# sourceMappingURL=cart.d.mts.map