@shopify/cli-hydrogen 4.0.0-alpha.9 → 4.0.1

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 (383) hide show
  1. package/dist/commands/hydrogen/build.d.ts +20 -0
  2. package/dist/commands/hydrogen/build.js +36 -33
  3. package/dist/commands/hydrogen/check.d.ts +18 -0
  4. package/dist/commands/hydrogen/check.js +35 -0
  5. package/dist/commands/hydrogen/dev.d.ts +14 -0
  6. package/dist/commands/hydrogen/dev.js +56 -60
  7. package/dist/commands/hydrogen/generate/route.d.ts +34 -0
  8. package/dist/commands/hydrogen/generate/route.js +165 -0
  9. package/dist/commands/hydrogen/generate/route.test.d.ts +1 -0
  10. package/dist/commands/hydrogen/generate/route.test.js +126 -0
  11. package/dist/commands/hydrogen/generate/routes.d.ts +16 -0
  12. package/dist/commands/hydrogen/generate/routes.js +22 -0
  13. package/dist/commands/hydrogen/init.d.ts +22 -0
  14. package/dist/commands/hydrogen/init.js +169 -25
  15. package/dist/commands/hydrogen/preview.d.ts +17 -0
  16. package/dist/commands/hydrogen/preview.js +2 -2
  17. package/dist/create-app.d.ts +1 -0
  18. package/dist/create-app.js +4 -0
  19. package/dist/{templates/demo-store/app/routes/($lang) → generator-templates/routes}/[robots.txt].tsx +2 -1
  20. package/dist/{templates/demo-store/app/routes/($lang) → generator-templates/routes}/[sitemap.xml].tsx +8 -6
  21. package/dist/generator-templates/routes/account/login.tsx +74 -0
  22. package/dist/generator-templates/routes/account/register.tsx +74 -0
  23. package/dist/generator-templates/routes/cart.tsx +43 -0
  24. package/dist/generator-templates/routes/collections/$collectionHandle.tsx +65 -0
  25. package/dist/{templates/demo-store/app → generator-templates}/routes/graphiql.tsx +0 -0
  26. package/dist/{templates/hello-world/app → generator-templates}/routes/index.tsx +0 -0
  27. package/dist/generator-templates/routes/pages/$pageHandle.tsx +74 -0
  28. package/dist/{templates/demo-store/app/routes/($lang) → generator-templates/routes}/policies/$policyHandle.tsx +9 -38
  29. package/dist/generator-templates/routes/policies/index.tsx +65 -0
  30. package/dist/generator-templates/routes/products/$productHandle.tsx +57 -0
  31. package/dist/hooks/init.d.ts +5 -0
  32. package/dist/utils/check-lockfile.d.ts +3 -0
  33. package/dist/utils/check-lockfile.js +78 -0
  34. package/dist/utils/check-version.d.ts +3 -0
  35. package/dist/utils/check-version.js +50 -0
  36. package/dist/utils/config.d.ts +18 -0
  37. package/dist/utils/config.js +116 -43
  38. package/dist/utils/flags.d.ts +10 -0
  39. package/dist/utils/flags.js +15 -3
  40. package/dist/utils/flags.test.d.ts +1 -0
  41. package/dist/utils/flags.test.js +18 -0
  42. package/dist/utils/log.d.ts +5 -0
  43. package/dist/utils/mini-oxygen.d.ts +11 -0
  44. package/dist/utils/mini-oxygen.js +7 -4
  45. package/dist/utils/missing-routes.d.ts +6 -0
  46. package/dist/utils/missing-routes.js +71 -0
  47. package/dist/utils/template-downloader.d.ts +11 -0
  48. package/dist/utils/template-downloader.js +66 -0
  49. package/dist/utils/transpile-ts.d.ts +16 -0
  50. package/dist/utils/transpile-ts.js +169 -0
  51. package/dist/utils/virtual-routes.d.ts +7 -0
  52. package/dist/utils/virtual-routes.js +47 -0
  53. package/dist/utils/virtual-routes.test.d.ts +1 -0
  54. package/dist/utils/virtual-routes.test.js +46 -0
  55. package/dist/virtual-routes/assets/dummy.d.ts +1 -0
  56. package/dist/virtual-routes/assets/dummy.js +1 -0
  57. package/dist/virtual-routes/assets/dummy.ts +1 -0
  58. package/dist/{templates/demo-store/dist/client → virtual-routes/assets}/favicon.svg +0 -0
  59. package/dist/virtual-routes/assets/styles.css +207 -0
  60. package/dist/virtual-routes/components/HydrogenLogoBaseBW.jsx +7 -0
  61. package/dist/virtual-routes/components/HydrogenLogoBaseColor.jsx +13 -0
  62. package/dist/virtual-routes/components/IconBanner.jsx +47 -0
  63. package/dist/virtual-routes/components/IconDiscord.jsx +4 -0
  64. package/dist/virtual-routes/components/IconError.jsx +20 -0
  65. package/dist/virtual-routes/components/IconGithub.jsx +4 -0
  66. package/dist/virtual-routes/components/IconTwitter.jsx +4 -0
  67. package/dist/virtual-routes/components/Layout.jsx +6 -0
  68. package/dist/virtual-routes/routes/graphiql.jsx +5 -0
  69. package/dist/virtual-routes/routes/index.jsx +140 -0
  70. package/dist/virtual-routes/virtual-root.jsx +38 -0
  71. package/oclif.manifest.json +1 -131
  72. package/package.json +36 -7
  73. package/dist/templates/demo-store/.cache/content-v2/sha512/02/76/13bbea15bb42b81a204b0dc5f14726e0bfa8d012a7b284f887cc2e3c92195d6b07a78f199f990b311ca5fafa9079563503cdd81808cd9b7e496d86c72732 +0 -1
  74. package/dist/templates/demo-store/.cache/content-v2/sha512/08/56/c9a478b8c5c2fbfb6eed219f0861db568eceecbb45155124491ca25125ca421aac7e1b10d29151e5294a776ae10e02e01dc2da3561da793d111c4f908502 +0 -1
  75. package/dist/templates/demo-store/.cache/content-v2/sha512/0f/d5/950a1e0708f440217f567601ee2bfed73c56ada7491058d1ebb769f9a348484d29d4c3897d848d5f9123b0cfb8be69de4ebddc9d964a368e779e2927be5b +0 -1
  76. package/dist/templates/demo-store/.cache/content-v2/sha512/10/31/47b4061a63eaedea6368416dff9248ab2e51a4bea4004882a27c1437490c8150a4709438d28bbd8fd71a7516c9af612204f6116b0604e18902b5c6f69453 +0 -1
  77. package/dist/templates/demo-store/.cache/content-v2/sha512/13/f6/b7f804d45a961ca1e392429e75ad80f23ba46cbba0e960c6a70f8de81f3f3763af59651474176798d1a1a4bd2a5109b1d441f6d1c8ba070b678b38378adf +0 -1
  78. package/dist/templates/demo-store/.cache/content-v2/sha512/28/7c/c71b0c6367bdf7307a8061fe1c4568c9f1e9603d835b6fc917fe8042535a867c37154e35376a01ad6bdb3c2d6f29b88b41902fd6f20b1227e02081682d01 +0 -1
  79. package/dist/templates/demo-store/.cache/content-v2/sha512/29/62/a788055902cff8e9403b901ebd715b56541b0ee4dc9f13cb739cd906ae89ae1fa7199831d613ab21c3ee5d84c5456608dc8707d9199ae3d8ba5e9fd7ce95 +0 -1
  80. package/dist/templates/demo-store/.cache/content-v2/sha512/2b/b2/d5a8e11c89553d08b26b4a7ba8b901de31c0b182f745f8c5d1c5aba44bf46d0d69e3d8042f5917728d0b69d5eba102e3de332f8141aef67a12d215a66843 +0 -1
  81. package/dist/templates/demo-store/.cache/content-v2/sha512/34/dd/ec66f7075936ba94dd741485089904914960fd50a4886c31783c27c27ca08852be43dea712e8aaea6f5197b83ccf1949c8a24c27ff61f5280377917d722e +0 -1
  82. package/dist/templates/demo-store/.cache/content-v2/sha512/46/04/af285aee74d96b28b24f75d7911de65e6c7bb26475ab5219fe5308028fda55060cf45650dfa09c0731ec73ece453c1e24e0c38715e8d4c5c80fd6365a1f4 +0 -1
  83. package/dist/templates/demo-store/.cache/content-v2/sha512/4e/ea/2fe739931285fa2839b54fe6c91470491475eac2d960e35ef0c6750313c08fbf2b2d784c0bb71c5fb2ef6c4a27f2202a4c29199b53bf7fd43c5721f90ecf +0 -1
  84. package/dist/templates/demo-store/.cache/content-v2/sha512/51/ab/e165384df6374c7b2d0ebebc8642ecb0e0c14f7c5b57970ec5d2e17f7d1643e0b01eda69e5ffbefde85ecba6d613bcc5175c5564e36bfb73d966c8ea4153 +0 -1
  85. package/dist/templates/demo-store/.cache/content-v2/sha512/54/b2/a99146d18769ec698b6c61e4c3e63689a24110cca7c671d926fc1320f5a2ac5cdbf143db9074dcfb383359307c50ccbe2512f2d9ee992eb53f2ed98997af +0 -1
  86. package/dist/templates/demo-store/.cache/content-v2/sha512/57/7e/37b69b357be4c488e5fca37c009c908201ac2107ddaa589143bcb108e9c5f7e4ca91a36f068b3f88bb0da655d7832bd040dcbef25d807faf0804a7f93c9a +0 -1
  87. package/dist/templates/demo-store/.cache/content-v2/sha512/6d/d8/5ad2b238dcc09122c8977b26e2a2eb94e12b1cda5181a020ec77d9364ea2efdc2ddddaf2ba766ced871d8cc33e5862fb4ae0c6591080b7523e5e779dceb5 +0 -1
  88. package/dist/templates/demo-store/.cache/content-v2/sha512/72/e4/3df1f2ae672aa3148b6afde9bd16b5371250464c301be7a4ca40e459768db712d39fb7039ce9710264f726b531b7dd346e43fe260b53789206a05f665393 +0 -1
  89. package/dist/templates/demo-store/.cache/content-v2/sha512/73/40/c822831f11f08a9ceea944d0145b072ba6164a3e2e75f98fda5437cda6dfddf9ca9450445c1f3236228d6259ac95e4cde9bb6e5996490ed00b7b13b06121 +0 -1
  90. package/dist/templates/demo-store/.cache/content-v2/sha512/73/ad/c5cb88faf344aa1be4c7f263610bbf4e5b4b4122a277e9f8adb20bdaabf46a65f647d902bf885172c5e17f16d63c69d9f0213938ad0648099d627bcdc7a3 +0 -1
  91. package/dist/templates/demo-store/.cache/content-v2/sha512/79/6a/c7905d20904ce592cd04dabc941dcfb9ae88a2936f564c6ca21dba66c7b89f44c697504d1fef3427d5121f3ce0abfc72225a25a5985cc2f823c50cb1a4e0 +0 -1
  92. package/dist/templates/demo-store/.cache/content-v2/sha512/7e/bd/739d3492efb96a9a5952538eee6f83dd7123c59a4b48538a5a554b8684ba84a1e65dd626b5aa9c6dc74c96734c46e3303ab93e6a5fcc56ecb4150c036aea +0 -1
  93. package/dist/templates/demo-store/.cache/content-v2/sha512/88/76/d18fdfbb05293909609d42368642fc6da4bd138c5864ec2f721212b52e595b84ae46f48021ed3e6240edf443f78bdea557d56d700e3da848459ea3077a80 +0 -1
  94. package/dist/templates/demo-store/.cache/content-v2/sha512/88/d0/847cc94057b70b5352a6f097d172883a789eedabfe597475672bec5495d323bc41e185cd5a6477aa691befeb69bd6f19f77b4735ebd8f230d39491bdabae +0 -1
  95. package/dist/templates/demo-store/.cache/content-v2/sha512/93/6b/e60098157f6bff8ba570cab2ffd97a14983109006f7fa87e4432728366f96dfb19e957d28754daa45f1b6cb2421d26ab59bbd5ce5a448d6102e8e662403d +0 -1
  96. package/dist/templates/demo-store/.cache/content-v2/sha512/bc/1c/74650cdfe58d3295c52501b3572b71ca4d0bcebe895291b39d63fc57d60b1924315d5b6292c825bec288196d39acf45d63688726fd77e85d99ce18e52f28 +0 -1
  97. package/dist/templates/demo-store/.cache/content-v2/sha512/bc/33/6e26ece5ac53d9eac9ac8a192ef39faf2a587a5808253c659fb1d371c477fc8074d428c8d1929b0d85dd1fec66fc79ea6b9fcb01507e2efec75fb7fbc2cc +0 -1
  98. package/dist/templates/demo-store/.cache/content-v2/sha512/cb/63/324e426b4c93a3fa8db83dab506b9abbe2d7628897dfd1369642f19d66f140c090e1c3834728d5082f8cffe846f7c54d112e11f5d934d629ed996d177a1f +0 -1
  99. package/dist/templates/demo-store/.cache/content-v2/sha512/d6/bd/656ddf1b02384b21b4fb55c615f28bba616f85c0992a8555bfbc3b0cf0692e2b3f20a534b4c3baef86e7c9ccf36b8d3a9239747b3d8422ff4dbe7dd2d0a6 +0 -1
  100. package/dist/templates/demo-store/.cache/content-v2/sha512/da/84/b6d27e02f9b109d7cff3095b08e2e2ed1802c8b6829c98f6e297d1c404059f8bacfdc278afd07e2f81cbc487318396a3775037b678ab6aff9a5231c94c0d +0 -1
  101. package/dist/templates/demo-store/.cache/content-v2/sha512/e8/ae/9b467e1d23913d4584d9417875b3cdc25f6dfed8b228f3a0c818129010b778aae1af1eb200b015ab428e79afe0ef1061262392fbdb96ed7da95efbe7f758 +0 -1
  102. package/dist/templates/demo-store/.cache/content-v2/sha512/f4/ba/e578b89fa1a4a0549fa2e68e0ba078fa8c9207c376189d1550a7ae0e54c4c0548d0a29a0cef532ca613e25832b9343e74f6a8bc7338fcc28d51e6e3d7898 +0 -1
  103. package/dist/templates/demo-store/.cache/content-v2/sha512/fb/75/9195d7f913bc6ae5a345003e0863e0c38c00e744334e2ae61feba1a3099be8207599085a8264590dbd0fd9e1fff1d58037183d106cdbc750c7ad6f979d88 +0 -1
  104. package/dist/templates/demo-store/.cache/content-v2/sha512/fd/ef/df6382410602f345da5bb420585629c22c350bc028c87eb6da71e611f381c5ccba09b435b9b5fb31d7c8beb5b8abfa87abdb874b189a3211efe61840fbac +0 -1
  105. package/dist/templates/demo-store/.cache/content-v2/sha512/fd/f3/986b7ee5ea5ad1d89af5c08de69d43c025b54381092e0a19fd7e7a1e0352552aa85c056315ce5e11a46ec75a252b1a44e2083abb73cd6df8407dfdb0ac48 +0 -1
  106. package/dist/templates/demo-store/.cache/index-v5/05/44/bebd201ef5e9e9a7c41bd789ff110691a32c7f7fbbbdd630f33d96667cd1 +0 -2
  107. package/dist/templates/demo-store/.cache/index-v5/26/b5/113aeb17f9f4ef406a1f8b143895199ca545fd0cc1e7972435a092910963 +0 -2
  108. package/dist/templates/demo-store/.cache/index-v5/2c/09/e60b5cd818510e0cbec908aae3b74175e35e446f4383e87c21489433a11e +0 -2
  109. package/dist/templates/demo-store/.cache/index-v5/38/21/c3fb7841590b85142018ba88a01045ef1249ac34211342579f0129eae294 +0 -2
  110. package/dist/templates/demo-store/.cache/index-v5/3a/98/8858fe7de4bf85d37c71adc322cc95335b498bef9a4ae41db324bf5696cc +0 -2
  111. package/dist/templates/demo-store/.cache/index-v5/3e/40/7021422a7cae2c05484b491fb5b85edd82b325e598ac9e5c6afb858049da +0 -2
  112. package/dist/templates/demo-store/.cache/index-v5/47/2f/8e9ec62247eca3464d07de774855bb30a56145adc6525b907490e0c1bda0 +0 -2
  113. package/dist/templates/demo-store/.cache/index-v5/5e/83/14bed234cd143eaf4043de721fcf4250a5adc7008e76d663365e8a322c88 +0 -2
  114. package/dist/templates/demo-store/.cache/index-v5/5f/87/f79366b4aab5423acdda7930c6c989c49dd1c6607885df3afaa5e6873c9f +0 -2
  115. package/dist/templates/demo-store/.cache/index-v5/6e/9e/dc622ea9b5c66089a08f3e8b7a0e62a29e85bab337da0a3b28d6126185ec +0 -2
  116. package/dist/templates/demo-store/.cache/index-v5/71/4c/401eb7f3b2db5e56857a3ddd90e61181e636a5d01cc569ff8671ddf7f14b +0 -2
  117. package/dist/templates/demo-store/.cache/index-v5/78/84/46021cf9ede94313b5bc2cbf2355909ae811d4879a7747f9e2341f6b5bfb +0 -2
  118. package/dist/templates/demo-store/.cache/index-v5/79/2e/b0dd8fcd37a11ecb71cfd33184651560cabda672e55e0b244fc6f825190c +0 -2
  119. package/dist/templates/demo-store/.cache/index-v5/7b/e1/807e64f6a84e568bf9163283e9d49b77b24ff24bd8eed751d9fd94ea404a +0 -2
  120. package/dist/templates/demo-store/.cache/index-v5/85/07/e0c4be5b8442583f11be2d0b6f09171d22721437456b745eb2c977294995 +0 -2
  121. package/dist/templates/demo-store/.cache/index-v5/87/4d/89bc172664efe0dc7f86d8e67559073b2900ae079bd42ae9e3c015d38ab0 +0 -2
  122. package/dist/templates/demo-store/.cache/index-v5/8c/0d/a633a8771437b330d83eef0fdd99a81c41356b2bdc81f80ec9277f92b060 +0 -2
  123. package/dist/templates/demo-store/.cache/index-v5/a3/fc/e2e503290d165b9b0e20c6880bc23ff8ec39a440482418b5103c36be66b9 +0 -2
  124. package/dist/templates/demo-store/.cache/index-v5/a5/bc/d87ab9468457cb872d6c360f8acecd05e0f88b7239b50754f120706fabd4 +0 -2
  125. package/dist/templates/demo-store/.cache/index-v5/a5/c0/8e6e4f498a17b6198e54f204247ba544e6404b282d4ce3065d85fa69a8a4 +0 -2
  126. package/dist/templates/demo-store/.cache/index-v5/af/65/89b0c9eb41779c1658ace443604fea125c524bc95cfc71c9b6300da2dc81 +0 -2
  127. package/dist/templates/demo-store/.cache/index-v5/b2/75/51549baf010c977c70017db497fd9bd20e1efa9b658a6d52761c559f9c0b +0 -2
  128. package/dist/templates/demo-store/.cache/index-v5/b3/75/d3e7a4a5df68530007409daf1d2e66ab789c8b658d1819d7e5fd183f5f57 +0 -2
  129. package/dist/templates/demo-store/.cache/index-v5/bb/db/9dc2cbdcdc6ff352f9a34463a02e198aa2123a4c2e4ef37fea8b8ccae413 +0 -2
  130. package/dist/templates/demo-store/.cache/index-v5/d0/c4/d960260ece228d28f70e317741b3f3f3df05c53956d870235837ae2b73b4 +0 -2
  131. package/dist/templates/demo-store/.cache/index-v5/d3/ca/ff5860148f0bedafb91dab72b54462de81a32a21210324c45a051b197b48 +0 -2
  132. package/dist/templates/demo-store/.cache/index-v5/d4/55/296e80e87e2652f4cf1aebd5419fe73ef16c94ab20cd0400166d44ea1746 +0 -2
  133. package/dist/templates/demo-store/.cache/index-v5/da/7a/4b6977be684885e550a0d8fd21c955d0195371ffc3a9535a5a7b950a5ac9 +0 -2
  134. package/dist/templates/demo-store/.cache/index-v5/dd/aa/599a1cd855476ba058c63ae75a9c006ca11f7fbc2efc00b361d7f1b95cb4 +0 -2
  135. package/dist/templates/demo-store/.cache/index-v5/df/d2/bcfa3853e61309abab85dbd561dbc632ad0ea79b24f1b77c95f861eead5f +0 -2
  136. package/dist/templates/demo-store/.cache/index-v5/df/f5/cc3a1197c607eac768ab1b1cdb7b53a7f87b67c23c92da957d45a5bd0bda +0 -2
  137. package/dist/templates/demo-store/.cache/index-v5/e4/bd/743967c269ef70a14ba6b5dd223d26759eae9295d79f165c66f514b7d8d3 +0 -2
  138. package/dist/templates/demo-store/.cache/index-v5/e5/d3/0de6bfbb93ef9271b53f0ded9696291312b19ff087c2826d679ee2c74c01 +0 -2
  139. package/dist/templates/demo-store/.editorconfig +0 -8
  140. package/dist/templates/demo-store/.eslintignore +0 -4
  141. package/dist/templates/demo-store/.eslintrc.js +0 -16
  142. package/dist/templates/demo-store/.graphqlrc.yml +0 -1
  143. package/dist/templates/demo-store/.prettierignore +0 -2
  144. package/dist/templates/demo-store/_env +0 -6
  145. package/dist/templates/demo-store/_gitignore +0 -13
  146. package/dist/templates/demo-store/app/components/AccountAddressBook.tsx +0 -97
  147. package/dist/templates/demo-store/app/components/AccountDetails.tsx +0 -41
  148. package/dist/templates/demo-store/app/components/AddToCartButton.tsx +0 -42
  149. package/dist/templates/demo-store/app/components/Breadcrumbs.tsx +0 -36
  150. package/dist/templates/demo-store/app/components/Button.tsx +0 -56
  151. package/dist/templates/demo-store/app/components/Cart.tsx +0 -431
  152. package/dist/templates/demo-store/app/components/CartLoading.tsx +0 -50
  153. package/dist/templates/demo-store/app/components/CountrySelector.tsx +0 -180
  154. package/dist/templates/demo-store/app/components/Drawer.tsx +0 -115
  155. package/dist/templates/demo-store/app/components/FeaturedCollections.tsx +0 -54
  156. package/dist/templates/demo-store/app/components/FeaturedProducts.tsx +0 -116
  157. package/dist/templates/demo-store/app/components/FeaturedSection.tsx +0 -39
  158. package/dist/templates/demo-store/app/components/GenericError.tsx +0 -58
  159. package/dist/templates/demo-store/app/components/Grid.tsx +0 -44
  160. package/dist/templates/demo-store/app/components/Hero.tsx +0 -129
  161. package/dist/templates/demo-store/app/components/Icon.tsx +0 -253
  162. package/dist/templates/demo-store/app/components/Input.tsx +0 -24
  163. package/dist/templates/demo-store/app/components/Layout.tsx +0 -492
  164. package/dist/templates/demo-store/app/components/Link.tsx +0 -46
  165. package/dist/templates/demo-store/app/components/Modal.tsx +0 -46
  166. package/dist/templates/demo-store/app/components/NotFound.tsx +0 -22
  167. package/dist/templates/demo-store/app/components/OrderCard.tsx +0 -82
  168. package/dist/templates/demo-store/app/components/Pagination.tsx +0 -277
  169. package/dist/templates/demo-store/app/components/ProductCard.tsx +0 -140
  170. package/dist/templates/demo-store/app/components/ProductGallery.tsx +0 -114
  171. package/dist/templates/demo-store/app/components/ProductGrid.tsx +0 -93
  172. package/dist/templates/demo-store/app/components/ProductSwimlane.tsx +0 -30
  173. package/dist/templates/demo-store/app/components/Skeleton.tsx +0 -24
  174. package/dist/templates/demo-store/app/components/SortFilter.tsx +0 -414
  175. package/dist/templates/demo-store/app/components/Text.tsx +0 -192
  176. package/dist/templates/demo-store/app/components/index.ts +0 -28
  177. package/dist/templates/demo-store/app/data/countries.ts +0 -194
  178. package/dist/templates/demo-store/app/data/index.ts +0 -1027
  179. package/dist/templates/demo-store/app/entry.client.tsx +0 -4
  180. package/dist/templates/demo-store/app/entry.server.tsx +0 -26
  181. package/dist/templates/demo-store/app/hooks/useCartFetchers.tsx +0 -14
  182. package/dist/templates/demo-store/app/hooks/useIsHydrated.tsx +0 -12
  183. package/dist/templates/demo-store/app/lib/const.ts +0 -10
  184. package/dist/templates/demo-store/app/lib/placeholders.ts +0 -244
  185. package/dist/templates/demo-store/app/lib/seo/common.tsx +0 -367
  186. package/dist/templates/demo-store/app/lib/seo/debugger.tsx +0 -175
  187. package/dist/templates/demo-store/app/lib/seo/image.tsx +0 -32
  188. package/dist/templates/demo-store/app/lib/seo/index.ts +0 -4
  189. package/dist/templates/demo-store/app/lib/seo/seo.tsx +0 -24
  190. package/dist/templates/demo-store/app/lib/seo/types.ts +0 -84
  191. package/dist/templates/demo-store/app/lib/session.server.ts +0 -57
  192. package/dist/templates/demo-store/app/lib/type.ts +0 -21
  193. package/dist/templates/demo-store/app/lib/utils.ts +0 -310
  194. package/dist/templates/demo-store/app/root.tsx +0 -279
  195. package/dist/templates/demo-store/app/routes/($lang)/$.tsx +0 -7
  196. package/dist/templates/demo-store/app/routes/($lang)/account/__private/address/$id.tsx +0 -320
  197. package/dist/templates/demo-store/app/routes/($lang)/account/__private/edit.tsx +0 -273
  198. package/dist/templates/demo-store/app/routes/($lang)/account/__private/logout.ts +0 -25
  199. package/dist/templates/demo-store/app/routes/($lang)/account/__private/orders.$id.tsx +0 -322
  200. package/dist/templates/demo-store/app/routes/($lang)/account/__public/activate.$id.$activationToken.tsx +0 -218
  201. package/dist/templates/demo-store/app/routes/($lang)/account/__public/login.tsx +0 -197
  202. package/dist/templates/demo-store/app/routes/($lang)/account/__public/recover.tsx +0 -144
  203. package/dist/templates/demo-store/app/routes/($lang)/account/__public/register.tsx +0 -184
  204. package/dist/templates/demo-store/app/routes/($lang)/account/__public/reset.$id.$resetToken.tsx +0 -214
  205. package/dist/templates/demo-store/app/routes/($lang)/account.tsx +0 -188
  206. package/dist/templates/demo-store/app/routes/($lang)/api/countries.tsx +0 -22
  207. package/dist/templates/demo-store/app/routes/($lang)/api/products.tsx +0 -116
  208. package/dist/templates/demo-store/app/routes/($lang)/cart.tsx +0 -510
  209. package/dist/templates/demo-store/app/routes/($lang)/collections/$collectionHandle.tsx +0 -300
  210. package/dist/templates/demo-store/app/routes/($lang)/collections/all.tsx +0 -5
  211. package/dist/templates/demo-store/app/routes/($lang)/collections/index.tsx +0 -188
  212. package/dist/templates/demo-store/app/routes/($lang)/discounts.$code.tsx +0 -60
  213. package/dist/templates/demo-store/app/routes/($lang)/featured-products.tsx +0 -58
  214. package/dist/templates/demo-store/app/routes/($lang)/index.tsx +0 -241
  215. package/dist/templates/demo-store/app/routes/($lang)/journal/$journalHandle.tsx +0 -141
  216. package/dist/templates/demo-store/app/routes/($lang)/journal/index.tsx +0 -152
  217. package/dist/templates/demo-store/app/routes/($lang)/og-image.tsx +0 -19
  218. package/dist/templates/demo-store/app/routes/($lang)/pages/$pageHandle.tsx +0 -75
  219. package/dist/templates/demo-store/app/routes/($lang)/policies/index.tsx +0 -97
  220. package/dist/templates/demo-store/app/routes/($lang)/products/$productHandle.tsx +0 -551
  221. package/dist/templates/demo-store/app/routes/($lang)/products/index.tsx +0 -148
  222. package/dist/templates/demo-store/app/routes/($lang)/search.tsx +0 -198
  223. package/dist/templates/demo-store/app/styles/app.css +0 -4203
  224. package/dist/templates/demo-store/app/styles/custom-font.css +0 -13
  225. package/dist/templates/demo-store/app/styles/fonts/IBMPlexSerif-Text.woff2 +0 -0
  226. package/dist/templates/demo-store/app/styles/fonts/IBMPlexSerif-TextItalic.woff2 +0 -0
  227. package/dist/templates/demo-store/dist/client/build/_assets/IBMPlexSerif-Text-YFMZNZW6.woff2 +0 -0
  228. package/dist/templates/demo-store/dist/client/build/_assets/IBMPlexSerif-TextItalic-CS6L5H7S.woff2 +0 -0
  229. package/dist/templates/demo-store/dist/client/build/_assets/app-PPSD2NK6.css +0 -1
  230. package/dist/templates/demo-store/dist/client/build/_assets/custom-font-WVPOFKHF.css +0 -1
  231. package/dist/templates/demo-store/dist/client/build/_assets/favicon-5FIZBM2K.svg +0 -28
  232. package/dist/templates/demo-store/dist/client/build/_shared/chunk-7CASD2US.js +0 -9
  233. package/dist/templates/demo-store/dist/client/build/_shared/chunk-7CASD2US.js.map +0 -7
  234. package/dist/templates/demo-store/dist/client/build/_shared/chunk-7CKXJRLM.js +0 -2
  235. package/dist/templates/demo-store/dist/client/build/_shared/chunk-7CKXJRLM.js.map +0 -7
  236. package/dist/templates/demo-store/dist/client/build/_shared/chunk-AYHDHSL7.js +0 -2
  237. package/dist/templates/demo-store/dist/client/build/_shared/chunk-AYHDHSL7.js.map +0 -7
  238. package/dist/templates/demo-store/dist/client/build/_shared/chunk-EW52HEI6.js +0 -133
  239. package/dist/templates/demo-store/dist/client/build/_shared/chunk-EW52HEI6.js.map +0 -7
  240. package/dist/templates/demo-store/dist/client/build/_shared/chunk-MEPKJ2VW.js +0 -2
  241. package/dist/templates/demo-store/dist/client/build/_shared/chunk-MEPKJ2VW.js.map +0 -7
  242. package/dist/templates/demo-store/dist/client/build/_shared/chunk-NIVT6A2W.js +0 -2
  243. package/dist/templates/demo-store/dist/client/build/_shared/chunk-NIVT6A2W.js.map +0 -7
  244. package/dist/templates/demo-store/dist/client/build/_shared/chunk-SYP5DAMV.js +0 -2
  245. package/dist/templates/demo-store/dist/client/build/_shared/chunk-SYP5DAMV.js.map +0 -7
  246. package/dist/templates/demo-store/dist/client/build/_shared/chunk-SZCP6RSO.js +0 -7
  247. package/dist/templates/demo-store/dist/client/build/_shared/chunk-SZCP6RSO.js.map +0 -7
  248. package/dist/templates/demo-store/dist/client/build/_shared/chunk-YCAWB56Y.js +0 -31
  249. package/dist/templates/demo-store/dist/client/build/_shared/chunk-YCAWB56Y.js.map +0 -7
  250. package/dist/templates/demo-store/dist/client/build/entry.client-3PUQSZFF.js +0 -2
  251. package/dist/templates/demo-store/dist/client/build/entry.client-3PUQSZFF.js.map +0 -7
  252. package/dist/templates/demo-store/dist/client/build/manifest-E4E22121.js +0 -1
  253. package/dist/templates/demo-store/dist/client/build/root-6BHVTOEY.js +0 -14
  254. package/dist/templates/demo-store/dist/client/build/root-6BHVTOEY.js.map +0 -7
  255. package/dist/templates/demo-store/dist/client/build/routes/($lang)/$-HDBACFGJ.js +0 -2
  256. package/dist/templates/demo-store/dist/client/build/routes/($lang)/$-HDBACFGJ.js.map +0 -7
  257. package/dist/templates/demo-store/dist/client/build/routes/($lang)/[robots.txt]-KDA3EX2G.js +0 -2
  258. package/dist/templates/demo-store/dist/client/build/routes/($lang)/[robots.txt]-KDA3EX2G.js.map +0 -7
  259. package/dist/templates/demo-store/dist/client/build/routes/($lang)/[sitemap.xml]-AAQRJL2R.js +0 -2
  260. package/dist/templates/demo-store/dist/client/build/routes/($lang)/[sitemap.xml]-AAQRJL2R.js.map +0 -7
  261. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__private/address/$id-3WQU2LQT.js +0 -2
  262. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__private/address/$id-3WQU2LQT.js.map +0 -7
  263. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__private/edit-3XQ4BLHS.js +0 -2
  264. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__private/edit-3XQ4BLHS.js.map +0 -7
  265. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__private/logout-7KXWFBCX.js +0 -2
  266. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__private/logout-7KXWFBCX.js.map +0 -7
  267. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__private/orders.$id-7VQDCWO5.js +0 -2
  268. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__private/orders.$id-7VQDCWO5.js.map +0 -7
  269. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__public/activate.$id.$activationToken-Z5BQE6J5.js +0 -2
  270. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__public/activate.$id.$activationToken-Z5BQE6J5.js.map +0 -7
  271. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__public/login-K6QUN2VF.js +0 -2
  272. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__public/login-K6QUN2VF.js.map +0 -7
  273. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__public/recover-UV5PLPS5.js +0 -2
  274. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__public/recover-UV5PLPS5.js.map +0 -7
  275. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__public/register-SZW3ORRR.js +0 -2
  276. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__public/register-SZW3ORRR.js.map +0 -7
  277. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__public/reset.$id.$resetToken-WOUXQWZU.js +0 -2
  278. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account/__public/reset.$id.$resetToken-WOUXQWZU.js.map +0 -7
  279. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account-PRE5HSJE.js +0 -25
  280. package/dist/templates/demo-store/dist/client/build/routes/($lang)/account-PRE5HSJE.js.map +0 -7
  281. package/dist/templates/demo-store/dist/client/build/routes/($lang)/api/countries-UD6BGYL2.js +0 -2
  282. package/dist/templates/demo-store/dist/client/build/routes/($lang)/api/countries-UD6BGYL2.js.map +0 -7
  283. package/dist/templates/demo-store/dist/client/build/routes/($lang)/api/products-KIFIWUFE.js +0 -2
  284. package/dist/templates/demo-store/dist/client/build/routes/($lang)/api/products-KIFIWUFE.js.map +0 -7
  285. package/dist/templates/demo-store/dist/client/build/routes/($lang)/cart-3AJ7UOZX.js +0 -55
  286. package/dist/templates/demo-store/dist/client/build/routes/($lang)/cart-3AJ7UOZX.js.map +0 -7
  287. package/dist/templates/demo-store/dist/client/build/routes/($lang)/collections/$collectionHandle-ORDYEBM3.js +0 -83
  288. package/dist/templates/demo-store/dist/client/build/routes/($lang)/collections/$collectionHandle-ORDYEBM3.js.map +0 -7
  289. package/dist/templates/demo-store/dist/client/build/routes/($lang)/collections/all-IXDFOKCK.js +0 -2
  290. package/dist/templates/demo-store/dist/client/build/routes/($lang)/collections/all-IXDFOKCK.js.map +0 -7
  291. package/dist/templates/demo-store/dist/client/build/routes/($lang)/collections/index-3AJFWRDR.js +0 -2
  292. package/dist/templates/demo-store/dist/client/build/routes/($lang)/collections/index-3AJFWRDR.js.map +0 -7
  293. package/dist/templates/demo-store/dist/client/build/routes/($lang)/discounts.$code-GYKQBNLQ.js +0 -2
  294. package/dist/templates/demo-store/dist/client/build/routes/($lang)/discounts.$code-GYKQBNLQ.js.map +0 -7
  295. package/dist/templates/demo-store/dist/client/build/routes/($lang)/featured-products-KNUST6DD.js +0 -2
  296. package/dist/templates/demo-store/dist/client/build/routes/($lang)/featured-products-KNUST6DD.js.map +0 -7
  297. package/dist/templates/demo-store/dist/client/build/routes/($lang)/index-4US2D5XK.js +0 -32
  298. package/dist/templates/demo-store/dist/client/build/routes/($lang)/index-4US2D5XK.js.map +0 -7
  299. package/dist/templates/demo-store/dist/client/build/routes/($lang)/journal/$journalHandle-BCHHYOJX.js +0 -2
  300. package/dist/templates/demo-store/dist/client/build/routes/($lang)/journal/$journalHandle-BCHHYOJX.js.map +0 -7
  301. package/dist/templates/demo-store/dist/client/build/routes/($lang)/journal/index-LZR4YNUM.js +0 -2
  302. package/dist/templates/demo-store/dist/client/build/routes/($lang)/journal/index-LZR4YNUM.js.map +0 -7
  303. package/dist/templates/demo-store/dist/client/build/routes/($lang)/og-image-KUOACO4J.js +0 -2
  304. package/dist/templates/demo-store/dist/client/build/routes/($lang)/og-image-KUOACO4J.js.map +0 -7
  305. package/dist/templates/demo-store/dist/client/build/routes/($lang)/pages/$pageHandle-5WR6PFRU.js +0 -2
  306. package/dist/templates/demo-store/dist/client/build/routes/($lang)/pages/$pageHandle-5WR6PFRU.js.map +0 -7
  307. package/dist/templates/demo-store/dist/client/build/routes/($lang)/policies/$policyHandle-C5ATUMN6.js +0 -2
  308. package/dist/templates/demo-store/dist/client/build/routes/($lang)/policies/$policyHandle-C5ATUMN6.js.map +0 -7
  309. package/dist/templates/demo-store/dist/client/build/routes/($lang)/policies/index-MJDYZG5P.js +0 -2
  310. package/dist/templates/demo-store/dist/client/build/routes/($lang)/policies/index-MJDYZG5P.js.map +0 -7
  311. package/dist/templates/demo-store/dist/client/build/routes/($lang)/products/$productHandle-IB2WTXB6.js +0 -68
  312. package/dist/templates/demo-store/dist/client/build/routes/($lang)/products/$productHandle-IB2WTXB6.js.map +0 -7
  313. package/dist/templates/demo-store/dist/client/build/routes/($lang)/products/index-266HKDAN.js +0 -24
  314. package/dist/templates/demo-store/dist/client/build/routes/($lang)/products/index-266HKDAN.js.map +0 -7
  315. package/dist/templates/demo-store/dist/client/build/routes/($lang)/search-CH57YG7S.js +0 -54
  316. package/dist/templates/demo-store/dist/client/build/routes/($lang)/search-CH57YG7S.js.map +0 -7
  317. package/dist/templates/demo-store/dist/client/build/routes/graphiql-ZHVT5SA7.js +0 -2
  318. package/dist/templates/demo-store/dist/client/build/routes/graphiql-ZHVT5SA7.js.map +0 -7
  319. package/dist/templates/demo-store/dist/worker/_assets/IBMPlexSerif-Text-YFMZNZW6.woff2 +0 -0
  320. package/dist/templates/demo-store/dist/worker/_assets/IBMPlexSerif-TextItalic-CS6L5H7S.woff2 +0 -0
  321. package/dist/templates/demo-store/dist/worker/index.js +0 -1385
  322. package/dist/templates/demo-store/dist/worker/index.js.map +0 -7
  323. package/dist/templates/demo-store/package.json +0 -67
  324. package/dist/templates/demo-store/playwright.config.ts +0 -109
  325. package/dist/templates/demo-store/postcss.config.js +0 -10
  326. package/dist/templates/demo-store/public/favicon.svg +0 -28
  327. package/dist/templates/demo-store/remix.env.d.ts +0 -40
  328. package/dist/templates/demo-store/remix.init/index.js +0 -25
  329. package/dist/templates/demo-store/remix.init/package.json +0 -7
  330. package/dist/templates/demo-store/server.ts +0 -73
  331. package/dist/templates/demo-store/styles/app.css +0 -182
  332. package/dist/templates/demo-store/tailwind.config.js +0 -70
  333. package/dist/templates/demo-store/tests/cart.test.ts +0 -70
  334. package/dist/templates/demo-store/tests/seo.test.ts +0 -36
  335. package/dist/templates/demo-store/tests/utils.ts +0 -100
  336. package/dist/templates/demo-store/tsconfig.json +0 -25
  337. package/dist/templates/hello-world/.cache/content-v2/sha512/13/f6/b7f804d45a961ca1e392429e75ad80f23ba46cbba0e960c6a70f8de81f3f3763af59651474176798d1a1a4bd2a5109b1d441f6d1c8ba070b678b38378adf +0 -1
  338. package/dist/templates/hello-world/.cache/content-v2/sha512/4b/d3/aedf0c5a14c0f852936adb81a3bbd15ad1d5d9964ffe11a40d56bbdb2f2a4c7588ffa1d1ee657a3c3be4f6e6194465365f5d4213ef3b4e5086aa4bf0a5a4 +0 -1
  339. package/dist/templates/hello-world/.cache/content-v2/sha512/fa/dd/9bc10a1cb1f145eabd96bdba509178e20484197fefd8469ace9f53bf277e875751db3c4dddf229807c48cbe8db19494fe2a5aab7d2a4b7ae8bebbd67509c +0 -1
  340. package/dist/templates/hello-world/.cache/index-v5/09/f6/fe4b05c4157320b8b59b3f84116195be0437d87357d743d21acd638a4606 +0 -2
  341. package/dist/templates/hello-world/.cache/index-v5/b3/75/d3e7a4a5df68530007409daf1d2e66ab789c8b658d1819d7e5fd183f5f57 +0 -2
  342. package/dist/templates/hello-world/.cache/index-v5/d0/c4/d960260ece228d28f70e317741b3f3f3df05c53956d870235837ae2b73b4 +0 -2
  343. package/dist/templates/hello-world/.eslintignore +0 -4
  344. package/dist/templates/hello-world/.eslintrc.js +0 -6
  345. package/dist/templates/hello-world/.graphqlrc.yml +0 -1
  346. package/dist/templates/hello-world/README.md +0 -20
  347. package/dist/templates/hello-world/_env +0 -6
  348. package/dist/templates/hello-world/_gitignore +0 -8
  349. package/dist/templates/hello-world/app/components/Layout.tsx +0 -15
  350. package/dist/templates/hello-world/app/components/index.ts +0 -1
  351. package/dist/templates/hello-world/app/entry.client.tsx +0 -4
  352. package/dist/templates/hello-world/app/entry.server.tsx +0 -21
  353. package/dist/templates/hello-world/app/root.tsx +0 -212
  354. package/dist/templates/hello-world/app/routes/graphiql.tsx +0 -10
  355. package/dist/templates/hello-world/app/styles/app.css +0 -38
  356. package/dist/templates/hello-world/dist/client/build/_assets/app-NBPUE4H5.css +0 -1
  357. package/dist/templates/hello-world/dist/client/build/_assets/favicon-5FIZBM2K.svg +0 -28
  358. package/dist/templates/hello-world/dist/client/build/_shared/chunk-MEPKJ2VW.js +0 -2
  359. package/dist/templates/hello-world/dist/client/build/_shared/chunk-MEPKJ2VW.js.map +0 -7
  360. package/dist/templates/hello-world/dist/client/build/_shared/chunk-SYP5DAMV.js +0 -2
  361. package/dist/templates/hello-world/dist/client/build/_shared/chunk-SYP5DAMV.js.map +0 -7
  362. package/dist/templates/hello-world/dist/client/build/_shared/chunk-UWGFS4PS.js +0 -31
  363. package/dist/templates/hello-world/dist/client/build/_shared/chunk-UWGFS4PS.js.map +0 -7
  364. package/dist/templates/hello-world/dist/client/build/entry.client-YKLPLTIJ.js +0 -9
  365. package/dist/templates/hello-world/dist/client/build/entry.client-YKLPLTIJ.js.map +0 -7
  366. package/dist/templates/hello-world/dist/client/build/manifest-5BEA23FF.js +0 -1
  367. package/dist/templates/hello-world/dist/client/build/root-YMCCM3GG.js +0 -2
  368. package/dist/templates/hello-world/dist/client/build/root-YMCCM3GG.js.map +0 -7
  369. package/dist/templates/hello-world/dist/client/build/routes/graphiql-ZHVT5SA7.js +0 -2
  370. package/dist/templates/hello-world/dist/client/build/routes/graphiql-ZHVT5SA7.js.map +0 -7
  371. package/dist/templates/hello-world/dist/client/build/routes/index-TH4MKESG.js +0 -2
  372. package/dist/templates/hello-world/dist/client/build/routes/index-TH4MKESG.js.map +0 -7
  373. package/dist/templates/hello-world/dist/client/favicon.svg +0 -28
  374. package/dist/templates/hello-world/dist/worker/index.js +0 -172
  375. package/dist/templates/hello-world/dist/worker/index.js.map +0 -7
  376. package/dist/templates/hello-world/package.json +0 -41
  377. package/dist/templates/hello-world/public/favicon.svg +0 -28
  378. package/dist/templates/hello-world/remix.env.d.ts +0 -35
  379. package/dist/templates/hello-world/remix.init/index.js +0 -25
  380. package/dist/templates/hello-world/remix.init/package.json +0 -7
  381. package/dist/templates/hello-world/server.ts +0 -129
  382. package/dist/templates/hello-world/tsconfig.json +0 -25
  383. package/dist/tmp-create-app.js +0 -33
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../../app/routes/($lang)/account/__private/address/$id.tsx"],
4
- "sourcesContent": ["import {json, redirect, type ActionFunction} from '@shopify/remix-oxygen';\nimport {\n Form,\n useActionData,\n useOutletContext,\n useParams,\n useTransition,\n} from '@remix-run/react';\nimport {flattenConnection} from '@shopify/storefront-kit-react';\nimport type {MailingAddressInput} from '@shopify/storefront-kit-react/storefront-api-types';\nimport invariant from 'tiny-invariant';\nimport {Button, Text} from '~/components';\nimport {\n createCustomerAddress,\n deleteCustomerAddress,\n updateCustomerAddress,\n updateCustomerDefaultAddress,\n} from '~/data';\nimport {getInputStyleClasses} from '~/lib/utils';\nimport type {AccountOutletContext} from '../edit';\n\ninterface ActionData {\n formError?: string;\n}\n\nconst badRequest = (data: ActionData) => json(data, {status: 400});\n\nexport const handle = {\n renderInModal: true,\n};\n\nexport const action: ActionFunction = async ({request, context, params}) => {\n const formData = await request.formData();\n\n const customerAccessToken = await context.session.get('customerAccessToken');\n invariant(customerAccessToken, 'You must be logged in to edit your account.');\n\n const addressId = formData.get('addressId');\n invariant(typeof addressId === 'string', 'You must provide an address id.');\n\n if (request.method === 'DELETE') {\n try {\n await deleteCustomerAddress(context, {\n customerAccessToken,\n addressId,\n });\n\n return redirect(params.lang ? `${params.lang}/account` : '/account');\n } catch (error: any) {\n return badRequest({formError: error.message});\n }\n }\n\n const address: MailingAddressInput = {};\n\n const keys: (keyof MailingAddressInput)[] = [\n 'lastName',\n 'firstName',\n 'address1',\n 'address2',\n 'city',\n 'province',\n 'country',\n 'zip',\n 'phone',\n 'company',\n ];\n\n for (const key of keys) {\n const value = formData.get(key);\n if (typeof value === 'string') {\n address[key] = value;\n }\n }\n\n const defaultAddress = formData.get('defaultAddress');\n\n if (addressId === 'add') {\n try {\n const id = await createCustomerAddress(context, {\n customerAccessToken,\n address,\n });\n\n if (defaultAddress) {\n await updateCustomerDefaultAddress(context, {\n customerAccessToken,\n addressId: id,\n });\n }\n\n return redirect(params.lang ? `${params.lang}/account` : '/account');\n } catch (error: any) {\n return badRequest({formError: error.message});\n }\n } else {\n try {\n await updateCustomerAddress(context, {\n customerAccessToken,\n addressId: decodeURIComponent(addressId),\n address,\n });\n\n if (defaultAddress) {\n await updateCustomerDefaultAddress(context, {\n customerAccessToken,\n addressId: decodeURIComponent(addressId),\n });\n }\n\n return redirect(params.lang ? `${params.lang}/account` : '/account');\n } catch (error: any) {\n return badRequest({formError: error.message});\n }\n }\n};\n\nexport default function EditAddress() {\n const {addressId} = useParams();\n const isNewAddress = addressId === 'add';\n const actionData = useActionData<ActionData>();\n const transition = useTransition();\n const {customer} = useOutletContext<AccountOutletContext>();\n const addresses = flattenConnection(customer.addresses);\n const defaultAddress = customer.defaultAddress;\n /**\n * When a refresh happens (or a user visits this link directly), the URL\n * is actually stale because it contains a special token. This means the data\n * loaded by the parent and passed to the outlet contains a newer, fresher token,\n * and we don't find a match. We update the `find` logic to just perform a match\n * on the first (permanent) part of the ID.\n */\n const normalizedAddress = decodeURIComponent(addressId ?? '').split('?')[0];\n const address = addresses.find((address) =>\n address.id!.startsWith(normalizedAddress),\n );\n\n return (\n <>\n <Text className=\"mt-4 mb-6\" as=\"h3\" size=\"lead\">\n {isNewAddress ? 'Add address' : 'Edit address'}\n </Text>\n <div className=\"max-w-lg\">\n <Form method=\"post\">\n <input\n type=\"hidden\"\n name=\"addressId\"\n value={address?.id ?? addressId}\n />\n {actionData?.formError && (\n <div className=\"flex items-center justify-center mb-6 bg-red-100 rounded\">\n <p className=\"m-4 text-sm text-red-900\">{actionData.formError}</p>\n </div>\n )}\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses()}\n id=\"firstName\"\n name=\"firstName\"\n required\n type=\"text\"\n autoComplete=\"given-name\"\n placeholder=\"First name\"\n aria-label=\"First name\"\n defaultValue={address?.firstName ?? ''}\n />\n </div>\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses()}\n id=\"lastName\"\n name=\"lastName\"\n required\n type=\"text\"\n autoComplete=\"family-name\"\n placeholder=\"Last name\"\n aria-label=\"Last name\"\n defaultValue={address?.lastName ?? ''}\n />\n </div>\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses()}\n id=\"company\"\n name=\"company\"\n type=\"text\"\n autoComplete=\"organization\"\n placeholder=\"Company\"\n aria-label=\"Company\"\n defaultValue={address?.company ?? ''}\n />\n </div>\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses()}\n id=\"address1\"\n name=\"address1\"\n type=\"text\"\n autoComplete=\"address-line1\"\n placeholder=\"Address line 1*\"\n required\n aria-label=\"Address line 1\"\n defaultValue={address?.address1 ?? ''}\n />\n </div>\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses()}\n id=\"address2\"\n name=\"address2\"\n type=\"text\"\n autoComplete=\"address-line2\"\n placeholder=\"Address line 2\"\n aria-label=\"Address line 2\"\n defaultValue={address?.address2 ?? ''}\n />\n </div>\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses()}\n id=\"city\"\n name=\"city\"\n type=\"text\"\n required\n autoComplete=\"address-level2\"\n placeholder=\"City\"\n aria-label=\"City\"\n defaultValue={address?.city ?? ''}\n />\n </div>\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses()}\n id=\"province\"\n name=\"province\"\n type=\"text\"\n autoComplete=\"address-level1\"\n placeholder=\"State / Province\"\n required\n aria-label=\"State\"\n defaultValue={address?.province ?? ''}\n />\n </div>\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses()}\n id=\"zip\"\n name=\"zip\"\n type=\"text\"\n autoComplete=\"postal-code\"\n placeholder=\"Zip / Postal Code\"\n required\n aria-label=\"Zip\"\n defaultValue={address?.zip ?? ''}\n />\n </div>\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses()}\n id=\"country\"\n name=\"country\"\n type=\"text\"\n autoComplete=\"country-name\"\n placeholder=\"Country\"\n required\n aria-label=\"Country\"\n defaultValue={address?.country ?? ''}\n />\n </div>\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses()}\n id=\"phone\"\n name=\"phone\"\n type=\"tel\"\n autoComplete=\"tel\"\n placeholder=\"Phone\"\n aria-label=\"Phone\"\n defaultValue={address?.phone ?? ''}\n />\n </div>\n <div className=\"mt-4\">\n <input\n type=\"checkbox\"\n name=\"defaultAddress\"\n id=\"defaultAddress\"\n defaultChecked={defaultAddress?.id === address?.id}\n className=\"border-gray-500 rounded-sm cursor-pointer border-1\"\n />\n <label\n className=\"inline-block ml-2 text-sm cursor-pointer\"\n htmlFor=\"defaultAddress\"\n >\n Set as default address\n </label>\n </div>\n <div className=\"mt-8\">\n <Button\n className=\"w-full rounded focus:shadow-outline\"\n type=\"submit\"\n variant=\"primary\"\n disabled={transition.state !== 'idle'}\n >\n {transition.state !== 'idle' ? 'Saving' : 'Save'}\n </Button>\n </div>\n <div>\n <Button\n to=\"..\"\n className=\"w-full mt-2 rounded focus:shadow-outline\"\n variant=\"secondary\"\n >\n Cancel\n </Button>\n </div>\n </Form>\n </div>\n </>\n );\n}\n"],
5
- "mappings": "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",
6
- "names": ["import_jsx_runtime", "handle", "EditAddress", "addressId", "useParams", "isNewAddress", "actionData", "useActionData", "transition", "useTransition", "customer", "useOutletContext", "addresses", "flattenConnection", "defaultAddress", "normalizedAddress", "address", "Text", "Form", "getInputStyleClasses", "Button"]
7
- }
@@ -1,2 +0,0 @@
1
- import"/build/_shared/chunk-EW52HEI6.js";import{D as w,E as a,R as n}from"/build/_shared/chunk-SZCP6RSO.js";import"/build/_shared/chunk-7CKXJRLM.js";import{f as s}from"/build/_shared/chunk-NIVT6A2W.js";import"/build/_shared/chunk-AYHDHSL7.js";import"/build/_shared/chunk-7CASD2US.js";import{c as m,g as d,r as c,s as u}from"/build/_shared/chunk-YCAWB56Y.js";import{b as p}from"/build/_shared/chunk-SYP5DAMV.js";import{c as l}from"/build/_shared/chunk-MEPKJ2VW.js";var e=l(p());var g={renderInModal:!0};function f(){let t=c(),{customer:r}=m(),o=u();return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(a,{className:"mt-4 mb-6",as:"h3",size:"lead",children:"Update your profile"}),(0,e.jsxs)(d,{method:"post",children:[t?.formError&&(0,e.jsx)("div",{className:"flex items-center justify-center mb-6 bg-red-100 rounded",children:(0,e.jsx)("p",{className:"m-4 text-sm text-red-900",children:t.formError})}),(0,e.jsx)("div",{className:"mt-3",children:(0,e.jsx)("input",{className:s(),id:"firstName",name:"firstName",type:"text",autoComplete:"given-name",placeholder:"First name","aria-label":"First name",defaultValue:r.firstName??""})}),(0,e.jsx)("div",{className:"mt-3",children:(0,e.jsx)("input",{className:s(),id:"lastName",name:"lastName",type:"text",autoComplete:"family-name",placeholder:"Last name","aria-label":"Last name",defaultValue:r.lastName??""})}),(0,e.jsx)("div",{className:"mt-3",children:(0,e.jsx)("input",{className:s(),id:"phone",name:"phone",type:"tel",autoComplete:"tel",placeholder:"Mobile","aria-label":"Mobile",defaultValue:r.phone??""})}),(0,e.jsxs)("div",{className:"mt-3",children:[(0,e.jsx)("input",{className:s(t?.fieldErrors?.email),id:"email",name:"email",type:"email",autoComplete:"email",required:!0,placeholder:"Email address","aria-label":"Email address",defaultValue:r.email??""}),t?.fieldErrors?.email&&(0,e.jsxs)("p",{className:"text-red-500 text-xs",children:[t.fieldErrors.email," \xA0"]})]}),(0,e.jsx)(a,{className:"mb-6 mt-6",as:"h3",size:"lead",children:"Change your password"}),(0,e.jsx)(i,{name:"currentPassword",label:"Current password",passwordError:t?.fieldErrors?.currentPassword}),t?.fieldErrors?.currentPassword&&(0,e.jsxs)(a,{size:"fine",className:"mt-1 text-red-500",children:[t.fieldErrors.currentPassword," \xA0"]}),(0,e.jsx)(i,{name:"newPassword",label:"New password",passwordError:t?.fieldErrors?.newPassword}),(0,e.jsx)(i,{name:"newPassword2",label:"Re-enter new password",passwordError:t?.fieldErrors?.newPassword2}),(0,e.jsx)(a,{size:"fine",color:"subtle",className:w("mt-1",t?.fieldErrors?.newPassword&&"text-red-500"),children:"Passwords must be at least 8 characters."}),t?.fieldErrors?.newPassword2?(0,e.jsx)("br",{}):null,t?.fieldErrors?.newPassword2&&(0,e.jsxs)(a,{size:"fine",className:"mt-1 text-red-500",children:[t.fieldErrors.newPassword2," \xA0"]}),(0,e.jsx)("div",{className:"mt-6",children:(0,e.jsx)(n,{className:"text-sm mb-2",variant:"primary",width:"full",type:"submit",disabled:o.state!=="idle",children:o.state!=="idle"?"Saving":"Save"})}),(0,e.jsx)("div",{className:"mb-4",children:(0,e.jsx)(n,{to:"..",className:"text-sm",variant:"secondary",width:"full",children:"Cancel"})})]})]})}function i({name:t,passwordError:r,label:o}){return(0,e.jsx)("div",{className:"mt-3",children:(0,e.jsx)("input",{className:s(r),id:t,name:t,type:"password",autoComplete:t==="currentPassword"?"current-password":void 0,placeholder:o,"aria-label":o,minLength:8})})}export{f as default,g as handle};
2
- //# sourceMappingURL=/build/routes/($lang)/account/__private/edit-3XQ4BLHS.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../app/routes/($lang)/account/__private/edit.tsx"],
4
- "sourcesContent": ["import {json, redirect, type ActionFunction} from '@shopify/remix-oxygen';\nimport {\n useActionData,\n Form,\n useOutletContext,\n useTransition,\n} from '@remix-run/react';\nimport type {\n Customer,\n CustomerUpdateInput,\n} from '@shopify/storefront-kit-react/storefront-api-types';\nimport clsx from 'clsx';\nimport invariant from 'tiny-invariant';\nimport {Button, Text} from '~/components';\nimport {getCustomer, updateCustomer} from '~/data';\nimport {getInputStyleClasses} from '~/lib/utils';\n\nexport interface AccountOutletContext {\n customer: Customer;\n}\n\nexport interface ActionData {\n success?: boolean;\n formError?: string;\n fieldErrors?: {\n firstName?: string;\n lastName?: string;\n email?: string;\n phone?: string;\n currentPassword?: string;\n newPassword?: string;\n newPassword2?: string;\n };\n}\n\nconst badRequest = (data: ActionData) => json(data, {status: 400});\n\nconst formDataHas = (formData: FormData, key: string) => {\n if (!formData.has(key)) return false;\n\n const value = formData.get(key);\n return typeof value === 'string' && value.length > 0;\n};\n\nexport const handle = {\n renderInModal: true,\n};\n\nexport const action: ActionFunction = async ({request, context, params}) => {\n const formData = await request.formData();\n\n const customerAccessToken = await context.session.get('customerAccessToken');\n\n invariant(\n customerAccessToken,\n 'You must be logged in to update your account details.',\n );\n\n // Double-check current user is logged in.\n // Will throw a logout redirect if not.\n await getCustomer(context, customerAccessToken);\n\n if (\n formDataHas(formData, 'newPassword') &&\n !formDataHas(formData, 'currentPassword')\n ) {\n return badRequest({\n fieldErrors: {\n currentPassword:\n 'Please enter your current password before entering a new password.',\n },\n });\n }\n\n if (\n formData.has('newPassword') &&\n formData.get('newPassword') !== formData.get('newPassword2')\n ) {\n return badRequest({\n fieldErrors: {\n newPassword2: 'New passwords must match.',\n },\n });\n }\n\n try {\n const customer: CustomerUpdateInput = {};\n\n formDataHas(formData, 'firstName') &&\n (customer.firstName = formData.get('firstName') as string);\n formDataHas(formData, 'lastName') &&\n (customer.lastName = formData.get('lastName') as string);\n formDataHas(formData, 'email') &&\n (customer.email = formData.get('email') as string);\n formDataHas(formData, 'phone') &&\n (customer.phone = formData.get('phone') as string);\n formDataHas(formData, 'newPassword') &&\n (customer.password = formData.get('newPassword') as string);\n\n await updateCustomer(context, {customerAccessToken, customer});\n\n return redirect(params?.lang ? `${params.lang}/account` : '/account');\n } catch (error: any) {\n return badRequest({formError: error.message});\n }\n};\n\n/**\n * Since this component is nested in `accounts/`, it is rendered in a modal via `<Outlet>` in `account.tsx`.\n *\n * This allows us to:\n * - preserve URL state (`/accounts/edit` when the modal is open)\n * - co-locate the edit action with the edit form (rather than grouped in account.tsx)\n * - use the `useOutletContext` hook to access the customer data from the parent route (no additional data loading)\n * - return a simple `redirect()` from this action to close the modal :mindblown: (no useState/useEffect)\n * - use the presence of outlet data (in `account.tsx`) to open/close the modal (no useState)\n */\nexport default function AccountDetailsEdit() {\n const actionData = useActionData<ActionData>();\n const {customer} = useOutletContext<AccountOutletContext>();\n const transition = useTransition();\n\n return (\n <>\n <Text className=\"mt-4 mb-6\" as=\"h3\" size=\"lead\">\n Update your profile\n </Text>\n <Form method=\"post\">\n {actionData?.formError && (\n <div className=\"flex items-center justify-center mb-6 bg-red-100 rounded\">\n <p className=\"m-4 text-sm text-red-900\">{actionData.formError}</p>\n </div>\n )}\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses()}\n id=\"firstName\"\n name=\"firstName\"\n type=\"text\"\n autoComplete=\"given-name\"\n placeholder=\"First name\"\n aria-label=\"First name\"\n defaultValue={customer.firstName ?? ''}\n />\n </div>\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses()}\n id=\"lastName\"\n name=\"lastName\"\n type=\"text\"\n autoComplete=\"family-name\"\n placeholder=\"Last name\"\n aria-label=\"Last name\"\n defaultValue={customer.lastName ?? ''}\n />\n </div>\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses()}\n id=\"phone\"\n name=\"phone\"\n type=\"tel\"\n autoComplete=\"tel\"\n placeholder=\"Mobile\"\n aria-label=\"Mobile\"\n defaultValue={customer.phone ?? ''}\n />\n </div>\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses(actionData?.fieldErrors?.email)}\n id=\"email\"\n name=\"email\"\n type=\"email\"\n autoComplete=\"email\"\n required\n placeholder=\"Email address\"\n aria-label=\"Email address\"\n defaultValue={customer.email ?? ''}\n />\n {actionData?.fieldErrors?.email && (\n <p className=\"text-red-500 text-xs\">\n {actionData.fieldErrors.email} &nbsp;\n </p>\n )}\n </div>\n <Text className=\"mb-6 mt-6\" as=\"h3\" size=\"lead\">\n Change your password\n </Text>\n <Password\n name=\"currentPassword\"\n label=\"Current password\"\n passwordError={actionData?.fieldErrors?.currentPassword}\n />\n {actionData?.fieldErrors?.currentPassword && (\n <Text size=\"fine\" className=\"mt-1 text-red-500\">\n {actionData.fieldErrors.currentPassword} &nbsp;\n </Text>\n )}\n <Password\n name=\"newPassword\"\n label=\"New password\"\n passwordError={actionData?.fieldErrors?.newPassword}\n />\n <Password\n name=\"newPassword2\"\n label=\"Re-enter new password\"\n passwordError={actionData?.fieldErrors?.newPassword2}\n />\n <Text\n size=\"fine\"\n color=\"subtle\"\n className={clsx(\n 'mt-1',\n actionData?.fieldErrors?.newPassword && 'text-red-500',\n )}\n >\n Passwords must be at least 8 characters.\n </Text>\n {actionData?.fieldErrors?.newPassword2 ? <br /> : null}\n {actionData?.fieldErrors?.newPassword2 && (\n <Text size=\"fine\" className=\"mt-1 text-red-500\">\n {actionData.fieldErrors.newPassword2} &nbsp;\n </Text>\n )}\n <div className=\"mt-6\">\n <Button\n className=\"text-sm mb-2\"\n variant=\"primary\"\n width=\"full\"\n type=\"submit\"\n disabled={transition.state !== 'idle'}\n >\n {transition.state !== 'idle' ? 'Saving' : 'Save'}\n </Button>\n </div>\n <div className=\"mb-4\">\n <Button to=\"..\" className=\"text-sm\" variant=\"secondary\" width=\"full\">\n Cancel\n </Button>\n </div>\n </Form>\n </>\n );\n}\n\nfunction Password({\n name,\n passwordError,\n label,\n}: {\n name: string;\n passwordError?: string;\n label: string;\n}) {\n return (\n <div className=\"mt-3\">\n <input\n className={getInputStyleClasses(passwordError)}\n id={name}\n name={name}\n type=\"password\"\n autoComplete={\n name === 'currentPassword' ? 'current-password' : undefined\n }\n placeholder={label}\n aria-label={label}\n minLength={8}\n />\n </div>\n );\n}\n"],
5
- "mappings": "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",
6
- "names": ["import_jsx_runtime", "handle", "AccountDetailsEdit", "actionData", "useActionData", "customer", "useOutletContext", "transition", "useTransition", "Text", "Form", "getInputStyleClasses", "Password", "clsx_m_default", "Button", "name", "passwordError", "label"]
7
- }
@@ -1,2 +0,0 @@
1
- import{b as o}from"/build/_shared/chunk-MEPKJ2VW.js";var p=o((r,e)=>{e.exports={}});export default p();
2
- //# sourceMappingURL=/build/routes/($lang)/account/__private/logout-7KXWFBCX.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["browser-route-module:routes/($lang)/account/__private/logout.ts?browser"],
4
- "sourcesContent": ["module.exports = {};"],
5
- "mappings": "qDAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CAAAA,EAAO,QAAU,CAAC",
6
- "names": ["require_logout", "__commonJSMin", "exports", "module"]
7
- }
@@ -1,2 +0,0 @@
1
- import"/build/_shared/chunk-EW52HEI6.js";import{D as g,E as a,F as o,H as u,Y as l}from"/build/_shared/chunk-SZCP6RSO.js";import{b as h,e as i}from"/build/_shared/chunk-7CKXJRLM.js";import{g as p}from"/build/_shared/chunk-NIVT6A2W.js";import"/build/_shared/chunk-AYHDHSL7.js";import"/build/_shared/chunk-7CASD2US.js";import{q as c}from"/build/_shared/chunk-YCAWB56Y.js";import{b as m}from"/build/_shared/chunk-SYP5DAMV.js";import{c as n}from"/build/_shared/chunk-MEPKJ2VW.js";var t=n(m()),N=({data:s})=>({title:`Order ${s?.order?.name}`});function f(){let{order:s,lineItems:x,discountValue:d,discountPercentage:r}=c();return(0,t.jsxs)("div",{children:[(0,t.jsx)(u,{heading:"Order detail",children:(0,t.jsx)(l,{to:"/account",children:(0,t.jsx)(a,{color:"subtle",children:"Return to Account Overview"})})}),(0,t.jsx)("div",{className:"w-full p-6 sm:grid-cols-1 md:p-8 lg:p-12 lg:py-6",children:(0,t.jsxs)("div",{children:[(0,t.jsxs)(a,{as:"h3",size:"lead",children:["Order No. ",s.name]}),(0,t.jsxs)(a,{className:"mt-2",as:"p",children:["Placed on ",new Date(s.processedAt).toDateString()]}),(0,t.jsxs)("div",{className:"grid items-start gap-12 sm:grid-cols-1 md:grid-cols-4 md:gap-16 sm:divide-y sm:divide-gray-200",children:[(0,t.jsxs)("table",{className:"min-w-full my-8 divide-y divide-gray-300 md:col-span-3",children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{className:"align-baseline ",children:[(0,t.jsx)("th",{scope:"col",className:"pb-4 pl-0 pr-3 font-semibold text-left",children:"Product"}),(0,t.jsx)("th",{scope:"col",className:"hidden px-4 pb-4 font-semibold text-right sm:table-cell md:table-cell",children:"Price"}),(0,t.jsx)("th",{scope:"col",className:"hidden px-4 pb-4 font-semibold text-right sm:table-cell md:table-cell",children:"Quantity"}),(0,t.jsx)("th",{scope:"col",className:"px-4 pb-4 font-semibold text-right",children:"Total"})]})}),(0,t.jsx)("tbody",{className:"divide-y divide-gray-200",children:x.map(e=>(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",{className:"w-full py-4 pl-0 pr-3 align-top sm:align-middle max-w-0 sm:w-auto sm:max-w-none",children:(0,t.jsxs)("div",{className:"flex gap-6",children:[(0,t.jsx)(l,{to:`/products/${e.variant.product.handle}`,children:e?.variant?.image&&(0,t.jsx)("div",{className:"w-24 card-image aspect-square",children:(0,t.jsx)(h,{data:{url:e.variant.image.src},width:e.variant.image.width,height:e.variant.image.height,alt:e.variant.image.altText,loaderOptions:{scale:2,crop:"center"}})})}),(0,t.jsxs)("div",{className:"flex-col justify-center hidden lg:flex",children:[(0,t.jsx)(a,{as:"p",children:e.title}),(0,t.jsx)(a,{size:"fine",className:"mt-1",as:"p",children:e.variant.title})]}),(0,t.jsxs)("dl",{className:"grid",children:[(0,t.jsx)("dt",{className:"sr-only",children:"Product"}),(0,t.jsxs)("dd",{className:"truncate lg:hidden",children:[(0,t.jsx)(o,{size:"copy",format:!0,as:"h3",children:e.title}),(0,t.jsx)(a,{size:"fine",className:"mt-1",children:e.variant.title})]}),(0,t.jsx)("dt",{className:"sr-only",children:"Price"}),(0,t.jsx)("dd",{className:"truncate sm:hidden",children:(0,t.jsx)(a,{size:"fine",className:"mt-4",children:(0,t.jsx)(i,{data:e.variant.price})})}),(0,t.jsx)("dt",{className:"sr-only",children:"Quantity"}),(0,t.jsx)("dd",{className:"truncate sm:hidden",children:(0,t.jsxs)(a,{className:"mt-1",size:"fine",children:["Qty: ",e.quantity]})})]})]})}),(0,t.jsx)("td",{className:"hidden px-3 py-4 text-right align-top sm:align-middle sm:table-cell",children:(0,t.jsx)(i,{data:e.variant.price})}),(0,t.jsx)("td",{className:"hidden px-3 py-4 text-right align-top sm:align-middle sm:table-cell",children:e.quantity}),(0,t.jsx)("td",{className:"px-3 py-4 text-right align-top sm:align-middle sm:table-cell",children:(0,t.jsx)(a,{children:(0,t.jsx)(i,{data:e.discountedTotalPrice})})})]},e.variant.id))}),(0,t.jsxs)("tfoot",{children:[(d&&d.amount||r)&&(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{scope:"row",colSpan:3,className:"hidden pt-6 pl-6 pr-3 font-normal text-right sm:table-cell md:pl-0",children:(0,t.jsx)(a,{children:"Discounts"})}),(0,t.jsx)("th",{scope:"row",className:"pt-6 pr-3 font-normal text-left sm:hidden",children:(0,t.jsx)(a,{children:"Discounts"})}),(0,t.jsx)("td",{className:"pt-6 pl-3 pr-4 font-medium text-right text-green-700 md:pr-3",children:r?(0,t.jsxs)("span",{className:"text-sm",children:["-",r,"% OFF"]}):d&&(0,t.jsx)(i,{data:d})})]}),(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{scope:"row",colSpan:3,className:"hidden pt-6 pl-6 pr-3 font-normal text-right sm:table-cell md:pl-0",children:(0,t.jsx)(a,{children:"Subtotal"})}),(0,t.jsx)("th",{scope:"row",className:"pt-6 pr-3 font-normal text-left sm:hidden",children:(0,t.jsx)(a,{children:"Subtotal"})}),(0,t.jsx)("td",{className:"pt-6 pl-3 pr-4 text-right md:pr-3",children:(0,t.jsx)(i,{data:s.subtotalPriceV2})})]}),(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{scope:"row",colSpan:3,className:"hidden pt-4 pl-6 pr-3 font-normal text-right sm:table-cell md:pl-0",children:"Tax"}),(0,t.jsx)("th",{scope:"row",className:"pt-4 pr-3 font-normal text-left sm:hidden",children:(0,t.jsx)(a,{children:"Tax"})}),(0,t.jsx)("td",{className:"pt-4 pl-3 pr-4 text-right md:pr-3",children:(0,t.jsx)(i,{data:s.totalTaxV2})})]}),(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{scope:"row",colSpan:3,className:"hidden pt-4 pl-6 pr-3 font-semibold text-right sm:table-cell md:pl-0",children:"Total"}),(0,t.jsx)("th",{scope:"row",className:"pt-4 pr-3 font-semibold text-left sm:hidden",children:(0,t.jsx)(a,{children:"Total"})}),(0,t.jsx)("td",{className:"pt-4 pl-3 pr-4 font-semibold text-right md:pr-3",children:(0,t.jsx)(i,{data:s.totalPriceV2})})]})]})]}),(0,t.jsxs)("div",{className:"sticky border-none top-nav md:my-8",children:[(0,t.jsx)(o,{size:"copy",className:"font-semibold",as:"h3",children:"Shipping Address"}),s?.shippingAddress?(0,t.jsxs)("ul",{className:"mt-6",children:[(0,t.jsx)("li",{children:(0,t.jsxs)(a,{children:[s.shippingAddress.firstName&&s.shippingAddress.firstName+" ",s.shippingAddress.lastName]})}),s?.shippingAddress?.formatted?s.shippingAddress.formatted.map(e=>(0,t.jsx)("li",{children:(0,t.jsx)(a,{children:e})},e)):(0,t.jsx)(t.Fragment,{})]}):(0,t.jsx)("p",{className:"mt-3",children:"No shipping address defined"}),(0,t.jsx)(o,{size:"copy",className:"mt-8 font-semibold",as:"h3",children:"Status"}),(0,t.jsx)("div",{className:g("mt-3 px-3 py-1 text-xs font-medium rounded-full inline-block w-auto",s.fulfillmentStatus==="FULFILLED"?"bg-green-100 text-green-800":"bg-primary/20 text-primary/50"),children:(0,t.jsx)(a,{size:"fine",children:p(s.fulfillmentStatus)})})]})]})]})})]})}export{f as default,N as meta};
2
- //# sourceMappingURL=/build/routes/($lang)/account/__private/orders.$id-7VQDCWO5.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../app/routes/($lang)/account/__private/orders.$id.tsx"],
4
- "sourcesContent": ["import invariant from 'tiny-invariant';\nimport clsx from 'clsx';\nimport {\n redirect,\n json,\n type MetaFunction,\n type LoaderArgs,\n} from '@shopify/remix-oxygen';\nimport {useLoaderData} from '@remix-run/react';\nimport {Money, Image, flattenConnection} from '@shopify/storefront-kit-react';\nimport {statusMessage} from '~/lib/utils';\nimport type {\n DiscountApplication,\n DiscountApplicationConnection,\n OrderLineItem,\n} from '@shopify/storefront-kit-react/storefront-api-types';\nimport {Link, Heading, PageHeader, Text} from '~/components';\nimport {getCustomerOrder} from '~/data';\n\nexport const meta: MetaFunction = ({data}) => ({\n title: `Order ${data?.order?.name}`,\n});\n\nexport async function loader({request, context, params}: LoaderArgs) {\n if (!params.id) {\n return redirect(params?.lang ? `${params.lang}/account` : '/account');\n }\n\n const queryParams = new URL(request.url).searchParams;\n const orderToken = queryParams.get('key');\n\n invariant(orderToken, 'Order token is required');\n\n const customerAccessToken = await context.session.get('customerAccessToken');\n\n if (!customerAccessToken) {\n return redirect(\n params.lang ? `${params.lang}/account/login` : '/account/login',\n );\n }\n\n const orderId = `gid://shopify/Order/${params.id}?key=${orderToken}`;\n\n const order = await getCustomerOrder(context, {orderId});\n\n if (!order) {\n throw new Response('Order not found', {status: 404});\n }\n\n const lineItems = flattenConnection(order.lineItems!) as Array<OrderLineItem>;\n\n const discountApplications = flattenConnection(\n order.discountApplications as DiscountApplicationConnection,\n );\n\n const firstDiscount = discountApplications[0]?.value;\n\n const discountValue =\n firstDiscount?.__typename === 'MoneyV2' && firstDiscount;\n\n const discountPercentage =\n firstDiscount?.__typename === 'PricingPercentageValue' &&\n firstDiscount?.percentage;\n\n return json({\n order,\n lineItems,\n discountValue,\n discountPercentage,\n });\n}\n\nexport default function OrderRoute() {\n const {order, lineItems, discountValue, discountPercentage} =\n useLoaderData<typeof loader>();\n return (\n <div>\n <PageHeader heading=\"Order detail\">\n <Link to=\"/account\">\n <Text color=\"subtle\">Return to Account Overview</Text>\n </Link>\n </PageHeader>\n <div className=\"w-full p-6 sm:grid-cols-1 md:p-8 lg:p-12 lg:py-6\">\n <div>\n <Text as=\"h3\" size=\"lead\">\n Order No. {order.name}\n </Text>\n <Text className=\"mt-2\" as=\"p\">\n Placed on {new Date(order.processedAt!).toDateString()}\n </Text>\n <div className=\"grid items-start gap-12 sm:grid-cols-1 md:grid-cols-4 md:gap-16 sm:divide-y sm:divide-gray-200\">\n <table className=\"min-w-full my-8 divide-y divide-gray-300 md:col-span-3\">\n <thead>\n <tr className=\"align-baseline \">\n <th\n scope=\"col\"\n className=\"pb-4 pl-0 pr-3 font-semibold text-left\"\n >\n Product\n </th>\n <th\n scope=\"col\"\n className=\"hidden px-4 pb-4 font-semibold text-right sm:table-cell md:table-cell\"\n >\n Price\n </th>\n <th\n scope=\"col\"\n className=\"hidden px-4 pb-4 font-semibold text-right sm:table-cell md:table-cell\"\n >\n Quantity\n </th>\n <th\n scope=\"col\"\n className=\"px-4 pb-4 font-semibold text-right\"\n >\n Total\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200\">\n {lineItems.map((lineItem: OrderLineItem) => (\n <tr key={lineItem.variant!.id}>\n <td className=\"w-full py-4 pl-0 pr-3 align-top sm:align-middle max-w-0 sm:w-auto sm:max-w-none\">\n <div className=\"flex gap-6\">\n <Link\n to={`/products/${lineItem.variant!.product!.handle}`}\n >\n {lineItem?.variant?.image && (\n <div className=\"w-24 card-image aspect-square\">\n <Image\n data={{\n url: lineItem.variant.image.src!,\n }}\n width={lineItem.variant.image.width!}\n height={lineItem.variant.image.height!}\n alt={lineItem.variant.image.altText!}\n loaderOptions={{\n scale: 2,\n crop: 'center',\n }}\n />\n </div>\n )}\n </Link>\n <div className=\"flex-col justify-center hidden lg:flex\">\n <Text as=\"p\">{lineItem.title}</Text>\n <Text size=\"fine\" className=\"mt-1\" as=\"p\">\n {lineItem.variant!.title}\n </Text>\n </div>\n <dl className=\"grid\">\n <dt className=\"sr-only\">Product</dt>\n <dd className=\"truncate lg:hidden\">\n <Heading size=\"copy\" format as=\"h3\">\n {lineItem.title}\n </Heading>\n <Text size=\"fine\" className=\"mt-1\">\n {lineItem.variant!.title}\n </Text>\n </dd>\n <dt className=\"sr-only\">Price</dt>\n <dd className=\"truncate sm:hidden\">\n <Text size=\"fine\" className=\"mt-4\">\n <Money data={lineItem.variant!.price!} />\n </Text>\n </dd>\n <dt className=\"sr-only\">Quantity</dt>\n <dd className=\"truncate sm:hidden\">\n <Text className=\"mt-1\" size=\"fine\">\n Qty: {lineItem.quantity}\n </Text>\n </dd>\n </dl>\n </div>\n </td>\n <td className=\"hidden px-3 py-4 text-right align-top sm:align-middle sm:table-cell\">\n <Money data={lineItem.variant!.price!} />\n </td>\n <td className=\"hidden px-3 py-4 text-right align-top sm:align-middle sm:table-cell\">\n {lineItem.quantity}\n </td>\n <td className=\"px-3 py-4 text-right align-top sm:align-middle sm:table-cell\">\n <Text>\n <Money data={lineItem.discountedTotalPrice!} />\n </Text>\n </td>\n </tr>\n ))}\n </tbody>\n <tfoot>\n {((discountValue && discountValue.amount) ||\n discountPercentage) && (\n <tr>\n <th\n scope=\"row\"\n colSpan={3}\n className=\"hidden pt-6 pl-6 pr-3 font-normal text-right sm:table-cell md:pl-0\"\n >\n <Text>Discounts</Text>\n </th>\n <th\n scope=\"row\"\n className=\"pt-6 pr-3 font-normal text-left sm:hidden\"\n >\n <Text>Discounts</Text>\n </th>\n <td className=\"pt-6 pl-3 pr-4 font-medium text-right text-green-700 md:pr-3\">\n {discountPercentage ? (\n <span className=\"text-sm\">\n -{discountPercentage}% OFF\n </span>\n ) : (\n discountValue && <Money data={discountValue!} />\n )}\n </td>\n </tr>\n )}\n <tr>\n <th\n scope=\"row\"\n colSpan={3}\n className=\"hidden pt-6 pl-6 pr-3 font-normal text-right sm:table-cell md:pl-0\"\n >\n <Text>Subtotal</Text>\n </th>\n <th\n scope=\"row\"\n className=\"pt-6 pr-3 font-normal text-left sm:hidden\"\n >\n <Text>Subtotal</Text>\n </th>\n <td className=\"pt-6 pl-3 pr-4 text-right md:pr-3\">\n <Money data={order.subtotalPriceV2!} />\n </td>\n </tr>\n <tr>\n <th\n scope=\"row\"\n colSpan={3}\n className=\"hidden pt-4 pl-6 pr-3 font-normal text-right sm:table-cell md:pl-0\"\n >\n Tax\n </th>\n <th\n scope=\"row\"\n className=\"pt-4 pr-3 font-normal text-left sm:hidden\"\n >\n <Text>Tax</Text>\n </th>\n <td className=\"pt-4 pl-3 pr-4 text-right md:pr-3\">\n <Money data={order.totalTaxV2!} />\n </td>\n </tr>\n <tr>\n <th\n scope=\"row\"\n colSpan={3}\n className=\"hidden pt-4 pl-6 pr-3 font-semibold text-right sm:table-cell md:pl-0\"\n >\n Total\n </th>\n <th\n scope=\"row\"\n className=\"pt-4 pr-3 font-semibold text-left sm:hidden\"\n >\n <Text>Total</Text>\n </th>\n <td className=\"pt-4 pl-3 pr-4 font-semibold text-right md:pr-3\">\n <Money data={order.totalPriceV2!} />\n </td>\n </tr>\n </tfoot>\n </table>\n <div className=\"sticky border-none top-nav md:my-8\">\n <Heading size=\"copy\" className=\"font-semibold\" as=\"h3\">\n Shipping Address\n </Heading>\n {order?.shippingAddress ? (\n <ul className=\"mt-6\">\n <li>\n <Text>\n {order.shippingAddress.firstName &&\n order.shippingAddress.firstName + ' '}\n {order.shippingAddress.lastName}\n </Text>\n </li>\n {order?.shippingAddress?.formatted ? (\n order.shippingAddress.formatted.map((line) => (\n <li key={line}>\n <Text>{line}</Text>\n </li>\n ))\n ) : (\n <></>\n )}\n </ul>\n ) : (\n <p className=\"mt-3\">No shipping address defined</p>\n )}\n <Heading size=\"copy\" className=\"mt-8 font-semibold\" as=\"h3\">\n Status\n </Heading>\n <div\n className={clsx(\n `mt-3 px-3 py-1 text-xs font-medium rounded-full inline-block w-auto`,\n order.fulfillmentStatus === 'FULFILLED'\n ? 'bg-green-100 text-green-800'\n : 'bg-primary/20 text-primary/50',\n )}\n >\n <Text size=\"fine\">\n {statusMessage(order.fulfillmentStatus!)}\n </Text>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],
5
- "mappings": "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",
6
- "names": ["import_jsx_runtime", "meta", "data", "OrderRoute", "order", "lineItems", "discountValue", "discountPercentage", "useLoaderData", "PageHeader", "Link", "Text", "lineItem", "Image", "Heading", "Money", "line", "clsx_m_default", "statusMessage"]
7
- }
@@ -1,2 +0,0 @@
1
- import"/build/_shared/chunk-EW52HEI6.js";import{f as c}from"/build/_shared/chunk-NIVT6A2W.js";import"/build/_shared/chunk-AYHDHSL7.js";import{g as p,r as f}from"/build/_shared/chunk-YCAWB56Y.js";import{a as y,b as w}from"/build/_shared/chunk-SYP5DAMV.js";import{c as i}from"/build/_shared/chunk-MEPKJ2VW.js";var r=i(y());var t=i(w());var g={isPublic:!0};var b=()=>({title:"Activate Account"});function v(){let l=f(),[s,u]=(0,r.useState)(null),[a,o]=(0,r.useState)(null),m=(0,r.useRef)(null),e=(0,r.useRef)(null),d=()=>{!e.current||(e.current.value.length&&e.current.value!==m.current?.value?o("The two passwords entered did not match."):e.current.validity.valid||!e.current.value.length?o(null):o(e.current.validity.valueMissing?"Please re-enter the password":"Passwords must be at least 8 characters"))};return(0,t.jsx)("div",{className:"flex justify-center my-24 px-4",children:(0,t.jsxs)("div",{className:"max-w-md w-full",children:[(0,t.jsx)("h1",{className:"text-4xl",children:"Activate Account."}),(0,t.jsx)("p",{className:"mt-4",children:"Create your password to activate your account."}),(0,t.jsxs)(p,{method:"post",noValidate:!0,className:"pt-6 pb-8 mt-4 mb-4 space-y-3",children:[l?.formError&&(0,t.jsx)("div",{className:"flex items-center justify-center mb-6 bg-zinc-500",children:(0,t.jsx)("p",{className:"m-4 text-s text-contrast",children:l.formError})}),(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("input",{ref:m,className:`mb-1 ${c(s)}`,id:"password",name:"password",type:"password",autoComplete:"current-password",placeholder:"Password","aria-label":"Password",minLength:8,required:!0,autoFocus:!0,onBlur:n=>{n.currentTarget.validity.valid||!n.currentTarget.value.length?(u(null),d()):u(n.currentTarget.validity.valueMissing?"Please enter a password":"Passwords must be at least 8 characters")}}),s&&(0,t.jsxs)("p",{className:"text-red-500 text-xs",children:[" ",s," \xA0"]})]}),(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("input",{ref:e,className:`mb-1 ${c(a)}`,id:"passwordConfirm",name:"passwordConfirm",type:"password",autoComplete:"current-password",placeholder:"Re-enter password","aria-label":"Re-enter password",minLength:8,required:!0,autoFocus:!0,onBlur:d}),a&&(0,t.jsxs)("p",{className:"text-red-500 text-xs",children:[" ",a," \xA0"]})]}),(0,t.jsx)("div",{className:"flex items-center justify-between",children:(0,t.jsx)("button",{className:"bg-primary text-contrast rounded py-2 px-4 focus:shadow-outline block w-full",type:"submit",children:"Save"})})]})]})})}export{v as default,g as handle,b as meta};
2
- //# sourceMappingURL=/build/routes/($lang)/account/__public/activate.$id.$activationToken-Z5BQE6J5.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../app/routes/($lang)/account/__public/activate.$id.$activationToken.tsx"],
4
- "sourcesContent": ["import {\n type MetaFunction,\n redirect,\n json,\n type ActionFunction,\n} from '@shopify/remix-oxygen';\nimport {Form, useActionData} from '@remix-run/react';\nimport {useRef, useState} from 'react';\nimport {activateAccount} from '~/data';\nimport {getInputStyleClasses} from '~/lib/utils';\n\ntype ActionData = {\n formError?: string;\n};\n\nconst badRequest = (data: ActionData) => json(data, {status: 400});\n\nexport const handle = {\n isPublic: true,\n};\n\nexport const action: ActionFunction = async ({\n request,\n context,\n params: {lang, id, activationToken},\n}) => {\n if (\n !id ||\n !activationToken ||\n typeof id !== 'string' ||\n typeof activationToken !== 'string'\n ) {\n return badRequest({\n formError: 'Wrong token. The link you followed might be wrong.',\n });\n }\n\n const formData = await request.formData();\n\n const password = formData.get('password');\n const passwordConfirm = formData.get('passwordConfirm');\n\n if (\n !password ||\n !passwordConfirm ||\n typeof password !== 'string' ||\n typeof passwordConfirm !== 'string' ||\n password !== passwordConfirm\n ) {\n return badRequest({\n formError: 'Please provide matching passwords',\n });\n }\n\n const {session, storefront} = context;\n\n try {\n const {accessToken} = await activateAccount(context, {\n id,\n activationToken,\n password,\n });\n\n session.set('customerAccessToken', accessToken);\n\n return redirect(lang ? `${lang}/account` : '/account', {\n headers: {\n 'Set-Cookie': await session.commit(),\n },\n });\n } catch (error: any) {\n if (storefront.isApiError(error)) {\n return badRequest({\n formError: 'Something went wrong. Please try again later.',\n });\n }\n\n /**\n * The user did something wrong, but the raw error from the API is not super friendly.\n * Let's make one up.\n */\n return badRequest({\n formError: 'Sorry. We could not activate your account.',\n });\n }\n};\n\nexport const meta: MetaFunction = () => {\n return {\n title: 'Activate Account',\n };\n};\n\nexport default function Activate() {\n const actionData = useActionData<ActionData>();\n const [nativePasswordError, setNativePasswordError] = useState<null | string>(\n null,\n );\n const [nativePasswordConfirmError, setNativePasswordConfirmError] = useState<\n null | string\n >(null);\n\n const passwordInput = useRef<HTMLInputElement>(null);\n const passwordConfirmInput = useRef<HTMLInputElement>(null);\n\n const validatePasswordConfirm = () => {\n if (!passwordConfirmInput.current) return;\n\n if (\n passwordConfirmInput.current.value.length &&\n passwordConfirmInput.current.value !== passwordInput.current?.value\n ) {\n setNativePasswordConfirmError('The two passwords entered did not match.');\n } else if (\n passwordConfirmInput.current.validity.valid ||\n !passwordConfirmInput.current.value.length\n ) {\n setNativePasswordConfirmError(null);\n } else {\n setNativePasswordConfirmError(\n passwordConfirmInput.current.validity.valueMissing\n ? 'Please re-enter the password'\n : 'Passwords must be at least 8 characters',\n );\n }\n };\n\n return (\n <div className=\"flex justify-center my-24 px-4\">\n <div className=\"max-w-md w-full\">\n <h1 className=\"text-4xl\">Activate Account.</h1>\n <p className=\"mt-4\">Create your password to activate your account.</p>\n {/* TODO: Add onSubmit to validate _before_ submission with native? */}\n <Form\n method=\"post\"\n noValidate\n className=\"pt-6 pb-8 mt-4 mb-4 space-y-3\"\n >\n {actionData?.formError && (\n <div className=\"flex items-center justify-center mb-6 bg-zinc-500\">\n <p className=\"m-4 text-s text-contrast\">{actionData.formError}</p>\n </div>\n )}\n <div className=\"mb-3\">\n <input\n ref={passwordInput}\n className={`mb-1 ${getInputStyleClasses(nativePasswordError)}`}\n id=\"password\"\n name=\"password\"\n type=\"password\"\n autoComplete=\"current-password\"\n placeholder=\"Password\"\n aria-label=\"Password\"\n minLength={8}\n required\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n onBlur={(event) => {\n if (\n event.currentTarget.validity.valid ||\n !event.currentTarget.value.length\n ) {\n setNativePasswordError(null);\n validatePasswordConfirm();\n } else {\n setNativePasswordError(\n event.currentTarget.validity.valueMissing\n ? 'Please enter a password'\n : 'Passwords must be at least 8 characters',\n );\n }\n }}\n />\n {nativePasswordError && (\n <p className=\"text-red-500 text-xs\">\n {' '}\n {nativePasswordError} &nbsp;\n </p>\n )}\n </div>\n <div className=\"mb-3\">\n <input\n ref={passwordConfirmInput}\n className={`mb-1 ${getInputStyleClasses(\n nativePasswordConfirmError,\n )}`}\n id=\"passwordConfirm\"\n name=\"passwordConfirm\"\n type=\"password\"\n autoComplete=\"current-password\"\n placeholder=\"Re-enter password\"\n aria-label=\"Re-enter password\"\n minLength={8}\n required\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n onBlur={validatePasswordConfirm}\n />\n {nativePasswordConfirmError && (\n <p className=\"text-red-500 text-xs\">\n {' '}\n {nativePasswordConfirmError} &nbsp;\n </p>\n )}\n </div>\n <div className=\"flex items-center justify-between\">\n <button\n className=\"bg-primary text-contrast rounded py-2 px-4 focus:shadow-outline block w-full\"\n type=\"submit\"\n >\n Save\n </button>\n </div>\n </Form>\n </div>\n </div>\n );\n}\n"],
5
- "mappings": "oTAOA,IAAAA,EAA+B,OA2HvB,IAAAC,EAAA,OAjHD,IAAMC,EAAS,CACpB,SAAU,EACZ,EAoEO,IAAMC,EAAqB,KACzB,CACL,MAAO,kBACT,GAGa,SAARC,GAA4B,CACjC,IAAMC,EAAaC,EAA0B,EACvC,CAACC,EAAqBC,CAAsB,KAAI,YACpD,IACF,EACM,CAACC,EAA4BC,CAA6B,KAAI,YAElE,IAAI,EAEAC,KAAgB,UAAyB,IAAI,EAC7CC,KAAuB,UAAyB,IAAI,EAEpDC,EAA0B,IAAM,CAChC,CAACD,EAAqB,UAGxBA,EAAqB,QAAQ,MAAM,QACnCA,EAAqB,QAAQ,QAAUD,EAAc,SAAS,MAE9DD,EAA8B,0CAA0C,EAExEE,EAAqB,QAAQ,SAAS,OACtC,CAACA,EAAqB,QAAQ,MAAM,OAEpCF,EAA8B,IAAI,EAElCA,EACEE,EAAqB,QAAQ,SAAS,aAClC,+BACA,yCACN,EAEJ,EAEA,SACE,OAAC,OAAI,UAAU,iCACb,oBAAC,OAAI,UAAU,kBACb,oBAAC,MAAG,UAAU,WAAW,6BAAiB,KAC1C,OAAC,KAAE,UAAU,OAAO,0DAA8C,KAElE,QAACE,EAAA,CACC,OAAO,OACP,WAAU,GACV,UAAU,gCAET,UAAAT,GAAY,cACX,OAAC,OAAI,UAAU,oDACb,mBAAC,KAAE,UAAU,2BAA4B,SAAAA,EAAW,UAAU,EAChE,KAEF,QAAC,OAAI,UAAU,OACb,oBAAC,SACC,IAAKM,EACL,UAAW,QAAQI,EAAqBR,CAAmB,IAC3D,GAAG,WACH,KAAK,WACL,KAAK,WACL,aAAa,mBACb,YAAY,WACZ,aAAW,WACX,UAAW,EACX,SAAQ,GAER,UAAS,GACT,OAASS,GAAU,CAEfA,EAAM,cAAc,SAAS,OAC7B,CAACA,EAAM,cAAc,MAAM,QAE3BR,EAAuB,IAAI,EAC3BK,EAAwB,GAExBL,EACEQ,EAAM,cAAc,SAAS,aACzB,0BACA,yCACN,CAEJ,EACF,EACCT,MACC,QAAC,KAAE,UAAU,uBACV,cACAA,EAAoB,SACvB,GAEJ,KACA,QAAC,OAAI,UAAU,OACb,oBAAC,SACC,IAAKK,EACL,UAAW,QAAQG,EACjBN,CACF,IACA,GAAG,kBACH,KAAK,kBACL,KAAK,WACL,aAAa,mBACb,YAAY,oBACZ,aAAW,oBACX,UAAW,EACX,SAAQ,GAER,UAAS,GACT,OAAQI,EACV,EACCJ,MACC,QAAC,KAAE,UAAU,uBACV,cACAA,EAA2B,SAC9B,GAEJ,KACA,OAAC,OAAI,UAAU,oCACb,mBAAC,UACC,UAAU,+EACV,KAAK,SACN,gBAED,EACF,GACF,GACF,EACF,CAEJ",
6
- "names": ["import_react", "import_jsx_runtime", "handle", "meta", "Activate", "actionData", "useActionData", "nativePasswordError", "setNativePasswordError", "nativePasswordConfirmError", "setNativePasswordConfirmError", "passwordInput", "passwordConfirmInput", "validatePasswordConfirm", "Form", "getInputStyleClasses", "event"]
7
- }
@@ -1,2 +0,0 @@
1
- import"/build/_shared/chunk-EW52HEI6.js";import{Y as n}from"/build/_shared/chunk-SZCP6RSO.js";import"/build/_shared/chunk-7CKXJRLM.js";import{f as o}from"/build/_shared/chunk-NIVT6A2W.js";import"/build/_shared/chunk-AYHDHSL7.js";import"/build/_shared/chunk-7CASD2US.js";import{g as m,q as u,r as d}from"/build/_shared/chunk-YCAWB56Y.js";import{a as b,b as p}from"/build/_shared/chunk-SYP5DAMV.js";import{c as s}from"/build/_shared/chunk-MEPKJ2VW.js";var i=s(b());var e=s(p()),w={isPublic:!0};var x=()=>({title:"Login"});function g(){let{shopName:f}=u(),l=d(),[a,y]=(0,i.useState)(null),[r,c]=(0,i.useState)(null);return(0,e.jsx)("div",{className:"flex justify-center my-24 px-4",children:(0,e.jsxs)("div",{className:"max-w-md w-full",children:[(0,e.jsx)("h1",{className:"text-4xl",children:"Sign in."}),(0,e.jsxs)(m,{method:"post",noValidate:!0,className:"pt-6 pb-8 mt-4 mb-4 space-y-3",children:[l?.formError&&(0,e.jsx)("div",{className:"flex items-center justify-center mb-6 bg-zinc-500",children:(0,e.jsx)("p",{className:"m-4 text-s text-contrast",children:l.formError})}),(0,e.jsxs)("div",{children:[(0,e.jsx)("input",{className:`mb-1 ${o(a)}`,id:"email",name:"email",type:"email",autoComplete:"email",required:!0,placeholder:"Email address","aria-label":"Email address",autoFocus:!0,onBlur:t=>{y(t.currentTarget.value.length&&!t.currentTarget.validity.valid?"Invalid email address":null)}}),a&&(0,e.jsxs)("p",{className:"text-red-500 text-xs",children:[a," \xA0"]})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("input",{className:`mb-1 ${o(r)}`,id:"password",name:"password",type:"password",autoComplete:"current-password",placeholder:"Password","aria-label":"Password",minLength:8,required:!0,autoFocus:!0,onBlur:t=>{t.currentTarget.validity.valid||!t.currentTarget.value.length?c(null):c(t.currentTarget.validity.valueMissing?"Please enter a password":"Passwords must be at least 8 characters")}}),r&&(0,e.jsxs)("p",{className:"text-red-500 text-xs",children:[" ",r," \xA0"]})]}),(0,e.jsx)("div",{className:"flex items-center justify-between",children:(0,e.jsx)("button",{className:"bg-primary text-contrast rounded py-2 px-4 focus:shadow-outline block w-full",type:"submit",children:"Sign in"})}),(0,e.jsxs)("div",{className:"flex justify-between items-center mt-8 border-t border-gray-300",children:[(0,e.jsxs)("p",{className:"align-baseline text-sm mt-6",children:["New to ",f,"? \xA0",(0,e.jsx)(n,{className:"inline underline",to:"/account/register",children:"Create an account"})]}),(0,e.jsx)(n,{className:"mt-6 inline-block align-baseline text-sm text-primary/50",to:"/account/recover",children:"Forgot password"})]})]})]})})}export{g as default,w as handle,x as meta};
2
- //# sourceMappingURL=/build/routes/($lang)/account/__public/login-K6QUN2VF.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../app/routes/($lang)/account/__public/login.tsx"],
4
- "sourcesContent": ["import {\n type MetaFunction,\n type ActionFunction,\n type LoaderArgs,\n redirect,\n json,\n} from '@shopify/remix-oxygen';\nimport {Form, useActionData, useLoaderData} from '@remix-run/react';\nimport {useState} from 'react';\nimport {login} from '~/data';\nimport {getInputStyleClasses} from '~/lib/utils';\nimport {Link} from '~/components';\n\nexport const handle = {\n isPublic: true,\n};\n\nexport async function loader({context, params}: LoaderArgs) {\n const customerAccessToken = await context.session.get('customerAccessToken');\n\n if (customerAccessToken) {\n return redirect(params.lang ? `${params.lang}/account` : '/account');\n }\n\n // TODO: Query for this?\n return json({shopName: 'Hydrogen'});\n}\n\ntype ActionData = {\n formError?: string;\n};\n\nconst badRequest = (data: ActionData) => json(data, {status: 400});\n\nexport const action: ActionFunction = async ({request, context, params}) => {\n const formData = await request.formData();\n\n const email = formData.get('email');\n const password = formData.get('password');\n\n if (\n !email ||\n !password ||\n typeof email !== 'string' ||\n typeof password !== 'string'\n ) {\n return badRequest({\n formError: 'Please provide both an email and a password.',\n });\n }\n\n const {session, storefront} = context;\n\n try {\n const customerAccessToken = await login(context, {email, password});\n session.set('customerAccessToken', customerAccessToken);\n\n return redirect(params.lang ? `${params.lang}/account` : '/account', {\n headers: {\n 'Set-Cookie': await session.commit(),\n },\n });\n } catch (error: any) {\n if (storefront.isApiError(error)) {\n return badRequest({\n formError: 'Something went wrong. Please try again later.',\n });\n }\n\n /**\n * The user did something wrong, but the raw error from the API is not super friendly.\n * Let's make one up.\n */\n return badRequest({\n formError:\n 'Sorry. We did not recognize either your email or password. Please try to sign in again or create a new account.',\n });\n }\n};\n\nexport const meta: MetaFunction = () => {\n return {\n title: 'Login',\n };\n};\n\nexport default function Login() {\n const {shopName} = useLoaderData<typeof loader>();\n const actionData = useActionData<ActionData>();\n const [nativeEmailError, setNativeEmailError] = useState<null | string>(null);\n const [nativePasswordError, setNativePasswordError] = useState<null | string>(\n null,\n );\n\n return (\n <div className=\"flex justify-center my-24 px-4\">\n <div className=\"max-w-md w-full\">\n <h1 className=\"text-4xl\">Sign in.</h1>\n {/* TODO: Add onSubmit to validate _before_ submission with native? */}\n <Form\n method=\"post\"\n noValidate\n className=\"pt-6 pb-8 mt-4 mb-4 space-y-3\"\n >\n {actionData?.formError && (\n <div className=\"flex items-center justify-center mb-6 bg-zinc-500\">\n <p className=\"m-4 text-s text-contrast\">{actionData.formError}</p>\n </div>\n )}\n <div>\n <input\n className={`mb-1 ${getInputStyleClasses(nativeEmailError)}`}\n id=\"email\"\n name=\"email\"\n type=\"email\"\n autoComplete=\"email\"\n required\n placeholder=\"Email address\"\n aria-label=\"Email address\"\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n onBlur={(event) => {\n setNativeEmailError(\n event.currentTarget.value.length &&\n !event.currentTarget.validity.valid\n ? 'Invalid email address'\n : null,\n );\n }}\n />\n {nativeEmailError && (\n <p className=\"text-red-500 text-xs\">{nativeEmailError} &nbsp;</p>\n )}\n </div>\n\n <div>\n <input\n className={`mb-1 ${getInputStyleClasses(nativePasswordError)}`}\n id=\"password\"\n name=\"password\"\n type=\"password\"\n autoComplete=\"current-password\"\n placeholder=\"Password\"\n aria-label=\"Password\"\n minLength={8}\n required\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n onBlur={(event) => {\n if (\n event.currentTarget.validity.valid ||\n !event.currentTarget.value.length\n ) {\n setNativePasswordError(null);\n } else {\n setNativePasswordError(\n event.currentTarget.validity.valueMissing\n ? 'Please enter a password'\n : 'Passwords must be at least 8 characters',\n );\n }\n }}\n />\n {nativePasswordError && (\n <p className=\"text-red-500 text-xs\">\n {' '}\n {nativePasswordError} &nbsp;\n </p>\n )}\n </div>\n <div className=\"flex items-center justify-between\">\n <button\n className=\"bg-primary text-contrast rounded py-2 px-4 focus:shadow-outline block w-full\"\n type=\"submit\"\n >\n Sign in\n </button>\n </div>\n <div className=\"flex justify-between items-center mt-8 border-t border-gray-300\">\n <p className=\"align-baseline text-sm mt-6\">\n New to {shopName}? &nbsp;\n <Link className=\"inline underline\" to=\"/account/register\">\n Create an account\n </Link>\n </p>\n <Link\n className=\"mt-6 inline-block align-baseline text-sm text-primary/50\"\n to=\"/account/recover\"\n >\n Forgot password\n </Link>\n </div>\n </Form>\n </div>\n </div>\n );\n}\n"],
5
- "mappings": "kcAQA,IAAAA,EAAuB,OAyFf,IAAAC,EAAA,OApFKC,EAAS,CACpB,SAAU,EACZ,EAiEO,IAAMC,EAAqB,KACzB,CACL,MAAO,OACT,GAGa,SAARC,GAAyB,CAC9B,GAAM,CAAC,SAAAC,CAAQ,EAAIC,EAA6B,EAC1CC,EAAaC,EAA0B,EACvC,CAACC,EAAkBC,CAAmB,KAAI,YAAwB,IAAI,EACtE,CAACC,EAAqBC,CAAsB,KAAI,YACpD,IACF,EAEA,SACE,OAAC,OAAI,UAAU,iCACb,oBAAC,OAAI,UAAU,kBACb,oBAAC,MAAG,UAAU,WAAW,oBAAQ,KAEjC,QAACC,EAAA,CACC,OAAO,OACP,WAAU,GACV,UAAU,gCAET,UAAAN,GAAY,cACX,OAAC,OAAI,UAAU,oDACb,mBAAC,KAAE,UAAU,2BAA4B,SAAAA,EAAW,UAAU,EAChE,KAEF,QAAC,OACC,oBAAC,SACC,UAAW,QAAQO,EAAqBL,CAAgB,IACxD,GAAG,QACH,KAAK,QACL,KAAK,QACL,aAAa,QACb,SAAQ,GACR,YAAY,gBACZ,aAAW,gBAEX,UAAS,GACT,OAASM,GAAU,CACjBL,EACEK,EAAM,cAAc,MAAM,QACxB,CAACA,EAAM,cAAc,SAAS,MAC5B,wBACA,IACN,CACF,EACF,EACCN,MACC,QAAC,KAAE,UAAU,uBAAwB,UAAAA,EAAiB,SAAO,GAEjE,KAEA,QAAC,OACC,oBAAC,SACC,UAAW,QAAQK,EAAqBH,CAAmB,IAC3D,GAAG,WACH,KAAK,WACL,KAAK,WACL,aAAa,mBACb,YAAY,WACZ,aAAW,WACX,UAAW,EACX,SAAQ,GAER,UAAS,GACT,OAASI,GAAU,CAEfA,EAAM,cAAc,SAAS,OAC7B,CAACA,EAAM,cAAc,MAAM,OAE3BH,EAAuB,IAAI,EAE3BA,EACEG,EAAM,cAAc,SAAS,aACzB,0BACA,yCACN,CAEJ,EACF,EACCJ,MACC,QAAC,KAAE,UAAU,uBACV,cACAA,EAAoB,SACvB,GAEJ,KACA,OAAC,OAAI,UAAU,oCACb,mBAAC,UACC,UAAU,+EACV,KAAK,SACN,mBAED,EACF,KACA,QAAC,OAAI,UAAU,kEACb,qBAAC,KAAE,UAAU,8BAA8B,oBACjCN,EAAS,YACjB,OAACW,EAAA,CAAK,UAAU,mBAAmB,GAAG,oBAAoB,6BAE1D,GACF,KACA,OAACA,EAAA,CACC,UAAU,2DACV,GAAG,mBACJ,2BAED,GACF,GACF,GACF,EACF,CAEJ",
6
- "names": ["import_react", "import_jsx_runtime", "handle", "meta", "Login", "shopName", "useLoaderData", "actionData", "useActionData", "nativeEmailError", "setNativeEmailError", "nativePasswordError", "setNativePasswordError", "Form", "getInputStyleClasses", "event", "Link"]
7
- }
@@ -1,2 +0,0 @@
1
- import"/build/_shared/chunk-EW52HEI6.js";import{Y as m}from"/build/_shared/chunk-SZCP6RSO.js";import"/build/_shared/chunk-7CKXJRLM.js";import{f as l}from"/build/_shared/chunk-NIVT6A2W.js";import"/build/_shared/chunk-AYHDHSL7.js";import"/build/_shared/chunk-7CASD2US.js";import{g as o,r as n}from"/build/_shared/chunk-YCAWB56Y.js";import{a as f,b as i}from"/build/_shared/chunk-SYP5DAMV.js";import{c as s}from"/build/_shared/chunk-MEPKJ2VW.js";var c=s(f());var e=s(i());var y=()=>({title:"Recover Password"});function u(){let t=n(),[a,d]=(0,c.useState)(null),p=t?.resetRequested;return(0,e.jsx)("div",{className:"flex justify-center my-24 px-4",children:(0,e.jsx)("div",{className:"max-w-md w-full",children:p?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("h1",{className:"text-4xl",children:"Request Sent."}),(0,e.jsx)("p",{className:"mt-4",children:"If that email address is in our system, you will receive an email with instructions about how to reset your password in a few minutes."})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("h1",{className:"text-4xl",children:"Forgot Password."}),(0,e.jsx)("p",{className:"mt-4",children:"Enter the email address associated with your account to receive a link to reset your password."}),(0,e.jsxs)(o,{method:"post",noValidate:!0,className:"pt-6 pb-8 mt-4 mb-4 space-y-3",children:[t?.formError&&(0,e.jsx)("div",{className:"flex items-center justify-center mb-6 bg-zinc-500",children:(0,e.jsx)("p",{className:"m-4 text-s text-contrast",children:t.formError})}),(0,e.jsxs)("div",{children:[(0,e.jsx)("input",{className:`mb-1 ${l(a)}`,id:"email",name:"email",type:"email",autoComplete:"email",required:!0,placeholder:"Email address","aria-label":"Email address",autoFocus:!0,onBlur:r=>{d(r.currentTarget.value.length&&!r.currentTarget.validity.valid?"Invalid email address":null)}}),a&&(0,e.jsxs)("p",{className:"text-red-500 text-xs",children:[a," \xA0"]})]}),(0,e.jsx)("div",{className:"flex items-center justify-between",children:(0,e.jsx)("button",{className:"bg-primary text-contrast rounded py-2 px-4 focus:shadow-outline block w-full",type:"submit",children:"Request Reset Link"})}),(0,e.jsx)("div",{className:"flex items-center mt-8 border-t border-gray-300",children:(0,e.jsxs)("p",{className:"align-baseline text-sm mt-6",children:["Return to \xA0",(0,e.jsx)(m,{className:"inline underline",to:"/account/login",children:"Login"})]})})]})]})})})}export{u as default,y as meta};
2
- //# sourceMappingURL=/build/routes/($lang)/account/__public/recover-UV5PLPS5.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../app/routes/($lang)/account/__public/recover.tsx"],
4
- "sourcesContent": ["import {\n type MetaFunction,\n type ActionFunction,\n type LoaderArgs,\n redirect,\n json,\n} from '@shopify/remix-oxygen';\nimport {Form, useActionData} from '@remix-run/react';\nimport {useState} from 'react';\nimport {sendPasswordResetEmail} from '~/data';\nimport {Link} from '~/components';\nimport {getInputStyleClasses} from '~/lib/utils';\n\nexport async function loader({context, params}: LoaderArgs) {\n const customerAccessToken = await context.session.get('customerAccessToken');\n\n if (customerAccessToken) {\n return redirect(params.lang ? `${params.lang}/account` : '/account');\n }\n\n return new Response(null);\n}\n\ntype ActionData = {\n formError?: string;\n resetRequested?: boolean;\n};\n\nconst badRequest = (data: ActionData) => json(data, {status: 400});\n\nexport const action: ActionFunction = async ({request, context}) => {\n const formData = await request.formData();\n const email = formData.get('email');\n\n if (!email || typeof email !== 'string') {\n return badRequest({\n formError: 'Please provide an email.',\n });\n }\n\n try {\n await sendPasswordResetEmail(context, {email});\n\n return json({resetRequested: true});\n } catch (error: any) {\n return badRequest({\n formError: 'Something went wrong. Please try again later.',\n });\n }\n};\n\nexport const meta: MetaFunction = () => {\n return {\n title: 'Recover Password',\n };\n};\n\nexport default function Recover() {\n const actionData = useActionData<ActionData>();\n const [nativeEmailError, setNativeEmailError] = useState<null | string>(null);\n const isSubmitted = actionData?.resetRequested;\n\n return (\n <div className=\"flex justify-center my-24 px-4\">\n <div className=\"max-w-md w-full\">\n {isSubmitted ? (\n <>\n <h1 className=\"text-4xl\">Request Sent.</h1>\n <p className=\"mt-4\">\n If that email address is in our system, you will receive an email\n with instructions about how to reset your password in a few\n minutes.\n </p>\n </>\n ) : (\n <>\n <h1 className=\"text-4xl\">Forgot Password.</h1>\n <p className=\"mt-4\">\n Enter the email address associated with your account to receive a\n link to reset your password.\n </p>\n {/* TODO: Add onSubmit to validate _before_ submission with native? */}\n <Form\n method=\"post\"\n noValidate\n className=\"pt-6 pb-8 mt-4 mb-4 space-y-3\"\n >\n {actionData?.formError && (\n <div className=\"flex items-center justify-center mb-6 bg-zinc-500\">\n <p className=\"m-4 text-s text-contrast\">\n {actionData.formError}\n </p>\n </div>\n )}\n <div>\n <input\n className={`mb-1 ${getInputStyleClasses(nativeEmailError)}`}\n id=\"email\"\n name=\"email\"\n type=\"email\"\n autoComplete=\"email\"\n required\n placeholder=\"Email address\"\n aria-label=\"Email address\"\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n onBlur={(event) => {\n setNativeEmailError(\n event.currentTarget.value.length &&\n !event.currentTarget.validity.valid\n ? 'Invalid email address'\n : null,\n );\n }}\n />\n {nativeEmailError && (\n <p className=\"text-red-500 text-xs\">\n {nativeEmailError} &nbsp;\n </p>\n )}\n </div>\n <div className=\"flex items-center justify-between\">\n <button\n className=\"bg-primary text-contrast rounded py-2 px-4 focus:shadow-outline block w-full\"\n type=\"submit\"\n >\n Request Reset Link\n </button>\n </div>\n <div className=\"flex items-center mt-8 border-t border-gray-300\">\n <p className=\"align-baseline text-sm mt-6\">\n Return to &nbsp;\n <Link className=\"inline underline\" to=\"/account/login\">\n Login\n </Link>\n </p>\n </div>\n </Form>\n </>\n )}\n </div>\n </div>\n );\n}\n"],
5
- "mappings": "2bAQA,IAAAA,EAAuB,OA0Db,IAAAC,EAAA,OAfH,IAAMC,EAAqB,KACzB,CACL,MAAO,kBACT,GAGa,SAARC,GAA2B,CAChC,IAAMC,EAAaC,EAA0B,EACvC,CAACC,EAAkBC,CAAmB,KAAI,YAAwB,IAAI,EACtEC,EAAcJ,GAAY,eAEhC,SACE,OAAC,OAAI,UAAU,iCACb,mBAAC,OAAI,UAAU,kBACZ,SAAAI,KACC,oBACE,oBAAC,MAAG,UAAU,WAAW,yBAAa,KACtC,OAAC,KAAE,UAAU,OAAO,kJAIpB,GACF,KAEA,oBACE,oBAAC,MAAG,UAAU,WAAW,4BAAgB,KACzC,OAAC,KAAE,UAAU,OAAO,0GAGpB,KAEA,QAACC,EAAA,CACC,OAAO,OACP,WAAU,GACV,UAAU,gCAET,UAAAL,GAAY,cACX,OAAC,OAAI,UAAU,oDACb,mBAAC,KAAE,UAAU,2BACV,SAAAA,EAAW,UACd,EACF,KAEF,QAAC,OACC,oBAAC,SACC,UAAW,QAAQM,EAAqBJ,CAAgB,IACxD,GAAG,QACH,KAAK,QACL,KAAK,QACL,aAAa,QACb,SAAQ,GACR,YAAY,gBACZ,aAAW,gBAEX,UAAS,GACT,OAASK,GAAU,CACjBJ,EACEI,EAAM,cAAc,MAAM,QACxB,CAACA,EAAM,cAAc,SAAS,MAC5B,wBACA,IACN,CACF,EACF,EACCL,MACC,QAAC,KAAE,UAAU,uBACV,UAAAA,EAAiB,SACpB,GAEJ,KACA,OAAC,OAAI,UAAU,oCACb,mBAAC,UACC,UAAU,+EACV,KAAK,SACN,8BAED,EACF,KACA,OAAC,OAAI,UAAU,kDACb,oBAAC,KAAE,UAAU,8BAA8B,8BAEzC,OAACM,EAAA,CAAK,UAAU,mBAAmB,GAAG,iBAAiB,iBAEvD,GACF,EACF,GACF,GACF,EAEJ,EACF,CAEJ",
6
- "names": ["import_react", "import_jsx_runtime", "meta", "Recover", "actionData", "useActionData", "nativeEmailError", "setNativeEmailError", "isSubmitted", "Form", "getInputStyleClasses", "event", "Link"]
7
- }
@@ -1,2 +0,0 @@
1
- import"/build/_shared/chunk-EW52HEI6.js";import{Y as d}from"/build/_shared/chunk-SZCP6RSO.js";import"/build/_shared/chunk-7CKXJRLM.js";import{f as o}from"/build/_shared/chunk-NIVT6A2W.js";import"/build/_shared/chunk-AYHDHSL7.js";import"/build/_shared/chunk-7CASD2US.js";import{g as c,r as m}from"/build/_shared/chunk-YCAWB56Y.js";import{a as f,b as u}from"/build/_shared/chunk-SYP5DAMV.js";import{c as s}from"/build/_shared/chunk-MEPKJ2VW.js";var n=s(f());var e=s(u());var y=()=>({title:"Register"});function p(){let i=m(),[a,g]=(0,n.useState)(null),[r,l]=(0,n.useState)(null);return(0,e.jsx)("div",{className:"flex justify-center my-24 px-4",children:(0,e.jsxs)("div",{className:"max-w-md w-full",children:[(0,e.jsx)("h1",{className:"text-4xl",children:"Create an Account."}),(0,e.jsxs)(c,{method:"post",noValidate:!0,className:"pt-6 pb-8 mt-4 mb-4 space-y-3",children:[i?.formError&&(0,e.jsx)("div",{className:"flex items-center justify-center mb-6 bg-zinc-500",children:(0,e.jsx)("p",{className:"m-4 text-s text-contrast",children:i.formError})}),(0,e.jsxs)("div",{children:[(0,e.jsx)("input",{className:`mb-1 ${o(a)}`,id:"email",name:"email",type:"email",autoComplete:"email",required:!0,placeholder:"Email address","aria-label":"Email address",autoFocus:!0,onBlur:t=>{g(t.currentTarget.value.length&&!t.currentTarget.validity.valid?"Invalid email address":null)}}),a&&(0,e.jsxs)("p",{className:"text-red-500 text-xs",children:[a," \xA0"]})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("input",{className:`mb-1 ${o(r)}`,id:"password",name:"password",type:"password",autoComplete:"current-password",placeholder:"Password","aria-label":"Password",minLength:8,required:!0,autoFocus:!0,onBlur:t=>{t.currentTarget.validity.valid||!t.currentTarget.value.length?l(null):l(t.currentTarget.validity.valueMissing?"Please enter a password":"Passwords must be at least 8 characters")}}),r&&(0,e.jsxs)("p",{className:"text-red-500 text-xs",children:[" ",r," \xA0"]})]}),(0,e.jsx)("div",{className:"flex items-center justify-between",children:(0,e.jsx)("button",{className:"bg-primary text-contrast rounded py-2 px-4 focus:shadow-outline block w-full",type:"submit",children:"Create Account"})}),(0,e.jsx)("div",{className:"flex items-center mt-8 border-t border-gray-300",children:(0,e.jsxs)("p",{className:"align-baseline text-sm mt-6",children:["Already have an account? \xA0",(0,e.jsx)(d,{className:"inline underline",to:"/account/login",children:"Sign in"})]})})]})]})})}export{p as default,y as meta};
2
- //# sourceMappingURL=/build/routes/($lang)/account/__public/register-SZW3ORRR.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../app/routes/($lang)/account/__public/register.tsx"],
4
- "sourcesContent": ["import {\n type MetaFunction,\n redirect,\n json,\n type ActionFunction,\n type LoaderArgs,\n} from '@shopify/remix-oxygen';\nimport {Form, useActionData} from '@remix-run/react';\nimport {useState} from 'react';\nimport {login, registerCustomer} from '~/data';\nimport {getInputStyleClasses} from '~/lib/utils';\nimport {Link} from '~/components';\n\nexport async function loader({context, params}: LoaderArgs) {\n const customerAccessToken = await context.session.get('customerAccessToken');\n\n if (customerAccessToken) {\n return redirect(params.lang ? `${params.lang}/account` : '/account');\n }\n\n return new Response(null);\n}\n\ntype ActionData = {\n formError?: string;\n};\n\nconst badRequest = (data: ActionData) => json(data, {status: 400});\n\nexport const action: ActionFunction = async ({request, context, params}) => {\n const {session, storefront} = context;\n const formData = await request.formData();\n\n const email = formData.get('email');\n const password = formData.get('password');\n\n if (\n !email ||\n !password ||\n typeof email !== 'string' ||\n typeof password !== 'string'\n ) {\n return badRequest({\n formError: 'Please provide both an email and a password.',\n });\n }\n\n try {\n await registerCustomer(context, {email, password});\n const customerAccessToken = await login(context, {email, password});\n session.set('customerAccessToken', customerAccessToken);\n\n return redirect(params.lang ? `${params.lang}/account` : '/account', {\n headers: {\n 'Set-Cookie': await session.commit(),\n },\n });\n } catch (error: any) {\n if (storefront.isApiError(error)) {\n return badRequest({\n formError: 'Something went wrong. Please try again later.',\n });\n }\n\n /**\n * The user did something wrong, but the raw error from the API is not super friendly.\n * Let's make one up.\n */\n return badRequest({\n formError:\n 'Sorry. We could not create an account with this email. User might already exist, try to login instead.',\n });\n }\n};\n\nexport const meta: MetaFunction = () => {\n return {\n title: 'Register',\n };\n};\n\nexport default function Register() {\n const actionData = useActionData<ActionData>();\n const [nativeEmailError, setNativeEmailError] = useState<null | string>(null);\n const [nativePasswordError, setNativePasswordError] = useState<null | string>(\n null,\n );\n\n return (\n <div className=\"flex justify-center my-24 px-4\">\n <div className=\"max-w-md w-full\">\n <h1 className=\"text-4xl\">Create an Account.</h1>\n {/* TODO: Add onSubmit to validate _before_ submission with native? */}\n <Form\n method=\"post\"\n noValidate\n className=\"pt-6 pb-8 mt-4 mb-4 space-y-3\"\n >\n {actionData?.formError && (\n <div className=\"flex items-center justify-center mb-6 bg-zinc-500\">\n <p className=\"m-4 text-s text-contrast\">{actionData.formError}</p>\n </div>\n )}\n <div>\n <input\n className={`mb-1 ${getInputStyleClasses(nativeEmailError)}`}\n id=\"email\"\n name=\"email\"\n type=\"email\"\n autoComplete=\"email\"\n required\n placeholder=\"Email address\"\n aria-label=\"Email address\"\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n onBlur={(event) => {\n setNativeEmailError(\n event.currentTarget.value.length &&\n !event.currentTarget.validity.valid\n ? 'Invalid email address'\n : null,\n );\n }}\n />\n {nativeEmailError && (\n <p className=\"text-red-500 text-xs\">{nativeEmailError} &nbsp;</p>\n )}\n </div>\n <div>\n <input\n className={`mb-1 ${getInputStyleClasses(nativePasswordError)}`}\n id=\"password\"\n name=\"password\"\n type=\"password\"\n autoComplete=\"current-password\"\n placeholder=\"Password\"\n aria-label=\"Password\"\n minLength={8}\n required\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n onBlur={(event) => {\n if (\n event.currentTarget.validity.valid ||\n !event.currentTarget.value.length\n ) {\n setNativePasswordError(null);\n } else {\n setNativePasswordError(\n event.currentTarget.validity.valueMissing\n ? 'Please enter a password'\n : 'Passwords must be at least 8 characters',\n );\n }\n }}\n />\n {nativePasswordError && (\n <p className=\"text-red-500 text-xs\">\n {' '}\n {nativePasswordError} &nbsp;\n </p>\n )}\n </div>\n <div className=\"flex items-center justify-between\">\n <button\n className=\"bg-primary text-contrast rounded py-2 px-4 focus:shadow-outline block w-full\"\n type=\"submit\"\n >\n Create Account\n </button>\n </div>\n <div className=\"flex items-center mt-8 border-t border-gray-300\">\n <p className=\"align-baseline text-sm mt-6\">\n Already have an account? &nbsp;\n <Link className=\"inline underline\" to=\"/account/login\">\n Sign in\n </Link>\n </p>\n </div>\n </Form>\n </div>\n </div>\n );\n}\n"],
5
- "mappings": "2bAQA,IAAAA,EAAuB,OAmFf,IAAAC,EAAA,OAhBD,IAAMC,EAAqB,KACzB,CACL,MAAO,UACT,GAGa,SAARC,GAA4B,CACjC,IAAMC,EAAaC,EAA0B,EACvC,CAACC,EAAkBC,CAAmB,KAAI,YAAwB,IAAI,EACtE,CAACC,EAAqBC,CAAsB,KAAI,YACpD,IACF,EAEA,SACE,OAAC,OAAI,UAAU,iCACb,oBAAC,OAAI,UAAU,kBACb,oBAAC,MAAG,UAAU,WAAW,8BAAkB,KAE3C,QAACC,EAAA,CACC,OAAO,OACP,WAAU,GACV,UAAU,gCAET,UAAAN,GAAY,cACX,OAAC,OAAI,UAAU,oDACb,mBAAC,KAAE,UAAU,2BAA4B,SAAAA,EAAW,UAAU,EAChE,KAEF,QAAC,OACC,oBAAC,SACC,UAAW,QAAQO,EAAqBL,CAAgB,IACxD,GAAG,QACH,KAAK,QACL,KAAK,QACL,aAAa,QACb,SAAQ,GACR,YAAY,gBACZ,aAAW,gBAEX,UAAS,GACT,OAASM,GAAU,CACjBL,EACEK,EAAM,cAAc,MAAM,QACxB,CAACA,EAAM,cAAc,SAAS,MAC5B,wBACA,IACN,CACF,EACF,EACCN,MACC,QAAC,KAAE,UAAU,uBAAwB,UAAAA,EAAiB,SAAO,GAEjE,KACA,QAAC,OACC,oBAAC,SACC,UAAW,QAAQK,EAAqBH,CAAmB,IAC3D,GAAG,WACH,KAAK,WACL,KAAK,WACL,aAAa,mBACb,YAAY,WACZ,aAAW,WACX,UAAW,EACX,SAAQ,GAER,UAAS,GACT,OAASI,GAAU,CAEfA,EAAM,cAAc,SAAS,OAC7B,CAACA,EAAM,cAAc,MAAM,OAE3BH,EAAuB,IAAI,EAE3BA,EACEG,EAAM,cAAc,SAAS,aACzB,0BACA,yCACN,CAEJ,EACF,EACCJ,MACC,QAAC,KAAE,UAAU,uBACV,cACAA,EAAoB,SACvB,GAEJ,KACA,OAAC,OAAI,UAAU,oCACb,mBAAC,UACC,UAAU,+EACV,KAAK,SACN,0BAED,EACF,KACA,OAAC,OAAI,UAAU,kDACb,oBAAC,KAAE,UAAU,8BAA8B,6CAEzC,OAACK,EAAA,CAAK,UAAU,mBAAmB,GAAG,iBAAiB,mBAEvD,GACF,EACF,GACF,GACF,EACF,CAEJ",
6
- "names": ["import_react", "import_jsx_runtime", "meta", "Register", "actionData", "useActionData", "nativeEmailError", "setNativeEmailError", "nativePasswordError", "setNativePasswordError", "Form", "getInputStyleClasses", "event", "Link"]
7
- }
@@ -1,2 +0,0 @@
1
- import"/build/_shared/chunk-EW52HEI6.js";import{f as l}from"/build/_shared/chunk-NIVT6A2W.js";import"/build/_shared/chunk-AYHDHSL7.js";import{g as p,r as f}from"/build/_shared/chunk-YCAWB56Y.js";import{a as v,b as w}from"/build/_shared/chunk-SYP5DAMV.js";import{c as i}from"/build/_shared/chunk-MEPKJ2VW.js";var r=i(v());var t=i(w());var g=()=>({title:"Reset Password"});function y(){let c=f(),[s,u]=(0,r.useState)(null),[a,o]=(0,r.useState)(null),m=(0,r.useRef)(null),e=(0,r.useRef)(null),d=()=>{!e.current||(e.current.value.length&&e.current.value!==m.current?.value?o("The two passwords entered did not match."):e.current.validity.valid||!e.current.value.length?o(null):o(e.current.validity.valueMissing?"Please re-enter the password":"Passwords must be at least 8 characters"))};return(0,t.jsx)("div",{className:"flex justify-center my-24 px-4",children:(0,t.jsxs)("div",{className:"max-w-md w-full",children:[(0,t.jsx)("h1",{className:"text-4xl",children:"Reset Password."}),(0,t.jsx)("p",{className:"mt-4",children:"Enter a new password for your account."}),(0,t.jsxs)(p,{method:"post",noValidate:!0,className:"pt-6 pb-8 mt-4 mb-4 space-y-3",children:[c?.formError&&(0,t.jsx)("div",{className:"flex items-center justify-center mb-6 bg-zinc-500",children:(0,t.jsx)("p",{className:"m-4 text-s text-contrast",children:c.formError})}),(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("input",{ref:m,className:`mb-1 ${l(s)}`,id:"password",name:"password",type:"password",autoComplete:"current-password",placeholder:"Password","aria-label":"Password",minLength:8,required:!0,autoFocus:!0,onBlur:n=>{n.currentTarget.validity.valid||!n.currentTarget.value.length?(u(null),d()):u(n.currentTarget.validity.valueMissing?"Please enter a password":"Passwords must be at least 8 characters")}}),s&&(0,t.jsxs)("p",{className:"text-red-500 text-xs",children:[" ",s," \xA0"]})]}),(0,t.jsxs)("div",{className:"mb-3",children:[(0,t.jsx)("input",{ref:e,className:`mb-1 ${l(a)}`,id:"passwordConfirm",name:"passwordConfirm",type:"password",autoComplete:"current-password",placeholder:"Re-enter password","aria-label":"Re-enter password",minLength:8,required:!0,autoFocus:!0,onBlur:d}),a&&(0,t.jsxs)("p",{className:"text-red-500 text-xs",children:[" ",a," \xA0"]})]}),(0,t.jsx)("div",{className:"flex items-center justify-between",children:(0,t.jsx)("button",{className:"bg-primary text-contrast rounded py-2 px-4 focus:shadow-outline block w-full",type:"submit",children:"Save"})})]})]})})}export{y as default,g as meta};
2
- //# sourceMappingURL=/build/routes/($lang)/account/__public/reset.$id.$resetToken-WOUXQWZU.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../../app/routes/($lang)/account/__public/reset.$id.$resetToken.tsx"],
4
- "sourcesContent": ["import {\n type MetaFunction,\n type ActionFunction,\n redirect,\n json,\n} from '@shopify/remix-oxygen';\nimport {Form, useActionData} from '@remix-run/react';\nimport {useRef, useState} from 'react';\nimport {resetPassword} from '~/data';\nimport {getInputStyleClasses} from '~/lib/utils';\n\ntype ActionData = {\n formError?: string;\n};\n\nconst badRequest = (data: ActionData) => json(data, {status: 400});\n\nexport const action: ActionFunction = async ({\n request,\n context,\n params: {lang, id, resetToken},\n}) => {\n if (\n !id ||\n !resetToken ||\n typeof id !== 'string' ||\n typeof resetToken !== 'string'\n ) {\n return badRequest({\n formError: 'Wrong token. Please try to reset your password again.',\n });\n }\n\n const formData = await request.formData();\n\n const password = formData.get('password');\n const passwordConfirm = formData.get('passwordConfirm');\n\n if (\n !password ||\n !passwordConfirm ||\n typeof password !== 'string' ||\n typeof passwordConfirm !== 'string' ||\n password !== passwordConfirm\n ) {\n return badRequest({\n formError: 'Please provide matching passwords',\n });\n }\n\n const {session, storefront} = context;\n\n try {\n const {accessToken} = await resetPassword(context, {\n id,\n resetToken,\n password,\n });\n\n session.set('customerAccessToken', accessToken);\n\n return redirect(lang ? `${lang}/account` : '/account', {\n headers: {\n 'Set-Cookie': await session.commit(),\n },\n });\n } catch (error: any) {\n if (storefront.isApiError(error)) {\n return badRequest({\n formError: 'Something went wrong. Please try again later.',\n });\n }\n\n /**\n * The user did something wrong, but the raw error from the API is not super friendly.\n * Let's make one up.\n */\n return badRequest({\n formError: 'Sorry. We could not update your password.',\n });\n }\n};\n\nexport const meta: MetaFunction = () => {\n return {\n title: 'Reset Password',\n };\n};\n\nexport default function Reset() {\n const actionData = useActionData<ActionData>();\n const [nativePasswordError, setNativePasswordError] = useState<null | string>(\n null,\n );\n const [nativePasswordConfirmError, setNativePasswordConfirmError] = useState<\n null | string\n >(null);\n\n const passwordInput = useRef<HTMLInputElement>(null);\n const passwordConfirmInput = useRef<HTMLInputElement>(null);\n\n const validatePasswordConfirm = () => {\n if (!passwordConfirmInput.current) return;\n\n if (\n passwordConfirmInput.current.value.length &&\n passwordConfirmInput.current.value !== passwordInput.current?.value\n ) {\n setNativePasswordConfirmError('The two passwords entered did not match.');\n } else if (\n passwordConfirmInput.current.validity.valid ||\n !passwordConfirmInput.current.value.length\n ) {\n setNativePasswordConfirmError(null);\n } else {\n setNativePasswordConfirmError(\n passwordConfirmInput.current.validity.valueMissing\n ? 'Please re-enter the password'\n : 'Passwords must be at least 8 characters',\n );\n }\n };\n\n return (\n <div className=\"flex justify-center my-24 px-4\">\n <div className=\"max-w-md w-full\">\n <h1 className=\"text-4xl\">Reset Password.</h1>\n <p className=\"mt-4\">Enter a new password for your account.</p>\n {/* TODO: Add onSubmit to validate _before_ submission with native? */}\n <Form\n method=\"post\"\n noValidate\n className=\"pt-6 pb-8 mt-4 mb-4 space-y-3\"\n >\n {actionData?.formError && (\n <div className=\"flex items-center justify-center mb-6 bg-zinc-500\">\n <p className=\"m-4 text-s text-contrast\">{actionData.formError}</p>\n </div>\n )}\n <div className=\"mb-3\">\n <input\n ref={passwordInput}\n className={`mb-1 ${getInputStyleClasses(nativePasswordError)}`}\n id=\"password\"\n name=\"password\"\n type=\"password\"\n autoComplete=\"current-password\"\n placeholder=\"Password\"\n aria-label=\"Password\"\n minLength={8}\n required\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n onBlur={(event) => {\n if (\n event.currentTarget.validity.valid ||\n !event.currentTarget.value.length\n ) {\n setNativePasswordError(null);\n validatePasswordConfirm();\n } else {\n setNativePasswordError(\n event.currentTarget.validity.valueMissing\n ? 'Please enter a password'\n : 'Passwords must be at least 8 characters',\n );\n }\n }}\n />\n {nativePasswordError && (\n <p className=\"text-red-500 text-xs\">\n {' '}\n {nativePasswordError} &nbsp;\n </p>\n )}\n </div>\n <div className=\"mb-3\">\n <input\n ref={passwordConfirmInput}\n className={`mb-1 ${getInputStyleClasses(\n nativePasswordConfirmError,\n )}`}\n id=\"passwordConfirm\"\n name=\"passwordConfirm\"\n type=\"password\"\n autoComplete=\"current-password\"\n placeholder=\"Re-enter password\"\n aria-label=\"Re-enter password\"\n minLength={8}\n required\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n onBlur={validatePasswordConfirm}\n />\n {nativePasswordConfirmError && (\n <p className=\"text-red-500 text-xs\">\n {' '}\n {nativePasswordConfirmError} &nbsp;\n </p>\n )}\n </div>\n <div className=\"flex items-center justify-between\">\n <button\n className=\"bg-primary text-contrast rounded py-2 px-4 focus:shadow-outline block w-full\"\n type=\"submit\"\n >\n Save\n </button>\n </div>\n </Form>\n </div>\n </div>\n );\n}\n"],
5
- "mappings": "oTAOA,IAAAA,EAA+B,OAuHvB,IAAAC,EAAA,OA3CD,IAAMC,EAAqB,KACzB,CACL,MAAO,gBACT,GAGa,SAARC,GAAyB,CAC9B,IAAMC,EAAaC,EAA0B,EACvC,CAACC,EAAqBC,CAAsB,KAAI,YACpD,IACF,EACM,CAACC,EAA4BC,CAA6B,KAAI,YAElE,IAAI,EAEAC,KAAgB,UAAyB,IAAI,EAC7CC,KAAuB,UAAyB,IAAI,EAEpDC,EAA0B,IAAM,CAChC,CAACD,EAAqB,UAGxBA,EAAqB,QAAQ,MAAM,QACnCA,EAAqB,QAAQ,QAAUD,EAAc,SAAS,MAE9DD,EAA8B,0CAA0C,EAExEE,EAAqB,QAAQ,SAAS,OACtC,CAACA,EAAqB,QAAQ,MAAM,OAEpCF,EAA8B,IAAI,EAElCA,EACEE,EAAqB,QAAQ,SAAS,aAClC,+BACA,yCACN,EAEJ,EAEA,SACE,OAAC,OAAI,UAAU,iCACb,oBAAC,OAAI,UAAU,kBACb,oBAAC,MAAG,UAAU,WAAW,2BAAe,KACxC,OAAC,KAAE,UAAU,OAAO,kDAAsC,KAE1D,QAACE,EAAA,CACC,OAAO,OACP,WAAU,GACV,UAAU,gCAET,UAAAT,GAAY,cACX,OAAC,OAAI,UAAU,oDACb,mBAAC,KAAE,UAAU,2BAA4B,SAAAA,EAAW,UAAU,EAChE,KAEF,QAAC,OAAI,UAAU,OACb,oBAAC,SACC,IAAKM,EACL,UAAW,QAAQI,EAAqBR,CAAmB,IAC3D,GAAG,WACH,KAAK,WACL,KAAK,WACL,aAAa,mBACb,YAAY,WACZ,aAAW,WACX,UAAW,EACX,SAAQ,GAER,UAAS,GACT,OAASS,GAAU,CAEfA,EAAM,cAAc,SAAS,OAC7B,CAACA,EAAM,cAAc,MAAM,QAE3BR,EAAuB,IAAI,EAC3BK,EAAwB,GAExBL,EACEQ,EAAM,cAAc,SAAS,aACzB,0BACA,yCACN,CAEJ,EACF,EACCT,MACC,QAAC,KAAE,UAAU,uBACV,cACAA,EAAoB,SACvB,GAEJ,KACA,QAAC,OAAI,UAAU,OACb,oBAAC,SACC,IAAKK,EACL,UAAW,QAAQG,EACjBN,CACF,IACA,GAAG,kBACH,KAAK,kBACL,KAAK,WACL,aAAa,mBACb,YAAY,oBACZ,aAAW,oBACX,UAAW,EACX,SAAQ,GAER,UAAS,GACT,OAAQI,EACV,EACCJ,MACC,QAAC,KAAE,UAAU,uBACV,cACAA,EAA2B,SAC9B,GAEJ,KACA,OAAC,OAAI,UAAU,oCACb,mBAAC,UACC,UAAU,+EACV,KAAK,SACN,gBAED,EACF,GACF,GACF,EACF,CAEJ",
6
- "names": ["import_react", "import_jsx_runtime", "meta", "Reset", "actionData", "useActionData", "nativePasswordError", "setNativePasswordError", "nativePasswordConfirmError", "setNativePasswordConfirmError", "passwordInput", "passwordConfirmInput", "validatePasswordConfirm", "Form", "getInputStyleClasses", "event"]
7
- }
@@ -1,25 +0,0 @@
1
- import{b as x}from"/build/_shared/chunk-EW52HEI6.js";import{E as g,H as y,O as h,R as A,U as C,V as w,W as P,X as O,Z as v}from"/build/_shared/chunk-SZCP6RSO.js";import"/build/_shared/chunk-7CKXJRLM.js";import"/build/_shared/chunk-NIVT6A2W.js";import"/build/_shared/chunk-AYHDHSL7.js";import"/build/_shared/chunk-7CASD2US.js";import{d,f as r,g as u,n as l,p as m,q as f}from"/build/_shared/chunk-YCAWB56Y.js";import{a as M,b as p}from"/build/_shared/chunk-SYP5DAMV.js";import{c as s}from"/build/_shared/chunk-MEPKJ2VW.js";var N=s(M());var E=`#graphql
2
- ${x}
3
- query homepage($country: CountryCode, $language: LanguageCode)
4
- @inContext(country: $country, language: $language) {
5
- featuredCollections: collections(first: 3, sortKey: UPDATED_AT) {
6
- nodes {
7
- id
8
- title
9
- handle
10
- image {
11
- altText
12
- width
13
- height
14
- url
15
- }
16
- }
17
- }
18
- featuredProducts: products(first: 12) {
19
- nodes {
20
- ...ProductCard
21
- }
22
- }
23
- }
24
- `;var t=s(p());function T(){let e=f(),o=d(),a=m().some(n=>n?.handle?.renderInModal);return e.isAuthenticated?o?a?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(O,{cancelLink:"/account",children:(0,t.jsx)(r,{context:{customer:e.customer}})}),(0,t.jsx)(D,{...e})]}):(0,t.jsx)(r,{context:{customer:e.customer}}):(0,t.jsx)(D,{...e}):(0,t.jsx)(r,{})}function D({customer:e,orders:o,heading:c,addresses:a,featuredData:n}){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(y,{heading:c,children:(0,t.jsx)(u,{method:"post",action:"/account/logout",children:(0,t.jsx)("button",{type:"submit",className:"text-primary/50",children:"Sign out"})})}),o&&(0,t.jsx)(L,{orders:o}),(0,t.jsx)(w,{customer:e}),(0,t.jsx)(P,{addresses:a,customer:e}),!o.length&&(0,t.jsx)(N.Suspense,{children:(0,t.jsx)(l,{resolve:n,errorElement:"There was a problem loading featured products.",children:i=>(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(v,{title:"Popular Collections",collections:i.featuredCollections}),(0,t.jsx)(h,{products:i.featuredProducts})]})})})]})}function L({orders:e}){return(0,t.jsx)("div",{className:"mt-6",children:(0,t.jsxs)("div",{className:"grid w-full gap-4 p-4 py-6 md:gap-8 md:p-8 lg:p-12",children:[(0,t.jsx)("h2",{className:"font-bold text-lead",children:"Order History"}),e?.length?(0,t.jsx)(b,{orders:e}):(0,t.jsx)($,{})]})})}function $(){return(0,t.jsxs)("div",{children:[(0,t.jsx)(g,{className:"mb-1",size:"fine",width:"narrow",as:"p",children:"You haven't placed any orders yet."}),(0,t.jsx)("div",{className:"w-48",children:(0,t.jsx)(A,{className:"text-sm mt-2 w-full",variant:"secondary",to:"/",children:"Start Shopping"})})]})}function b({orders:e}){return(0,t.jsx)("ul",{className:"grid-flow-row grid gap-2 gap-y-6 md:gap-4 lg:gap-6 grid-cols-1 false sm:grid-cols-3",children:e.map(o=>(0,t.jsx)(C,{order:o},o.id))})}export{T as default};
25
- //# sourceMappingURL=/build/routes/($lang)/account-PRE5HSJE.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../app/routes/($lang)/account.tsx", "../../../../../app/routes/($lang)/featured-products.tsx"],
4
- "sourcesContent": ["import {\n Await,\n Form,\n Outlet,\n useLoaderData,\n useMatches,\n useOutlet,\n} from '@remix-run/react';\nimport type {\n Collection,\n Customer,\n MailingAddress,\n Order,\n} from '@shopify/storefront-kit-react/storefront-api-types';\nimport {Suspense} from 'react';\nimport {\n Button,\n OrderCard,\n PageHeader,\n Text,\n AccountDetails,\n AccountAddressBook,\n Modal,\n ProductSwimlane,\n} from '~/components';\nimport {FeaturedCollections} from '~/components/FeaturedCollections';\nimport {redirect, json, type LoaderArgs} from '@shopify/remix-oxygen';\nimport {flattenConnection} from '@shopify/storefront-kit-react';\nimport {getCustomer} from '~/data';\nimport {getFeaturedData} from './featured-products';\n\nexport async function loader({request, context, params}: LoaderArgs) {\n const {pathname} = new URL(request.url);\n const lang = params.lang;\n const customerAccessToken = await context.session.get('customerAccessToken');\n const isAuthenticated = Boolean(customerAccessToken);\n const loginPath = lang ? `${lang}/account/login` : '/account/login';\n\n if (!isAuthenticated) {\n if (/\\/account\\/login$/.test(pathname)) {\n return json({\n isAuthenticated,\n });\n }\n return redirect(loginPath);\n }\n\n const customer = await getCustomer(context, customerAccessToken);\n\n const heading = customer\n ? customer.firstName\n ? `Welcome, ${customer.firstName}.`\n : `Welcome to your account.`\n : 'Account Details';\n\n const orders = flattenConnection(customer?.orders) as Order[];\n\n return json({\n isAuthenticated,\n customer,\n heading,\n orders,\n addresses: flattenConnection(customer.addresses) as MailingAddress[],\n featuredData: getFeaturedData(context.storefront),\n });\n}\n\nexport default function Authenticated() {\n const data = useLoaderData<typeof loader>();\n const outlet = useOutlet();\n const matches = useMatches();\n\n // routes that export handle { renderInModal: true }\n const renderOutletInModal = matches.some((match) => {\n return match?.handle?.renderInModal;\n });\n\n // Public routes\n if (!data.isAuthenticated) {\n return <Outlet />;\n }\n\n // Authenticated routes\n if (outlet) {\n if (renderOutletInModal) {\n return (\n <>\n <Modal cancelLink=\"/account\">\n <Outlet context={{customer: data.customer} as any} />\n </Modal>\n <Account {...data} />\n </>\n );\n } else {\n return <Outlet context={{customer: data.customer} as any} />;\n }\n }\n\n return <Account {...data} />;\n}\n\ninterface Account {\n customer: Customer;\n orders: Order[];\n heading: string;\n addresses: MailingAddress[];\n featuredData: any; // @todo: help please\n}\n\nfunction Account({\n customer,\n orders,\n heading,\n addresses,\n featuredData,\n}: Account) {\n return (\n <>\n <PageHeader heading={heading}>\n <Form method=\"post\" action=\"/account/logout\">\n <button type=\"submit\" className=\"text-primary/50\">\n Sign out\n </button>\n </Form>\n </PageHeader>\n {orders && <AccountOrderHistory orders={orders as Order[]} />}\n <AccountDetails customer={customer as Customer} />\n <AccountAddressBook\n addresses={addresses as MailingAddress[]}\n customer={customer as Customer}\n />\n {!orders.length && (\n <Suspense>\n <Await\n resolve={featuredData}\n errorElement=\"There was a problem loading featured products.\"\n >\n {(data) => (\n <>\n <FeaturedCollections\n title=\"Popular Collections\"\n collections={data.featuredCollections as Collection[]}\n />\n <ProductSwimlane products={data.featuredProducts} />\n </>\n )}\n </Await>\n </Suspense>\n )}\n </>\n );\n}\n\nfunction AccountOrderHistory({orders}: {orders: Order[]}) {\n return (\n <div className=\"mt-6\">\n <div className=\"grid w-full gap-4 p-4 py-6 md:gap-8 md:p-8 lg:p-12\">\n <h2 className=\"font-bold text-lead\">Order History</h2>\n {orders?.length ? <Orders orders={orders} /> : <EmptyOrders />}\n </div>\n </div>\n );\n}\n\nfunction EmptyOrders() {\n return (\n <div>\n <Text className=\"mb-1\" size=\"fine\" width=\"narrow\" as=\"p\">\n You haven&apos;t placed any orders yet.\n </Text>\n <div className=\"w-48\">\n <Button className=\"text-sm mt-2 w-full\" variant=\"secondary\" to={'/'}>\n Start Shopping\n </Button>\n </div>\n </div>\n );\n}\n\nfunction Orders({orders}: {orders: Order[]}) {\n return (\n <ul className=\"grid-flow-row grid gap-2 gap-y-6 md:gap-4 lg:gap-6 grid-cols-1 false sm:grid-cols-3\">\n {orders.map((order) => (\n <OrderCard order={order} key={order.id} />\n ))}\n </ul>\n );\n}\n", "import {json, type LoaderArgs} from '@shopify/remix-oxygen';\nimport {flattenConnection} from '@shopify/storefront-kit-react';\nimport type {\n CollectionConnection,\n ProductConnection,\n} from '@shopify/storefront-kit-react/storefront-api-types';\nimport invariant from 'tiny-invariant';\nimport {PRODUCT_CARD_FRAGMENT} from '~/data';\n\nexport async function loader({context: {storefront}}: LoaderArgs) {\n return json(await getFeaturedData(storefront));\n}\n\nexport async function getFeaturedData(\n storefront: LoaderArgs['context']['storefront'],\n) {\n const data = await storefront.query<{\n featuredCollections: CollectionConnection;\n featuredProducts: ProductConnection;\n }>(FEATURED_QUERY, {\n variables: {\n country: storefront.i18n.country,\n language: storefront.i18n.language,\n },\n });\n\n invariant(data, 'No data returned from Shopify API');\n\n return {\n featuredCollections: flattenConnection(data.featuredCollections),\n featuredProducts: flattenConnection(data.featuredProducts),\n };\n}\n\nconst FEATURED_QUERY = `#graphql\n ${PRODUCT_CARD_FRAGMENT}\n query homepage($country: CountryCode, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n featuredCollections: collections(first: 3, sortKey: UPDATED_AT) {\n nodes {\n id\n title\n handle\n image {\n altText\n width\n height\n url\n }\n }\n }\n featuredProducts: products(first: 12) {\n nodes {\n ...ProductCard\n }\n }\n }\n`;\n"],
5
- "mappings": "0gBAcA,IAAAA,EAAuB,OCoBvB,IAAMC,EAAiB;AAAA,IACnBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ED4CO,IAAAC,EAAA,OAZI,SAARC,GAAiC,CACtC,IAAMC,EAAOC,EAA6B,EACpCC,EAASC,EAAU,EAInBC,EAHUC,EAAW,EAGS,KAAMC,GACjCA,GAAO,QAAQ,aACvB,EAGD,OAAKN,EAAK,gBAKNE,EACEE,KAEA,oBACE,oBAACG,EAAA,CAAM,WAAW,WAChB,mBAACC,EAAA,CAAO,QAAS,CAAC,SAAUR,EAAK,QAAQ,EAAU,EACrD,KACA,OAACS,EAAA,CAAS,GAAGT,EAAM,GACrB,KAGK,OAACQ,EAAA,CAAO,QAAS,CAAC,SAAUR,EAAK,QAAQ,EAAU,KAIvD,OAACS,EAAA,CAAS,GAAGT,EAAM,KAnBjB,OAACQ,EAAA,EAAO,CAoBnB,CAUA,SAASC,EAAQ,CACf,SAAAC,EACA,OAAAC,EACA,QAAAC,EACA,UAAAC,EACA,aAAAC,CACF,EAAY,CACV,SACE,oBACE,oBAACC,EAAA,CAAW,QAASH,EACnB,mBAACI,EAAA,CAAK,OAAO,OAAO,OAAO,kBACzB,mBAAC,UAAO,KAAK,SAAS,UAAU,kBAAkB,oBAElD,EACF,EACF,EACCL,MAAU,OAACM,EAAA,CAAoB,OAAQN,EAAmB,KAC3D,OAACO,EAAA,CAAe,SAAUR,EAAsB,KAChD,OAACS,EAAA,CACC,UAAWN,EACX,SAAUH,EACZ,EACC,CAACC,EAAO,WACP,OAAC,YACC,mBAACS,EAAA,CACC,QAASN,EACT,aAAa,iDAEZ,SAACd,MACA,oBACE,oBAACqB,EAAA,CACC,MAAM,sBACN,YAAarB,EAAK,oBACpB,KACA,OAACsB,EAAA,CAAgB,SAAUtB,EAAK,iBAAkB,GACpD,EAEJ,EACF,GAEJ,CAEJ,CAEA,SAASiB,EAAoB,CAAC,OAAAN,CAAM,EAAsB,CACxD,SACE,OAAC,OAAI,UAAU,OACb,oBAAC,OAAI,UAAU,qDACb,oBAAC,MAAG,UAAU,sBAAsB,yBAAa,EAChDA,GAAQ,UAAS,OAACY,EAAA,CAAO,OAAQZ,EAAQ,KAAK,OAACa,EAAA,EAAY,GAC9D,EACF,CAEJ,CAEA,SAASA,GAAc,CACrB,SACE,QAAC,OACC,oBAACC,EAAA,CAAK,UAAU,OAAO,KAAK,OAAO,MAAM,SAAS,GAAG,IAAI,8CAEzD,KACA,OAAC,OAAI,UAAU,OACb,mBAACC,EAAA,CAAO,UAAU,sBAAsB,QAAQ,YAAY,GAAI,IAAK,0BAErE,EACF,GACF,CAEJ,CAEA,SAASH,EAAO,CAAC,OAAAZ,CAAM,EAAsB,CAC3C,SACE,OAAC,MAAG,UAAU,uFACX,SAAAA,EAAO,IAAKgB,MACX,OAACC,EAAA,CAAU,MAAOD,GAAYA,EAAM,EAAI,CACzC,EACH,CAEJ",
6
- "names": ["import_react", "FEATURED_QUERY", "PRODUCT_CARD_FRAGMENT", "import_jsx_runtime", "Authenticated", "data", "useLoaderData", "outlet", "useOutlet", "renderOutletInModal", "useMatches", "match", "Modal", "Outlet", "Account", "customer", "orders", "heading", "addresses", "featuredData", "PageHeader", "Form", "AccountOrderHistory", "AccountDetails", "AccountAddressBook", "Await", "FeaturedCollections", "ProductSwimlane", "Orders", "EmptyOrders", "Text", "Button", "order", "OrderCard"]
7
- }
@@ -1,2 +0,0 @@
1
- import"/build/_shared/chunk-AYHDHSL7.js";import"/build/_shared/chunk-MEPKJ2VW.js";function e(){return null}export{e as default};
2
- //# sourceMappingURL=/build/routes/($lang)/api/countries-UD6BGYL2.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../app/routes/($lang)/api/countries.tsx"],
4
- "sourcesContent": ["import {json, type LoaderArgs} from '@shopify/remix-oxygen';\nimport {countries} from '~/data/countries';\n\nexport async function loader({context: {storefront}}: LoaderArgs) {\n return json(\n {\n ...countries,\n },\n {\n headers: {\n 'cache-control': storefront.generateCacheControlHeader(\n storefront.CacheLong(),\n ),\n },\n },\n );\n}\n\n// no-op\nexport default function CountriesApiRoute() {\n return null;\n}\n"],
5
- "mappings": "kFAmBe,SAARA,GAAqC,CAC1C,OAAO,IACT",
6
- "names": ["CountriesApiRoute"]
7
- }
@@ -1,2 +0,0 @@
1
- import"/build/_shared/chunk-7CKXJRLM.js";import"/build/_shared/chunk-SYP5DAMV.js";import"/build/_shared/chunk-MEPKJ2VW.js";function e(){return null}export{e as default};
2
- //# sourceMappingURL=/build/routes/($lang)/api/products-KIFIWUFE.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../../app/routes/($lang)/api/products.tsx"],
4
- "sourcesContent": ["import {json, type LoaderArgs} from '@shopify/remix-oxygen';\nimport {flattenConnection} from '@shopify/storefront-kit-react';\nimport {ProductConnection} from '@shopify/storefront-kit-react/storefront-api-types';\nimport invariant from 'tiny-invariant';\n\n/**\n * Fetch a given set of products from the storefront API\n * @param count\n * @param query\n * @param reverse\n * @param sortKey\n * @returns Product[]\n * @see https://shopify.dev/api/storefront/2023-01/queries/products\n */\nexport async function loader({request, context: {storefront}}: LoaderArgs) {\n const url = new URL(request.url);\n const searchParams = new URLSearchParams(url.search);\n\n const sortKey = searchParams.get('sortKey') ?? 'BEST_SELLING';\n const query = searchParams.get('query') ?? '';\n\n let reverse = false;\n try {\n const _reverse = searchParams.get('reverse');\n if (_reverse === 'true') {\n reverse = true;\n }\n } catch (_) {\n // noop\n }\n\n let count = 4;\n try {\n const _count = searchParams.get('count');\n if (typeof _count === 'string') {\n count = parseInt(_count);\n }\n } catch (_) {\n // noop\n }\n\n const {products} = await storefront.query<{\n products: ProductConnection;\n }>(PRODUCTS_QUERY, {\n variables: {\n count,\n query,\n reverse,\n sortKey,\n country: storefront.i18n.country,\n language: storefront.i18n.language,\n },\n cache: storefront.CacheLong(),\n });\n\n invariant(products, 'No data returned from top products query');\n\n return json({\n products: flattenConnection(products),\n });\n}\n\nconst PRODUCTS_QUERY = `#graphql\n fragment ProductCard on Product {\n id\n title\n publishedAt\n handle\n variants(first: 1) {\n nodes {\n id\n image {\n url\n altText\n width\n height\n }\n price {\n amount\n currencyCode\n }\n compareAtPrice {\n amount\n currencyCode\n }\n product {\n title\n handle\n }\n selectedOptions {\n name\n value\n }\n }\n }\n }\n query (\n $query: String\n $count: Int\n $reverse: Boolean\n $country: CountryCode\n $language: LanguageCode\n $sortKey: ProductSortKeys\n ) @inContext(country: $country, language: $language) {\n products(first: $count, sortKey: $sortKey, reverse: $reverse, query: $query) {\n nodes {\n ...ProductCard\n }\n }\n }\n`;\n\n// no-op\nexport default function ProductsApiRoute() {\n return null;\n}\n"],
5
- "mappings": "2HAiHe,SAARA,GAAoC,CACzC,OAAO,IACT",
6
- "names": ["ProductsApiRoute"]
7
- }
@@ -1,55 +0,0 @@
1
- import{S as i,T as c}from"/build/_shared/chunk-SZCP6RSO.js";import"/build/_shared/chunk-7CKXJRLM.js";import"/build/_shared/chunk-NIVT6A2W.js";import"/build/_shared/chunk-AYHDHSL7.js";import"/build/_shared/chunk-7CASD2US.js";import{n,p as o}from"/build/_shared/chunk-YCAWB56Y.js";import{a as y,b as s}from"/build/_shared/chunk-SYP5DAMV.js";import{c as r}from"/build/_shared/chunk-MEPKJ2VW.js";var d=r(y());var t=r(s());function u(){let[p]=o();return(0,t.jsx)("div",{className:"grid w-full gap-8 p-6 py-8 md:p-8 lg:p-12 justify-items-start",children:(0,t.jsx)(d.Suspense,{fallback:(0,t.jsx)(c,{}),children:(0,t.jsx)(n,{resolve:p.data?.cart,children:C=>(0,t.jsx)(i,{layout:"page",cart:C})})})})}var e=`#graphql
2
- fragment ErrorFragment on CartUserError {
3
- message
4
- field
5
- code
6
- }
7
- `,a=`#graphql
8
- fragment CartLinesFragment on Cart {
9
- id
10
- totalQuantity
11
- }
12
- `;var A=`#graphql
13
- mutation ($input: CartInput!, $country: CountryCode = ZZ, $language: LanguageCode)
14
- @inContext(country: $country, language: $language) {
15
- cartCreate(input: $input) {
16
- cart {
17
- ...CartLinesFragment
18
- }
19
- errors: userErrors {
20
- ...ErrorFragment
21
- }
22
- }
23
- }
24
- ${a}
25
- ${e}
26
- `;var E=`#graphql
27
- mutation ($cartId: ID!, $lines: [CartLineInput!]!, $country: CountryCode = ZZ, $language: LanguageCode)
28
- @inContext(country: $country, language: $language) {
29
- cartLinesAdd(cartId: $cartId, lines: $lines) {
30
- cart {
31
- ...CartLinesFragment
32
- }
33
- errors: userErrors {
34
- ...ErrorFragment
35
- }
36
- }
37
- }
38
- ${a}
39
- ${e}
40
- `;var U=`#graphql
41
- ${a}
42
- ${e}
43
- mutation ($cartId: ID!, $lines: [CartLineUpdateInput!]!, $language: LanguageCode, $country: CountryCode)
44
- @inContext(country: $country, language: $language) {
45
- cartLinesUpdate(cartId: $cartId, lines: $lines) {
46
- cart {
47
- ...CartLinesFragment
48
- }
49
- errors: userErrors {
50
- ...ErrorFragment
51
- }
52
- }
53
- }
54
- `;export{u as default};
55
- //# sourceMappingURL=/build/routes/($lang)/cart-3AJ7UOZX.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../app/routes/($lang)/cart.tsx"],
4
- "sourcesContent": ["import {CartLoading, Cart} from '~/components';\nimport {Await, useMatches} from '@remix-run/react';\nimport {Suspense} from 'react';\nimport invariant from 'tiny-invariant';\nimport {\n json,\n type ActionArgs,\n type AppLoadContext,\n} from '@shopify/remix-oxygen';\nimport type {\n Cart as CartType,\n CartInput,\n CartLineInput,\n CartLineUpdateInput,\n CartUserError,\n UserError,\n CartBuyerIdentityInput,\n} from '@shopify/storefront-kit-react/storefront-api-types';\nimport {isLocalPath} from '~/lib/utils';\nimport {CartAction, type CartActions} from '~/lib/type';\n\nexport async function action({request, context}: ActionArgs) {\n const {session, storefront} = context;\n const headers = new Headers();\n\n const [formData, storedCartId, customerAccessToken] = await Promise.all([\n request.formData(),\n session.get('cartId'),\n session.get('customerAccessToken'),\n ]);\n\n let cartId = storedCartId;\n\n const cartAction = formData.get('cartAction') as CartActions;\n invariant(cartAction, 'No cartAction defined');\n\n const countryCode = formData.get('countryCode')\n ? (formData.get('countryCode') as CartBuyerIdentityInput['countryCode'])\n : null;\n\n let status = 200;\n let result: {\n cart: CartType;\n errors?: CartUserError[] | UserError[];\n };\n\n switch (cartAction) {\n case CartAction.ADD_TO_CART:\n const lines = formData.get('lines')\n ? (JSON.parse(String(formData.get('lines'))) as CartLineInput[])\n : ([] as CartLineInput[]);\n invariant(lines.length, 'No lines to add');\n\n /**\n * If no previous cart exists, create one with the lines.\n */\n if (!cartId) {\n result = await cartCreate({\n input: countryCode ? {lines, buyerIdentity: {countryCode}} : {lines},\n storefront,\n });\n } else {\n result = await cartAdd({\n cartId,\n lines,\n storefront,\n });\n }\n\n cartId = result.cart.id;\n\n break;\n case CartAction.REMOVE_FROM_CART:\n const lineIds = formData.get('linesIds')\n ? (JSON.parse(String(formData.get('linesIds'))) as CartType['id'][])\n : ([] as CartType['id'][]);\n invariant(lineIds.length, 'No lines to remove');\n\n result = await cartRemove({\n cartId,\n lineIds,\n storefront,\n });\n\n cartId = result.cart.id;\n\n break;\n case CartAction.UPDATE_CART:\n const updateLines = formData.get('lines')\n ? (JSON.parse(String(formData.get('lines'))) as CartLineUpdateInput[])\n : ([] as CartLineUpdateInput[]);\n invariant(updateLines.length, 'No lines to update');\n\n result = await cartUpdate({\n cartId,\n lines: updateLines,\n storefront,\n });\n\n cartId = result.cart.id;\n\n break;\n case CartAction.UPDATE_DISCOUNT:\n invariant(cartId, 'Missing cartId');\n\n const formDiscountCode = formData.get('discountCode');\n const discountCodes = ([formDiscountCode] || ['']) as string[];\n\n result = await cartDiscountCodesUpdate({\n cartId,\n discountCodes,\n storefront,\n });\n\n cartId = result.cart.id;\n\n break;\n case CartAction.UPDATE_BUYER_IDENTITY:\n const buyerIdentity = formData.get('buyerIdentity')\n ? (JSON.parse(\n String(formData.get('buyerIdentity')),\n ) as CartBuyerIdentityInput)\n : ({} as CartBuyerIdentityInput);\n\n result = cartId\n ? await cartUpdateBuyerIdentity({\n cartId,\n buyerIdentity: {\n ...buyerIdentity,\n customerAccessToken,\n },\n storefront,\n })\n : await cartCreate({\n input: {\n buyerIdentity: {\n ...buyerIdentity,\n customerAccessToken,\n },\n },\n storefront,\n });\n\n cartId = result.cart.id;\n\n break;\n default:\n invariant(false, `${cartAction} cart action is not defined`);\n }\n\n /**\n * The Cart ID may change after each mutation. We need to update it each time in the session.\n */\n session.set('cartId', cartId);\n headers.set('Set-Cookie', await session.commit());\n\n const redirectTo = formData.get('redirectTo') ?? null;\n if (typeof redirectTo === 'string' && isLocalPath(redirectTo)) {\n status = 303;\n headers.set('Location', redirectTo);\n }\n\n const {cart, errors} = result;\n return json({cart, errors}, {status, headers});\n}\n\nexport default function CartRoute() {\n const [root] = useMatches();\n // @todo: finish on a separate PR\n return (\n <div className=\"grid w-full gap-8 p-6 py-8 md:p-8 lg:p-12 justify-items-start\">\n <Suspense fallback={<CartLoading />}>\n <Await resolve={root.data?.cart}>\n {(cart) => <Cart layout=\"page\" cart={cart} />}\n </Await>\n </Suspense>\n </div>\n );\n}\n\n/*\n Cart Queries\n*/\n\nconst USER_ERROR_FRAGMENT = `#graphql\n fragment ErrorFragment on CartUserError {\n message\n field\n code\n }\n`;\n\nconst LINES_CART_FRAGMENT = `#graphql\n fragment CartLinesFragment on Cart {\n id\n totalQuantity\n }\n`;\n\n//! @see: https://shopify.dev/api/storefront/2022-01/mutations/cartcreate\nconst CREATE_CART_MUTATION = `#graphql\n mutation ($input: CartInput!, $country: CountryCode = ZZ, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartCreate(input: $input) {\n cart {\n ...CartLinesFragment\n }\n errors: userErrors {\n ...ErrorFragment\n }\n }\n }\n ${LINES_CART_FRAGMENT}\n ${USER_ERROR_FRAGMENT}\n`;\n\n/**\n * Create a cart with line(s) mutation\n * @param input CartInput https://shopify.dev/api/storefront/2022-01/input-objects/CartInput\n * @see https://shopify.dev/api/storefront/2022-01/mutations/cartcreate\n * @returns result {cart, errors}\n * @preserve\n */\nexport async function cartCreate({\n input,\n storefront,\n}: {\n input: CartInput;\n storefront: AppLoadContext['storefront'];\n}) {\n const {cartCreate} = await storefront.mutate<{\n cartCreate: {\n cart: CartType;\n errors: CartUserError[];\n };\n errors: UserError[];\n }>(CREATE_CART_MUTATION, {\n variables: {input},\n });\n\n invariant(cartCreate, 'No data returned from cartCreate mutation');\n\n return cartCreate;\n}\n\nconst ADD_LINES_MUTATION = `#graphql\n mutation ($cartId: ID!, $lines: [CartLineInput!]!, $country: CountryCode = ZZ, $language: LanguageCode)\n @inContext(country: $country, language: $language) {\n cartLinesAdd(cartId: $cartId, lines: $lines) {\n cart {\n ...CartLinesFragment\n }\n errors: userErrors {\n ...ErrorFragment\n }\n }\n }\n ${LINES_CART_FRAGMENT}\n ${USER_ERROR_FRAGMENT}\n`;\n\n/**\n * Storefront API cartLinesAdd mutation\n * @param cartId\n * @param lines [CartLineInput!]! https://shopify.dev/api/storefront/2022-01/input-objects/CartLineInput\n * @see https://shopify.dev/api/storefront/2022-01/mutations/cartLinesAdd\n * @returns result {cart, errors}\n * @preserve\n */\nexport async function cartAdd({\n cartId,\n lines,\n storefront,\n}: {\n cartId: string;\n lines: CartLineInput[];\n storefront: AppLoadContext['storefront'];\n}) {\n const {cartLinesAdd} = await storefront.mutate<{\n cartLinesAdd: {\n cart: CartType;\n errors: CartUserError[];\n };\n }>(ADD_LINES_MUTATION, {\n variables: {cartId, lines},\n });\n\n invariant(cartLinesAdd, 'No data returned from cartLinesAdd mutation');\n\n return cartLinesAdd;\n}\n\nconst REMOVE_LINE_ITEMS_MUTATION = `#graphql\n mutation ($cartId: ID!, $lineIds: [ID!]!, $language: LanguageCode, $country: CountryCode)\n @inContext(country: $country, language: $language) {\n cartLinesRemove(cartId: $cartId, lineIds: $lineIds) {\n cart {\n id\n totalQuantity\n lines(first: 100) {\n edges {\n node {\n id\n quantity\n merchandise {\n ...on ProductVariant {\n id\n }\n }\n }\n }\n }\n }\n errors: userErrors {\n message\n field\n code\n }\n }\n }\n`;\n\n/**\n * Create a cart with line(s) mutation\n * @param cartId the current cart id\n * @param lineIds [ID!]! an array of cart line ids to remove\n * @see https://shopify.dev/api/storefront/2022-07/mutations/cartlinesremove\n * @returns mutated cart\n * @preserve\n */\nexport async function cartRemove({\n cartId,\n lineIds,\n storefront,\n}: {\n cartId: string;\n lineIds: CartType['id'][];\n storefront: AppLoadContext['storefront'];\n}) {\n const {cartLinesRemove} = await storefront.mutate<{\n cartLinesRemove: {cart: CartType; errors: UserError[]};\n }>(REMOVE_LINE_ITEMS_MUTATION, {\n variables: {\n cartId,\n lineIds,\n },\n });\n\n invariant(cartLinesRemove, 'No data returned from remove lines mutation');\n return cartLinesRemove;\n}\n\nconst LINES_UPDATE_MUTATION = `#graphql\n ${LINES_CART_FRAGMENT}\n ${USER_ERROR_FRAGMENT}\n mutation ($cartId: ID!, $lines: [CartLineUpdateInput!]!, $language: LanguageCode, $country: CountryCode)\n @inContext(country: $country, language: $language) {\n cartLinesUpdate(cartId: $cartId, lines: $lines) {\n cart {\n ...CartLinesFragment\n }\n errors: userErrors {\n ...ErrorFragment\n }\n }\n }\n`;\n\n/**\n * Update cart line(s) mutation\n * @param cartId the current cart id\n * @param lineIds [ID!]! an array of cart line ids to remove\n * @see https://shopify.dev/api/storefront/2022-07/mutations/cartlinesremove\n * @returns mutated cart\n * @preserve\n */\nexport async function cartUpdate({\n cartId,\n lines,\n storefront,\n}: {\n cartId: string;\n lines: CartLineUpdateInput[];\n storefront: AppLoadContext['storefront'];\n}) {\n const {cartLinesUpdate} = await storefront.mutate<{\n cartLinesUpdate: {cart: CartType; errors: UserError[]};\n }>(LINES_UPDATE_MUTATION, {\n variables: {cartId, lines},\n });\n\n invariant(\n cartLinesUpdate,\n 'No data returned from update lines items mutation',\n );\n return cartLinesUpdate;\n}\n\n/**\n * @see https://shopify.dev/api/storefront/2022-10/mutations/cartBuyerIdentityUpdate\n * @preserve\n */\nconst UPDATE_CART_BUYER_COUNTRY = `#graphql\n mutation(\n $cartId: ID!\n $buyerIdentity: CartBuyerIdentityInput!\n $country: CountryCode = ZZ\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n cartBuyerIdentityUpdate(cartId: $cartId, buyerIdentity: $buyerIdentity) {\n cart {\n id\n buyerIdentity {\n email\n phone\n countryCode\n }\n }\n errors: userErrors {\n message\n field\n code\n }\n }\n }\n`;\n\n/**\n * Mutation to update a cart buyerIdentity\n * @param cartId Cart['id']\n * @param buyerIdentity CartBuyerIdentityInput\n * @returns {cart: Cart; errors: UserError[]}\n * @see API https://shopify.dev/api/storefront/2022-10/mutations/cartBuyerIdentityUpdate\n * @preserve\n */\nexport async function cartUpdateBuyerIdentity({\n cartId,\n buyerIdentity,\n storefront,\n}: {\n cartId: string;\n buyerIdentity: CartBuyerIdentityInput;\n storefront: AppLoadContext['storefront'];\n}) {\n const {cartBuyerIdentityUpdate} = await storefront.mutate<{\n cartBuyerIdentityUpdate: {cart: CartType; errors: UserError[]};\n }>(UPDATE_CART_BUYER_COUNTRY, {\n variables: {\n cartId,\n buyerIdentity,\n },\n });\n\n invariant(\n cartBuyerIdentityUpdate,\n 'No data returned from cart buyer identity update mutation',\n );\n\n return cartBuyerIdentityUpdate;\n}\n\nconst DISCOUNT_CODES_UPDATE = `#graphql\n mutation cartDiscountCodesUpdate($cartId: ID!, $discountCodes: [String!], $country: CountryCode = ZZ)\n @inContext(country: $country) {\n cartDiscountCodesUpdate(cartId: $cartId, discountCodes: $discountCodes) {\n cart {\n id\n discountCodes {\n code\n }\n }\n errors: userErrors {\n field\n message\n }\n }\n }\n`;\n\n/**\n * Mutation that updates the cart discounts\n * @param discountCodes Array of discount codes\n * @returns mutated cart\n * @preserve\n */\nexport async function cartDiscountCodesUpdate({\n cartId,\n discountCodes,\n storefront,\n}: {\n cartId: string;\n discountCodes: string[];\n storefront: AppLoadContext['storefront'];\n}) {\n const {cartDiscountCodesUpdate} = await storefront.mutate<{\n cartDiscountCodesUpdate: {cart: CartType; errors: UserError[]};\n }>(DISCOUNT_CODES_UPDATE, {\n variables: {\n cartId,\n discountCodes,\n },\n });\n\n invariant(\n cartDiscountCodesUpdate,\n 'No data returned from the cartDiscountCodesUpdate mutation',\n );\n\n return cartDiscountCodesUpdate;\n}\n"],
5
- "mappings": "wYAEA,IAAAA,EAAuB,OAyKG,IAAAC,EAAA,OALX,SAARC,GAA6B,CAClC,GAAM,CAACC,CAAI,EAAIC,EAAW,EAE1B,SACE,OAAC,OAAI,UAAU,gEACb,mBAAC,YAAS,YAAU,OAACC,EAAA,EAAY,EAC/B,mBAACC,EAAA,CAAM,QAASH,EAAK,MAAM,KACxB,SAACI,MAAS,OAACC,EAAA,CAAK,OAAO,OAAO,KAAMD,EAAM,EAC7C,EACF,EACF,CAEJ,CAMA,IAAME,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQtBC,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5B,IAAMC,EAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYzBD;AAAA,IACAD;EAgCJ,IAAMG,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYvBC;AAAA,IACAC;EA8FJ,IAAMC,EAAwB;AAAA,IAC1BC;AAAA,IACAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
- "names": ["import_react", "import_jsx_runtime", "CartRoute", "root", "useMatches", "CartLoading", "Await", "cart", "Cart", "USER_ERROR_FRAGMENT", "LINES_CART_FRAGMENT", "CREATE_CART_MUTATION", "ADD_LINES_MUTATION", "LINES_CART_FRAGMENT", "USER_ERROR_FRAGMENT", "LINES_UPDATE_MUTATION", "LINES_CART_FRAGMENT", "USER_ERROR_FRAGMENT"]
7
- }