@shopify/shopify-app-remix 0.0.0-experimental-20231213172144

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 (503) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +179 -0
  3. package/build/cjs/react/components/AppProvider/AppProvider.js +98 -0
  4. package/build/cjs/react/components/RemixPolarisLink.js +22 -0
  5. package/build/cjs/react/const.js +7 -0
  6. package/build/cjs/react/index.js +9 -0
  7. package/build/cjs/server/adapters/node/index.js +22 -0
  8. package/build/cjs/server/authenticate/admin/authenticate.js +176 -0
  9. package/build/cjs/server/authenticate/admin/billing/cancel.js +40 -0
  10. package/build/cjs/server/authenticate/admin/billing/request.js +85 -0
  11. package/build/cjs/server/authenticate/admin/billing/require.js +47 -0
  12. package/build/cjs/server/authenticate/admin/helpers/begin-auth.js +18 -0
  13. package/build/cjs/server/authenticate/admin/helpers/create-admin-api-context.js +18 -0
  14. package/build/cjs/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.js +27 -0
  15. package/build/cjs/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.js +25 -0
  16. package/build/cjs/server/authenticate/admin/helpers/handle-client-error.js +39 -0
  17. package/build/cjs/server/authenticate/admin/helpers/redirect-to-auth-page.js +27 -0
  18. package/build/cjs/server/authenticate/admin/helpers/redirect-to-bounce-page.js +24 -0
  19. package/build/cjs/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.js +22 -0
  20. package/build/cjs/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.js +21 -0
  21. package/build/cjs/server/authenticate/admin/helpers/redirect-with-exitiframe.js +23 -0
  22. package/build/cjs/server/authenticate/admin/helpers/redirect.js +67 -0
  23. package/build/cjs/server/authenticate/admin/helpers/render-app-bridge.js +30 -0
  24. package/build/cjs/server/authenticate/admin/helpers/trigger-after-auth-hook.js +21 -0
  25. package/build/cjs/server/authenticate/admin/helpers/validate-shop-and-host-params.js +32 -0
  26. package/build/cjs/server/authenticate/admin/strategies/auth-code-flow.js +314 -0
  27. package/build/cjs/server/authenticate/admin/strategies/token-exchange.js +125 -0
  28. package/build/cjs/server/authenticate/const.js +9 -0
  29. package/build/cjs/server/authenticate/helpers/add-response-headers.js +32 -0
  30. package/build/cjs/server/authenticate/helpers/app-bridge-url.js +16 -0
  31. package/build/cjs/server/authenticate/helpers/ensure-cors-headers.js +25 -0
  32. package/build/cjs/server/authenticate/helpers/get-session-token-header.js +16 -0
  33. package/build/cjs/server/authenticate/helpers/idempotent-promise-handler.js +29 -0
  34. package/build/cjs/server/authenticate/helpers/reject-bot-request.js +23 -0
  35. package/build/cjs/server/authenticate/helpers/respond-to-invalid-session-token.js +30 -0
  36. package/build/cjs/server/authenticate/helpers/respond-to-options-request.js +19 -0
  37. package/build/cjs/server/authenticate/helpers/validate-session-token.js +29 -0
  38. package/build/cjs/server/authenticate/login/login.js +48 -0
  39. package/build/cjs/server/authenticate/public/appProxy/authenticate.js +88 -0
  40. package/build/cjs/server/authenticate/public/checkout/authenticate.js +39 -0
  41. package/build/cjs/server/authenticate/public/factory.js +31 -0
  42. package/build/cjs/server/authenticate/webhooks/authenticate.js +96 -0
  43. package/build/cjs/server/authenticate/webhooks/register.js +53 -0
  44. package/build/cjs/server/boundary/error.js +18 -0
  45. package/build/cjs/server/boundary/headers.js +18 -0
  46. package/build/cjs/server/boundary/index.js +44 -0
  47. package/build/cjs/server/clients/admin/factory.js +27 -0
  48. package/build/cjs/server/clients/admin/graphql.js +47 -0
  49. package/build/cjs/server/clients/admin/rest.js +145 -0
  50. package/build/cjs/server/clients/storefront/factory.js +35 -0
  51. package/build/cjs/server/index.js +39 -0
  52. package/build/cjs/server/override-logger.js +55 -0
  53. package/build/cjs/server/shopify-app.js +143 -0
  54. package/build/cjs/server/types.js +26 -0
  55. package/build/cjs/server/unauthenticated/admin/factory.js +25 -0
  56. package/build/cjs/server/unauthenticated/helpers/get-offline-session.js +14 -0
  57. package/build/cjs/server/unauthenticated/storefront/factory.js +25 -0
  58. package/build/cjs/server/version.js +7 -0
  59. package/build/ts/react/components/AppProvider/AppProvider.d.ts +90 -0
  60. package/build/ts/react/components/AppProvider/AppProvider.d.ts.map +1 -0
  61. package/build/ts/react/components/AppProvider/AppProvider.doc.d.ts +4 -0
  62. package/build/ts/react/components/AppProvider/AppProvider.doc.d.ts.map +1 -0
  63. package/build/ts/react/components/AppProvider/AppProvider.doc.js +34 -0
  64. package/build/ts/react/components/AppProvider/AppProvider.doc.js.map +1 -0
  65. package/build/ts/react/components/AppProvider/AppProvider.js +76 -0
  66. package/build/ts/react/components/AppProvider/AppProvider.js.map +1 -0
  67. package/build/ts/react/components/AppProvider/index.d.ts +2 -0
  68. package/build/ts/react/components/AppProvider/index.d.ts.map +1 -0
  69. package/build/ts/react/components/AppProvider/index.js +5 -0
  70. package/build/ts/react/components/AppProvider/index.js.map +1 -0
  71. package/build/ts/react/components/RemixPolarisLink.d.ts +3 -0
  72. package/build/ts/react/components/RemixPolarisLink.d.ts.map +1 -0
  73. package/build/ts/react/components/RemixPolarisLink.js +12 -0
  74. package/build/ts/react/components/RemixPolarisLink.js.map +1 -0
  75. package/build/ts/react/components/index.d.ts +2 -0
  76. package/build/ts/react/components/index.d.ts.map +1 -0
  77. package/build/ts/react/components/index.js +5 -0
  78. package/build/ts/react/components/index.js.map +1 -0
  79. package/build/ts/react/const.d.ts +2 -0
  80. package/build/ts/react/const.d.ts.map +1 -0
  81. package/build/ts/react/const.js +5 -0
  82. package/build/ts/react/const.js.map +1 -0
  83. package/build/ts/react/index.d.ts +2 -0
  84. package/build/ts/react/index.d.ts.map +1 -0
  85. package/build/ts/react/index.js +5 -0
  86. package/build/ts/react/index.js.map +1 -0
  87. package/build/ts/server/__test-helpers/const.d.ts +9 -0
  88. package/build/ts/server/__test-helpers/const.d.ts.map +1 -0
  89. package/build/ts/server/__test-helpers/const.js +13 -0
  90. package/build/ts/server/__test-helpers/const.js.map +1 -0
  91. package/build/ts/server/__test-helpers/expect-admin-api-client.d.ts +8 -0
  92. package/build/ts/server/__test-helpers/expect-admin-api-client.d.ts.map +1 -0
  93. package/build/ts/server/__test-helpers/expect-admin-api-client.js +165 -0
  94. package/build/ts/server/__test-helpers/expect-admin-api-client.js.map +1 -0
  95. package/build/ts/server/__test-helpers/expect-begin-auth-redirect.d.ts +3 -0
  96. package/build/ts/server/__test-helpers/expect-begin-auth-redirect.d.ts.map +1 -0
  97. package/build/ts/server/__test-helpers/expect-begin-auth-redirect.js +16 -0
  98. package/build/ts/server/__test-helpers/expect-begin-auth-redirect.js.map +1 -0
  99. package/build/ts/server/__test-helpers/expect-document-request-headers.d.ts +2 -0
  100. package/build/ts/server/__test-helpers/expect-document-request-headers.d.ts.map +1 -0
  101. package/build/ts/server/__test-helpers/expect-document-request-headers.js +18 -0
  102. package/build/ts/server/__test-helpers/expect-document-request-headers.js.map +1 -0
  103. package/build/ts/server/__test-helpers/expect-exit-iframe.d.ts +8 -0
  104. package/build/ts/server/__test-helpers/expect-exit-iframe.d.ts.map +1 -0
  105. package/build/ts/server/__test-helpers/expect-exit-iframe.js +17 -0
  106. package/build/ts/server/__test-helpers/expect-exit-iframe.js.map +1 -0
  107. package/build/ts/server/__test-helpers/expect-login-redirect.d.ts +2 -0
  108. package/build/ts/server/__test-helpers/expect-login-redirect.d.ts.map +1 -0
  109. package/build/ts/server/__test-helpers/expect-login-redirect.js +11 -0
  110. package/build/ts/server/__test-helpers/expect-login-redirect.js.map +1 -0
  111. package/build/ts/server/__test-helpers/expect-storefront-api-client.d.ts +8 -0
  112. package/build/ts/server/__test-helpers/expect-storefront-api-client.d.ts.map +1 -0
  113. package/build/ts/server/__test-helpers/expect-storefront-api-client.js +57 -0
  114. package/build/ts/server/__test-helpers/expect-storefront-api-client.js.map +1 -0
  115. package/build/ts/server/__test-helpers/get-hmac.d.ts +2 -0
  116. package/build/ts/server/__test-helpers/get-hmac.d.ts.map +1 -0
  117. package/build/ts/server/__test-helpers/get-hmac.js +14 -0
  118. package/build/ts/server/__test-helpers/get-hmac.js.map +1 -0
  119. package/build/ts/server/__test-helpers/get-jwt.d.ts +8 -0
  120. package/build/ts/server/__test-helpers/get-jwt.d.ts.map +1 -0
  121. package/build/ts/server/__test-helpers/get-jwt.js +17 -0
  122. package/build/ts/server/__test-helpers/get-jwt.js.map +1 -0
  123. package/build/ts/server/__test-helpers/get-thrown-response.d.ts +2 -0
  124. package/build/ts/server/__test-helpers/get-thrown-response.d.ts.map +1 -0
  125. package/build/ts/server/__test-helpers/get-thrown-response.js +28 -0
  126. package/build/ts/server/__test-helpers/get-thrown-response.js.map +1 -0
  127. package/build/ts/server/__test-helpers/index.d.ts +17 -0
  128. package/build/ts/server/__test-helpers/index.d.ts.map +1 -0
  129. package/build/ts/server/__test-helpers/index.js +20 -0
  130. package/build/ts/server/__test-helpers/index.js.map +1 -0
  131. package/build/ts/server/__test-helpers/request-mock.d.ts +10 -0
  132. package/build/ts/server/__test-helpers/request-mock.d.ts.map +1 -0
  133. package/build/ts/server/__test-helpers/request-mock.js +192 -0
  134. package/build/ts/server/__test-helpers/request-mock.js.map +1 -0
  135. package/build/ts/server/__test-helpers/setup-valid-session.d.ts +4 -0
  136. package/build/ts/server/__test-helpers/setup-valid-session.d.ts.map +1 -0
  137. package/build/ts/server/__test-helpers/setup-valid-session.js +45 -0
  138. package/build/ts/server/__test-helpers/setup-valid-session.js.map +1 -0
  139. package/build/ts/server/__test-helpers/sign-request-cookie.d.ts +6 -0
  140. package/build/ts/server/__test-helpers/sign-request-cookie.d.ts.map +1 -0
  141. package/build/ts/server/__test-helpers/sign-request-cookie.js +14 -0
  142. package/build/ts/server/__test-helpers/sign-request-cookie.js.map +1 -0
  143. package/build/ts/server/__test-helpers/test-config.d.ts +42 -0
  144. package/build/ts/server/__test-helpers/test-config.d.ts.map +1 -0
  145. package/build/ts/server/__test-helpers/test-config.js +45 -0
  146. package/build/ts/server/__test-helpers/test-config.js.map +1 -0
  147. package/build/ts/server/adapters/node/index.d.ts +2 -0
  148. package/build/ts/server/adapters/node/index.d.ts.map +1 -0
  149. package/build/ts/server/adapters/node/index.js +16 -0
  150. package/build/ts/server/adapters/node/index.js.map +1 -0
  151. package/build/ts/server/authenticate/admin/authenticate.admin.doc.d.ts +4 -0
  152. package/build/ts/server/authenticate/admin/authenticate.admin.doc.d.ts.map +1 -0
  153. package/build/ts/server/authenticate/admin/authenticate.admin.doc.js +35 -0
  154. package/build/ts/server/authenticate/admin/authenticate.admin.doc.js.map +1 -0
  155. package/build/ts/server/authenticate/admin/authenticate.d.ts +11 -0
  156. package/build/ts/server/authenticate/admin/authenticate.d.ts.map +1 -0
  157. package/build/ts/server/authenticate/admin/authenticate.js +169 -0
  158. package/build/ts/server/authenticate/admin/authenticate.js.map +1 -0
  159. package/build/ts/server/authenticate/admin/billing/authenticate.admin.billing.doc.d.ts +4 -0
  160. package/build/ts/server/authenticate/admin/billing/authenticate.admin.billing.doc.d.ts.map +1 -0
  161. package/build/ts/server/authenticate/admin/billing/authenticate.admin.billing.doc.js +26 -0
  162. package/build/ts/server/authenticate/admin/billing/authenticate.admin.billing.doc.js.map +1 -0
  163. package/build/ts/server/authenticate/admin/billing/cancel.d.ts +5 -0
  164. package/build/ts/server/authenticate/admin/billing/cancel.d.ts.map +1 -0
  165. package/build/ts/server/authenticate/admin/billing/cancel.js +43 -0
  166. package/build/ts/server/authenticate/admin/billing/cancel.js.map +1 -0
  167. package/build/ts/server/authenticate/admin/billing/index.d.ts +4 -0
  168. package/build/ts/server/authenticate/admin/billing/index.d.ts.map +1 -0
  169. package/build/ts/server/authenticate/admin/billing/index.js +10 -0
  170. package/build/ts/server/authenticate/admin/billing/index.js.map +1 -0
  171. package/build/ts/server/authenticate/admin/billing/request.d.ts +6 -0
  172. package/build/ts/server/authenticate/admin/billing/request.d.ts.map +1 -0
  173. package/build/ts/server/authenticate/admin/billing/request.js +77 -0
  174. package/build/ts/server/authenticate/admin/billing/request.js.map +1 -0
  175. package/build/ts/server/authenticate/admin/billing/require.d.ts +6 -0
  176. package/build/ts/server/authenticate/admin/billing/require.d.ts.map +1 -0
  177. package/build/ts/server/authenticate/admin/billing/require.js +55 -0
  178. package/build/ts/server/authenticate/admin/billing/require.js.map +1 -0
  179. package/build/ts/server/authenticate/admin/billing/types.d.ts +252 -0
  180. package/build/ts/server/authenticate/admin/billing/types.d.ts.map +1 -0
  181. package/build/ts/server/authenticate/admin/billing/types.js +3 -0
  182. package/build/ts/server/authenticate/admin/billing/types.js.map +1 -0
  183. package/build/ts/server/authenticate/admin/helpers/begin-auth.d.ts +3 -0
  184. package/build/ts/server/authenticate/admin/helpers/begin-auth.d.ts.map +1 -0
  185. package/build/ts/server/authenticate/admin/helpers/begin-auth.js +24 -0
  186. package/build/ts/server/authenticate/admin/helpers/begin-auth.js.map +1 -0
  187. package/build/ts/server/authenticate/admin/helpers/create-admin-api-context.d.ts +5 -0
  188. package/build/ts/server/authenticate/admin/helpers/create-admin-api-context.d.ts.map +1 -0
  189. package/build/ts/server/authenticate/admin/helpers/create-admin-api-context.js +16 -0
  190. package/build/ts/server/authenticate/admin/helpers/create-admin-api-context.js.map +1 -0
  191. package/build/ts/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.d.ts +3 -0
  192. package/build/ts/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.d.ts.map +1 -0
  193. package/build/ts/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.js +25 -0
  194. package/build/ts/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.js.map +1 -0
  195. package/build/ts/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.d.ts +3 -0
  196. package/build/ts/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.d.ts.map +1 -0
  197. package/build/ts/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.js +23 -0
  198. package/build/ts/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.js.map +1 -0
  199. package/build/ts/server/authenticate/admin/helpers/handle-client-error.d.ts +7 -0
  200. package/build/ts/server/authenticate/admin/helpers/handle-client-error.d.ts.map +1 -0
  201. package/build/ts/server/authenticate/admin/helpers/handle-client-error.js +41 -0
  202. package/build/ts/server/authenticate/admin/helpers/handle-client-error.js.map +1 -0
  203. package/build/ts/server/authenticate/admin/helpers/index.d.ts +15 -0
  204. package/build/ts/server/authenticate/admin/helpers/index.d.ts.map +1 -0
  205. package/build/ts/server/authenticate/admin/helpers/index.js +18 -0
  206. package/build/ts/server/authenticate/admin/helpers/index.js.map +1 -0
  207. package/build/ts/server/authenticate/admin/helpers/redirect-to-auth-page.d.ts +3 -0
  208. package/build/ts/server/authenticate/admin/helpers/redirect-to-auth-page.d.ts.map +1 -0
  209. package/build/ts/server/authenticate/admin/helpers/redirect-to-auth-page.js +36 -0
  210. package/build/ts/server/authenticate/admin/helpers/redirect-to-auth-page.js.map +1 -0
  211. package/build/ts/server/authenticate/admin/helpers/redirect-to-bounce-page.d.ts +3 -0
  212. package/build/ts/server/authenticate/admin/helpers/redirect-to-bounce-page.d.ts.map +1 -0
  213. package/build/ts/server/authenticate/admin/helpers/redirect-to-bounce-page.js +18 -0
  214. package/build/ts/server/authenticate/admin/helpers/redirect-to-bounce-page.js.map +1 -0
  215. package/build/ts/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.d.ts +3 -0
  216. package/build/ts/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.d.ts.map +1 -0
  217. package/build/ts/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.js +32 -0
  218. package/build/ts/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.js.map +1 -0
  219. package/build/ts/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.d.ts +3 -0
  220. package/build/ts/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.d.ts.map +1 -0
  221. package/build/ts/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.js +18 -0
  222. package/build/ts/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.js.map +1 -0
  223. package/build/ts/server/authenticate/admin/helpers/redirect-with-exitiframe.d.ts +3 -0
  224. package/build/ts/server/authenticate/admin/helpers/redirect-with-exitiframe.d.ts.map +1 -0
  225. package/build/ts/server/authenticate/admin/helpers/redirect-with-exitiframe.js +18 -0
  226. package/build/ts/server/authenticate/admin/helpers/redirect-with-exitiframe.js.map +1 -0
  227. package/build/ts/server/authenticate/admin/helpers/redirect.d.ts +9 -0
  228. package/build/ts/server/authenticate/admin/helpers/redirect.d.ts.map +1 -0
  229. package/build/ts/server/authenticate/admin/helpers/redirect.js +64 -0
  230. package/build/ts/server/authenticate/admin/helpers/redirect.js.map +1 -0
  231. package/build/ts/server/authenticate/admin/helpers/render-app-bridge.d.ts +8 -0
  232. package/build/ts/server/authenticate/admin/helpers/render-app-bridge.d.ts.map +1 -0
  233. package/build/ts/server/authenticate/admin/helpers/render-app-bridge.js +22 -0
  234. package/build/ts/server/authenticate/admin/helpers/render-app-bridge.js.map +1 -0
  235. package/build/ts/server/authenticate/admin/helpers/trigger-after-auth-hook.d.ts +4 -0
  236. package/build/ts/server/authenticate/admin/helpers/trigger-after-auth-hook.d.ts.map +1 -0
  237. package/build/ts/server/authenticate/admin/helpers/trigger-after-auth-hook.js +28 -0
  238. package/build/ts/server/authenticate/admin/helpers/trigger-after-auth-hook.js.map +1 -0
  239. package/build/ts/server/authenticate/admin/helpers/validate-shop-and-host-params.d.ts +3 -0
  240. package/build/ts/server/authenticate/admin/helpers/validate-shop-and-host-params.d.ts.map +1 -0
  241. package/build/ts/server/authenticate/admin/helpers/validate-shop-and-host-params.js +26 -0
  242. package/build/ts/server/authenticate/admin/helpers/validate-shop-and-host-params.js.map +1 -0
  243. package/build/ts/server/authenticate/admin/strategies/auth-code-flow.d.ts +22 -0
  244. package/build/ts/server/authenticate/admin/strategies/auth-code-flow.d.ts.map +1 -0
  245. package/build/ts/server/authenticate/admin/strategies/auth-code-flow.js +324 -0
  246. package/build/ts/server/authenticate/admin/strategies/auth-code-flow.js.map +1 -0
  247. package/build/ts/server/authenticate/admin/strategies/token-exchange.d.ts +15 -0
  248. package/build/ts/server/authenticate/admin/strategies/token-exchange.d.ts.map +1 -0
  249. package/build/ts/server/authenticate/admin/strategies/token-exchange.js +136 -0
  250. package/build/ts/server/authenticate/admin/strategies/token-exchange.js.map +1 -0
  251. package/build/ts/server/authenticate/admin/strategies/types.d.ts +17 -0
  252. package/build/ts/server/authenticate/admin/strategies/types.d.ts.map +1 -0
  253. package/build/ts/server/authenticate/admin/strategies/types.js +3 -0
  254. package/build/ts/server/authenticate/admin/strategies/types.js.map +1 -0
  255. package/build/ts/server/authenticate/admin/types.d.ts +175 -0
  256. package/build/ts/server/authenticate/admin/types.d.ts.map +1 -0
  257. package/build/ts/server/authenticate/admin/types.js +3 -0
  258. package/build/ts/server/authenticate/admin/types.js.map +1 -0
  259. package/build/ts/server/authenticate/const.d.ts +8 -0
  260. package/build/ts/server/authenticate/const.d.ts.map +1 -0
  261. package/build/ts/server/authenticate/const.js +11 -0
  262. package/build/ts/server/authenticate/const.js.map +1 -0
  263. package/build/ts/server/authenticate/helpers/add-response-headers.d.ts +5 -0
  264. package/build/ts/server/authenticate/helpers/add-response-headers.d.ts.map +1 -0
  265. package/build/ts/server/authenticate/helpers/add-response-headers.js +27 -0
  266. package/build/ts/server/authenticate/helpers/add-response-headers.js.map +1 -0
  267. package/build/ts/server/authenticate/helpers/app-bridge-url.d.ts +3 -0
  268. package/build/ts/server/authenticate/helpers/app-bridge-url.d.ts.map +1 -0
  269. package/build/ts/server/authenticate/helpers/app-bridge-url.js +14 -0
  270. package/build/ts/server/authenticate/helpers/app-bridge-url.js.map +1 -0
  271. package/build/ts/server/authenticate/helpers/ensure-cors-headers.d.ts +6 -0
  272. package/build/ts/server/authenticate/helpers/ensure-cors-headers.d.ts.map +1 -0
  273. package/build/ts/server/authenticate/helpers/ensure-cors-headers.js +25 -0
  274. package/build/ts/server/authenticate/helpers/ensure-cors-headers.js.map +1 -0
  275. package/build/ts/server/authenticate/helpers/get-session-token-header.d.ts +3 -0
  276. package/build/ts/server/authenticate/helpers/get-session-token-header.d.ts.map +1 -0
  277. package/build/ts/server/authenticate/helpers/get-session-token-header.js +15 -0
  278. package/build/ts/server/authenticate/helpers/get-session-token-header.js.map +1 -0
  279. package/build/ts/server/authenticate/helpers/idempotent-promise-handler.d.ts +11 -0
  280. package/build/ts/server/authenticate/helpers/idempotent-promise-handler.d.ts.map +1 -0
  281. package/build/ts/server/authenticate/helpers/idempotent-promise-handler.js +37 -0
  282. package/build/ts/server/authenticate/helpers/idempotent-promise-handler.js.map +1 -0
  283. package/build/ts/server/authenticate/helpers/index.d.ts +9 -0
  284. package/build/ts/server/authenticate/helpers/index.d.ts.map +1 -0
  285. package/build/ts/server/authenticate/helpers/index.js +12 -0
  286. package/build/ts/server/authenticate/helpers/index.js.map +1 -0
  287. package/build/ts/server/authenticate/helpers/reject-bot-request.d.ts +3 -0
  288. package/build/ts/server/authenticate/helpers/reject-bot-request.d.ts.map +1 -0
  289. package/build/ts/server/authenticate/helpers/reject-bot-request.js +14 -0
  290. package/build/ts/server/authenticate/helpers/reject-bot-request.js.map +1 -0
  291. package/build/ts/server/authenticate/helpers/respond-to-invalid-session-token.d.ts +3 -0
  292. package/build/ts/server/authenticate/helpers/respond-to-invalid-session-token.d.ts.map +1 -0
  293. package/build/ts/server/authenticate/helpers/respond-to-invalid-session-token.js +19 -0
  294. package/build/ts/server/authenticate/helpers/respond-to-invalid-session-token.js.map +1 -0
  295. package/build/ts/server/authenticate/helpers/respond-to-options-request.d.ts +3 -0
  296. package/build/ts/server/authenticate/helpers/respond-to-options-request.d.ts.map +1 -0
  297. package/build/ts/server/authenticate/helpers/respond-to-options-request.js +17 -0
  298. package/build/ts/server/authenticate/helpers/respond-to-options-request.js.map +1 -0
  299. package/build/ts/server/authenticate/helpers/validate-session-token.d.ts +8 -0
  300. package/build/ts/server/authenticate/helpers/validate-session-token.d.ts.map +1 -0
  301. package/build/ts/server/authenticate/helpers/validate-session-token.js +39 -0
  302. package/build/ts/server/authenticate/helpers/validate-session-token.js.map +1 -0
  303. package/build/ts/server/authenticate/login/login.d.ts +3 -0
  304. package/build/ts/server/authenticate/login/login.d.ts.map +1 -0
  305. package/build/ts/server/authenticate/login/login.js +54 -0
  306. package/build/ts/server/authenticate/login/login.js.map +1 -0
  307. package/build/ts/server/authenticate/public/appProxy/authenticate.d.ts +5 -0
  308. package/build/ts/server/authenticate/public/appProxy/authenticate.d.ts.map +1 -0
  309. package/build/ts/server/authenticate/public/appProxy/authenticate.js +81 -0
  310. package/build/ts/server/authenticate/public/appProxy/authenticate.js.map +1 -0
  311. package/build/ts/server/authenticate/public/appProxy/authenticate.public.app-proxy.doc.d.ts +4 -0
  312. package/build/ts/server/authenticate/public/appProxy/authenticate.public.app-proxy.doc.d.ts.map +1 -0
  313. package/build/ts/server/authenticate/public/appProxy/authenticate.public.app-proxy.doc.js +32 -0
  314. package/build/ts/server/authenticate/public/appProxy/authenticate.public.app-proxy.doc.js.map +1 -0
  315. package/build/ts/server/authenticate/public/appProxy/types.d.ts +129 -0
  316. package/build/ts/server/authenticate/public/appProxy/types.d.ts.map +1 -0
  317. package/build/ts/server/authenticate/public/appProxy/types.js +3 -0
  318. package/build/ts/server/authenticate/public/appProxy/types.js.map +1 -0
  319. package/build/ts/server/authenticate/public/checkout/authenticate.d.ts +4 -0
  320. package/build/ts/server/authenticate/public/checkout/authenticate.d.ts.map +1 -0
  321. package/build/ts/server/authenticate/public/checkout/authenticate.js +42 -0
  322. package/build/ts/server/authenticate/public/checkout/authenticate.js.map +1 -0
  323. package/build/ts/server/authenticate/public/checkout/authenticate.public.checkout.doc.d.ts +4 -0
  324. package/build/ts/server/authenticate/public/checkout/authenticate.public.checkout.doc.d.ts.map +1 -0
  325. package/build/ts/server/authenticate/public/checkout/authenticate.public.checkout.doc.js +21 -0
  326. package/build/ts/server/authenticate/public/checkout/authenticate.public.checkout.doc.js.map +1 -0
  327. package/build/ts/server/authenticate/public/checkout/types.d.ts +58 -0
  328. package/build/ts/server/authenticate/public/checkout/types.d.ts.map +1 -0
  329. package/build/ts/server/authenticate/public/checkout/types.js +3 -0
  330. package/build/ts/server/authenticate/public/checkout/types.js.map +1 -0
  331. package/build/ts/server/authenticate/public/factory.d.ts +6 -0
  332. package/build/ts/server/authenticate/public/factory.d.ts.map +1 -0
  333. package/build/ts/server/authenticate/public/factory.js +26 -0
  334. package/build/ts/server/authenticate/public/factory.js.map +1 -0
  335. package/build/ts/server/authenticate/public/index.d.ts +2 -0
  336. package/build/ts/server/authenticate/public/index.d.ts.map +1 -0
  337. package/build/ts/server/authenticate/public/index.js +5 -0
  338. package/build/ts/server/authenticate/public/index.js.map +1 -0
  339. package/build/ts/server/authenticate/public/types.d.ts +64 -0
  340. package/build/ts/server/authenticate/public/types.d.ts.map +1 -0
  341. package/build/ts/server/authenticate/public/types.js +3 -0
  342. package/build/ts/server/authenticate/public/types.js.map +1 -0
  343. package/build/ts/server/authenticate/webhooks/authenticate.d.ts +6 -0
  344. package/build/ts/server/authenticate/webhooks/authenticate.d.ts.map +1 -0
  345. package/build/ts/server/authenticate/webhooks/authenticate.js +93 -0
  346. package/build/ts/server/authenticate/webhooks/authenticate.js.map +1 -0
  347. package/build/ts/server/authenticate/webhooks/authenticate.webhooks.doc.d.ts +4 -0
  348. package/build/ts/server/authenticate/webhooks/authenticate.webhooks.doc.d.ts.map +1 -0
  349. package/build/ts/server/authenticate/webhooks/authenticate.webhooks.doc.js +27 -0
  350. package/build/ts/server/authenticate/webhooks/authenticate.webhooks.doc.js.map +1 -0
  351. package/build/ts/server/authenticate/webhooks/index.d.ts +2 -0
  352. package/build/ts/server/authenticate/webhooks/index.d.ts.map +1 -0
  353. package/build/ts/server/authenticate/webhooks/index.js +6 -0
  354. package/build/ts/server/authenticate/webhooks/index.js.map +1 -0
  355. package/build/ts/server/authenticate/webhooks/register.d.ts +4 -0
  356. package/build/ts/server/authenticate/webhooks/register.d.ts.map +1 -0
  357. package/build/ts/server/authenticate/webhooks/register.js +53 -0
  358. package/build/ts/server/authenticate/webhooks/register.js.map +1 -0
  359. package/build/ts/server/authenticate/webhooks/types.d.ts +189 -0
  360. package/build/ts/server/authenticate/webhooks/types.d.ts.map +1 -0
  361. package/build/ts/server/authenticate/webhooks/types.js +3 -0
  362. package/build/ts/server/authenticate/webhooks/types.js.map +1 -0
  363. package/build/ts/server/boundary/error.d.ts +2 -0
  364. package/build/ts/server/boundary/error.d.ts.map +1 -0
  365. package/build/ts/server/boundary/error.js +13 -0
  366. package/build/ts/server/boundary/error.js.map +1 -0
  367. package/build/ts/server/boundary/headers.d.ts +3 -0
  368. package/build/ts/server/boundary/headers.d.ts.map +1 -0
  369. package/build/ts/server/boundary/headers.js +13 -0
  370. package/build/ts/server/boundary/headers.js.map +1 -0
  371. package/build/ts/server/boundary/index.d.ts +38 -0
  372. package/build/ts/server/boundary/index.d.ts.map +1 -0
  373. package/build/ts/server/boundary/index.js +41 -0
  374. package/build/ts/server/boundary/index.js.map +1 -0
  375. package/build/ts/server/boundary/types.d.ts +4 -0
  376. package/build/ts/server/boundary/types.d.ts.map +1 -0
  377. package/build/ts/server/boundary/types.js +3 -0
  378. package/build/ts/server/boundary/types.js.map +1 -0
  379. package/build/ts/server/clients/admin/authenticate.admin.api.doc.d.ts +4 -0
  380. package/build/ts/server/clients/admin/authenticate.admin.api.doc.d.ts.map +1 -0
  381. package/build/ts/server/clients/admin/authenticate.admin.api.doc.js +32 -0
  382. package/build/ts/server/clients/admin/authenticate.admin.api.doc.js.map +1 -0
  383. package/build/ts/server/clients/admin/factory.d.ts +11 -0
  384. package/build/ts/server/clients/admin/factory.d.ts.map +1 -0
  385. package/build/ts/server/clients/admin/factory.js +18 -0
  386. package/build/ts/server/clients/admin/factory.js.map +1 -0
  387. package/build/ts/server/clients/admin/graphql.d.ts +5 -0
  388. package/build/ts/server/clients/admin/graphql.d.ts.map +1 -0
  389. package/build/ts/server/clients/admin/graphql.js +48 -0
  390. package/build/ts/server/clients/admin/graphql.js.map +1 -0
  391. package/build/ts/server/clients/admin/index.d.ts +3 -0
  392. package/build/ts/server/clients/admin/index.d.ts.map +1 -0
  393. package/build/ts/server/clients/admin/index.js +6 -0
  394. package/build/ts/server/clients/admin/index.js.map +1 -0
  395. package/build/ts/server/clients/admin/rest.d.ts +31 -0
  396. package/build/ts/server/clients/admin/rest.d.ts.map +1 -0
  397. package/build/ts/server/clients/admin/rest.js +165 -0
  398. package/build/ts/server/clients/admin/rest.js.map +1 -0
  399. package/build/ts/server/clients/admin/types.d.ts +158 -0
  400. package/build/ts/server/clients/admin/types.d.ts.map +1 -0
  401. package/build/ts/server/clients/admin/types.js +3 -0
  402. package/build/ts/server/clients/admin/types.js.map +1 -0
  403. package/build/ts/server/clients/index.d.ts +3 -0
  404. package/build/ts/server/clients/index.d.ts.map +1 -0
  405. package/build/ts/server/clients/index.js +6 -0
  406. package/build/ts/server/clients/index.js.map +1 -0
  407. package/build/ts/server/clients/storefront/authenticate.storefront.api.doc.d.ts +4 -0
  408. package/build/ts/server/clients/storefront/authenticate.storefront.api.doc.d.ts.map +1 -0
  409. package/build/ts/server/clients/storefront/authenticate.storefront.api.doc.js +32 -0
  410. package/build/ts/server/clients/storefront/authenticate.storefront.api.doc.js.map +1 -0
  411. package/build/ts/server/clients/storefront/factory.d.ts +8 -0
  412. package/build/ts/server/clients/storefront/factory.d.ts.map +1 -0
  413. package/build/ts/server/clients/storefront/factory.js +39 -0
  414. package/build/ts/server/clients/storefront/factory.js.map +1 -0
  415. package/build/ts/server/clients/storefront/index.d.ts +3 -0
  416. package/build/ts/server/clients/storefront/index.d.ts.map +1 -0
  417. package/build/ts/server/clients/storefront/index.js +6 -0
  418. package/build/ts/server/clients/storefront/index.js.map +1 -0
  419. package/build/ts/server/clients/storefront/types.d.ts +29 -0
  420. package/build/ts/server/clients/storefront/types.d.ts.map +1 -0
  421. package/build/ts/server/clients/storefront/types.js +3 -0
  422. package/build/ts/server/clients/storefront/types.js.map +1 -0
  423. package/build/ts/server/clients/types.d.ts +15 -0
  424. package/build/ts/server/clients/types.d.ts.map +1 -0
  425. package/build/ts/server/clients/types.js +3 -0
  426. package/build/ts/server/clients/types.js.map +1 -0
  427. package/build/ts/server/config-types.d.ts +255 -0
  428. package/build/ts/server/config-types.d.ts.map +1 -0
  429. package/build/ts/server/config-types.js +3 -0
  430. package/build/ts/server/config-types.js.map +1 -0
  431. package/build/ts/server/future/flags.d.ts +23 -0
  432. package/build/ts/server/future/flags.d.ts.map +1 -0
  433. package/build/ts/server/future/flags.js +3 -0
  434. package/build/ts/server/future/flags.js.map +1 -0
  435. package/build/ts/server/index.d.ts +7 -0
  436. package/build/ts/server/index.d.ts.map +1 -0
  437. package/build/ts/server/index.js +22 -0
  438. package/build/ts/server/index.js.map +1 -0
  439. package/build/ts/server/override-logger.d.ts +3 -0
  440. package/build/ts/server/override-logger.d.ts.map +1 -0
  441. package/build/ts/server/override-logger.js +40 -0
  442. package/build/ts/server/override-logger.js.map +1 -0
  443. package/build/ts/server/shopify-app.d.ts +27 -0
  444. package/build/ts/server/shopify-app.d.ts.map +1 -0
  445. package/build/ts/server/shopify-app.doc.d.ts +4 -0
  446. package/build/ts/server/shopify-app.doc.d.ts.map +1 -0
  447. package/build/ts/server/shopify-app.doc.js +42 -0
  448. package/build/ts/server/shopify-app.doc.js.map +1 -0
  449. package/build/ts/server/shopify-app.js +117 -0
  450. package/build/ts/server/shopify-app.js.map +1 -0
  451. package/build/ts/server/types.d.ts +391 -0
  452. package/build/ts/server/types.d.ts.map +1 -0
  453. package/build/ts/server/types.js +17 -0
  454. package/build/ts/server/types.js.map +1 -0
  455. package/build/ts/server/unauthenticated/admin/factory.d.ts +5 -0
  456. package/build/ts/server/unauthenticated/admin/factory.d.ts.map +1 -0
  457. package/build/ts/server/unauthenticated/admin/factory.js +29 -0
  458. package/build/ts/server/unauthenticated/admin/factory.js.map +1 -0
  459. package/build/ts/server/unauthenticated/admin/index.d.ts +2 -0
  460. package/build/ts/server/unauthenticated/admin/index.d.ts.map +1 -0
  461. package/build/ts/server/unauthenticated/admin/index.js +5 -0
  462. package/build/ts/server/unauthenticated/admin/index.js.map +1 -0
  463. package/build/ts/server/unauthenticated/admin/types.d.ts +34 -0
  464. package/build/ts/server/unauthenticated/admin/types.d.ts.map +1 -0
  465. package/build/ts/server/unauthenticated/admin/types.js +3 -0
  466. package/build/ts/server/unauthenticated/admin/types.js.map +1 -0
  467. package/build/ts/server/unauthenticated/admin/unauthenticated.admin.doc.d.ts +4 -0
  468. package/build/ts/server/unauthenticated/admin/unauthenticated.admin.doc.d.ts.map +1 -0
  469. package/build/ts/server/unauthenticated/admin/unauthenticated.admin.doc.js +29 -0
  470. package/build/ts/server/unauthenticated/admin/unauthenticated.admin.doc.js.map +1 -0
  471. package/build/ts/server/unauthenticated/helpers/get-offline-session.d.ts +4 -0
  472. package/build/ts/server/unauthenticated/helpers/get-offline-session.d.ts.map +1 -0
  473. package/build/ts/server/unauthenticated/helpers/get-offline-session.js +22 -0
  474. package/build/ts/server/unauthenticated/helpers/get-offline-session.js.map +1 -0
  475. package/build/ts/server/unauthenticated/helpers/index.d.ts +2 -0
  476. package/build/ts/server/unauthenticated/helpers/index.d.ts.map +1 -0
  477. package/build/ts/server/unauthenticated/helpers/index.js +5 -0
  478. package/build/ts/server/unauthenticated/helpers/index.js.map +1 -0
  479. package/build/ts/server/unauthenticated/storefront/factory.d.ts +4 -0
  480. package/build/ts/server/unauthenticated/storefront/factory.d.ts.map +1 -0
  481. package/build/ts/server/unauthenticated/storefront/factory.js +29 -0
  482. package/build/ts/server/unauthenticated/storefront/factory.js.map +1 -0
  483. package/build/ts/server/unauthenticated/storefront/index.d.ts +2 -0
  484. package/build/ts/server/unauthenticated/storefront/index.d.ts.map +1 -0
  485. package/build/ts/server/unauthenticated/storefront/index.js +5 -0
  486. package/build/ts/server/unauthenticated/storefront/index.js.map +1 -0
  487. package/build/ts/server/unauthenticated/storefront/types.d.ts +34 -0
  488. package/build/ts/server/unauthenticated/storefront/types.d.ts.map +1 -0
  489. package/build/ts/server/unauthenticated/storefront/types.js +3 -0
  490. package/build/ts/server/unauthenticated/storefront/types.js.map +1 -0
  491. package/build/ts/server/unauthenticated/storefront/unauthenticated.storefront.doc.d.ts +4 -0
  492. package/build/ts/server/unauthenticated/storefront/unauthenticated.storefront.doc.d.ts.map +1 -0
  493. package/build/ts/server/unauthenticated/storefront/unauthenticated.storefront.doc.js +29 -0
  494. package/build/ts/server/unauthenticated/storefront/unauthenticated.storefront.doc.js.map +1 -0
  495. package/build/ts/server/unauthenticated/types.d.ts +66 -0
  496. package/build/ts/server/unauthenticated/types.d.ts.map +1 -0
  497. package/build/ts/server/unauthenticated/types.js +3 -0
  498. package/build/ts/server/unauthenticated/types.js.map +1 -0
  499. package/build/ts/server/version.d.ts +2 -0
  500. package/build/ts/server/version.d.ts.map +1 -0
  501. package/build/ts/server/version.js +5 -0
  502. package/build/ts/server/version.js.map +1 -0
  503. package/package.json +94 -0
package/LICENSE.md ADDED
@@ -0,0 +1,9 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022-present, Shopify Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,179 @@
1
+ # `@shopify/shopify-app-remix`
2
+
3
+ <!-- ![Build Status]() -->
4
+
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE.md)
6
+ [![npm version](https://badge.fury.io/js/%40shopify%2Fshopify-app-remix.svg)](https://badge.fury.io/js/%40shopify%2Fshopify-app-remix)
7
+
8
+ This package makes it easy to use [Remix](https://remix.run/) to build Shopify apps.
9
+ It builds on the `@shopify/shopify-api` package and exposes a `shopifyApp` function. You can use `shopifyApp` to configure your app and then authenticate requests from Shopify.
10
+
11
+ Visit the [`shopify.dev` documentation](https://shopify.dev/docs/api/shopify-app-remix) for more details on the Remix app package.
12
+
13
+ ## Requirements
14
+
15
+ To use this package, you will need to have:
16
+
17
+ - a Shopify Partner account and development store
18
+ - an app already set up on your partner account
19
+ - a JavaScript package manager such as [yarn](https://yarnpkg.com) installed
20
+
21
+ ## Getting started
22
+
23
+ ### Shopify CLI
24
+
25
+ The easiest way to get started with developing Shopify apps is using the [Shopify CLI](https://shopify.dev/docs/apps/tools/cli).
26
+ It helps you set up your environment for developing and publishing your apps and extensions.
27
+
28
+ We strongly recommend using the CLI to create and manage your Remix apps and extensions!
29
+ Refer to the [getting started documentation](https://shopify.dev/docs/apps/getting-started/create) to create your app using the Shopify CLI.
30
+
31
+ ### Using a plain Remix app
32
+
33
+ This package works with any Remix app. If you're starting an app from scratch, then you can create a brand new Remix app that uses the indie-stack:
34
+
35
+ ```bash
36
+ npx create-remix@latest --template remix-run/indie-stack
37
+ cd ./name-of-your-app
38
+ ```
39
+
40
+ Now let's install this package:
41
+
42
+ ```bash
43
+ npm install @shopify/shopify-app-remix
44
+ ```
45
+
46
+ Next, you'll need to set up some routes and headers so you can embed your app in the Shopify admin.
47
+ You can find more details on all the steps described here in the [package documentation](https://shopify.dev/docs/api/shopify-app-remix).
48
+
49
+ Create `app/shopify.server.js`. We will use this file to configure our Shopify app by calling the [`shopifyApp` function](https://shopify.dev/docs/api/shopify-app-remix/latest/entrypoints/shopifyapp):
50
+
51
+ ```ts
52
+ // app/shopify.server.js
53
+ // Note that you don't need to import the node adapter if you're running on a different runtime.
54
+ import '@shopify/shopify-app-remix/server/adapters/node';
55
+ // Memory storage makes it easy to set an app up, but should never be used in production.
56
+ import {MemorySessionStorage} from '@shopify/shopify-app-session-storage-memory';
57
+
58
+ import {LATEST_API_VERSION, shopifyApp} from '@shopify/shopify-app-remix';
59
+
60
+ const shopify = shopifyApp({
61
+ apiKey: process.env.SHOPIFY_API_KEY!,
62
+ apiSecretKey: process.env.SHOPIFY_API_SECRET!,
63
+ appUrl: process.env.SHOPIFY_APP_URL!,
64
+ scopes: ['read_products'],
65
+ apiVersion: LATEST_API_VERSION,
66
+ sessionStorage: new MemorySessionStorage(),
67
+ });
68
+ export default shopify;
69
+ ```
70
+
71
+ This will require some environment variables. So let's create an `.env` file:
72
+
73
+ ```env
74
+ SHOPIFY_API_KEY="[Copy from partners dashboard]"
75
+ SHOPIFY_API_SECRET="[Copy from partners dashboard]"
76
+ SHOPIFY_APP_URL="[The tunnel URL you are using to run your app]"
77
+ ```
78
+
79
+ `shopifyApp` needs to reserve a [splat route](https://remix.run/docs/en/main/guides/routing#splats) for auth.
80
+ It should export a loader that uses `shopifyApp` to authenticate:
81
+
82
+ ```ts
83
+ // app/routes/auth/$.tsx
84
+ import {LoaderFunctionArgs} from '@remix-run/node';
85
+
86
+ import shopify from '~/shopify.server';
87
+
88
+ export async function loader({request}: LoaderFunctionArgs) {
89
+ await shopify.authenticate.admin(request);
90
+
91
+ return null;
92
+ }
93
+ ```
94
+
95
+ Next, set up the [`AppProvider` component](https://shopify.dev/docs/api/shopify-app-remix/latest/entrypoints/appprovider) in your app's routes. To do this pass the `process.env.SHOPIFY_API_KEY` to the frontend via the loader.
96
+
97
+ Here is an example:
98
+
99
+ ```ts
100
+ // root.tsx
101
+ import {LoaderFunctionArgs} from '@remix-run/node';
102
+ import {AppProvider} from '@shopify/shopify-app-remix/react';
103
+
104
+ import shopify from '~/shopify.server';
105
+
106
+ export async function loader({request}: LoaderFunctionArgs) {
107
+ await shopify.authenticate.admin(request);
108
+
109
+ return json({
110
+ apiKey: process.env.SHOPIFY_API_KEY,
111
+ });
112
+ }
113
+
114
+ export default function App() {
115
+ const {apiKey} = useLoaderData<typeof loader>();
116
+
117
+ return (
118
+ <html>
119
+ <head>
120
+ <Meta />
121
+ <Links />
122
+ </head>
123
+ <body>
124
+ <AppProvider apiKey={apiKey} isEmbeddedApp>
125
+ <Outlet />
126
+ </AppProvider>
127
+ </body>
128
+ </html>
129
+ );
130
+ }
131
+ ```
132
+
133
+ This component will set up [Polaris](https://polaris.shopify.com/components/utilities/app-provider) and [App Bridge](https://shopify.dev/tools/app-bridge). If your app isn't embedded, set the `isEmbeddedApp` prop to `false`.
134
+
135
+ Now that your app is ready to respond to requests, it will also need to add the required `Content-Security-Policy` header directives, as per [our documentation](https://shopify.dev/docs/apps/store/security/iframe-protection).
136
+ To do that, this package provides the `shopify.addDocumentResponseHeaders` method.
137
+
138
+ You should return these headers from any endpoint that renders HTML in your app.
139
+ Most likely you'll want to add this to every HTML response by updating the entry.server.tsx file:
140
+
141
+ ```ts
142
+ // entry.server.tsx
143
+ import shopify from './shopify.server';
144
+
145
+ export default function handleRequest(
146
+ request: Request,
147
+ responseStatusCode: number,
148
+ responseHeaders: Headers,
149
+ remixContext: EntryContext,
150
+ ) {
151
+ shopify.addDocumentResponseHeaders(request, responseHeaders);
152
+
153
+ /// ..etc
154
+ }
155
+ ```
156
+
157
+ ### Running your app
158
+
159
+ To run your app and load it within the Shopify Admin, you need to:
160
+
161
+ 1. Update your app's URL in your Partners Dashboard app setup page to `http://localhost:8080`
162
+ 1. Update your app's callback URL to `http://localhost:8080/api/auth/callback` in that same page
163
+ 1. Go to **Test your app** in Partners Dashboard and select your development store
164
+
165
+ ## Next steps
166
+
167
+ Once your app is up and running, you can start using this package to interact with Shopify APIs, webhooks and more.
168
+
169
+ Here are some guides to help you set up your app:
170
+
171
+ - [Interacting with Shopify Admin](https://shopify.dev/docs/api/shopify-app-remix/latest/guide-admin)
172
+ - [Subscribing to webhooks](https://shopify.dev/docs/api/shopify-app-remix/latest/guide-webhooks)
173
+
174
+ You can also authenticate requests from surfaces other than the admin.
175
+ To see all supported methods, see [the `shopify.authenticate` object documentation](https://shopify.dev/docs/api/shopify-app-remix/latest/authenticate).
176
+
177
+ ## Gotchas / Troubleshooting
178
+
179
+ If you're experiencing unexpected behaviors when using this package, check our [app template's documentation](https://github.com/Shopify/shopify-app-template-remix#gotchas--troubleshooting) for the solution to common issues.
@@ -0,0 +1,98 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var polaris = require('@shopify/polaris');
6
+ var englishI18n = require('@shopify/polaris/locales/en.json');
7
+ var _const = require('../../const.js');
8
+ var RemixPolarisLink = require('../RemixPolarisLink.js');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+
11
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
+
13
+ var englishI18n__default = /*#__PURE__*/_interopDefaultLegacy(englishI18n);
14
+
15
+ /**
16
+ * Sets up the Polaris `AppProvider` and injects the App Bridge script.
17
+ *
18
+ * This component extends the [`AppProvider`](https://polaris.shopify.com/components/utilities/app-provider) component
19
+ * from Polaris, and accepts all of its props except for `linkComponent`, which is overridden to use the Remix `Link`
20
+ * component.
21
+ *
22
+ * {@link https://polaris.shopify.com/components/utilities/app-provider}
23
+ * {@link https://shopify.dev/tools/app-bridge}
24
+ *
25
+ * @example
26
+ * <caption>Set up AppProvider.</caption>
27
+ * <description>Wrap your app in the `AppProvider` component and pass in your API key.</description>
28
+ * ```ts
29
+ * import {authenticate} from '~/shopify.server';
30
+ * import {AppProvider} from '@shopify/shopify-app-remix/react';
31
+ *
32
+ * export async function loader({ request }) {
33
+ * await authenticate.admin(request);
34
+ *
35
+ * return json({ apiKey: process.env.SHOPIFY_API_KEY });
36
+ * }
37
+ *
38
+ * export default function App() {
39
+ * const { apiKey } = useLoaderData();
40
+ *
41
+ * return (
42
+ * <AppProvider isEmbeddedApp apiKey={apiKey}>
43
+ * <Outlet />
44
+ * </AppProvider>
45
+ * );
46
+ * }
47
+ * ```
48
+ *
49
+ * @example
50
+ * <caption>Localize Polaris components.</caption>
51
+ * <description>Pass in a different locale for Polaris to translate its components.</description>
52
+ * ```ts
53
+ * import {authenticate} from '~/shopify.server';
54
+ * import {AppProvider} from '@shopify/shopify-app-remix/react';
55
+ *
56
+ * export async function loader({ request }) {
57
+ * await authenticate.admin(request);
58
+ *
59
+ * return json({
60
+ * apiKey: process.env.SHOPIFY_API_KEY,
61
+ * polarisTranslations: require("@shopify/polaris/locales/fr.json"),
62
+ * });
63
+ * }
64
+ *
65
+ * export default function App() {
66
+ * const { apiKey, polarisTranslations } = useLoaderData();
67
+ *
68
+ * return (
69
+ * <AppProvider apiKey={apiKey} i18n={polarisTranslations}>
70
+ * <Outlet />
71
+ * </AppProvider>
72
+ * );
73
+ * }
74
+ * ```
75
+ */
76
+ function AppProvider(props) {
77
+ const {
78
+ children,
79
+ apiKey,
80
+ i18n,
81
+ isEmbeddedApp = true,
82
+ __APP_BRIDGE_URL = _const.APP_BRIDGE_URL,
83
+ ...polarisProps
84
+ } = props;
85
+ return /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
86
+ children: [isEmbeddedApp && /*#__PURE__*/jsxRuntime.jsx("script", {
87
+ src: __APP_BRIDGE_URL,
88
+ "data-api-key": apiKey
89
+ }), /*#__PURE__*/jsxRuntime.jsx(polaris.AppProvider, {
90
+ ...polarisProps,
91
+ linkComponent: RemixPolarisLink.RemixPolarisLink,
92
+ i18n: i18n || englishI18n__default["default"],
93
+ children: children
94
+ })]
95
+ });
96
+ }
97
+
98
+ exports.AppProvider = AppProvider;
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+ var react = require('@remix-run/react');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
10
+
11
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
12
+
13
+ const RemixPolarisLink = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
14
+ var _props$url;
15
+ return /*#__PURE__*/jsxRuntime.jsx(react.Link, {
16
+ ...props,
17
+ to: (_props$url = props.url) !== null && _props$url !== void 0 ? _props$url : props.to,
18
+ ref: ref
19
+ });
20
+ });
21
+
22
+ exports.RemixPolarisLink = RemixPolarisLink;
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const APP_BRIDGE_URL = 'https://cdn.shopify.com/shopifycloud/app-bridge.js';
6
+
7
+ exports.APP_BRIDGE_URL = APP_BRIDGE_URL;
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var AppProvider = require('./components/AppProvider/AppProvider.js');
6
+
7
+
8
+
9
+ exports.AppProvider = AppProvider.AppProvider;
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ var crypto = require('crypto');
4
+ var runtime = require('@shopify/shopify-api/runtime');
5
+ var appBridgeUrl = require('../../authenticate/helpers/app-bridge-url.js');
6
+ require('isbot');
7
+ require('@remix-run/server-runtime');
8
+
9
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
10
+
11
+ var crypto__default = /*#__PURE__*/_interopDefaultLegacy(crypto);
12
+
13
+ runtime.setCrypto(crypto__default["default"]);
14
+ runtime.setAbstractRuntimeString(() => {
15
+ return `Remix (Node)`;
16
+ });
17
+
18
+ /* eslint-disable no-process-env */
19
+ if (process.env.APP_BRIDGE_URL) {
20
+ appBridgeUrl.setAppBridgeUrlOverride(process.env.APP_BRIDGE_URL);
21
+ }
22
+ /* eslint-enable no-process-env */
@@ -0,0 +1,176 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var ensureCorsHeaders = require('../helpers/ensure-cors-headers.js');
6
+ var validateSessionToken = require('../helpers/validate-session-token.js');
7
+ var getSessionTokenHeader = require('../helpers/get-session-token-header.js');
8
+ var rejectBotRequest = require('../helpers/reject-bot-request.js');
9
+ var respondToOptionsRequest = require('../helpers/respond-to-options-request.js');
10
+ require('@remix-run/server-runtime');
11
+ var cancel = require('./billing/cancel.js');
12
+ var require$1 = require('./billing/require.js');
13
+ var request = require('./billing/request.js');
14
+ var createAdminApiContext = require('./helpers/create-admin-api-context.js');
15
+ var ensureAppIsEmbeddedIfRequired = require('./helpers/ensure-app-is-embedded-if-required.js');
16
+ var ensureSessionTokenSearchParamIfRequired = require('./helpers/ensure-session-token-search-param-if-required.js');
17
+ require('@shopify/shopify-api');
18
+ var redirect = require('./helpers/redirect.js');
19
+ var renderAppBridge = require('./helpers/render-app-bridge.js');
20
+ var validateShopAndHostParams = require('./helpers/validate-shop-and-host-params.js');
21
+
22
+ function authStrategyFactory({
23
+ strategy,
24
+ ...params
25
+ }) {
26
+ const {
27
+ api,
28
+ logger,
29
+ config
30
+ } = params;
31
+ async function respondToBouncePageRequest(request) {
32
+ const url = new URL(request.url);
33
+ if (url.pathname === config.auth.patchSessionTokenPath) {
34
+ logger.debug('Rendering bounce page');
35
+ throw renderAppBridge.renderAppBridge({
36
+ config,
37
+ logger,
38
+ api
39
+ }, request);
40
+ }
41
+ }
42
+ async function respondToExitIframeRequest(request) {
43
+ const url = new URL(request.url);
44
+ if (url.pathname === config.auth.exitIframePath) {
45
+ const destination = url.searchParams.get('exitIframe');
46
+ logger.debug('Rendering exit iframe page', {
47
+ destination
48
+ });
49
+ throw renderAppBridge.renderAppBridge({
50
+ config,
51
+ logger,
52
+ api
53
+ }, request, {
54
+ url: destination
55
+ });
56
+ }
57
+ }
58
+ function createContext(request$1, session, sessionToken) {
59
+ const context = {
60
+ admin: createAdminApiContext.createAdminApiContext(request$1, session, {
61
+ api,
62
+ logger,
63
+ config
64
+ }),
65
+ billing: {
66
+ require: require$1.requireBillingFactory(params, request$1, session),
67
+ request: request.requestBillingFactory(params, request$1, session),
68
+ cancel: cancel.cancelBillingFactory(params, request$1, session)
69
+ },
70
+ session,
71
+ cors: ensureCorsHeaders.ensureCORSHeadersFactory(params, request$1)
72
+ };
73
+ if (config.isEmbeddedApp) {
74
+ return {
75
+ ...context,
76
+ sessionToken,
77
+ redirect: redirect.redirectFactory(params, request$1)
78
+ };
79
+ } else {
80
+ return context;
81
+ }
82
+ }
83
+ return async function authenticateAdmin(request) {
84
+ try {
85
+ rejectBotRequest.respondToBotRequest(params, request);
86
+ respondToOptionsRequest.respondToOptionsRequest(params, request);
87
+ await respondToBouncePageRequest(request);
88
+ await respondToExitIframeRequest(request);
89
+ await strategy.respondToOAuthRequests(request);
90
+
91
+ // If this is a valid request, but it doesn't have a session token header, this is a document request. We need to
92
+ // ensure we're embedded if needed and we have the information needed to load the session.
93
+ if (!getSessionTokenHeader.getSessionTokenHeader(request)) {
94
+ validateShopAndHostParams.validateShopAndHostParams(params, request);
95
+ await ensureAppIsEmbeddedIfRequired.ensureAppIsEmbeddedIfRequired(params, request);
96
+ await ensureSessionTokenSearchParamIfRequired.ensureSessionTokenSearchParamIfRequired(params, request);
97
+ }
98
+ logger.info('Authenticating admin request');
99
+ const {
100
+ payload,
101
+ shop,
102
+ sessionId,
103
+ sessionToken
104
+ } = await getSessionTokenContext(params, request);
105
+ logger.debug('Loading session from storage', {
106
+ sessionId
107
+ });
108
+ const existingSession = sessionId ? await config.sessionStorage.loadSession(sessionId) : undefined;
109
+ const session = await strategy.authenticate(request, {
110
+ session: existingSession,
111
+ sessionToken,
112
+ shop
113
+ });
114
+ logger.debug('Request is valid, loaded session from session token', {
115
+ shop: session.shop,
116
+ isOnline: session.isOnline
117
+ });
118
+ return createContext(request, session, payload);
119
+ } catch (errorOrResponse) {
120
+ if (errorOrResponse instanceof Response) {
121
+ ensureCorsHeaders.ensureCORSHeadersFactory(params, request)(errorOrResponse);
122
+ }
123
+ throw errorOrResponse;
124
+ }
125
+ };
126
+ }
127
+ async function getSessionTokenContext(params, request) {
128
+ const {
129
+ api,
130
+ config,
131
+ logger
132
+ } = params;
133
+ const headerSessionToken = getSessionTokenHeader.getSessionTokenHeader(request);
134
+ const searchParamSessionToken = getSessionTokenHeader.getSessionTokenFromUrlParam(request);
135
+ const sessionToken = headerSessionToken || searchParamSessionToken;
136
+ logger.debug('Attempting to authenticate session token', {
137
+ sessionToken: JSON.stringify({
138
+ header: headerSessionToken,
139
+ search: searchParamSessionToken
140
+ })
141
+ });
142
+ if (config.isEmbeddedApp) {
143
+ const payload = await validateSessionToken.validateSessionToken({
144
+ config,
145
+ logger,
146
+ api
147
+ }, sessionToken);
148
+ const dest = new URL(payload.dest);
149
+ const shop = dest.hostname;
150
+ logger.debug('Session token is valid', {
151
+ shop,
152
+ payload
153
+ });
154
+ const sessionId = config.useOnlineTokens ? api.session.getJwtSessionId(shop, payload.sub) : api.session.getOfflineId(shop);
155
+ return {
156
+ shop,
157
+ payload,
158
+ sessionId,
159
+ sessionToken
160
+ };
161
+ }
162
+ const url = new URL(request.url);
163
+ const shop = url.searchParams.get('shop');
164
+ const sessionId = await api.session.getCurrentId({
165
+ isOnline: config.useOnlineTokens,
166
+ rawRequest: request
167
+ });
168
+ return {
169
+ shop,
170
+ sessionId,
171
+ payload: undefined,
172
+ sessionToken
173
+ };
174
+ }
175
+
176
+ exports.authStrategyFactory = authStrategyFactory;
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var shopifyApi = require('@shopify/shopify-api');
6
+ require('@shopify/shopify-api/runtime');
7
+ var redirectToAuthPage = require('../helpers/redirect-to-auth-page.js');
8
+ require('@remix-run/server-runtime');
9
+
10
+ function cancelBillingFactory(params, request, session) {
11
+ return async function cancelBilling(options) {
12
+ const {
13
+ api,
14
+ logger
15
+ } = params;
16
+ logger.debug('Cancelling billing', {
17
+ shop: session.shop,
18
+ ...options
19
+ });
20
+ try {
21
+ return await api.billing.cancel({
22
+ session,
23
+ subscriptionId: options.subscriptionId,
24
+ isTest: options.isTest,
25
+ prorate: options.prorate
26
+ });
27
+ } catch (error) {
28
+ if (error instanceof shopifyApi.HttpResponseError && error.response.code === 401) {
29
+ logger.debug('API token was invalid, redirecting to OAuth', {
30
+ shop: session.shop
31
+ });
32
+ throw await redirectToAuthPage.redirectToAuthPage(params, request, session.shop);
33
+ } else {
34
+ throw error;
35
+ }
36
+ }
37
+ };
38
+ }
39
+
40
+ exports.cancelBillingFactory = cancelBillingFactory;
@@ -0,0 +1,85 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var shopifyApi = require('@shopify/shopify-api');
6
+ var serverRuntime = require('@remix-run/server-runtime');
7
+ require('@shopify/shopify-api/runtime');
8
+ var redirectToAuthPage = require('../helpers/redirect-to-auth-page.js');
9
+ var redirectWithAppBridgeHeaders = require('../helpers/redirect-with-app-bridge-headers.js');
10
+
11
+ function requestBillingFactory(params, request, session) {
12
+ return async function requestBilling({
13
+ plan,
14
+ isTest,
15
+ returnUrl,
16
+ ...overrides
17
+ }) {
18
+ const {
19
+ api,
20
+ logger
21
+ } = params;
22
+ logger.info('Requesting billing', {
23
+ shop: session.shop,
24
+ plan,
25
+ isTest,
26
+ returnUrl
27
+ });
28
+ let result;
29
+ try {
30
+ result = await api.billing.request({
31
+ plan: plan,
32
+ session,
33
+ isTest,
34
+ returnUrl,
35
+ returnObject: true,
36
+ ...overrides
37
+ });
38
+ } catch (error) {
39
+ if (error instanceof shopifyApi.HttpResponseError && error.response.code === 401) {
40
+ logger.debug('API token was invalid, redirecting to OAuth', {
41
+ shop: session.shop
42
+ });
43
+ throw await redirectToAuthPage.redirectToAuthPage(params, request, session.shop);
44
+ } else {
45
+ throw error;
46
+ }
47
+ }
48
+ throw redirectOutOfApp(params, request, result.confirmationUrl, session.shop);
49
+ };
50
+ }
51
+ function redirectOutOfApp(params, request, url, shop) {
52
+ const {
53
+ config,
54
+ logger
55
+ } = params;
56
+ logger.debug('Redirecting out of app', {
57
+ url
58
+ });
59
+ const requestUrl = new URL(request.url);
60
+ const isEmbeddedRequest = requestUrl.searchParams.get('embedded') === '1';
61
+ const isXhrRequest = request.headers.get('authorization');
62
+ if (isXhrRequest) {
63
+ // eslint-disable-next-line no-warning-comments
64
+ // TODO Check this with the beta flag disabled (with the bounce page)
65
+ // Remix is not including the X-Shopify-API-Request-Failure-Reauthorize-Url when throwing a Response
66
+ // https://github.com/remix-run/remix/issues/5356
67
+ throw new Response(undefined, {
68
+ status: 401,
69
+ statusText: 'Unauthorized',
70
+ headers: redirectWithAppBridgeHeaders.getAppBridgeHeaders(url)
71
+ });
72
+ } else if (isEmbeddedRequest) {
73
+ const params = new URLSearchParams({
74
+ shop,
75
+ host: requestUrl.searchParams.get('host'),
76
+ exitIframe: url
77
+ });
78
+ throw serverRuntime.redirect(`${config.auth.exitIframePath}?${params.toString()}`);
79
+ } else {
80
+ // This will only ever happen for non-embedded apps, because the authenticator will stop before reaching this point
81
+ throw serverRuntime.redirect(url);
82
+ }
83
+ }
84
+
85
+ exports.requestBillingFactory = requestBillingFactory;