@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.
- package/LICENSE.md +9 -0
- package/README.md +179 -0
- package/build/cjs/react/components/AppProvider/AppProvider.js +98 -0
- package/build/cjs/react/components/RemixPolarisLink.js +22 -0
- package/build/cjs/react/const.js +7 -0
- package/build/cjs/react/index.js +9 -0
- package/build/cjs/server/adapters/node/index.js +22 -0
- package/build/cjs/server/authenticate/admin/authenticate.js +176 -0
- package/build/cjs/server/authenticate/admin/billing/cancel.js +40 -0
- package/build/cjs/server/authenticate/admin/billing/request.js +85 -0
- package/build/cjs/server/authenticate/admin/billing/require.js +47 -0
- package/build/cjs/server/authenticate/admin/helpers/begin-auth.js +18 -0
- package/build/cjs/server/authenticate/admin/helpers/create-admin-api-context.js +18 -0
- package/build/cjs/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.js +27 -0
- package/build/cjs/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.js +25 -0
- package/build/cjs/server/authenticate/admin/helpers/handle-client-error.js +39 -0
- package/build/cjs/server/authenticate/admin/helpers/redirect-to-auth-page.js +27 -0
- package/build/cjs/server/authenticate/admin/helpers/redirect-to-bounce-page.js +24 -0
- package/build/cjs/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.js +22 -0
- package/build/cjs/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.js +21 -0
- package/build/cjs/server/authenticate/admin/helpers/redirect-with-exitiframe.js +23 -0
- package/build/cjs/server/authenticate/admin/helpers/redirect.js +67 -0
- package/build/cjs/server/authenticate/admin/helpers/render-app-bridge.js +30 -0
- package/build/cjs/server/authenticate/admin/helpers/trigger-after-auth-hook.js +21 -0
- package/build/cjs/server/authenticate/admin/helpers/validate-shop-and-host-params.js +32 -0
- package/build/cjs/server/authenticate/admin/strategies/auth-code-flow.js +314 -0
- package/build/cjs/server/authenticate/admin/strategies/token-exchange.js +125 -0
- package/build/cjs/server/authenticate/const.js +9 -0
- package/build/cjs/server/authenticate/helpers/add-response-headers.js +32 -0
- package/build/cjs/server/authenticate/helpers/app-bridge-url.js +16 -0
- package/build/cjs/server/authenticate/helpers/ensure-cors-headers.js +25 -0
- package/build/cjs/server/authenticate/helpers/get-session-token-header.js +16 -0
- package/build/cjs/server/authenticate/helpers/idempotent-promise-handler.js +29 -0
- package/build/cjs/server/authenticate/helpers/reject-bot-request.js +23 -0
- package/build/cjs/server/authenticate/helpers/respond-to-invalid-session-token.js +30 -0
- package/build/cjs/server/authenticate/helpers/respond-to-options-request.js +19 -0
- package/build/cjs/server/authenticate/helpers/validate-session-token.js +29 -0
- package/build/cjs/server/authenticate/login/login.js +48 -0
- package/build/cjs/server/authenticate/public/appProxy/authenticate.js +88 -0
- package/build/cjs/server/authenticate/public/checkout/authenticate.js +39 -0
- package/build/cjs/server/authenticate/public/factory.js +31 -0
- package/build/cjs/server/authenticate/webhooks/authenticate.js +96 -0
- package/build/cjs/server/authenticate/webhooks/register.js +53 -0
- package/build/cjs/server/boundary/error.js +18 -0
- package/build/cjs/server/boundary/headers.js +18 -0
- package/build/cjs/server/boundary/index.js +44 -0
- package/build/cjs/server/clients/admin/factory.js +27 -0
- package/build/cjs/server/clients/admin/graphql.js +47 -0
- package/build/cjs/server/clients/admin/rest.js +145 -0
- package/build/cjs/server/clients/storefront/factory.js +35 -0
- package/build/cjs/server/index.js +39 -0
- package/build/cjs/server/override-logger.js +55 -0
- package/build/cjs/server/shopify-app.js +143 -0
- package/build/cjs/server/types.js +26 -0
- package/build/cjs/server/unauthenticated/admin/factory.js +25 -0
- package/build/cjs/server/unauthenticated/helpers/get-offline-session.js +14 -0
- package/build/cjs/server/unauthenticated/storefront/factory.js +25 -0
- package/build/cjs/server/version.js +7 -0
- package/build/ts/react/components/AppProvider/AppProvider.d.ts +90 -0
- package/build/ts/react/components/AppProvider/AppProvider.d.ts.map +1 -0
- package/build/ts/react/components/AppProvider/AppProvider.doc.d.ts +4 -0
- package/build/ts/react/components/AppProvider/AppProvider.doc.d.ts.map +1 -0
- package/build/ts/react/components/AppProvider/AppProvider.doc.js +34 -0
- package/build/ts/react/components/AppProvider/AppProvider.doc.js.map +1 -0
- package/build/ts/react/components/AppProvider/AppProvider.js +76 -0
- package/build/ts/react/components/AppProvider/AppProvider.js.map +1 -0
- package/build/ts/react/components/AppProvider/index.d.ts +2 -0
- package/build/ts/react/components/AppProvider/index.d.ts.map +1 -0
- package/build/ts/react/components/AppProvider/index.js +5 -0
- package/build/ts/react/components/AppProvider/index.js.map +1 -0
- package/build/ts/react/components/RemixPolarisLink.d.ts +3 -0
- package/build/ts/react/components/RemixPolarisLink.d.ts.map +1 -0
- package/build/ts/react/components/RemixPolarisLink.js +12 -0
- package/build/ts/react/components/RemixPolarisLink.js.map +1 -0
- package/build/ts/react/components/index.d.ts +2 -0
- package/build/ts/react/components/index.d.ts.map +1 -0
- package/build/ts/react/components/index.js +5 -0
- package/build/ts/react/components/index.js.map +1 -0
- package/build/ts/react/const.d.ts +2 -0
- package/build/ts/react/const.d.ts.map +1 -0
- package/build/ts/react/const.js +5 -0
- package/build/ts/react/const.js.map +1 -0
- package/build/ts/react/index.d.ts +2 -0
- package/build/ts/react/index.d.ts.map +1 -0
- package/build/ts/react/index.js +5 -0
- package/build/ts/react/index.js.map +1 -0
- package/build/ts/server/__test-helpers/const.d.ts +9 -0
- package/build/ts/server/__test-helpers/const.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/const.js +13 -0
- package/build/ts/server/__test-helpers/const.js.map +1 -0
- package/build/ts/server/__test-helpers/expect-admin-api-client.d.ts +8 -0
- package/build/ts/server/__test-helpers/expect-admin-api-client.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/expect-admin-api-client.js +165 -0
- package/build/ts/server/__test-helpers/expect-admin-api-client.js.map +1 -0
- package/build/ts/server/__test-helpers/expect-begin-auth-redirect.d.ts +3 -0
- package/build/ts/server/__test-helpers/expect-begin-auth-redirect.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/expect-begin-auth-redirect.js +16 -0
- package/build/ts/server/__test-helpers/expect-begin-auth-redirect.js.map +1 -0
- package/build/ts/server/__test-helpers/expect-document-request-headers.d.ts +2 -0
- package/build/ts/server/__test-helpers/expect-document-request-headers.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/expect-document-request-headers.js +18 -0
- package/build/ts/server/__test-helpers/expect-document-request-headers.js.map +1 -0
- package/build/ts/server/__test-helpers/expect-exit-iframe.d.ts +8 -0
- package/build/ts/server/__test-helpers/expect-exit-iframe.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/expect-exit-iframe.js +17 -0
- package/build/ts/server/__test-helpers/expect-exit-iframe.js.map +1 -0
- package/build/ts/server/__test-helpers/expect-login-redirect.d.ts +2 -0
- package/build/ts/server/__test-helpers/expect-login-redirect.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/expect-login-redirect.js +11 -0
- package/build/ts/server/__test-helpers/expect-login-redirect.js.map +1 -0
- package/build/ts/server/__test-helpers/expect-storefront-api-client.d.ts +8 -0
- package/build/ts/server/__test-helpers/expect-storefront-api-client.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/expect-storefront-api-client.js +57 -0
- package/build/ts/server/__test-helpers/expect-storefront-api-client.js.map +1 -0
- package/build/ts/server/__test-helpers/get-hmac.d.ts +2 -0
- package/build/ts/server/__test-helpers/get-hmac.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/get-hmac.js +14 -0
- package/build/ts/server/__test-helpers/get-hmac.js.map +1 -0
- package/build/ts/server/__test-helpers/get-jwt.d.ts +8 -0
- package/build/ts/server/__test-helpers/get-jwt.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/get-jwt.js +17 -0
- package/build/ts/server/__test-helpers/get-jwt.js.map +1 -0
- package/build/ts/server/__test-helpers/get-thrown-response.d.ts +2 -0
- package/build/ts/server/__test-helpers/get-thrown-response.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/get-thrown-response.js +28 -0
- package/build/ts/server/__test-helpers/get-thrown-response.js.map +1 -0
- package/build/ts/server/__test-helpers/index.d.ts +17 -0
- package/build/ts/server/__test-helpers/index.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/index.js +20 -0
- package/build/ts/server/__test-helpers/index.js.map +1 -0
- package/build/ts/server/__test-helpers/request-mock.d.ts +10 -0
- package/build/ts/server/__test-helpers/request-mock.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/request-mock.js +192 -0
- package/build/ts/server/__test-helpers/request-mock.js.map +1 -0
- package/build/ts/server/__test-helpers/setup-valid-session.d.ts +4 -0
- package/build/ts/server/__test-helpers/setup-valid-session.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/setup-valid-session.js +45 -0
- package/build/ts/server/__test-helpers/setup-valid-session.js.map +1 -0
- package/build/ts/server/__test-helpers/sign-request-cookie.d.ts +6 -0
- package/build/ts/server/__test-helpers/sign-request-cookie.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/sign-request-cookie.js +14 -0
- package/build/ts/server/__test-helpers/sign-request-cookie.js.map +1 -0
- package/build/ts/server/__test-helpers/test-config.d.ts +42 -0
- package/build/ts/server/__test-helpers/test-config.d.ts.map +1 -0
- package/build/ts/server/__test-helpers/test-config.js +45 -0
- package/build/ts/server/__test-helpers/test-config.js.map +1 -0
- package/build/ts/server/adapters/node/index.d.ts +2 -0
- package/build/ts/server/adapters/node/index.d.ts.map +1 -0
- package/build/ts/server/adapters/node/index.js +16 -0
- package/build/ts/server/adapters/node/index.js.map +1 -0
- package/build/ts/server/authenticate/admin/authenticate.admin.doc.d.ts +4 -0
- package/build/ts/server/authenticate/admin/authenticate.admin.doc.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/authenticate.admin.doc.js +35 -0
- package/build/ts/server/authenticate/admin/authenticate.admin.doc.js.map +1 -0
- package/build/ts/server/authenticate/admin/authenticate.d.ts +11 -0
- package/build/ts/server/authenticate/admin/authenticate.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/authenticate.js +169 -0
- package/build/ts/server/authenticate/admin/authenticate.js.map +1 -0
- package/build/ts/server/authenticate/admin/billing/authenticate.admin.billing.doc.d.ts +4 -0
- package/build/ts/server/authenticate/admin/billing/authenticate.admin.billing.doc.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/billing/authenticate.admin.billing.doc.js +26 -0
- package/build/ts/server/authenticate/admin/billing/authenticate.admin.billing.doc.js.map +1 -0
- package/build/ts/server/authenticate/admin/billing/cancel.d.ts +5 -0
- package/build/ts/server/authenticate/admin/billing/cancel.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/billing/cancel.js +43 -0
- package/build/ts/server/authenticate/admin/billing/cancel.js.map +1 -0
- package/build/ts/server/authenticate/admin/billing/index.d.ts +4 -0
- package/build/ts/server/authenticate/admin/billing/index.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/billing/index.js +10 -0
- package/build/ts/server/authenticate/admin/billing/index.js.map +1 -0
- package/build/ts/server/authenticate/admin/billing/request.d.ts +6 -0
- package/build/ts/server/authenticate/admin/billing/request.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/billing/request.js +77 -0
- package/build/ts/server/authenticate/admin/billing/request.js.map +1 -0
- package/build/ts/server/authenticate/admin/billing/require.d.ts +6 -0
- package/build/ts/server/authenticate/admin/billing/require.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/billing/require.js +55 -0
- package/build/ts/server/authenticate/admin/billing/require.js.map +1 -0
- package/build/ts/server/authenticate/admin/billing/types.d.ts +252 -0
- package/build/ts/server/authenticate/admin/billing/types.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/billing/types.js +3 -0
- package/build/ts/server/authenticate/admin/billing/types.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/begin-auth.d.ts +3 -0
- package/build/ts/server/authenticate/admin/helpers/begin-auth.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/begin-auth.js +24 -0
- package/build/ts/server/authenticate/admin/helpers/begin-auth.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/create-admin-api-context.d.ts +5 -0
- package/build/ts/server/authenticate/admin/helpers/create-admin-api-context.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/create-admin-api-context.js +16 -0
- package/build/ts/server/authenticate/admin/helpers/create-admin-api-context.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.d.ts +3 -0
- package/build/ts/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.js +25 -0
- package/build/ts/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.d.ts +3 -0
- package/build/ts/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.js +23 -0
- package/build/ts/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/handle-client-error.d.ts +7 -0
- package/build/ts/server/authenticate/admin/helpers/handle-client-error.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/handle-client-error.js +41 -0
- package/build/ts/server/authenticate/admin/helpers/handle-client-error.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/index.d.ts +15 -0
- package/build/ts/server/authenticate/admin/helpers/index.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/index.js +18 -0
- package/build/ts/server/authenticate/admin/helpers/index.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-to-auth-page.d.ts +3 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-to-auth-page.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-to-auth-page.js +36 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-to-auth-page.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-to-bounce-page.d.ts +3 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-to-bounce-page.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-to-bounce-page.js +18 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-to-bounce-page.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.d.ts +3 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.js +32 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.d.ts +3 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.js +18 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-with-exitiframe.d.ts +3 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-with-exitiframe.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-with-exitiframe.js +18 -0
- package/build/ts/server/authenticate/admin/helpers/redirect-with-exitiframe.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/redirect.d.ts +9 -0
- package/build/ts/server/authenticate/admin/helpers/redirect.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/redirect.js +64 -0
- package/build/ts/server/authenticate/admin/helpers/redirect.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/render-app-bridge.d.ts +8 -0
- package/build/ts/server/authenticate/admin/helpers/render-app-bridge.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/render-app-bridge.js +22 -0
- package/build/ts/server/authenticate/admin/helpers/render-app-bridge.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/trigger-after-auth-hook.d.ts +4 -0
- package/build/ts/server/authenticate/admin/helpers/trigger-after-auth-hook.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/trigger-after-auth-hook.js +28 -0
- package/build/ts/server/authenticate/admin/helpers/trigger-after-auth-hook.js.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/validate-shop-and-host-params.d.ts +3 -0
- package/build/ts/server/authenticate/admin/helpers/validate-shop-and-host-params.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/helpers/validate-shop-and-host-params.js +26 -0
- package/build/ts/server/authenticate/admin/helpers/validate-shop-and-host-params.js.map +1 -0
- package/build/ts/server/authenticate/admin/strategies/auth-code-flow.d.ts +22 -0
- package/build/ts/server/authenticate/admin/strategies/auth-code-flow.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/strategies/auth-code-flow.js +324 -0
- package/build/ts/server/authenticate/admin/strategies/auth-code-flow.js.map +1 -0
- package/build/ts/server/authenticate/admin/strategies/token-exchange.d.ts +15 -0
- package/build/ts/server/authenticate/admin/strategies/token-exchange.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/strategies/token-exchange.js +136 -0
- package/build/ts/server/authenticate/admin/strategies/token-exchange.js.map +1 -0
- package/build/ts/server/authenticate/admin/strategies/types.d.ts +17 -0
- package/build/ts/server/authenticate/admin/strategies/types.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/strategies/types.js +3 -0
- package/build/ts/server/authenticate/admin/strategies/types.js.map +1 -0
- package/build/ts/server/authenticate/admin/types.d.ts +175 -0
- package/build/ts/server/authenticate/admin/types.d.ts.map +1 -0
- package/build/ts/server/authenticate/admin/types.js +3 -0
- package/build/ts/server/authenticate/admin/types.js.map +1 -0
- package/build/ts/server/authenticate/const.d.ts +8 -0
- package/build/ts/server/authenticate/const.d.ts.map +1 -0
- package/build/ts/server/authenticate/const.js +11 -0
- package/build/ts/server/authenticate/const.js.map +1 -0
- package/build/ts/server/authenticate/helpers/add-response-headers.d.ts +5 -0
- package/build/ts/server/authenticate/helpers/add-response-headers.d.ts.map +1 -0
- package/build/ts/server/authenticate/helpers/add-response-headers.js +27 -0
- package/build/ts/server/authenticate/helpers/add-response-headers.js.map +1 -0
- package/build/ts/server/authenticate/helpers/app-bridge-url.d.ts +3 -0
- package/build/ts/server/authenticate/helpers/app-bridge-url.d.ts.map +1 -0
- package/build/ts/server/authenticate/helpers/app-bridge-url.js +14 -0
- package/build/ts/server/authenticate/helpers/app-bridge-url.js.map +1 -0
- package/build/ts/server/authenticate/helpers/ensure-cors-headers.d.ts +6 -0
- package/build/ts/server/authenticate/helpers/ensure-cors-headers.d.ts.map +1 -0
- package/build/ts/server/authenticate/helpers/ensure-cors-headers.js +25 -0
- package/build/ts/server/authenticate/helpers/ensure-cors-headers.js.map +1 -0
- package/build/ts/server/authenticate/helpers/get-session-token-header.d.ts +3 -0
- package/build/ts/server/authenticate/helpers/get-session-token-header.d.ts.map +1 -0
- package/build/ts/server/authenticate/helpers/get-session-token-header.js +15 -0
- package/build/ts/server/authenticate/helpers/get-session-token-header.js.map +1 -0
- package/build/ts/server/authenticate/helpers/idempotent-promise-handler.d.ts +11 -0
- package/build/ts/server/authenticate/helpers/idempotent-promise-handler.d.ts.map +1 -0
- package/build/ts/server/authenticate/helpers/idempotent-promise-handler.js +37 -0
- package/build/ts/server/authenticate/helpers/idempotent-promise-handler.js.map +1 -0
- package/build/ts/server/authenticate/helpers/index.d.ts +9 -0
- package/build/ts/server/authenticate/helpers/index.d.ts.map +1 -0
- package/build/ts/server/authenticate/helpers/index.js +12 -0
- package/build/ts/server/authenticate/helpers/index.js.map +1 -0
- package/build/ts/server/authenticate/helpers/reject-bot-request.d.ts +3 -0
- package/build/ts/server/authenticate/helpers/reject-bot-request.d.ts.map +1 -0
- package/build/ts/server/authenticate/helpers/reject-bot-request.js +14 -0
- package/build/ts/server/authenticate/helpers/reject-bot-request.js.map +1 -0
- package/build/ts/server/authenticate/helpers/respond-to-invalid-session-token.d.ts +3 -0
- package/build/ts/server/authenticate/helpers/respond-to-invalid-session-token.d.ts.map +1 -0
- package/build/ts/server/authenticate/helpers/respond-to-invalid-session-token.js +19 -0
- package/build/ts/server/authenticate/helpers/respond-to-invalid-session-token.js.map +1 -0
- package/build/ts/server/authenticate/helpers/respond-to-options-request.d.ts +3 -0
- package/build/ts/server/authenticate/helpers/respond-to-options-request.d.ts.map +1 -0
- package/build/ts/server/authenticate/helpers/respond-to-options-request.js +17 -0
- package/build/ts/server/authenticate/helpers/respond-to-options-request.js.map +1 -0
- package/build/ts/server/authenticate/helpers/validate-session-token.d.ts +8 -0
- package/build/ts/server/authenticate/helpers/validate-session-token.d.ts.map +1 -0
- package/build/ts/server/authenticate/helpers/validate-session-token.js +39 -0
- package/build/ts/server/authenticate/helpers/validate-session-token.js.map +1 -0
- package/build/ts/server/authenticate/login/login.d.ts +3 -0
- package/build/ts/server/authenticate/login/login.d.ts.map +1 -0
- package/build/ts/server/authenticate/login/login.js +54 -0
- package/build/ts/server/authenticate/login/login.js.map +1 -0
- package/build/ts/server/authenticate/public/appProxy/authenticate.d.ts +5 -0
- package/build/ts/server/authenticate/public/appProxy/authenticate.d.ts.map +1 -0
- package/build/ts/server/authenticate/public/appProxy/authenticate.js +81 -0
- package/build/ts/server/authenticate/public/appProxy/authenticate.js.map +1 -0
- package/build/ts/server/authenticate/public/appProxy/authenticate.public.app-proxy.doc.d.ts +4 -0
- package/build/ts/server/authenticate/public/appProxy/authenticate.public.app-proxy.doc.d.ts.map +1 -0
- package/build/ts/server/authenticate/public/appProxy/authenticate.public.app-proxy.doc.js +32 -0
- package/build/ts/server/authenticate/public/appProxy/authenticate.public.app-proxy.doc.js.map +1 -0
- package/build/ts/server/authenticate/public/appProxy/types.d.ts +129 -0
- package/build/ts/server/authenticate/public/appProxy/types.d.ts.map +1 -0
- package/build/ts/server/authenticate/public/appProxy/types.js +3 -0
- package/build/ts/server/authenticate/public/appProxy/types.js.map +1 -0
- package/build/ts/server/authenticate/public/checkout/authenticate.d.ts +4 -0
- package/build/ts/server/authenticate/public/checkout/authenticate.d.ts.map +1 -0
- package/build/ts/server/authenticate/public/checkout/authenticate.js +42 -0
- package/build/ts/server/authenticate/public/checkout/authenticate.js.map +1 -0
- package/build/ts/server/authenticate/public/checkout/authenticate.public.checkout.doc.d.ts +4 -0
- package/build/ts/server/authenticate/public/checkout/authenticate.public.checkout.doc.d.ts.map +1 -0
- package/build/ts/server/authenticate/public/checkout/authenticate.public.checkout.doc.js +21 -0
- package/build/ts/server/authenticate/public/checkout/authenticate.public.checkout.doc.js.map +1 -0
- package/build/ts/server/authenticate/public/checkout/types.d.ts +58 -0
- package/build/ts/server/authenticate/public/checkout/types.d.ts.map +1 -0
- package/build/ts/server/authenticate/public/checkout/types.js +3 -0
- package/build/ts/server/authenticate/public/checkout/types.js.map +1 -0
- package/build/ts/server/authenticate/public/factory.d.ts +6 -0
- package/build/ts/server/authenticate/public/factory.d.ts.map +1 -0
- package/build/ts/server/authenticate/public/factory.js +26 -0
- package/build/ts/server/authenticate/public/factory.js.map +1 -0
- package/build/ts/server/authenticate/public/index.d.ts +2 -0
- package/build/ts/server/authenticate/public/index.d.ts.map +1 -0
- package/build/ts/server/authenticate/public/index.js +5 -0
- package/build/ts/server/authenticate/public/index.js.map +1 -0
- package/build/ts/server/authenticate/public/types.d.ts +64 -0
- package/build/ts/server/authenticate/public/types.d.ts.map +1 -0
- package/build/ts/server/authenticate/public/types.js +3 -0
- package/build/ts/server/authenticate/public/types.js.map +1 -0
- package/build/ts/server/authenticate/webhooks/authenticate.d.ts +6 -0
- package/build/ts/server/authenticate/webhooks/authenticate.d.ts.map +1 -0
- package/build/ts/server/authenticate/webhooks/authenticate.js +93 -0
- package/build/ts/server/authenticate/webhooks/authenticate.js.map +1 -0
- package/build/ts/server/authenticate/webhooks/authenticate.webhooks.doc.d.ts +4 -0
- package/build/ts/server/authenticate/webhooks/authenticate.webhooks.doc.d.ts.map +1 -0
- package/build/ts/server/authenticate/webhooks/authenticate.webhooks.doc.js +27 -0
- package/build/ts/server/authenticate/webhooks/authenticate.webhooks.doc.js.map +1 -0
- package/build/ts/server/authenticate/webhooks/index.d.ts +2 -0
- package/build/ts/server/authenticate/webhooks/index.d.ts.map +1 -0
- package/build/ts/server/authenticate/webhooks/index.js +6 -0
- package/build/ts/server/authenticate/webhooks/index.js.map +1 -0
- package/build/ts/server/authenticate/webhooks/register.d.ts +4 -0
- package/build/ts/server/authenticate/webhooks/register.d.ts.map +1 -0
- package/build/ts/server/authenticate/webhooks/register.js +53 -0
- package/build/ts/server/authenticate/webhooks/register.js.map +1 -0
- package/build/ts/server/authenticate/webhooks/types.d.ts +189 -0
- package/build/ts/server/authenticate/webhooks/types.d.ts.map +1 -0
- package/build/ts/server/authenticate/webhooks/types.js +3 -0
- package/build/ts/server/authenticate/webhooks/types.js.map +1 -0
- package/build/ts/server/boundary/error.d.ts +2 -0
- package/build/ts/server/boundary/error.d.ts.map +1 -0
- package/build/ts/server/boundary/error.js +13 -0
- package/build/ts/server/boundary/error.js.map +1 -0
- package/build/ts/server/boundary/headers.d.ts +3 -0
- package/build/ts/server/boundary/headers.d.ts.map +1 -0
- package/build/ts/server/boundary/headers.js +13 -0
- package/build/ts/server/boundary/headers.js.map +1 -0
- package/build/ts/server/boundary/index.d.ts +38 -0
- package/build/ts/server/boundary/index.d.ts.map +1 -0
- package/build/ts/server/boundary/index.js +41 -0
- package/build/ts/server/boundary/index.js.map +1 -0
- package/build/ts/server/boundary/types.d.ts +4 -0
- package/build/ts/server/boundary/types.d.ts.map +1 -0
- package/build/ts/server/boundary/types.js +3 -0
- package/build/ts/server/boundary/types.js.map +1 -0
- package/build/ts/server/clients/admin/authenticate.admin.api.doc.d.ts +4 -0
- package/build/ts/server/clients/admin/authenticate.admin.api.doc.d.ts.map +1 -0
- package/build/ts/server/clients/admin/authenticate.admin.api.doc.js +32 -0
- package/build/ts/server/clients/admin/authenticate.admin.api.doc.js.map +1 -0
- package/build/ts/server/clients/admin/factory.d.ts +11 -0
- package/build/ts/server/clients/admin/factory.d.ts.map +1 -0
- package/build/ts/server/clients/admin/factory.js +18 -0
- package/build/ts/server/clients/admin/factory.js.map +1 -0
- package/build/ts/server/clients/admin/graphql.d.ts +5 -0
- package/build/ts/server/clients/admin/graphql.d.ts.map +1 -0
- package/build/ts/server/clients/admin/graphql.js +48 -0
- package/build/ts/server/clients/admin/graphql.js.map +1 -0
- package/build/ts/server/clients/admin/index.d.ts +3 -0
- package/build/ts/server/clients/admin/index.d.ts.map +1 -0
- package/build/ts/server/clients/admin/index.js +6 -0
- package/build/ts/server/clients/admin/index.js.map +1 -0
- package/build/ts/server/clients/admin/rest.d.ts +31 -0
- package/build/ts/server/clients/admin/rest.d.ts.map +1 -0
- package/build/ts/server/clients/admin/rest.js +165 -0
- package/build/ts/server/clients/admin/rest.js.map +1 -0
- package/build/ts/server/clients/admin/types.d.ts +158 -0
- package/build/ts/server/clients/admin/types.d.ts.map +1 -0
- package/build/ts/server/clients/admin/types.js +3 -0
- package/build/ts/server/clients/admin/types.js.map +1 -0
- package/build/ts/server/clients/index.d.ts +3 -0
- package/build/ts/server/clients/index.d.ts.map +1 -0
- package/build/ts/server/clients/index.js +6 -0
- package/build/ts/server/clients/index.js.map +1 -0
- package/build/ts/server/clients/storefront/authenticate.storefront.api.doc.d.ts +4 -0
- package/build/ts/server/clients/storefront/authenticate.storefront.api.doc.d.ts.map +1 -0
- package/build/ts/server/clients/storefront/authenticate.storefront.api.doc.js +32 -0
- package/build/ts/server/clients/storefront/authenticate.storefront.api.doc.js.map +1 -0
- package/build/ts/server/clients/storefront/factory.d.ts +8 -0
- package/build/ts/server/clients/storefront/factory.d.ts.map +1 -0
- package/build/ts/server/clients/storefront/factory.js +39 -0
- package/build/ts/server/clients/storefront/factory.js.map +1 -0
- package/build/ts/server/clients/storefront/index.d.ts +3 -0
- package/build/ts/server/clients/storefront/index.d.ts.map +1 -0
- package/build/ts/server/clients/storefront/index.js +6 -0
- package/build/ts/server/clients/storefront/index.js.map +1 -0
- package/build/ts/server/clients/storefront/types.d.ts +29 -0
- package/build/ts/server/clients/storefront/types.d.ts.map +1 -0
- package/build/ts/server/clients/storefront/types.js +3 -0
- package/build/ts/server/clients/storefront/types.js.map +1 -0
- package/build/ts/server/clients/types.d.ts +15 -0
- package/build/ts/server/clients/types.d.ts.map +1 -0
- package/build/ts/server/clients/types.js +3 -0
- package/build/ts/server/clients/types.js.map +1 -0
- package/build/ts/server/config-types.d.ts +255 -0
- package/build/ts/server/config-types.d.ts.map +1 -0
- package/build/ts/server/config-types.js +3 -0
- package/build/ts/server/config-types.js.map +1 -0
- package/build/ts/server/future/flags.d.ts +23 -0
- package/build/ts/server/future/flags.d.ts.map +1 -0
- package/build/ts/server/future/flags.js +3 -0
- package/build/ts/server/future/flags.js.map +1 -0
- package/build/ts/server/index.d.ts +7 -0
- package/build/ts/server/index.d.ts.map +1 -0
- package/build/ts/server/index.js +22 -0
- package/build/ts/server/index.js.map +1 -0
- package/build/ts/server/override-logger.d.ts +3 -0
- package/build/ts/server/override-logger.d.ts.map +1 -0
- package/build/ts/server/override-logger.js +40 -0
- package/build/ts/server/override-logger.js.map +1 -0
- package/build/ts/server/shopify-app.d.ts +27 -0
- package/build/ts/server/shopify-app.d.ts.map +1 -0
- package/build/ts/server/shopify-app.doc.d.ts +4 -0
- package/build/ts/server/shopify-app.doc.d.ts.map +1 -0
- package/build/ts/server/shopify-app.doc.js +42 -0
- package/build/ts/server/shopify-app.doc.js.map +1 -0
- package/build/ts/server/shopify-app.js +117 -0
- package/build/ts/server/shopify-app.js.map +1 -0
- package/build/ts/server/types.d.ts +391 -0
- package/build/ts/server/types.d.ts.map +1 -0
- package/build/ts/server/types.js +17 -0
- package/build/ts/server/types.js.map +1 -0
- package/build/ts/server/unauthenticated/admin/factory.d.ts +5 -0
- package/build/ts/server/unauthenticated/admin/factory.d.ts.map +1 -0
- package/build/ts/server/unauthenticated/admin/factory.js +29 -0
- package/build/ts/server/unauthenticated/admin/factory.js.map +1 -0
- package/build/ts/server/unauthenticated/admin/index.d.ts +2 -0
- package/build/ts/server/unauthenticated/admin/index.d.ts.map +1 -0
- package/build/ts/server/unauthenticated/admin/index.js +5 -0
- package/build/ts/server/unauthenticated/admin/index.js.map +1 -0
- package/build/ts/server/unauthenticated/admin/types.d.ts +34 -0
- package/build/ts/server/unauthenticated/admin/types.d.ts.map +1 -0
- package/build/ts/server/unauthenticated/admin/types.js +3 -0
- package/build/ts/server/unauthenticated/admin/types.js.map +1 -0
- package/build/ts/server/unauthenticated/admin/unauthenticated.admin.doc.d.ts +4 -0
- package/build/ts/server/unauthenticated/admin/unauthenticated.admin.doc.d.ts.map +1 -0
- package/build/ts/server/unauthenticated/admin/unauthenticated.admin.doc.js +29 -0
- package/build/ts/server/unauthenticated/admin/unauthenticated.admin.doc.js.map +1 -0
- package/build/ts/server/unauthenticated/helpers/get-offline-session.d.ts +4 -0
- package/build/ts/server/unauthenticated/helpers/get-offline-session.d.ts.map +1 -0
- package/build/ts/server/unauthenticated/helpers/get-offline-session.js +22 -0
- package/build/ts/server/unauthenticated/helpers/get-offline-session.js.map +1 -0
- package/build/ts/server/unauthenticated/helpers/index.d.ts +2 -0
- package/build/ts/server/unauthenticated/helpers/index.d.ts.map +1 -0
- package/build/ts/server/unauthenticated/helpers/index.js +5 -0
- package/build/ts/server/unauthenticated/helpers/index.js.map +1 -0
- package/build/ts/server/unauthenticated/storefront/factory.d.ts +4 -0
- package/build/ts/server/unauthenticated/storefront/factory.d.ts.map +1 -0
- package/build/ts/server/unauthenticated/storefront/factory.js +29 -0
- package/build/ts/server/unauthenticated/storefront/factory.js.map +1 -0
- package/build/ts/server/unauthenticated/storefront/index.d.ts +2 -0
- package/build/ts/server/unauthenticated/storefront/index.d.ts.map +1 -0
- package/build/ts/server/unauthenticated/storefront/index.js +5 -0
- package/build/ts/server/unauthenticated/storefront/index.js.map +1 -0
- package/build/ts/server/unauthenticated/storefront/types.d.ts +34 -0
- package/build/ts/server/unauthenticated/storefront/types.d.ts.map +1 -0
- package/build/ts/server/unauthenticated/storefront/types.js +3 -0
- package/build/ts/server/unauthenticated/storefront/types.js.map +1 -0
- package/build/ts/server/unauthenticated/storefront/unauthenticated.storefront.doc.d.ts +4 -0
- package/build/ts/server/unauthenticated/storefront/unauthenticated.storefront.doc.d.ts.map +1 -0
- package/build/ts/server/unauthenticated/storefront/unauthenticated.storefront.doc.js +29 -0
- package/build/ts/server/unauthenticated/storefront/unauthenticated.storefront.doc.js.map +1 -0
- package/build/ts/server/unauthenticated/types.d.ts +66 -0
- package/build/ts/server/unauthenticated/types.d.ts.map +1 -0
- package/build/ts/server/unauthenticated/types.js +3 -0
- package/build/ts/server/unauthenticated/types.js.map +1 -0
- package/build/ts/server/version.d.ts +2 -0
- package/build/ts/server/version.d.ts.map +1 -0
- package/build/ts/server/version.js +5 -0
- package/build/ts/server/version.js.map +1 -0
- 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.md)
|
|
6
|
+
[](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,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;
|