shopify-app-js 0.0.1-security → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of shopify-app-js might be problematic. Click here for more details.
- package/.changeset/README.md +8 -0
- package/.changeset/config.json +14 -0
- package/.changeset/flat-clouds-camp.md +5 -0
- package/.eslintrc.js +36 -0
- package/.github/CODEOWNERS +1 -0
- package/.github/ISSUE_TEMPLATE/BUG_REPORT.md +36 -0
- package/.github/ISSUE_TEMPLATE/ENHANCEMENT.md +9 -0
- package/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md +9 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +34 -0
- package/.github/dependabot.yml +9 -0
- package/.github/workflows/changelog.yml +30 -0
- package/.github/workflows/ci.yml +22 -0
- package/.github/workflows/cla.yml +22 -0
- package/.github/workflows/close-waiting-for-response-issues.yml +20 -0
- package/.github/workflows/main-release.yml +36 -0
- package/.github/workflows/markdown_link_check.yml +14 -0
- package/.github/workflows/markdown_link_checker_config.json +9 -0
- package/.github/workflows/publish-experimental-build.yml +30 -0
- package/.github/workflows/release-candidate.yml +35 -0
- package/.github/workflows/remove-labels-on-activity.yml +16 -0
- package/.github/workflows/stale.yml +26 -0
- package/.prettierignore +5 -0
- package/.prettierrc +1 -0
- package/CODE_OF_CONDUCT.md +46 -0
- package/CONTRIBUTING.md +39 -0
- package/LICENSE.md +9 -0
- package/README.md +62 -3
- package/RELEASING.md +142 -0
- package/loom.config.ts +115 -0
- package/package.json +44 -3
- package/packages/.prettierrc +1 -0
- package/packages/shopify-app-express/CHANGELOG.md +316 -0
- package/packages/shopify-app-express/LICENSE.md +9 -0
- package/packages/shopify-app-express/README.md +93 -0
- package/packages/shopify-app-express/docs/reference/README.md +3 -0
- package/packages/shopify-app-express/docs/reference/auth.md +76 -0
- package/packages/shopify-app-express/docs/reference/cspHeaders.md +24 -0
- package/packages/shopify-app-express/docs/reference/ensureInstalledOnShop.md +17 -0
- package/packages/shopify-app-express/docs/reference/migrating-app-v6-api-lib-to-express-lib.md +345 -0
- package/packages/shopify-app-express/docs/reference/processWebhooks.md +67 -0
- package/packages/shopify-app-express/docs/reference/redirectOutOfApp.md +77 -0
- package/packages/shopify-app-express/docs/reference/redirectToShopifyOrAppRoot.md +20 -0
- package/packages/shopify-app-express/docs/reference/shopifyApp.md +148 -0
- package/packages/shopify-app-express/docs/reference/validateAuthenticatedSession.md +30 -0
- package/packages/shopify-app-express/loom.config.ts +27 -0
- package/packages/shopify-app-express/package.json +54 -0
- package/packages/shopify-app-express/src/__tests__/index.test.ts +100 -0
- package/packages/shopify-app-express/src/__tests__/integration/oauth.test.ts +445 -0
- package/packages/shopify-app-express/src/__tests__/integration/responses.ts +135 -0
- package/packages/shopify-app-express/src/__tests__/integration/types.ts +22 -0
- package/packages/shopify-app-express/src/__tests__/integration/utils.ts +68 -0
- package/packages/shopify-app-express/src/__tests__/integration/webhooks.test.ts +208 -0
- package/packages/shopify-app-express/src/__tests__/redirect-to-auth.test.ts +103 -0
- package/packages/shopify-app-express/src/__tests__/setup-jest.ts +8 -0
- package/packages/shopify-app-express/src/__tests__/test-helper.ts +204 -0
- package/packages/shopify-app-express/src/app-installations.ts +42 -0
- package/packages/shopify-app-express/src/auth/__tests__/auth.test.ts +303 -0
- package/packages/shopify-app-express/src/auth/auth-callback.ts +131 -0
- package/packages/shopify-app-express/src/auth/index.ts +32 -0
- package/packages/shopify-app-express/src/auth/types.ts +13 -0
- package/packages/shopify-app-express/src/config-types.ts +38 -0
- package/packages/shopify-app-express/src/error.ts +8 -0
- package/packages/shopify-app-express/src/index.ts +171 -0
- package/packages/shopify-app-express/src/middlewares/__tests__/csp-headers.test.ts +69 -0
- package/packages/shopify-app-express/src/middlewares/__tests__/ensure-installed-on-shop.test.ts +193 -0
- package/packages/shopify-app-express/src/middlewares/__tests__/redirect-to-shopify-or-app-root.test.ts +59 -0
- package/packages/shopify-app-express/src/middlewares/__tests__/validate-authenticated-session.test.ts +319 -0
- package/packages/shopify-app-express/src/middlewares/csp-headers.ts +31 -0
- package/packages/shopify-app-express/src/middlewares/ensure-installed-on-shop.ts +176 -0
- package/packages/shopify-app-express/src/middlewares/has-valid-access-token.ts +25 -0
- package/packages/shopify-app-express/src/middlewares/index.ts +15 -0
- package/packages/shopify-app-express/src/middlewares/redirect-to-shopify-or-app-root.ts +39 -0
- package/packages/shopify-app-express/src/middlewares/types.ts +6 -0
- package/packages/shopify-app-express/src/middlewares/validate-authenticated-session.ts +142 -0
- package/packages/shopify-app-express/src/redirect-out-of-app.ts +80 -0
- package/packages/shopify-app-express/src/redirect-to-auth.ts +70 -0
- package/packages/shopify-app-express/src/types.ts +26 -0
- package/packages/shopify-app-express/src/version.ts +1 -0
- package/packages/shopify-app-express/src/webhooks/__tests__/process.test.ts +138 -0
- package/packages/shopify-app-express/src/webhooks/index.ts +54 -0
- package/packages/shopify-app-express/src/webhooks/process.ts +22 -0
- package/packages/shopify-app-express/src/webhooks/types.ts +24 -0
- package/packages/shopify-app-express/tsconfig.json +10 -0
- package/packages/shopify-app-remix/.eslintrc.js +3 -0
- package/packages/shopify-app-remix/CHANGELOG.md +569 -0
- package/packages/shopify-app-remix/LICENSE.md +9 -0
- package/packages/shopify-app-remix/README.md +223 -0
- package/packages/shopify-app-remix/docs/build-docs.sh +11 -0
- package/packages/shopify-app-remix/docs/generated/generated_docs_data.json +18650 -0
- package/packages/shopify-app-remix/docs/generated/generated_static_pages.json +540 -0
- package/packages/shopify-app-remix/docs/staticPages/admin.doc.ts +130 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/admin/auth-cors.example.tsx +11 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/admin/auth.example.tsx +19 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/admin/graphql.example.tsx +29 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/admin/headers.example.tsx +10 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/admin/rest-resources.example.tsx +9 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/admin/rest.example.tsx +17 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/future-flags/config.example.ts +8 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/future-flags/unstable.example.ts +9 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/.graphqlrc.ts +16 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.npm.example.sh +2 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.pnpm.example.sh +2 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.yarn.example.sh +2 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/package.json +5 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.npm.example.sh +1 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.pnpm.example.sh +1 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.yarn.example.sh +1 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/webhooks/config.example.ts +19 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/guides/webhooks/endpoint.example.ts +24 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/index/app-provider.example.ts +30 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/index/boundaries.example.ts +9 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/index/create.npm.example.sh +1 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/index/create.pnpm.example.sh +1 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/index/create.yarn.example.sh +1 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/index/embedded-app-auth-strategy-config.example.ts +10 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/index/entry-server.example.ts +12 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/index/install.npm.example.sh +1 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/index/install.pnpm.example.sh +1 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/index/install.yarn.example.sh +1 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/index/shopify-app.example.ts +14 -0
- package/packages/shopify-app-remix/docs/staticPages/examples/index/splat-route.example.ts +11 -0
- package/packages/shopify-app-remix/docs/staticPages/future-flags.doc.ts +94 -0
- package/packages/shopify-app-remix/docs/staticPages/graphql-types.doc.ts +148 -0
- package/packages/shopify-app-remix/docs/staticPages/index.doc.ts +227 -0
- package/packages/shopify-app-remix/docs/staticPages/webhooks.doc.ts +64 -0
- package/packages/shopify-app-remix/docs/tsconfig.docs.json +9 -0
- package/packages/shopify-app-remix/docs/typeOverride.json +1 -0
- package/packages/shopify-app-remix/docs/upcoming_changes.md +153 -0
- package/packages/shopify-app-remix/loom.config.ts +57 -0
- package/packages/shopify-app-remix/package.json +93 -0
- package/packages/shopify-app-remix/src/react/.eslintrc.js +16 -0
- package/packages/shopify-app-remix/src/react/__tests__/test-helper.ts +22 -0
- package/packages/shopify-app-remix/src/react/components/AppProvider/AppProvider.doc.ts +34 -0
- package/packages/shopify-app-remix/src/react/components/AppProvider/AppProvider.tsx +121 -0
- package/packages/shopify-app-remix/src/react/components/AppProvider/__tests__/AppProvider.test.tsx +68 -0
- package/packages/shopify-app-remix/src/react/components/AppProvider/index.ts +1 -0
- package/packages/shopify-app-remix/src/react/components/RemixPolarisLink.tsx +14 -0
- package/packages/shopify-app-remix/src/react/components/index.ts +1 -0
- package/packages/shopify-app-remix/src/react/const.ts +2 -0
- package/packages/shopify-app-remix/src/react/index.ts +1 -0
- package/packages/shopify-app-remix/src/server/.eslintrc.js +16 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/__tests__/request-mock.test.ts +171 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/const.ts +11 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/expect-admin-api-client.ts +119 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/expect-begin-auth-redirect.ts +22 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/expect-document-request-headers.ts +25 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/expect-exit-iframe.ts +37 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/expect-login-redirect.ts +8 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/expect-storefront-api-client.ts +50 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/get-hmac.ts +10 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/get-jwt.ts +31 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/get-thrown-response.ts +17 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/index.ts +14 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/request-mock.ts +169 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/setup-valid-session.ts +45 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/sign-request-cookie.ts +21 -0
- package/packages/shopify-app-remix/src/server/__test-helpers/test-config.ts +112 -0
- package/packages/shopify-app-remix/src/server/__tests__/override-logger.test.ts +101 -0
- package/packages/shopify-app-remix/src/server/__tests__/shopify-app.test.ts +119 -0
- package/packages/shopify-app-remix/src/server/adapters/__tests__/node-app-bridge-url.test.ts +18 -0
- package/packages/shopify-app-remix/src/server/adapters/__tests__/node.test.ts +28 -0
- package/packages/shopify-app-remix/src/server/adapters/node/__tests__/setup-jest.ts +10 -0
- package/packages/shopify-app-remix/src/server/adapters/node/index.ts +20 -0
- package/packages/shopify-app-remix/src/server/adapters/vercel/__tests__/setup-jest.ts +12 -0
- package/packages/shopify-app-remix/src/server/adapters/vercel/index.ts +13 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/admin-client.test.ts +181 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/doc-request-path.test.ts +151 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/exit-i-frame-path.test.ts +99 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/patch-session-token-path.test.ts +58 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/reject-bot.test.ts +23 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/respond-to-options.test.ts +50 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/session-token-header-path.test.ts +91 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/authenticate.admin.doc.ts +37 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/authenticate.ts +201 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/billing/__tests__/cancel.test.ts +258 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/billing/__tests__/check.test.ts +254 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/billing/__tests__/mock-responses.ts +65 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/billing/__tests__/request.test.ts +373 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/billing/__tests__/require.test.ts +316 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/billing/authenticate.admin.billing.doc.ts +28 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/billing/cancel.ts +37 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/billing/check.ts +38 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/billing/index.ts +4 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/billing/request.ts +101 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/billing/require.ts +56 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/billing/types.ts +383 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/__tests__/redirect.test.ts +313 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/__tests__/validate-redirect-url.test.ts +84 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/begin-auth.ts +17 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/create-admin-api-context.ts +22 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.ts +18 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.ts +25 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/handle-client-error.ts +43 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/index.ts +14 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/redirect-to-auth-page.ts +28 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/redirect-to-bounce-page.ts +23 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.ts +21 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.ts +13 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/redirect-with-exitiframe.ts +28 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/redirect.ts +83 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/render-app-bridge.ts +46 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/trigger-after-auth-hook.ts +28 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/validate-redirect-url.ts +67 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/validate-shop-and-host-params.ts +28 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/admin-client.test.ts +222 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/auth-callback-path.test.ts +395 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/auth-path.test.ts +83 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/authenticate.test.ts +183 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/ensure-installed-on-shop.test.ts +234 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/session-token-header-path.test.ts +79 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/token-exchange/admin-client.test.ts +189 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/token-exchange/authenticate.test.ts +310 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/auth-code-flow.ts +333 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/token-exchange.ts +169 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/types.ts +29 -0
- package/packages/shopify-app-remix/src/server/authenticate/admin/types.ts +199 -0
- package/packages/shopify-app-remix/src/server/authenticate/const.ts +15 -0
- package/packages/shopify-app-remix/src/server/authenticate/flow/__tests__/authenticate.test.ts +142 -0
- package/packages/shopify-app-remix/src/server/authenticate/flow/authenticate.flow.doc.ts +34 -0
- package/packages/shopify-app-remix/src/server/authenticate/flow/authenticate.ts +71 -0
- package/packages/shopify-app-remix/src/server/authenticate/flow/types.ts +90 -0
- package/packages/shopify-app-remix/src/server/authenticate/helpers/__tests__/add-response-headers.test.ts +25 -0
- package/packages/shopify-app-remix/src/server/authenticate/helpers/__tests__/app-bridge-url.test.ts +21 -0
- package/packages/shopify-app-remix/src/server/authenticate/helpers/__tests__/idempotent-promise-handler.test.ts +104 -0
- package/packages/shopify-app-remix/src/server/authenticate/helpers/add-response-headers.ts +43 -0
- package/packages/shopify-app-remix/src/server/authenticate/helpers/app-bridge-url.ts +10 -0
- package/packages/shopify-app-remix/src/server/authenticate/helpers/ensure-cors-headers.ts +38 -0
- package/packages/shopify-app-remix/src/server/authenticate/helpers/get-session-token-header.ts +11 -0
- package/packages/shopify-app-remix/src/server/authenticate/helpers/idempotent-promise-handler.ts +45 -0
- package/packages/shopify-app-remix/src/server/authenticate/helpers/index.ts +8 -0
- package/packages/shopify-app-remix/src/server/authenticate/helpers/reject-bot-request.ts +13 -0
- package/packages/shopify-app-remix/src/server/authenticate/helpers/respond-to-invalid-session-token.ts +29 -0
- package/packages/shopify-app-remix/src/server/authenticate/helpers/respond-to-options-request.ts +26 -0
- package/packages/shopify-app-remix/src/server/authenticate/helpers/validate-session-token.ts +32 -0
- package/packages/shopify-app-remix/src/server/authenticate/login/__tests__/login.test.ts +157 -0
- package/packages/shopify-app-remix/src/server/authenticate/login/login.ts +53 -0
- package/packages/shopify-app-remix/src/server/authenticate/public/__tests__/factory.test.ts +224 -0
- package/packages/shopify-app-remix/src/server/authenticate/public/appProxy/__tests__/authenticate.test.ts +282 -0
- package/packages/shopify-app-remix/src/server/authenticate/public/appProxy/authenticate.public.app-proxy.doc.ts +36 -0
- package/packages/shopify-app-remix/src/server/authenticate/public/appProxy/authenticate.ts +90 -0
- package/packages/shopify-app-remix/src/server/authenticate/public/appProxy/types.ts +164 -0
- package/packages/shopify-app-remix/src/server/authenticate/public/checkout/__tests__/authenticate.test.ts +142 -0
- package/packages/shopify-app-remix/src/server/authenticate/public/checkout/authenticate.public.checkout.doc.ts +23 -0
- package/packages/shopify-app-remix/src/server/authenticate/public/checkout/authenticate.ts +45 -0
- package/packages/shopify-app-remix/src/server/authenticate/public/checkout/types.ts +65 -0
- package/packages/shopify-app-remix/src/server/authenticate/public/factory.ts +49 -0
- package/packages/shopify-app-remix/src/server/authenticate/public/index.ts +1 -0
- package/packages/shopify-app-remix/src/server/authenticate/public/types.ts +77 -0
- package/packages/shopify-app-remix/src/server/authenticate/webhooks/__tests__/authenticate.test.ts +207 -0
- package/packages/shopify-app-remix/src/server/authenticate/webhooks/__tests__/mock-responses.ts +45 -0
- package/packages/shopify-app-remix/src/server/authenticate/webhooks/__tests__/register.test.ts +210 -0
- package/packages/shopify-app-remix/src/server/authenticate/webhooks/authenticate.ts +113 -0
- package/packages/shopify-app-remix/src/server/authenticate/webhooks/authenticate.webhooks.doc.ts +28 -0
- package/packages/shopify-app-remix/src/server/authenticate/webhooks/index.ts +1 -0
- package/packages/shopify-app-remix/src/server/authenticate/webhooks/register.ts +48 -0
- package/packages/shopify-app-remix/src/server/authenticate/webhooks/types.ts +246 -0
- package/packages/shopify-app-remix/src/server/boundary/__tests__/error.test.tsx +36 -0
- package/packages/shopify-app-remix/src/server/boundary/__tests__/headers.test.ts +66 -0
- package/packages/shopify-app-remix/src/server/boundary/error.tsx +14 -0
- package/packages/shopify-app-remix/src/server/boundary/headers.ts +15 -0
- package/packages/shopify-app-remix/src/server/boundary/index.ts +39 -0
- package/packages/shopify-app-remix/src/server/boundary/types.ts +4 -0
- package/packages/shopify-app-remix/src/server/clients/admin/authenticate.admin.api.doc.ts +34 -0
- package/packages/shopify-app-remix/src/server/clients/admin/factory.ts +30 -0
- package/packages/shopify-app-remix/src/server/clients/admin/graphql.ts +39 -0
- package/packages/shopify-app-remix/src/server/clients/admin/index.ts +2 -0
- package/packages/shopify-app-remix/src/server/clients/admin/rest.ts +157 -0
- package/packages/shopify-app-remix/src/server/clients/admin/types.ts +178 -0
- package/packages/shopify-app-remix/src/server/clients/index.ts +2 -0
- package/packages/shopify-app-remix/src/server/clients/storefront/authenticate.storefront.api.doc.ts +34 -0
- package/packages/shopify-app-remix/src/server/clients/storefront/factory.ts +32 -0
- package/packages/shopify-app-remix/src/server/clients/storefront/index.ts +2 -0
- package/packages/shopify-app-remix/src/server/clients/storefront/types.ts +31 -0
- package/packages/shopify-app-remix/src/server/clients/types.ts +27 -0
- package/packages/shopify-app-remix/src/server/config-types.ts +293 -0
- package/packages/shopify-app-remix/src/server/errors.ts +3 -0
- package/packages/shopify-app-remix/src/server/future/flags.ts +57 -0
- package/packages/shopify-app-remix/src/server/index.ts +20 -0
- package/packages/shopify-app-remix/src/server/override-logger.ts +42 -0
- package/packages/shopify-app-remix/src/server/shopify-app.doc.ts +45 -0
- package/packages/shopify-app-remix/src/server/shopify-app.ts +198 -0
- package/packages/shopify-app-remix/src/server/types.ts +509 -0
- package/packages/shopify-app-remix/src/server/unauthenticated/admin/__tests__/factory.test.ts +30 -0
- package/packages/shopify-app-remix/src/server/unauthenticated/admin/factory.ts +29 -0
- package/packages/shopify-app-remix/src/server/unauthenticated/admin/index.ts +1 -0
- package/packages/shopify-app-remix/src/server/unauthenticated/admin/types.ts +117 -0
- package/packages/shopify-app-remix/src/server/unauthenticated/admin/unauthenticated.admin.doc.ts +40 -0
- package/packages/shopify-app-remix/src/server/unauthenticated/helpers/get-offline-session.ts +13 -0
- package/packages/shopify-app-remix/src/server/unauthenticated/helpers/index.ts +1 -0
- package/packages/shopify-app-remix/src/server/unauthenticated/storefront/__tests__/factory.test.ts +30 -0
- package/packages/shopify-app-remix/src/server/unauthenticated/storefront/factory.ts +28 -0
- package/packages/shopify-app-remix/src/server/unauthenticated/storefront/index.ts +1 -0
- package/packages/shopify-app-remix/src/server/unauthenticated/storefront/types.ts +39 -0
- package/packages/shopify-app-remix/src/server/unauthenticated/storefront/unauthenticated.storefront.doc.ts +40 -0
- package/packages/shopify-app-remix/src/server/unauthenticated/types.ts +68 -0
- package/packages/shopify-app-remix/src/server/version.ts +1 -0
- package/packages/shopify-app-remix/tsconfig.json +11 -0
- package/packages/shopify-app-session-storage/CHANGELOG.md +149 -0
- package/packages/shopify-app-session-storage/LICENSE.md +9 -0
- package/packages/shopify-app-session-storage/README.md +5 -0
- package/packages/shopify-app-session-storage/implementing-session-storage.md +214 -0
- package/packages/shopify-app-session-storage/loom.config.ts +45 -0
- package/packages/shopify-app-session-storage/package.json +44 -0
- package/packages/shopify-app-session-storage/src/__tests__/setup-jest.ts +8 -0
- package/packages/shopify-app-session-storage/src/abstract-migration-engine.ts +53 -0
- package/packages/shopify-app-session-storage/src/index.ts +3 -0
- package/packages/shopify-app-session-storage/src/rdbms-session-storage-migrator.ts +59 -0
- package/packages/shopify-app-session-storage/src/types.ts +174 -0
- package/packages/shopify-app-session-storage/tsconfig.json +10 -0
- package/packages/shopify-app-session-storage-dynamodb/CHANGELOG.md +150 -0
- package/packages/shopify-app-session-storage-dynamodb/LICENSE.md +9 -0
- package/packages/shopify-app-session-storage-dynamodb/README.md +75 -0
- package/packages/shopify-app-session-storage-dynamodb/loom.config.ts +27 -0
- package/packages/shopify-app-session-storage-dynamodb/package.json +51 -0
- package/packages/shopify-app-session-storage-dynamodb/src/__tests__/dynamodb.test.ts +93 -0
- package/packages/shopify-app-session-storage-dynamodb/src/__tests__/setup-jest.ts +8 -0
- package/packages/shopify-app-session-storage-dynamodb/src/dynamodb.ts +126 -0
- package/packages/shopify-app-session-storage-dynamodb/tsconfig.json +10 -0
- package/packages/shopify-app-session-storage-kv/CHANGELOG.md +204 -0
- package/packages/shopify-app-session-storage-kv/LICENSE.md +9 -0
- package/packages/shopify-app-session-storage-kv/README.md +41 -0
- package/packages/shopify-app-session-storage-kv/loom.config.ts +27 -0
- package/packages/shopify-app-session-storage-kv/package.json +52 -0
- package/packages/shopify-app-session-storage-kv/src/__tests__/kv-namespace-dummy-worker.ts +8 -0
- package/packages/shopify-app-session-storage-kv/src/__tests__/kv.test.ts +22 -0
- package/packages/shopify-app-session-storage-kv/src/__tests__/setup-jest.ts +8 -0
- package/packages/shopify-app-session-storage-kv/src/kv.ts +87 -0
- package/packages/shopify-app-session-storage-kv/tsconfig.json +11 -0
- package/packages/shopify-app-session-storage-memory/CHANGELOG.md +190 -0
- package/packages/shopify-app-session-storage-memory/LICENSE.md +9 -0
- package/packages/shopify-app-session-storage-memory/README.md +19 -0
- package/packages/shopify-app-session-storage-memory/loom.config.ts +27 -0
- package/packages/shopify-app-session-storage-memory/package.json +46 -0
- package/packages/shopify-app-session-storage-memory/src/__tests__/memory.test.ts +12 -0
- package/packages/shopify-app-session-storage-memory/src/__tests__/setup-jest.ts +8 -0
- package/packages/shopify-app-session-storage-memory/src/memory.ts +34 -0
- package/packages/shopify-app-session-storage-memory/tsconfig.json +10 -0
- package/packages/shopify-app-session-storage-mongodb/CHANGELOG.md +208 -0
- package/packages/shopify-app-session-storage-mongodb/LICENSE.md +9 -0
- package/packages/shopify-app-session-storage-mongodb/README.md +30 -0
- package/packages/shopify-app-session-storage-mongodb/loom.config.ts +27 -0
- package/packages/shopify-app-session-storage-mongodb/package.json +49 -0
- package/packages/shopify-app-session-storage-mongodb/src/__tests__/mongodb.test.ts +54 -0
- package/packages/shopify-app-session-storage-mongodb/src/__tests__/setup-jest.ts +8 -0
- package/packages/shopify-app-session-storage-mongodb/src/mongodb.ts +120 -0
- package/packages/shopify-app-session-storage-mongodb/tsconfig.json +10 -0
- package/packages/shopify-app-session-storage-mysql/CHANGELOG.md +220 -0
- package/packages/shopify-app-session-storage-mysql/LICENSE.md +9 -0
- package/packages/shopify-app-session-storage-mysql/README.md +41 -0
- package/packages/shopify-app-session-storage-mysql/loom.config.ts +27 -0
- package/packages/shopify-app-session-storage-mysql/package.json +50 -0
- package/packages/shopify-app-session-storage-mysql/src/__tests__/mysql.test.ts +137 -0
- package/packages/shopify-app-session-storage-mysql/src/__tests__/setup-jest.ts +8 -0
- package/packages/shopify-app-session-storage-mysql/src/migrations.ts +18 -0
- package/packages/shopify-app-session-storage-mysql/src/mysql-connection.ts +108 -0
- package/packages/shopify-app-session-storage-mysql/src/mysql-migrator.ts +53 -0
- package/packages/shopify-app-session-storage-mysql/src/mysql.ts +178 -0
- package/packages/shopify-app-session-storage-mysql/tsconfig.json +10 -0
- package/packages/shopify-app-session-storage-postgresql/CHANGELOG.md +210 -0
- package/packages/shopify-app-session-storage-postgresql/LICENSE.md +9 -0
- package/packages/shopify-app-session-storage-postgresql/README.md +39 -0
- package/packages/shopify-app-session-storage-postgresql/loom.config.ts +27 -0
- package/packages/shopify-app-session-storage-postgresql/package.json +52 -0
- package/packages/shopify-app-session-storage-postgresql/src/__tests__/migrate-to-case-sensitivity.test.ts +344 -0
- package/packages/shopify-app-session-storage-postgresql/src/__tests__/postgresql.test.ts +136 -0
- package/packages/shopify-app-session-storage-postgresql/src/__tests__/setup-jest.ts +8 -0
- package/packages/shopify-app-session-storage-postgresql/src/migrations.ts +70 -0
- package/packages/shopify-app-session-storage-postgresql/src/postgres-connection.ts +94 -0
- package/packages/shopify-app-session-storage-postgresql/src/postgres-migrator.ts +27 -0
- package/packages/shopify-app-session-storage-postgresql/src/postgresql.ts +178 -0
- package/packages/shopify-app-session-storage-postgresql/tsconfig.json +10 -0
- package/packages/shopify-app-session-storage-prisma/CHANGELOG.md +148 -0
- package/packages/shopify-app-session-storage-prisma/LICENSE.md +9 -0
- package/packages/shopify-app-session-storage-prisma/README.md +68 -0
- package/packages/shopify-app-session-storage-prisma/loom.config.ts +27 -0
- package/packages/shopify-app-session-storage-prisma/package.json +51 -0
- package/packages/shopify-app-session-storage-prisma/prisma/migrations/20230425184828_init/migration.sql +11 -0
- package/packages/shopify-app-session-storage-prisma/prisma/migrations/20230906155758_mySession/migration.sql +11 -0
- package/packages/shopify-app-session-storage-prisma/prisma/migrations/migration_lock.toml +3 -0
- package/packages/shopify-app-session-storage-prisma/prisma/schema.prisma +30 -0
- package/packages/shopify-app-session-storage-prisma/src/__tests__/prisma.test.ts +66 -0
- package/packages/shopify-app-session-storage-prisma/src/__tests__/setup-jest.ts +8 -0
- package/packages/shopify-app-session-storage-prisma/src/prisma.ts +145 -0
- package/packages/shopify-app-session-storage-prisma/tsconfig.json +10 -0
- package/packages/shopify-app-session-storage-redis/CHANGELOG.md +200 -0
- package/packages/shopify-app-session-storage-redis/LICENSE.md +9 -0
- package/packages/shopify-app-session-storage-redis/README.md +38 -0
- package/packages/shopify-app-session-storage-redis/loom.config.ts +27 -0
- package/packages/shopify-app-session-storage-redis/package.json +50 -0
- package/packages/shopify-app-session-storage-redis/src/__tests__/migration-test-data.ts +46 -0
- package/packages/shopify-app-session-storage-redis/src/__tests__/redis.conf +2 -0
- package/packages/shopify-app-session-storage-redis/src/__tests__/redis.test.ts +236 -0
- package/packages/shopify-app-session-storage-redis/src/__tests__/setup-jest.ts +8 -0
- package/packages/shopify-app-session-storage-redis/src/migrations.ts +36 -0
- package/packages/shopify-app-session-storage-redis/src/redis-connection.ts +64 -0
- package/packages/shopify-app-session-storage-redis/src/redis-migrator.ts +58 -0
- package/packages/shopify-app-session-storage-redis/src/redis.ts +167 -0
- package/packages/shopify-app-session-storage-redis/tsconfig.json +10 -0
- package/packages/shopify-app-session-storage-sqlite/CHANGELOG.md +202 -0
- package/packages/shopify-app-session-storage-sqlite/LICENSE.md +9 -0
- package/packages/shopify-app-session-storage-sqlite/README.md +25 -0
- package/packages/shopify-app-session-storage-sqlite/loom.config.ts +27 -0
- package/packages/shopify-app-session-storage-sqlite/package.json +51 -0
- package/packages/shopify-app-session-storage-sqlite/src/__tests__/setup-jest.ts +8 -0
- package/packages/shopify-app-session-storage-sqlite/src/__tests__/sqlite.test.ts +44 -0
- package/packages/shopify-app-session-storage-sqlite/src/migrations.ts +54 -0
- package/packages/shopify-app-session-storage-sqlite/src/sqlite-connection.ts +80 -0
- package/packages/shopify-app-session-storage-sqlite/src/sqlite-migrator.ts +34 -0
- package/packages/shopify-app-session-storage-sqlite/src/sqlite.ts +147 -0
- package/packages/shopify-app-session-storage-sqlite/tsconfig.json +10 -0
- package/packages/shopify-app-session-storage-test-utils/CHANGELOG.md +185 -0
- package/packages/shopify-app-session-storage-test-utils/LICENSE.md +9 -0
- package/packages/shopify-app-session-storage-test-utils/loom.config.ts +27 -0
- package/packages/shopify-app-session-storage-test-utils/package.json +48 -0
- package/packages/shopify-app-session-storage-test-utils/src/__tests__/session-test-utils.test.ts +273 -0
- package/packages/shopify-app-session-storage-test-utils/src/battery-of-tests.ts +250 -0
- package/packages/shopify-app-session-storage-test-utils/src/index.ts +2 -0
- package/packages/shopify-app-session-storage-test-utils/src/session-test-utils.ts +24 -0
- package/packages/shopify-app-session-storage-test-utils/src/utils.ts +71 -0
- package/packages/shopify-app-session-storage-test-utils/tsconfig.json +10 -0
- package/tests/setup/build.js +1 -0
- package/tests/setup/setup-jest.ts +8 -0
- package/tsconfig.base.json +41 -0
- package/tsconfig.json +19 -0
package/packages/shopify-app-remix/src/server/unauthenticated/admin/unauthenticated.admin.doc.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import {ReferenceEntityTemplateSchema} from '@shopify/generate-docs';
|
|
2
|
+
|
|
3
|
+
const data: ReferenceEntityTemplateSchema = {
|
|
4
|
+
name: 'Unauthenticated admin',
|
|
5
|
+
description: `Allows interacting with the Admin API when working outside of Shopify requests.
|
|
6
|
+
This enables apps to integrate with 3rd party services and perform background tasks.
|
|
7
|
+
|
|
8
|
+
> Caution:
|
|
9
|
+
> This function doesn't perform **any** validation and shouldn't rely on raw user input.
|
|
10
|
+
|
|
11
|
+
When using this function, consider the following:
|
|
12
|
+
|
|
13
|
+
#### Background tasks
|
|
14
|
+
|
|
15
|
+
Apps should ensure that the shop domain is authenticated when enqueueing jobs.
|
|
16
|
+
|
|
17
|
+
#### 3rd party service requests
|
|
18
|
+
|
|
19
|
+
Apps must obtain the shop domain from the 3rd party service in a secure way.`,
|
|
20
|
+
category: 'Unauthenticated',
|
|
21
|
+
type: 'object',
|
|
22
|
+
isVisualComponent: false,
|
|
23
|
+
definitions: [
|
|
24
|
+
{
|
|
25
|
+
title: 'unauthenticated.admin',
|
|
26
|
+
description: 'Creates an unauthenticated Admin context.',
|
|
27
|
+
type: 'GetUnauthenticatedAdminContext',
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
jsDocTypeExamples: ['UnauthenticatedAdminContext'],
|
|
31
|
+
related: [
|
|
32
|
+
{
|
|
33
|
+
name: 'API context',
|
|
34
|
+
subtitle: 'Interact with the Admin API.',
|
|
35
|
+
url: '/docs/api/shopify-app-remix/apis/admin-api',
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export default data;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import {Session} from '@shopify/shopify-api';
|
|
2
|
+
|
|
3
|
+
import {BasicParams} from '../../types';
|
|
4
|
+
|
|
5
|
+
export async function getOfflineSession(
|
|
6
|
+
shop: string,
|
|
7
|
+
{api, config}: BasicParams,
|
|
8
|
+
): Promise<Session | undefined> {
|
|
9
|
+
const offlineSessionId = api.session.getOfflineId(shop);
|
|
10
|
+
const session = await config.sessionStorage.loadSession(offlineSessionId);
|
|
11
|
+
|
|
12
|
+
return session;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './get-offline-session';
|
package/packages/shopify-app-remix/src/server/unauthenticated/storefront/__tests__/factory.test.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {shopifyApp} from '../../../index';
|
|
2
|
+
import {
|
|
3
|
+
TEST_SHOP,
|
|
4
|
+
setUpValidSession,
|
|
5
|
+
testConfig,
|
|
6
|
+
expectStorefrontApiClient,
|
|
7
|
+
} from '../../../__test-helpers';
|
|
8
|
+
|
|
9
|
+
describe('unauthenticated storefront context', () => {
|
|
10
|
+
it('throws an error if there is no offline session for the shop', async () => {
|
|
11
|
+
// GIVEN
|
|
12
|
+
const shopify = shopifyApp(testConfig());
|
|
13
|
+
|
|
14
|
+
// EXPECT
|
|
15
|
+
await expect(
|
|
16
|
+
shopify.unauthenticated.storefront(TEST_SHOP),
|
|
17
|
+
).rejects.toThrow();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
expectStorefrontApiClient(async () => {
|
|
21
|
+
const shopify = shopifyApp(testConfig());
|
|
22
|
+
const expectedSession = await setUpValidSession(shopify.sessionStorage, {
|
|
23
|
+
isOnline: false,
|
|
24
|
+
});
|
|
25
|
+
const {storefront, session: actualSession} =
|
|
26
|
+
await shopify.unauthenticated.storefront(TEST_SHOP);
|
|
27
|
+
|
|
28
|
+
return {storefront, expectedSession, actualSession};
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {SessionNotFoundError} from '../../errors';
|
|
2
|
+
import {BasicParams} from '../../types';
|
|
3
|
+
import {storefrontClientFactory} from '../../clients/storefront';
|
|
4
|
+
import {getOfflineSession} from '../helpers';
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
UnauthenticatedStorefrontContext,
|
|
8
|
+
GetUnauthenticatedStorefrontContext,
|
|
9
|
+
} from './types';
|
|
10
|
+
|
|
11
|
+
export function unauthenticatedStorefrontContextFactory(
|
|
12
|
+
params: BasicParams,
|
|
13
|
+
): GetUnauthenticatedStorefrontContext {
|
|
14
|
+
return async (shop: string): Promise<UnauthenticatedStorefrontContext> => {
|
|
15
|
+
const session = await getOfflineSession(shop, params);
|
|
16
|
+
|
|
17
|
+
if (!session) {
|
|
18
|
+
throw new SessionNotFoundError(
|
|
19
|
+
`Could not find a session for shop ${shop} when creating unauthenticated storefront context`,
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
session,
|
|
25
|
+
storefront: storefrontClientFactory({params, session}),
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './factory';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import {Session} from '@shopify/shopify-api';
|
|
2
|
+
|
|
3
|
+
import type {StorefrontContext} from '../../clients';
|
|
4
|
+
|
|
5
|
+
export interface UnauthenticatedStorefrontContext {
|
|
6
|
+
/**
|
|
7
|
+
* The session for the given shop.
|
|
8
|
+
*
|
|
9
|
+
* This comes from the session storage which `shopifyApp` uses to store sessions in your database of choice.
|
|
10
|
+
*
|
|
11
|
+
* This will always be an offline session. You can use this to get shop specific data.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* <caption>Using the offline session.</caption>
|
|
15
|
+
* <description>Get your app's shop-specific data using the returned offline `session` object.</description>
|
|
16
|
+
* ```ts
|
|
17
|
+
* // app/routes/**\/.ts
|
|
18
|
+
* import { LoaderFunctionArgs, json } from "@remix-run/node";
|
|
19
|
+
* import { unauthenticated } from "../shopify.server";
|
|
20
|
+
* import { getMyAppData } from "~/db/model.server";
|
|
21
|
+
*
|
|
22
|
+
* export const loader = async ({ request }: LoaderFunctionArgs) => {
|
|
23
|
+
* const shop = getShopFromExternalRequest(request);
|
|
24
|
+
* const { session } = await unauthenticated.storefront(shop);
|
|
25
|
+
* return json(await getMyAppData({shop: session.shop));
|
|
26
|
+
* };
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
session: Session;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Method for interacting with the Shopify GraphQL Storefront API for the given store.
|
|
33
|
+
*/
|
|
34
|
+
storefront: StorefrontContext;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type GetUnauthenticatedStorefrontContext = (
|
|
38
|
+
shop: string,
|
|
39
|
+
) => Promise<UnauthenticatedStorefrontContext>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import {ReferenceEntityTemplateSchema} from '@shopify/generate-docs';
|
|
2
|
+
|
|
3
|
+
const data: ReferenceEntityTemplateSchema = {
|
|
4
|
+
name: 'Unauthenticated storefront',
|
|
5
|
+
description: `Allows interacting with the Storefront API when working outside of Shopify requests.
|
|
6
|
+
This enables apps to integrate with 3rd party services and perform background tasks.
|
|
7
|
+
|
|
8
|
+
> Caution:
|
|
9
|
+
> This function doesn't perform **any** validation and shouldn't rely on raw user input.
|
|
10
|
+
|
|
11
|
+
When using this function, consider the following:
|
|
12
|
+
|
|
13
|
+
#### Background tasks
|
|
14
|
+
|
|
15
|
+
Apps should ensure that the shop domain is authenticated when enqueueing jobs.
|
|
16
|
+
|
|
17
|
+
#### 3rd party service requests
|
|
18
|
+
|
|
19
|
+
Apps must obtain the shop domain from the 3rd party service in a secure way.`,
|
|
20
|
+
category: 'Unauthenticated',
|
|
21
|
+
type: 'object',
|
|
22
|
+
isVisualComponent: false,
|
|
23
|
+
definitions: [
|
|
24
|
+
{
|
|
25
|
+
title: 'unauthenticated.storefront',
|
|
26
|
+
description: 'Creates an unauthenticated Storefront context.',
|
|
27
|
+
type: 'GetUnauthenticatedStorefrontContext',
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
jsDocTypeExamples: ['UnauthenticatedStorefrontContext', 'StorefrontContext'],
|
|
31
|
+
related: [
|
|
32
|
+
{
|
|
33
|
+
name: 'API context',
|
|
34
|
+
subtitle: 'Interact with the Storefront API.',
|
|
35
|
+
url: '/docs/api/shopify-app-remix/apis/storefront-api',
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export default data;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type {ShopifyRestResources} from '@shopify/shopify-api';
|
|
2
|
+
|
|
3
|
+
import type {GetUnauthenticatedAdminContext} from './admin/types';
|
|
4
|
+
import type {GetUnauthenticatedStorefrontContext} from './storefront/types';
|
|
5
|
+
|
|
6
|
+
export interface Unauthenticated<Resources extends ShopifyRestResources> {
|
|
7
|
+
/**
|
|
8
|
+
* Get an admin context by passing a shop
|
|
9
|
+
*
|
|
10
|
+
* **Warning** This should only be used for Requests that do not originate from Shopify.
|
|
11
|
+
* You must do your own authentication before using this method.
|
|
12
|
+
* This method throws an error if there is no session for the shop.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* <caption>Responding to a request not controlled by Shopify.</caption>
|
|
16
|
+
* ```ts
|
|
17
|
+
* // /app/shopify.server.ts
|
|
18
|
+
* import { LATEST_API_VERSION, shopifyApp } from "@shopify/shopify-app-remix/server";
|
|
19
|
+
* import { restResources } from "@shopify/shopify-api/rest/admin/2023-04";
|
|
20
|
+
*
|
|
21
|
+
* const shopify = shopifyApp({
|
|
22
|
+
* restResources,
|
|
23
|
+
* // ...etc
|
|
24
|
+
* });
|
|
25
|
+
* export default shopify;
|
|
26
|
+
* ```
|
|
27
|
+
* ```ts
|
|
28
|
+
* // /app/routes/**\/*.jsx
|
|
29
|
+
* import { LoaderFunctionArgs, json } from "@remix-run/node";
|
|
30
|
+
* import { authenticateExternal } from "~/helpers/authenticate"
|
|
31
|
+
* import shopify from "../../shopify.server";
|
|
32
|
+
*
|
|
33
|
+
* export async function loader({ request }: LoaderFunctionArgs) {
|
|
34
|
+
* const shop = await authenticateExternal(request)
|
|
35
|
+
* const {admin} = await shopify.unauthenticated.admin(shop);
|
|
36
|
+
*
|
|
37
|
+
* return json(await admin.rest.resources.Product.count({ session }));
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
admin: GetUnauthenticatedAdminContext<Resources>;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get a storefront context by passing a shop
|
|
45
|
+
*
|
|
46
|
+
* **Warning** This should only be used for Requests that do not originate from Shopify.
|
|
47
|
+
* You must do your own authentication before using this method.
|
|
48
|
+
* This method throws an error if there is no session for the shop.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* <caption>Responding to a request not controlled by Shopify</caption>
|
|
52
|
+
* ```ts
|
|
53
|
+
* // /app/routes/**\/*.jsx
|
|
54
|
+
* import { LoaderFunctionArgs, json } from "@remix-run/node";
|
|
55
|
+
* import { authenticateExternal } from "~/helpers/authenticate"
|
|
56
|
+
* import shopify from "../../shopify.server";
|
|
57
|
+
*
|
|
58
|
+
* export async function loader({ request }: LoaderFunctionArgs) {
|
|
59
|
+
* const shop = await authenticateExternal(request)
|
|
60
|
+
* const {storefront} = await shopify.unauthenticated.storefront(shop);
|
|
61
|
+
* const response = await storefront.graphql(`{blogs(first: 10) { edges { node { id } } } }`);
|
|
62
|
+
*
|
|
63
|
+
* return json(await response.json());
|
|
64
|
+
* }
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
storefront: GetUnauthenticatedStorefrontContext;
|
|
68
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const SHOPIFY_REMIX_LIBRARY_VERSION = '2.6.1';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"baseUrl": ".",
|
|
5
|
+
"outDir": "./build/ts",
|
|
6
|
+
"rootDir": "src",
|
|
7
|
+
"jsx": "react-jsx"
|
|
8
|
+
},
|
|
9
|
+
"include": ["src/**/*.ts", "src/**/*.tsx"],
|
|
10
|
+
"exclude": ["**/*.test.ts", "**/*.test.tsx", "**/test/*", "**/__tests__/*"]
|
|
11
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# @shopify/shopify-app-session-storage
|
|
2
|
+
|
|
3
|
+
## 2.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 02a8341: Updated dependency on `@shopify/shopify-api` to 9.3.1
|
|
8
|
+
- 321d6a4: Update @shopify/shopify-api to 9.3.2
|
|
9
|
+
|
|
10
|
+
## 2.1.0
|
|
11
|
+
|
|
12
|
+
### Minor Changes
|
|
13
|
+
|
|
14
|
+
- 64e0246: Update shopify-api version to 9.2.0
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- f5742c1: Updated dependency on `@shopify/shopify-api`
|
|
19
|
+
|
|
20
|
+
## 2.0.4
|
|
21
|
+
|
|
22
|
+
### Patch Changes
|
|
23
|
+
|
|
24
|
+
- b4eeb24: Improved and simplified package.json dependencies
|
|
25
|
+
- b998c30: Bump shopify-api version from 9.0.1 to 9.0.2
|
|
26
|
+
|
|
27
|
+
## 2.0.3
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- d3e4b5e: Updated the dependency on `@shopify/shopify-api`
|
|
32
|
+
|
|
33
|
+
## 2.0.2
|
|
34
|
+
|
|
35
|
+
### Patch Changes
|
|
36
|
+
|
|
37
|
+
- 3685bd4: Bump shopify-api to ^8.1.1
|
|
38
|
+
|
|
39
|
+
## 2.0.1
|
|
40
|
+
|
|
41
|
+
### Patch Changes
|
|
42
|
+
|
|
43
|
+
- 6d12840: Updating dependencies on @shopify/shopify-api
|
|
44
|
+
|
|
45
|
+
## 2.0.0
|
|
46
|
+
|
|
47
|
+
### Major Changes
|
|
48
|
+
|
|
49
|
+
- f837060: **Removed support for Node 14**
|
|
50
|
+
|
|
51
|
+
Node 14 has reached its [EOL](https://endoflife.date/nodejs), and dependencies to this package no longer work on Node 14.
|
|
52
|
+
Because of that, we can no longer support that version.
|
|
53
|
+
|
|
54
|
+
If your app is running on Node 14, you'll need to update to a more recent version before upgrading this package.
|
|
55
|
+
|
|
56
|
+
This upgrade does not require any code changes.
|
|
57
|
+
|
|
58
|
+
### Patch Changes
|
|
59
|
+
|
|
60
|
+
- a69d6fc: Updating dependency on @shopify/shopify-api to v.8.0.1
|
|
61
|
+
|
|
62
|
+
## 1.1.10
|
|
63
|
+
|
|
64
|
+
### Patch Changes
|
|
65
|
+
|
|
66
|
+
- 616388d: Updating dependency on @shopify/shopify-api to 7.7.0
|
|
67
|
+
|
|
68
|
+
## 1.1.9
|
|
69
|
+
|
|
70
|
+
### Patch Changes
|
|
71
|
+
|
|
72
|
+
- 5b862fe: Upgraded shopify-api dependency to 7.6.0
|
|
73
|
+
|
|
74
|
+
## 1.1.8
|
|
75
|
+
|
|
76
|
+
### Patch Changes
|
|
77
|
+
|
|
78
|
+
- 346b623: Updating dependency on @shopify/shopify-api
|
|
79
|
+
|
|
80
|
+
## 1.1.7
|
|
81
|
+
|
|
82
|
+
### Patch Changes
|
|
83
|
+
|
|
84
|
+
- 13b9048: Updating @shopify/shopify-api dependency to the latest version
|
|
85
|
+
|
|
86
|
+
## 1.1.6
|
|
87
|
+
|
|
88
|
+
### Patch Changes
|
|
89
|
+
|
|
90
|
+
- 32296d7: Update @shopify/shopify-api dependency to 7.5.0
|
|
91
|
+
|
|
92
|
+
## 1.1.5
|
|
93
|
+
|
|
94
|
+
### Patch Changes
|
|
95
|
+
|
|
96
|
+
- 93e9126: Updating @shopify/shopify-api dependency
|
|
97
|
+
|
|
98
|
+
## 1.1.4
|
|
99
|
+
|
|
100
|
+
### Patch Changes
|
|
101
|
+
|
|
102
|
+
- b3453ff: Bumping @shopify/shopify-api dependency to latest version
|
|
103
|
+
|
|
104
|
+
## 1.1.3
|
|
105
|
+
|
|
106
|
+
### Patch Changes
|
|
107
|
+
|
|
108
|
+
- e1d4f4f: Add @shopify/shopify-api as a peerDependencies entry for each session-storage package, to avoid API library conflicts (e.g., scopesArray.map error). Should help avoid issues like #93
|
|
109
|
+
- 1d007e8: Bumps [@shopify/shopify-api](https://github.com/Shopify/shopify-api-js) from 7.0.0 to 7.1.0. See `@shopify/shopify-api`'s [changelog](https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/CHANGELOG.md) for more details.
|
|
110
|
+
|
|
111
|
+
## 1.1.2
|
|
112
|
+
|
|
113
|
+
### Patch Changes
|
|
114
|
+
|
|
115
|
+
- e4f3415: Bump @shopify/shopify-api from 6.2.0 to 7.0.0. See [changelog](https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/CHANGELOG.md) for details.
|
|
116
|
+
|
|
117
|
+
## 1.1.1
|
|
118
|
+
|
|
119
|
+
### Patch Changes
|
|
120
|
+
|
|
121
|
+
- 97346b3: Fix #132: mysql migrator was unable to detect already applied migrations
|
|
122
|
+
|
|
123
|
+
## 1.1.0
|
|
124
|
+
|
|
125
|
+
### Minor Changes
|
|
126
|
+
|
|
127
|
+
- becc305: Migrations capabilities that can handle persistence changes for all session storage implementations
|
|
128
|
+
|
|
129
|
+
### Patch Changes
|
|
130
|
+
|
|
131
|
+
- b6501b0: Bump typescript to 4.9.5
|
|
132
|
+
|
|
133
|
+
## 1.0.2
|
|
134
|
+
|
|
135
|
+
### Patch Changes
|
|
136
|
+
|
|
137
|
+
- 222b755: Updating @shopify/shopify-api to v6.1.0
|
|
138
|
+
|
|
139
|
+
## 1.0.1
|
|
140
|
+
|
|
141
|
+
### Patch Changes
|
|
142
|
+
|
|
143
|
+
- 866b50c: Update dependencies on shopify-api v6.0.2
|
|
144
|
+
|
|
145
|
+
## 1.0.0
|
|
146
|
+
|
|
147
|
+
### Major Changes
|
|
148
|
+
|
|
149
|
+
- Initial public release of @shopify/shopify-app-session-storage
|
|
@@ -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.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Session Storage
|
|
2
|
+
|
|
3
|
+
This folder contains the `SessionStorage` interface that the individual [packages](../) for most common databases implement.
|
|
4
|
+
|
|
5
|
+
See the [`session-storage.ts`](./src/types.ts) file for the methods that need to be implemented, the params they accept and values they return.
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# Implementing session storage
|
|
2
|
+
|
|
3
|
+
A custom implementaton of `SessionStorage` will need to implement the following methods, as documented by the abstract [`SessionStorage`](./src/types.ts) class:
|
|
4
|
+
|
|
5
|
+
| Method | Parameter type | Return value | Description |
|
|
6
|
+
| :------------------: | :------------: | :-----------------------------: | ------------------------------------------------------------------------------------------------------------- |
|
|
7
|
+
| `storeSession` | `Session` | `Promise<boolean>` | Creates or updates the given session in storage; returns `true` if successfully stored, `false` otherwise |
|
|
8
|
+
| `loadSession` | `string` | `Promise<Session \| undefined>` | Returns a `Session` matching the given session id from storage, or returns `undefined` if not found |
|
|
9
|
+
| `deleteSession` | `string` | `Promise<boolean>` | Deletes a session matching the given session id from storage; returns `true` if successful, `false` otherwise |
|
|
10
|
+
| `deleteSessions` | `string[]` | `Promise<boolean>` | Deletes each of the given session ids (array) from storage; returns `true` if successful, `false` otherwise |
|
|
11
|
+
| `findSessionsByShop` | `string` | `Promise<Session[]>` | Returns an array of `Session`s for the given shop domain; returns an empty array of none found |
|
|
12
|
+
|
|
13
|
+
## Example
|
|
14
|
+
|
|
15
|
+
As an example of an implementation, the following saves sessions to a text file, stored in CSV format.
|
|
16
|
+
|
|
17
|
+
> **Note 1**: This is for the purposes of example only - this implementation would not be suitable for production as it would be too inefficient nor would it scale beyond a single app instance.
|
|
18
|
+
|
|
19
|
+
> **Note 2**: The format of a line in the csv file is a list of property name/property value pairs, e.g.
|
|
20
|
+
|
|
21
|
+
```csv
|
|
22
|
+
id,this-is-a-session-id,shop,my-test-shop.myshopify.com,state,150801840581085,isOnline,true,...
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import fs from 'fs';
|
|
27
|
+
import {Session} from '@shopify/shopify-api';
|
|
28
|
+
import {SessionStorage} from '@shopify/shopify-app-session-storage';
|
|
29
|
+
|
|
30
|
+
export class CsvSessionStorage implements SessionStorage {
|
|
31
|
+
constructor(private filename: string) {
|
|
32
|
+
super();
|
|
33
|
+
|
|
34
|
+
this.init();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public async storeSession(session: Session): Promise<boolean> {
|
|
38
|
+
try {
|
|
39
|
+
const lines = this.readLines();
|
|
40
|
+
|
|
41
|
+
let found = false;
|
|
42
|
+
|
|
43
|
+
// process each line
|
|
44
|
+
for (let i = 0; i < lines.length; i++) {
|
|
45
|
+
// split the line by comma into columns
|
|
46
|
+
const columns = lines[i].split(',');
|
|
47
|
+
// check if the id column matches (second column is value of 'id')
|
|
48
|
+
if (columns[1] === session.id) {
|
|
49
|
+
// if the session id already exists, update the line
|
|
50
|
+
lines[i] = session.toPropertyArray().join(',');
|
|
51
|
+
found = true;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (!found) {
|
|
57
|
+
// if the session id does not exist, add a new line
|
|
58
|
+
lines.push(session.toPropertyArray().join(','));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
this.writeLines(lines);
|
|
63
|
+
return true;
|
|
64
|
+
} catch (err) {
|
|
65
|
+
// error on write
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
} catch (err) {
|
|
69
|
+
// error on read
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public async loadSession(id: string): Promise<Session | undefined> {
|
|
75
|
+
try {
|
|
76
|
+
const lines = this.readLines();
|
|
77
|
+
|
|
78
|
+
// process each line
|
|
79
|
+
for (const line of lines) {
|
|
80
|
+
// split the line by comma into columns
|
|
81
|
+
const columns = line.split(',');
|
|
82
|
+
// check if the id column matches (second column is value of 'id')
|
|
83
|
+
if (columns[1] === id) {
|
|
84
|
+
// if the session id already exists, convert to session and return
|
|
85
|
+
return Session.fromPropertyArray(
|
|
86
|
+
this.columnsToPropertyArray(columns),
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return undefined;
|
|
92
|
+
} catch (err) {
|
|
93
|
+
// error on read
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public async deleteSession(id: string): Promise<boolean> {
|
|
99
|
+
try {
|
|
100
|
+
const lines = this.readLines();
|
|
101
|
+
|
|
102
|
+
// process each line
|
|
103
|
+
for (let i = 0; i < lines.length; i++) {
|
|
104
|
+
// split the line by comma into columns
|
|
105
|
+
const columns = lines[i].split(',');
|
|
106
|
+
// check if the id column matches (second column is value of 'id')
|
|
107
|
+
if (columns[1] === id) {
|
|
108
|
+
// if the session id matches, remove the line
|
|
109
|
+
lines.splice(i, 1);
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
this.writeLines(lines);
|
|
116
|
+
return true;
|
|
117
|
+
} catch (err) {
|
|
118
|
+
// error on write
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
} catch (err) {
|
|
122
|
+
// error on read
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
public async deleteSessions(ids: string[]): Promise<boolean> {
|
|
128
|
+
try {
|
|
129
|
+
const lines = this.readLines();
|
|
130
|
+
|
|
131
|
+
// process each line
|
|
132
|
+
for (let i = 0; i < lines.length; i++) {
|
|
133
|
+
// split the line by comma into columns
|
|
134
|
+
const columns = lines[i].split(',');
|
|
135
|
+
// check if the id column matches (second column is value of 'id')
|
|
136
|
+
if (ids.includes(columns[1])) {
|
|
137
|
+
// if the session id already exists, remove the line
|
|
138
|
+
lines.splice(i, 1);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
this.writeLines(lines);
|
|
144
|
+
return true;
|
|
145
|
+
} catch (err) {
|
|
146
|
+
// error on write
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
} catch (err) {
|
|
150
|
+
// error on read
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
public async findSessionsByShop(shop: string): Promise<Session[]> {
|
|
156
|
+
try {
|
|
157
|
+
const lines = this.readLines();
|
|
158
|
+
|
|
159
|
+
const sessions: Session[] = [];
|
|
160
|
+
|
|
161
|
+
// process each line
|
|
162
|
+
for (const line of lines) {
|
|
163
|
+
// split the line by comma into columns
|
|
164
|
+
const columns = line.split(',');
|
|
165
|
+
// check if the shop column matches (fourth column is value of 'shop')
|
|
166
|
+
if (columns[3] === shop) {
|
|
167
|
+
// if the shop matches, convert to session and add to array
|
|
168
|
+
sessions.push(
|
|
169
|
+
Session.fromPropertyArray(this.columnsToPropertyArray(columns)),
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return sessions;
|
|
175
|
+
} catch (err) {
|
|
176
|
+
// error on read
|
|
177
|
+
return [];
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
private init() {
|
|
182
|
+
if (!fs.existsSync(this.filename)) {
|
|
183
|
+
fs.writeFileSync(this.filename, '');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
private readLines(): string[] {
|
|
188
|
+
// read contents of the file
|
|
189
|
+
const data = fs.readFileSync(this.filename, {
|
|
190
|
+
encoding: 'utf8',
|
|
191
|
+
flag: 'r',
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
// split the contents by new line
|
|
195
|
+
return data.split(/\r?\n/);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
private writeLines(lines: string[]) {
|
|
199
|
+
// write the lines back to the file
|
|
200
|
+
fs.writeFileSync(this.filename, lines.join('\n'), {
|
|
201
|
+
encoding: 'utf8',
|
|
202
|
+
flag: 'w',
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
private columnsToPropertyArray(columns: string[]): [string, string][] {
|
|
207
|
+
const propertyArray: [string, string][] = [];
|
|
208
|
+
for (let i = 0; i < columns.length; i += 2) {
|
|
209
|
+
propertyArray.push([columns[i], columns[i + 1]]);
|
|
210
|
+
}
|
|
211
|
+
return propertyArray;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
```
|