@shopify/shopify-app-remix 3.8.3 → 3.8.5
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/dist/cjs/react/components/AppProvider/AppProvider.js.map +1 -1
- package/dist/cjs/react/components/AppProxyForm/AppProxyForm.js.map +1 -1
- package/dist/cjs/react/components/AppProxyLink/AppProxyLink.js.map +1 -1
- package/dist/cjs/react/components/AppProxyProvider/AppProxyProvider.js.map +1 -1
- package/dist/cjs/react/components/RemixPolarisLink.js.map +1 -1
- package/dist/cjs/react/const.js.map +1 -1
- package/dist/cjs/server/adapters/node/index.js.map +1 -1
- package/dist/cjs/server/adapters/vercel/index.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/authenticate.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/billing/cancel.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/billing/check.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/billing/create-usage-record.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/billing/helpers.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/billing/request.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/billing/require.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/billing/update-usage-subscription-capped-amount.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/begin-auth.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/create-admin-api-context.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/handle-client-error.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/redirect-to-auth-page.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/redirect-to-bounce-page.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/redirect-to-install-page.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/redirect-with-exitiframe.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/redirect.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/render-app-bridge.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/trigger-after-auth-hook.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/validate-redirect-url.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/helpers/validate-shop-and-host-params.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/scope/client/fetch-scopes-details.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/scope/client/revoke-scopes.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/scope/factory.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/scope/query.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/scope/request.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/scope/revoke.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/strategies/auth-code-flow.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/strategies/merchant-custom-app.js.map +1 -1
- package/dist/cjs/server/authenticate/admin/strategies/token-exchange.js.map +1 -1
- package/dist/cjs/server/authenticate/const.js.map +1 -1
- package/dist/cjs/server/authenticate/flow/authenticate.js.map +1 -1
- package/dist/cjs/server/authenticate/fulfillment-service/authenticate.js.map +1 -1
- package/dist/cjs/server/authenticate/helpers/add-response-headers.js.map +1 -1
- package/dist/cjs/server/authenticate/helpers/app-bridge-url.js.map +1 -1
- package/dist/cjs/server/authenticate/helpers/create-or-load-offline-session.js.map +1 -1
- package/dist/cjs/server/authenticate/helpers/ensure-cors-headers.js.map +1 -1
- package/dist/cjs/server/authenticate/helpers/get-session-token-header.js.map +1 -1
- package/dist/cjs/server/authenticate/helpers/get-shop-from-request.js.map +1 -1
- package/dist/cjs/server/authenticate/helpers/idempotent-promise-handler.js.map +1 -1
- package/dist/cjs/server/authenticate/helpers/invalidate-access-token.js.map +1 -1
- package/dist/cjs/server/authenticate/helpers/reject-bot-request.js.map +1 -1
- package/dist/cjs/server/authenticate/helpers/respond-to-invalid-session-token.js.map +1 -1
- package/dist/cjs/server/authenticate/helpers/respond-to-options-request.js.map +1 -1
- package/dist/cjs/server/authenticate/helpers/validate-session-token.js.map +1 -1
- package/dist/cjs/server/authenticate/login/login.js.map +1 -1
- package/dist/cjs/server/authenticate/public/appProxy/authenticate.js.map +1 -1
- package/dist/cjs/server/authenticate/public/checkout/authenticate.js.map +1 -1
- package/dist/cjs/server/authenticate/public/customer-account/authenticate.js.map +1 -1
- package/dist/cjs/server/authenticate/public/extension/authenticate.js.map +1 -1
- package/dist/cjs/server/authenticate/public/factory.js.map +1 -1
- package/dist/cjs/server/authenticate/public/pos/authenticate.js.map +1 -1
- package/dist/cjs/server/authenticate/webhooks/authenticate.js.map +1 -1
- package/dist/cjs/server/authenticate/webhooks/register.js.map +1 -1
- package/dist/cjs/server/boundary/error.js.map +1 -1
- package/dist/cjs/server/boundary/headers.js.map +1 -1
- package/dist/cjs/server/boundary/index.js.map +1 -1
- package/dist/cjs/server/clients/admin/factory.js.map +1 -1
- package/dist/cjs/server/clients/admin/graphql.js.map +1 -1
- package/dist/cjs/server/clients/admin/rest.js.map +1 -1
- package/dist/cjs/server/clients/storefront/factory.js.map +1 -1
- package/dist/cjs/server/errors.js.map +1 -1
- package/dist/cjs/server/future/flags.js.map +1 -1
- package/dist/cjs/server/index.js.map +1 -1
- package/dist/cjs/server/override-logger.js.map +1 -1
- package/dist/cjs/server/shopify-app.js.map +1 -1
- package/dist/cjs/server/test-helpers/test-config.js.map +1 -1
- package/dist/cjs/server/types.js.map +1 -1
- package/dist/cjs/server/unauthenticated/admin/factory.js.map +1 -1
- package/dist/cjs/server/unauthenticated/storefront/factory.js.map +1 -1
- package/dist/cjs/server/version.js +1 -1
- package/dist/cjs/server/version.js.map +1 -1
- package/dist/cjs/session-storage/shopify-app-session-storage-memory/dist/esm/memory.js.map +1 -1
- package/dist/esm/react/components/AppProvider/AppProvider.mjs.map +1 -1
- package/dist/esm/react/components/AppProxyForm/AppProxyForm.mjs.map +1 -1
- package/dist/esm/react/components/AppProxyLink/AppProxyLink.mjs.map +1 -1
- package/dist/esm/react/components/AppProxyProvider/AppProxyProvider.mjs.map +1 -1
- package/dist/esm/react/components/RemixPolarisLink.mjs.map +1 -1
- package/dist/esm/react/const.mjs.map +1 -1
- package/dist/esm/server/adapters/node/index.mjs.map +1 -1
- package/dist/esm/server/adapters/vercel/index.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/authenticate.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/billing/cancel.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/billing/check.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/billing/create-usage-record.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/billing/helpers.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/billing/request.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/billing/require.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/billing/update-usage-subscription-capped-amount.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/begin-auth.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/create-admin-api-context.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/handle-client-error.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/redirect-to-auth-page.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/redirect-to-bounce-page.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/redirect-to-install-page.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/redirect-with-exitiframe.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/redirect.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/render-app-bridge.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/trigger-after-auth-hook.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/validate-redirect-url.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/helpers/validate-shop-and-host-params.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/scope/client/fetch-scopes-details.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/scope/client/revoke-scopes.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/scope/factory.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/scope/query.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/scope/request.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/scope/revoke.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/strategies/auth-code-flow.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/strategies/merchant-custom-app.mjs.map +1 -1
- package/dist/esm/server/authenticate/admin/strategies/token-exchange.mjs.map +1 -1
- package/dist/esm/server/authenticate/const.mjs.map +1 -1
- package/dist/esm/server/authenticate/flow/authenticate.mjs.map +1 -1
- package/dist/esm/server/authenticate/fulfillment-service/authenticate.mjs.map +1 -1
- package/dist/esm/server/authenticate/helpers/add-response-headers.mjs.map +1 -1
- package/dist/esm/server/authenticate/helpers/app-bridge-url.mjs.map +1 -1
- package/dist/esm/server/authenticate/helpers/create-or-load-offline-session.mjs.map +1 -1
- package/dist/esm/server/authenticate/helpers/ensure-cors-headers.mjs.map +1 -1
- package/dist/esm/server/authenticate/helpers/get-session-token-header.mjs.map +1 -1
- package/dist/esm/server/authenticate/helpers/get-shop-from-request.mjs.map +1 -1
- package/dist/esm/server/authenticate/helpers/idempotent-promise-handler.mjs.map +1 -1
- package/dist/esm/server/authenticate/helpers/invalidate-access-token.mjs.map +1 -1
- package/dist/esm/server/authenticate/helpers/reject-bot-request.mjs.map +1 -1
- package/dist/esm/server/authenticate/helpers/respond-to-invalid-session-token.mjs.map +1 -1
- package/dist/esm/server/authenticate/helpers/respond-to-options-request.mjs.map +1 -1
- package/dist/esm/server/authenticate/helpers/validate-session-token.mjs.map +1 -1
- package/dist/esm/server/authenticate/login/login.mjs.map +1 -1
- package/dist/esm/server/authenticate/public/appProxy/authenticate.mjs.map +1 -1
- package/dist/esm/server/authenticate/public/checkout/authenticate.mjs.map +1 -1
- package/dist/esm/server/authenticate/public/customer-account/authenticate.mjs.map +1 -1
- package/dist/esm/server/authenticate/public/extension/authenticate.mjs.map +1 -1
- package/dist/esm/server/authenticate/public/factory.mjs.map +1 -1
- package/dist/esm/server/authenticate/public/pos/authenticate.mjs.map +1 -1
- package/dist/esm/server/authenticate/webhooks/authenticate.mjs.map +1 -1
- package/dist/esm/server/authenticate/webhooks/register.mjs.map +1 -1
- package/dist/esm/server/boundary/error.mjs.map +1 -1
- package/dist/esm/server/boundary/headers.mjs.map +1 -1
- package/dist/esm/server/boundary/index.mjs.map +1 -1
- package/dist/esm/server/clients/admin/factory.mjs.map +1 -1
- package/dist/esm/server/clients/admin/graphql.mjs.map +1 -1
- package/dist/esm/server/clients/admin/rest.mjs.map +1 -1
- package/dist/esm/server/clients/storefront/factory.mjs.map +1 -1
- package/dist/esm/server/errors.mjs.map +1 -1
- package/dist/esm/server/future/flags.mjs.map +1 -1
- package/dist/esm/server/index.mjs.map +1 -1
- package/dist/esm/server/override-logger.mjs.map +1 -1
- package/dist/esm/server/shopify-app.mjs.map +1 -1
- package/dist/esm/server/test-helpers/test-config.mjs.map +1 -1
- package/dist/esm/server/types.mjs.map +1 -1
- package/dist/esm/server/unauthenticated/admin/factory.mjs.map +1 -1
- package/dist/esm/server/unauthenticated/storefront/factory.mjs.map +1 -1
- package/dist/esm/server/version.mjs +1 -1
- package/dist/esm/server/version.mjs.map +1 -1
- package/dist/esm/session-storage/shopify-app-session-storage-memory/dist/esm/memory.mjs.map +1 -1
- package/dist/ts/server/authenticate/admin/billing/cancel.d.ts.map +1 -1
- package/dist/ts/server/authenticate/admin/billing/check.d.ts.map +1 -1
- package/dist/ts/server/authenticate/admin/billing/create-usage-record.d.ts.map +1 -1
- package/dist/ts/server/authenticate/admin/billing/request.d.ts.map +1 -1
- package/dist/ts/server/authenticate/admin/billing/require.d.ts.map +1 -1
- package/dist/ts/server/authenticate/admin/billing/update-usage-subscription-capped-amount.d.ts.map +1 -1
- package/dist/ts/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.d.ts.map +1 -1
- package/dist/ts/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.d.ts.map +1 -1
- package/dist/ts/server/authenticate/admin/helpers/redirect-to-bounce-page.d.ts.map +1 -1
- package/dist/ts/server/authenticate/admin/scope/request.d.ts.map +1 -1
- package/dist/ts/server/authenticate/admin/scope/revoke.d.ts.map +1 -1
- package/dist/ts/server/authenticate/admin/scope/types.d.ts +25 -59
- package/dist/ts/server/authenticate/admin/scope/types.d.ts.map +1 -1
- package/dist/ts/server/authenticate/login/login.d.ts.map +1 -1
- package/dist/ts/server/authenticate/webhooks/register.d.ts.map +1 -1
- package/dist/ts/server/unauthenticated/admin/factory.d.ts.map +1 -1
- package/dist/ts/server/version.d.ts +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../../../src/server/types.ts"],"sourcesContent":[null],"names":["AppDistribution","LoginErrorType"],"mappings":";;AAmCA;AACA;AACYA;AAAZ,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,UAAA,CAAA,GAAA,WAAsB;AACtB,IAAA,eAAA,CAAA,gBAAA,CAAA,GAAA,iBAAkC;AAClC,IAAA,eAAA,CAAA,cAAA,CAAA,GAAA,eAA8B;AAChC,CAAC,EAJWA,uBAAe,KAAfA,uBAAe,GAI1B,EAAA,CAAA,CAAA;AAMWC;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,aAAA,CAAA,GAAA,cAA4B;AAC5B,IAAA,cAAA,CAAA,aAAA,CAAA,GAAA,cAA4B;AAC9B,CAAC,EAHWA,sBAAc,KAAdA,sBAAc,GAGzB,EAAA,CAAA,CAAA;;"}
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../../src/server/types.ts"],"sourcesContent":["import {\n RegisterReturn,\n Shopify,\n ShopifyRestResources,\n} from '@shopify/shopify-api';\nimport {SessionStorage} from '@shopify/shopify-app-session-storage';\n\nimport type {AuthenticateAdmin} from './authenticate/admin/types';\nimport type {AuthenticateFlow} from './authenticate/flow/types';\nimport {AuthenticateFulfillmentService} from './authenticate/fulfillment-service/types';\nimport type {AuthenticatePublic} from './authenticate/public/types';\nimport type {\n AuthenticateWebhook,\n RegisterWebhooksOptions,\n} from './authenticate/webhooks/types';\nimport type {AppConfig, AppConfigArg} from './config-types';\nimport type {\n ApiConfigWithFutureFlags,\n ApiFutureFlags,\n FutureFlagOptions,\n} from './future/flags';\nimport type {Unauthenticated} from './unauthenticated/types';\n\nexport interface BasicParams<\n Future extends FutureFlagOptions = FutureFlagOptions,\n> {\n api: Shopify<\n ApiConfigWithFutureFlags<Future>,\n ShopifyRestResources,\n ApiFutureFlags<Future>\n >;\n config: AppConfig;\n logger: Shopify['logger'];\n}\n\n// eslint-disable-next-line no-warning-comments\n// TODO: Use this enum to replace the isCustomStoreApp config option in shopify-api-js\nexport enum AppDistribution {\n AppStore = 'app_store',\n SingleMerchant = 'single_merchant',\n ShopifyAdmin = 'shopify_admin',\n}\n\ntype RegisterWebhooks = (\n options: RegisterWebhooksOptions,\n) => Promise<RegisterReturn | void>;\n\nexport enum LoginErrorType {\n MissingShop = 'MISSING_SHOP',\n InvalidShop = 'INVALID_SHOP',\n}\n\nexport interface LoginError {\n shop?: LoginErrorType;\n}\n\ntype Login = (request: Request) => Promise<LoginError | never>;\n\ntype AddDocumentResponseHeaders = (request: Request, headers: Headers) => void;\n\ntype RestResourcesType<Config extends AppConfigArg> =\n Config['restResources'] extends ShopifyRestResources\n ? Config['restResources']\n : ShopifyRestResources;\n\ntype SessionStorageType<Config extends AppConfigArg> =\n Config['sessionStorage'] extends SessionStorage\n ? Config['sessionStorage']\n : SessionStorage;\n\ninterface Authenticate<Config extends AppConfigArg> {\n /**\n * Authenticate an admin Request and get back an authenticated admin context. Use the authenticated admin context to interact with Shopify.\n *\n * Examples of when to use this are requests from your app's UI, or requests from admin extensions.\n *\n * If there is no session for the Request, this will redirect the merchant to correct auth flows.\n *\n * @example\n * <caption>Authenticating a request for an embedded app.</caption>\n * ```ts\n * // /app/routes/**\\/*.jsx\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../../shopify.server\";\n *\n * export async function loader({ request }: LoaderFunctionArgs) {\n * const {admin, session, sessionToken, billing} = authenticate.admin(request);\n * const response = await admin.graphql(`{ shop { name } }`)\n *\n * return json(await response.json());\n * }\n * ```\n * ```ts\n * // /app/shopify.server.ts\n * import { LATEST_API_VERSION, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n *\n * const shopify = shopifyApp({\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n admin: AuthenticateAdmin<Config, RestResourcesType<Config>>;\n\n /**\n * Authenticate a Flow extension Request and get back an authenticated context, containing an admin context to access\n * the API, and the payload of the request.\n *\n * If there is no session for the Request, this will return an HTTP 400 error.\n *\n * Note that this will always be a POST request.\n *\n * @example\n * <caption>Authenticating a Flow extension request.</caption>\n * ```ts\n * // /app/routes/**\\/*.jsx\n * import { ActionFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const {admin, session, payload} = authenticate.flow(request);\n *\n * // Perform flow extension logic\n *\n * // Return a 200 response\n * return null;\n * }\n * ```\n * ```ts\n * // /app/shopify.server.ts\n * import { LATEST_API_VERSION, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n *\n * const shopify = shopifyApp({\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n flow: AuthenticateFlow<Config, RestResourcesType<Config>>;\n\n /**\n * Authenticate a request from a fulfillment service and get back an authenticated context.\n *\n * @example\n * <caption>Shopify session for the fulfillment service request.</caption>\n * <description>Use the session associated with this request to use the Admin GraphQL API </description>\n * ```ts\n * // /app/routes/fulfillment_order_notification.ts\n * import { ActionFunctionArgs } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { admin, session } = await authenticate.fulfillmentService(request);\n *\n * console.log(session.id)\n *\n * return new Response();\n * }\n * ```\n * */\n fulfillmentService: AuthenticateFulfillmentService<\n Config,\n RestResourcesType<Config>\n >;\n\n /**\n * Authenticate a public request and get back a session token.\n *\n * @example\n * <caption>Authenticating a request from a checkout extension</caption>\n *\n * ```ts\n * // /app/routes/api/checkout.jsx\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../../shopify.server\";\n * import { getWidgets } from \"~/db/widgets\";\n *\n * export async function loader({ request }: LoaderFunctionArgs) {\n * const {sessionToken} = authenticate.public.checkout(request);\n *\n * return json(await getWidgets(sessionToken));\n * }\n * ```\n */\n public: AuthenticatePublic<Config>;\n\n /**\n * Authenticate a Shopify webhook request, get back an authenticated admin context and details on the webhook request\n * \n * @example\n * <caption>Authenticating a webhook request</caption>\n *\n * ```ts\n * // app/routes/webhooks.ts\n * import { ActionFunctionArgs } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n * import db from \"../db.server\";\n *\n * export const action = async ({ request }: ActionFunctionArgs) => {\n * const { topic, shop, session, payload } = await authenticate.webhook(request);\n * \n * // Webhook requests can trigger after an app is uninstalled\n * // If the app is already uninstalled, the session may be undefined.\n * if (!session) {\n * throw new Response();\n * }\n * \n * // Handle the webhook\n * console.log(`${TOPIC} webhook received with payload:`, JSON.stringify(payload))\n *\n * throw new Response();\n * };\n * ```\n * \n * @example\n * <caption>Registering app-specific webhooks (Recommended)</caption>\n * ```toml\n * # shopify.app.toml\n * [webhooks]\n * api_version = \"2024-07\"\n\n * [[webhooks.subscriptions]]\n * topics = [\"products/create\"]\n * uri = \"/webhooks/products/create\"\n * \n * ```\n * \n * @example\n * <caption>Registering shop-specific webhooks.</caption>\n * <description>In many cases you won't need this. Please see: [https://shopify.dev/docs/apps/build/webhooks/subscribe#app-specific-vs-shop-specific-subscriptions](https://shopify.dev/docs/apps/build/webhooks/subscribe#app-specific-vs-shop-specific-subscriptions)\n * </description>\n * ```ts\n * // app/shopify.server.ts\n * import { DeliveryMethod, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n *\n * const shopify = shopifyApp({\n * webhooks: {\n * PRODUCTS_CREATE: {\n * deliveryMethod: DeliveryMethod.Http,\n * callbackUrl: \"/webhooks/products/create\",\n * },\n * },\n * hooks: {\n * afterAuth: async ({ session }) => {\n * // Register webhooks for the shop\n * // In this example, every shop will have these webhooks\n * // You could wrap this in some custom shop specific conditional logic if needed\n * shopify.registerWebhooks({ session });\n * },\n * },\n * // ...etc\n * });\n * ```\n */\n webhook: AuthenticateWebhook<Config, RestResourcesType<Config>, string>;\n}\n\nexport interface ShopifyAppBase<Config extends AppConfigArg> {\n /**\n * The `SessionStorage` instance you passed in as a config option.\n *\n * @example\n * <caption>Storing sessions with Prisma.</caption>\n * <description>Import the `@shopify/shopify-app-session-storage-prisma` package to store sessions in your Prisma database.</description>\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { PrismaSessionStorage } from \"@shopify/shopify-app-session-storage-prisma\";\n * import prisma from \"~/db.server\";\n *\n * const shopify = shopifyApp({\n * sessionStorage: new PrismaSessionStorage(prisma),\n * // ...etc\n * })\n *\n * // shopify.sessionStorage is an instance of PrismaSessionStorage\n * ```\n */\n sessionStorage?: SessionStorageType<Config>;\n\n /**\n * Adds the required Content Security Policy headers for Shopify apps to the given Headers object.\n *\n * {@link https://shopify.dev/docs/apps/store/security/iframe-protection}\n *\n * @example\n * <caption>Return headers on all requests.</caption>\n * <description>Add headers to all HTML requests by calling `shopify.addDocumentResponseHeaders` in `entry.server.tsx`.</description>\n *\n * ```\n * // ~/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n *\n * const shopify = shopifyApp({\n * // ...etc\n * });\n * export default shopify;\n * export const addDocumentResponseheaders = shopify.addDocumentResponseheaders;\n * ```\n *\n * ```ts\n * // entry.server.tsx\n * import { addDocumentResponseHeaders } from \"~/shopify.server\";\n *\n * export default function handleRequest(\n * request: Request,\n * responseStatusCode: number,\n * responseHeaders: Headers,\n * remixContext: EntryContext\n * ) {\n * const markup = renderToString(\n * <RemixServer context={remixContext} url={request.url} />\n * );\n *\n * responseHeaders.set(\"Content-Type\", \"text/html\");\n * addDocumentResponseHeaders(request, responseHeaders);\n *\n * return new Response(\"<!DOCTYPE html>\" + markup, {\n * status: responseStatusCode,\n * headers: responseHeaders,\n * });\n * }\n * ```\n */\n addDocumentResponseHeaders: AddDocumentResponseHeaders;\n\n /**\n * Register shop-specific webhook subscriptions using the Admin GraphQL API.\n *\n * In many cases defining app-specific webhooks in the `shopify.app.toml` will be sufficient and easier to manage. Please see:\n *\n * {@link https://shopify.dev/docs/apps/build/webhooks/subscribe#app-specific-vs-shop-specific-subscriptions}\n *\n * You should only use this if you need shop-specific webhooks.\n *\n * @example\n * <caption>Registering shop-specific webhooks after install</caption>\n * <description>Trigger the registration to create the shop-specific webhook subscriptions after a merchant installs your app using the `afterAuth` hook. Learn more about [subscribing to webhooks.](https://shopify.dev/docs/api/shopify-app-remix/v3/guide-webhooks)</description>\n * ```ts\n * // app/shopify.server.ts\n * import { DeliveryMethod, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n *\n * const shopify = shopifyApp({\n * webhooks: {\n * PRODUCTS_CREATE: {\n * deliveryMethod: DeliveryMethod.Http,\n * callbackUrl: \"/webhooks/products/create\",\n * },\n * },\n * hooks: {\n * afterAuth: async ({ session }) => {\n * // Register webhooks for the shop\n * // In this example, every shop will have these webhooks\n * // You could wrap this in some custom shop specific conditional logic if needed\n * shopify.registerWebhooks({ session });\n * },\n * },\n * // ...etc\n * });\n * ```\n */\n registerWebhooks: RegisterWebhooks;\n\n /**\n * Ways to authenticate requests from different surfaces across Shopify.\n *\n * @example\n * <caption>Authenticate Shopify requests.</caption>\n * <description>Use the functions in `authenticate` to validate requests coming from Shopify.</description>\n * ```ts\n * // /app/shopify.server.ts\n * import { LATEST_API_VERSION, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n *\n * const shopify = shopifyApp({\n * // ...etc\n * });\n * export default shopify;\n * ```\n * ```ts\n * // /app/routes/**\\/*.jsx\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import shopify from \"../../shopify.server\";\n *\n * export async function loader({ request }: LoaderFunctionArgs) {\n * const {admin, session, sessionToken, billing} = shopify.authenticate.admin(request);\n * const response = admin.graphql(`{ shop { name } }`)\n *\n * return json(await response.json());\n * }\n * ```\n */\n authenticate: Authenticate<Config>;\n\n /**\n * Ways to get Contexts from requests that do not originate from Shopify.\n *\n * @example\n * <caption>Using unauthenticated contexts.</caption>\n * <description>Create contexts for requests that don't come from Shopify.</description>\n * ```ts\n * // /app/shopify.server.ts\n * import { LATEST_API_VERSION, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n *\n * const shopify = shopifyApp({\n * // ...etc\n * });\n * export default shopify;\n * ```\n * ```ts\n * // /app/routes/**\\/*.jsx\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticateExternal } from \"~/helpers/authenticate\"\n * import shopify from \"../../shopify.server\";\n *\n * export async function loader({ request }: LoaderFunctionArgs) {\n * const shop = await authenticateExternal(request)\n * const {admin} = await shopify.unauthenticated.admin(shop);\n * const response = admin.graphql(`{ shop { currencyCode } }`)\n *\n * return json(await response.json());\n * }\n * ```\n */\n unauthenticated: Unauthenticated<Config, RestResourcesType<Config>>;\n}\n\nexport interface ShopifyAppLogin {\n /**\n * Log a merchant in, and redirect them to the app root. Will redirect the merchant to authentication if a shop is\n * present in the URL search parameters or form data.\n *\n * This function won't be present when the `distribution` config option is set to `AppDistribution.ShopifyAdmin`,\n * because Admin apps aren't allowed to show a login page.\n *\n * @example\n * <caption>Creating a login page.</caption>\n * <description>Use `shopify.login` to create a login form, in a route that can handle GET and POST requests.</description>\n * ```ts\n * // /app/shopify.server.ts\n * import { LATEST_API_VERSION, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n *\n * const shopify = shopifyApp({\n * // ...etc\n * });\n * export default shopify;\n * ```\n * ```ts\n * // /app/routes/auth/login.tsx\n * import shopify from \"../../shopify.server\";\n *\n * export async function loader({ request }: LoaderFunctionArgs) {\n * const errors = shopify.login(request);\n *\n * return json(errors);\n * }\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const errors = shopify.login(request);\n *\n * return json(errors);\n * }\n *\n * export default function Auth() {\n * const actionData = useActionData<typeof action>();\n * const [shop, setShop] = useState(\"\");\n *\n * return (\n * <Page>\n * <Card>\n * <Form method=\"post\">\n * <FormLayout>\n * <Text variant=\"headingMd\" as=\"h2\">\n * Login\n * </Text>\n * <TextField\n * type=\"text\"\n * name=\"shop\"\n * label=\"Shop domain\"\n * helpText=\"e.g: my-shop-domain.myshopify.com\"\n * value={shop}\n * onChange={setShop}\n * autoComplete=\"on\"\n * error={actionData?.errors.shop}\n * />\n * <Button submit primary>\n * Submit\n * </Button>\n * </FormLayout>\n * </Form>\n * </Card>\n * </Page>\n * );\n * }\n * ```\n */\n login: Login;\n}\n\nexport type AdminApp<Config extends AppConfigArg> = ShopifyAppBase<Config>;\nexport type SingleMerchantApp<Config extends AppConfigArg> =\n ShopifyAppBase<Config> & ShopifyAppLogin;\nexport type AppStoreApp<Config extends AppConfigArg> = ShopifyAppBase<Config> &\n ShopifyAppLogin;\n\ntype EnforceSessionStorage<Config extends AppConfigArg, Base> = Base & {\n sessionStorage: SessionStorageType<Config>;\n};\n\n/**\n * An object your app can use to interact with Shopify.\n *\n * By default, the app's distribution is `AppStore`.\n */\nexport type ShopifyApp<Config extends AppConfigArg> =\n Config['distribution'] extends AppDistribution.ShopifyAdmin\n ? AdminApp<Config>\n : Config['distribution'] extends AppDistribution.SingleMerchant\n ? EnforceSessionStorage<Config, SingleMerchantApp<Config>>\n : Config['distribution'] extends AppDistribution.AppStore\n ? EnforceSessionStorage<Config, AppStoreApp<Config>>\n : EnforceSessionStorage<Config, AppStoreApp<Config>>;\n"],"names":["AppDistribution","LoginErrorType"],"mappings":";;AAmCA;AACA;AACYA;AAAZ,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,UAAA,CAAA,GAAA,WAAsB;AACtB,IAAA,eAAA,CAAA,gBAAA,CAAA,GAAA,iBAAkC;AAClC,IAAA,eAAA,CAAA,cAAA,CAAA,GAAA,eAA8B;AAChC,CAAC,EAJWA,uBAAe,KAAfA,uBAAe,GAAA,EAAA,CAAA,CAAA;AAUfC;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,aAAA,CAAA,GAAA,cAA4B;AAC5B,IAAA,cAAA,CAAA,aAAA,CAAA,GAAA,cAA4B;AAC9B,CAAC,EAHWA,sBAAc,KAAdA,sBAAc,GAAA,EAAA,CAAA,CAAA;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sources":["../../../../../../src/server/unauthenticated/admin/factory.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"factory.js","sources":["../../../../../../src/server/unauthenticated/admin/factory.ts"],"sourcesContent":["import {ShopifyRestResources} from '@shopify/shopify-api';\n\nimport {AppConfigArg} from '../../config-types';\nimport {createOrLoadOfflineSession} from '../../authenticate/helpers/create-or-load-offline-session';\nimport {SessionNotFoundError} from '../../errors';\nimport {BasicParams} from '../../types';\nimport {adminClientFactory} from '../../clients/admin';\n\nimport {UnauthenticatedAdminContext} from './types';\n\nexport function unauthenticatedAdminContextFactory<\n ConfigArg extends AppConfigArg,\n Resources extends ShopifyRestResources,\n>(params: BasicParams) {\n return async (\n shop: string,\n ): Promise<UnauthenticatedAdminContext<ConfigArg, Resources>> => {\n const session = await createOrLoadOfflineSession(shop, params);\n\n if (!session) {\n throw new SessionNotFoundError(\n `Could not find a session for shop ${shop} when creating unauthenticated admin context`,\n );\n }\n\n return {\n session,\n admin: adminClientFactory<ConfigArg, Resources>({params, session}),\n };\n };\n}\n"],"names":["createOrLoadOfflineSession","SessionNotFoundError","adminClientFactory"],"mappings":";;;;;;AAUM,SAAU,kCAAkC,CAGhD,MAAmB,EAAA;AACnB,IAAA,OAAO,OACL,IAAY,KACkD;QAC9D,MAAM,OAAO,GAAG,MAAMA,qDAA0B,CAAC,IAAI,EAAE,MAAM,CAAC;QAE9D,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,MAAM,IAAIC,2BAAoB,CAC5B,qCAAqC,IAAI,CAAA,4CAAA,CAA8C,CACxF;QACH;QAEA,OAAO;YACL,OAAO;YACP,KAAK,EAAEC,0BAAkB,CAAuB,EAAC,MAAM,EAAE,OAAO,EAAC,CAAC;SACnE;AACH,IAAA,CAAC;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sources":["../../../../../../src/server/unauthenticated/storefront/factory.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"factory.js","sources":["../../../../../../src/server/unauthenticated/storefront/factory.ts"],"sourcesContent":["import {createOrLoadOfflineSession} from '../../authenticate/helpers/create-or-load-offline-session';\nimport {SessionNotFoundError} from '../../errors';\nimport {BasicParams} from '../../types';\nimport {storefrontClientFactory} from '../../clients/storefront';\n\nimport {\n UnauthenticatedStorefrontContext,\n GetUnauthenticatedStorefrontContext,\n} from './types';\n\nexport function unauthenticatedStorefrontContextFactory(\n params: BasicParams,\n): GetUnauthenticatedStorefrontContext {\n return async (shop: string): Promise<UnauthenticatedStorefrontContext> => {\n const session = await createOrLoadOfflineSession(shop, params);\n\n if (!session) {\n throw new SessionNotFoundError(\n `Could not find a session for shop ${shop} when creating unauthenticated storefront context`,\n );\n }\n\n return {\n session,\n storefront: storefrontClientFactory({params, session}),\n };\n };\n}\n"],"names":["createOrLoadOfflineSession","SessionNotFoundError","storefrontClientFactory"],"mappings":";;;;;;AAUM,SAAU,uCAAuC,CACrD,MAAmB,EAAA;AAEnB,IAAA,OAAO,OAAO,IAAY,KAA+C;QACvE,MAAM,OAAO,GAAG,MAAMA,qDAA0B,CAAC,IAAI,EAAE,MAAM,CAAC;QAE9D,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,MAAM,IAAIC,2BAAoB,CAC5B,qCAAqC,IAAI,CAAA,iDAAA,CAAmD,CAC7F;QACH;QAEA,OAAO;YACL,OAAO;YACP,UAAU,EAAEC,+BAAuB,CAAC,EAAC,MAAM,EAAE,OAAO,EAAC,CAAC;SACvD;AACH,IAAA,CAAC;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sources":["../../../../src/server/version.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"version.js","sources":["../../../../src/server/version.ts"],"sourcesContent":["export const SHOPIFY_REMIX_LIBRARY_VERSION = '3.8.5';\n"],"names":[],"mappings":";;AAAO,MAAM,6BAA6B,GAAG;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sources":["../../../../../../../session-storage/shopify-app-session-storage-memory/dist/esm/memory.mjs"],"sourcesContent":["class MemorySessionStorage {\n sessions = {};\n async storeSession(session) {\n this.sessions[session.id] = session;\n return true;\n }\n async loadSession(id) {\n return this.sessions[id] || undefined;\n }\n async deleteSession(id) {\n if (this.sessions[id]) {\n delete this.sessions[id];\n }\n return true;\n }\n async deleteSessions(ids) {\n ids.forEach((id) => delete this.sessions[id]);\n return true;\n }\n async findSessionsByShop(shop) {\n const results = Object.values(this.sessions).filter((session) => session.shop === shop);\n return results;\n }\n}\n\nexport { MemorySessionStorage };\n//# sourceMappingURL=memory.mjs.map\n"],"names":[],"mappings":";;AAAA,MAAM,oBAAoB,CAAC;AAC3B,IAAI,QAAQ,GAAG,EAAE;AACjB,IAAI,MAAM,YAAY,CAAC,OAAO,EAAE;AAChC,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,OAAO;AAC3C,QAAQ,OAAO,IAAI;AACnB;
|
|
1
|
+
{"version":3,"file":"memory.js","sources":["../../../../../../../session-storage/shopify-app-session-storage-memory/dist/esm/memory.mjs"],"sourcesContent":["class MemorySessionStorage {\n sessions = {};\n async storeSession(session) {\n this.sessions[session.id] = session;\n return true;\n }\n async loadSession(id) {\n return this.sessions[id] || undefined;\n }\n async deleteSession(id) {\n if (this.sessions[id]) {\n delete this.sessions[id];\n }\n return true;\n }\n async deleteSessions(ids) {\n ids.forEach((id) => delete this.sessions[id]);\n return true;\n }\n async findSessionsByShop(shop) {\n const results = Object.values(this.sessions).filter((session) => session.shop === shop);\n return results;\n }\n}\n\nexport { MemorySessionStorage };\n//# sourceMappingURL=memory.mjs.map\n"],"names":[],"mappings":";;AAAA,MAAM,oBAAoB,CAAC;AAC3B,IAAI,QAAQ,GAAG,EAAE;AACjB,IAAI,MAAM,YAAY,CAAC,OAAO,EAAE;AAChC,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,OAAO;AAC3C,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ,IAAI,MAAM,WAAW,CAAC,EAAE,EAAE;AAC1B,QAAQ,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,SAAS;AAC7C,IAAI;AACJ,IAAI,MAAM,aAAa,CAAC,EAAE,EAAE;AAC5B,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AAC/B,YAAY,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AACpC,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ,IAAI,MAAM,cAAc,CAAC,GAAG,EAAE;AAC9B,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACrD,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ,IAAI,MAAM,kBAAkB,CAAC,IAAI,EAAE;AACnC,QAAQ,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC;AAC/F,QAAQ,OAAO,OAAO;AACtB,IAAI;AACJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppProvider.mjs","sources":["../../../../../../src/react/components/AppProvider/AppProvider.tsx"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"AppProvider.mjs","sources":["../../../../../../src/react/components/AppProvider/AppProvider.tsx"],"sourcesContent":["import {\n AppProvider as PolarisAppProvider,\n AppProviderProps as PolarisAppProviderProps,\n} from '@shopify/polaris';\n// This leads to some TS errors, but it does compile to something that works\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport englishI18n from '@shopify/polaris/locales/en.json' with {type: 'json'};\n\nimport {APP_BRIDGE_URL} from '../../const';\nimport {RemixPolarisLink} from '../RemixPolarisLink';\n\nexport interface AppProviderProps\n extends Omit<PolarisAppProviderProps, 'linkComponent' | 'i18n'> {\n /**\n * The API key for your Shopify app. This is the `Client ID` from the Partner Dashboard.\n *\n * When using the Shopify CLI, this is the `SHOPIFY_API_KEY` environment variable. If you're using the environment\n * variable, then you need to pass it from the loader to the component.\n */\n apiKey: string;\n /**\n * Whether the app is loaded inside the Shopify Admin. Default is `true`.\n *\n * {@link https://shopify.dev/docs/apps/admin/embedded-app-home}\n */\n isEmbeddedApp?: boolean;\n /**\n * The internationalization (i18n) configuration for your Polaris provider.\n *\n * {@link https://polaris.shopify.com/components/utilities/app-provider}\n */\n i18n?: PolarisAppProviderProps['i18n'];\n /**\n * Used internally by Shopify. You don't need to set this.\n * @private\n */\n __APP_BRIDGE_URL?: string;\n}\n\n/**\n * Sets up the Polaris `AppProvider` and injects the App Bridge script.\n *\n * This component extends the [`AppProvider`](https://polaris.shopify.com/components/utilities/app-provider) component\n * from Polaris, and accepts all of its props except for `linkComponent`, which is overridden to use the Remix `Link`\n * component.\n *\n * {@link https://polaris.shopify.com/components/utilities/app-provider}\n * {@link https://shopify.dev/tools/app-bridge}\n *\n * @example\n * <caption>Set up AppProvider.</caption>\n * <description>Wrap your app in the `AppProvider` component and pass in your API key.</description>\n * ```ts\n * // /app/routes/**\\/*.ts\n * import {authenticate} from '~/shopify.server';\n * import {AppProvider} from '@shopify/shopify-app-remix/react';\n *\n * export async function loader({ request }) {\n * await authenticate.admin(request);\n *\n * return json({ apiKey: process.env.SHOPIFY_API_KEY });\n * }\n *\n * export default function App() {\n * const { apiKey } = useLoaderData();\n *\n * return (\n * <AppProvider isEmbeddedApp apiKey={apiKey}>\n * <Outlet />\n * </AppProvider>\n * );\n * }\n * ```\n *\n * @example\n * <caption>Localize Polaris components.</caption>\n * <description>Pass in a different locale for Polaris to translate its components.</description>\n * ```ts\n * // /app/routes/**\\/*.ts\n * import {authenticate} from '~/shopify.server';\n * import {AppProvider} from '@shopify/shopify-app-remix/react';\n *\n * export async function loader({ request }) {\n * await authenticate.admin(request);\n *\n * return json({\n * apiKey: process.env.SHOPIFY_API_KEY,\n * polarisTranslations: require(\"@shopify/polaris/locales/fr.json\"),\n * });\n * }\n *\n * export default function App() {\n * const { apiKey, polarisTranslations } = useLoaderData();\n *\n * return (\n * <AppProvider apiKey={apiKey} i18n={polarisTranslations}>\n * <Outlet />\n * </AppProvider>\n * );\n * }\n * ```\n */\nexport function AppProvider(props: AppProviderProps) {\n const {\n children,\n apiKey,\n i18n,\n isEmbeddedApp = true,\n __APP_BRIDGE_URL = APP_BRIDGE_URL,\n ...polarisProps\n } = props;\n\n return (\n <>\n {isEmbeddedApp && <script src={__APP_BRIDGE_URL} data-api-key={apiKey} />}\n <PolarisAppProvider\n {...polarisProps}\n linkComponent={RemixPolarisLink}\n i18n={i18n || englishI18n}\n >\n {children}\n </PolarisAppProvider>\n </>\n );\n}\n"],"names":["_jsxs","_Fragment","_jsx","PolarisAppProvider"],"mappings":";;;;;;AAwCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DG;AACG,SAAU,WAAW,CAAC,KAAuB,EAAA;IACjD,MAAM,EACJ,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,aAAa,GAAG,IAAI,EACpB,gBAAgB,GAAG,cAAc,EACjC,GAAG,YAAY,EAChB,GAAG,KAAK;AAET,IAAA,QACEA,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CACG,aAAa,IAAIC,GAAA,CAAA,QAAA,EAAA,EAAQ,GAAG,EAAE,gBAAgB,EAAA,cAAA,EAAgB,MAAM,EAAA,CAAI,EACzEA,IAACC,aAAkB,EAAA,EAAA,GACb,YAAY,EAChB,aAAa,EAAE,gBAAgB,EAC/B,IAAI,EAAE,IAAI,IAAI,WAAW,EAAA,QAAA,EAExB,QAAQ,EAAA,CACU,CAAA,EAAA,CACpB;AAEP;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppProxyForm.mjs","sources":["../../../../../../src/react/components/AppProxyForm/AppProxyForm.tsx"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"AppProxyForm.mjs","sources":["../../../../../../src/react/components/AppProxyForm/AppProxyForm.tsx"],"sourcesContent":["import {useContext} from 'react';\nimport {Form, type FormProps} from '@remix-run/react';\n\nimport {AppProxyProviderContext} from '../AppProxyProvider';\n\nexport interface AppProxyFormProps extends FormProps {\n action: string;\n}\n\n/**\n * Sets up a Remix `<Form>` component that works when rendered on an app proxy page.\n *\n * Supports any properties accepted by the `<Form>` component.\n *\n * Because Remix doesn't support URL rewriting, any route using this component should <b>match the pathname of the proxy\n * URL exactly</b>, and <b>end in a trailing slash</b> (e.g., `https://<shop>/apps/proxy/`), or set the Remix Form prop\n * `navigate` to `false`.\n *\n * @example\n * <caption>Render a form element in a proxied route.</caption>\n * <description>Use an `AppProxyForm` within an `AppProxy` to create a form.</description>\n * ```ts\n * // /app/routes/apps/appProxy.ts\n * import {\n * AppProxyProvider,\n * AppProxyForm,\n * } from \"@shopify/shopify-app-remix/react\";\n * import { authenticate } from \"~/shopify.server\";\n *\n * export async function loader({ request }) {\n * await authenticate.public.appProxy(request);\n *\n * return json({ appUrl: process.env.SHOPIFY_APP_URL });\n * }\n *\n * export async function action({ request }) {\n * await authenticate.public.appProxy(request);\n *\n * const formData = await request.formData();\n * const field = formData.get(\"field\")?.toString();\n *\n * // Perform actions\n * if (field) {\n * console.log(\"Field:\", field);\n * }\n *\n * // Return JSON to the client\n * return json({ message: \"Success!\" });\n * }\n *\n * export default function App() {\n * const { appUrl } = useLoaderData();\n *\n * return (\n * <AppProxyProvider appUrl={appUrl}>\n * <AppProxyForm action=\"/apps/appProxy\" method=\"post\">\n * <input type=\"text\" name=\"field\" />\n *\n * <input type=\"submit\" name=\"Submit\" />\n * </AppProxyForm>\n * </AppProxyProvider>\n * );\n * }\n * ```\n */\nexport function AppProxyForm(props: AppProxyFormProps) {\n const context = useContext(AppProxyProviderContext);\n\n if (!context) {\n throw new Error(\n 'AppProxyForm must be used within an AppProxyProvider component',\n );\n }\n\n const {children, action, ...otherProps} = props;\n\n return (\n <Form action={context.formatUrl(action, false)} {...otherProps}>\n {children}\n </Form>\n );\n}\n"],"names":["_jsx"],"mappings":";;;;;AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDG;AACG,SAAU,YAAY,CAAC,KAAwB,EAAA;AACnD,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,uBAAuB,CAAC;IAEnD,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE;IACH;IAEA,MAAM,EAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,UAAU,EAAC,GAAG,KAAK;IAE/C,QACEA,IAAC,IAAI,EAAA,EAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,EAAA,GAAM,UAAU,YAC3D,QAAQ,EAAA,CACJ;AAEX;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppProxyLink.mjs","sources":["../../../../../../src/react/components/AppProxyLink/AppProxyLink.tsx"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"AppProxyLink.mjs","sources":["../../../../../../src/react/components/AppProxyLink/AppProxyLink.tsx"],"sourcesContent":["import {useContext} from 'react';\n\nimport {AppProxyProviderContext} from '../AppProxyProvider';\n\nexport interface AppProxyLinkProps\n extends React.DetailedHTMLProps<\n React.AnchorHTMLAttributes<HTMLAnchorElement>,\n HTMLAnchorElement\n > {\n href: string;\n}\n\n/**\n * Sets up an `<a />` HTML element that works when rendered behind an app proxy.\n *\n * Supports any properties accepted by the `<a />` HTML element.\n *\n * @example\n * <caption>Link to a different route.</caption>\n * <description>Use an `AppProxyLink` within an `AppProxyProvider` to link to a different proxied route.</description>\n * ```ts\n * // /app/routes/**\\/*.ts\n * import {authenticate} from '~/shopify.server';\n * import {AppProxyProvider, AppProxyLink} from '@shopify/shopify-app-remix/react';\n *\n * export async function loader({ request }) {\n * await authenticate.public.appProxy(request);\n *\n * return json({ appUrl: process.env.SHOPIFY_APP_URL });\n * }\n *\n * export default function App() {\n * const { appUrl } = useLoaderData();\n *\n * return (\n * <AppProxyProvider appUrl={appUrl}>\n * <AppProxyLink href=\"/other-proxy-route\">Link to another route</AppProxyLink>\n * </AppProxyProvider>\n * );\n * }\n * ```\n */\nexport function AppProxyLink(props: AppProxyLinkProps) {\n const context = useContext(AppProxyProviderContext);\n\n if (!context) {\n throw new Error(\n 'AppProxyLink must be used within an AppProxyProvider component',\n );\n }\n\n const {children, href, ...otherProps} = props;\n\n return (\n <a href={context.formatUrl(href)} {...otherProps}>\n {children}\n </a>\n );\n}\n"],"names":["_jsx"],"mappings":";;;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;AACG,SAAU,YAAY,CAAC,KAAwB,EAAA;AACnD,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,uBAAuB,CAAC;IAEnD,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE;IACH;IAEA,MAAM,EAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,UAAU,EAAC,GAAG,KAAK;AAE7C,IAAA,QACEA,GAAA,CAAA,GAAA,EAAA,EAAG,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,KAAM,UAAU,EAAA,QAAA,EAC7C,QAAQ,EAAA,CACP;AAER;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppProxyProvider.mjs","sources":["../../../../../../src/react/components/AppProxyProvider/AppProxyProvider.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":";;;MAyBa,uBAAuB,GAClC,aAAa,CAAsC,IAAI;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCG;AACG,SAAU,gBAAgB,CAAC,KAA4B,EAAA;AAC3D,IAAA,MAAM,EAAC,QAAQ,EAAE,MAAM,EAAC,GAAG,KAAK;IAChC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,EAAmB;IAE/D,SAAS,CACP,MAAM,aAAa,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAClD,CAAC,aAAa,CAAC,CAChB;AAED,IAAA,QACEA,IAAA,CAAC,uBAAuB,CAAC,QAAQ,EAAA,EAC/B,KAAK,EAAE,EAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EAAC,EAAA,QAAA,EAAA,CAElEC,
|
|
1
|
+
{"version":3,"file":"AppProxyProvider.mjs","sources":["../../../../../../src/react/components/AppProxyProvider/AppProxyProvider.tsx"],"sourcesContent":["import {createContext, useEffect, useState} from 'react';\n\nexport interface AppProxyProviderProps {\n /**\n * The URL where the app is hosted. You can set this from the `SHOPIFY_APP_URL` environment variable.\n */\n appUrl: string;\n\n /**\n * The children to render.\n */\n children?: React.ReactNode;\n}\n\ntype FormatUrlFunction = (\n url: string | undefined,\n addOrigin?: boolean,\n) => string | undefined;\n\ninterface AppProxyProviderContextProps {\n appUrl: string;\n formatUrl: FormatUrlFunction;\n requestUrl?: URL;\n}\n\nexport const AppProxyProviderContext =\n createContext<AppProxyProviderContextProps | null>(null);\n\n/**\n * Sets up a page to render behind a Shopify app proxy, enabling JavaScript and CSS to be loaded from the app.\n *\n * Also provides components that enable using other components such as links and forms within proxies.\n *\n * > Caution:\n * Because Remix doesn't support URL rewriting, any route using this component should <b>match the pathname of the proxy\n * URL exactly</b>, and <b>end in a trailing slash</b> (e.g., `https://<shop>/apps/proxy/`).\n *\n * @example\n * <caption>Wrap a route with an AppProxyProvider component.</caption>\n * <description>Wrap your route component in the `AppProxyProvider` component and pass in your app URL.</description>\n * ```ts\n * // /app/routes/**\\/*.ts\n * import {authenticate} from '~/shopify.server';\n * import {AppProxyProvider} from '@shopify/shopify-app-remix/react';\n *\n * export async function loader({ request }) {\n * await authenticate.public.appProxy(request);\n *\n * return json({ appUrl: process.env.SHOPIFY_APP_URL });\n * }\n *\n * export default function App() {\n * const { appUrl } = useLoaderData();\n *\n * return (\n * <AppProxyProvider appUrl={appUrl}>\n * Page content\n * </AppProxyProvider>\n * );\n * }\n * ```\n */\nexport function AppProxyProvider(props: AppProxyProviderProps) {\n const {children, appUrl} = props;\n const [requestUrl, setRequestUrl] = useState<URL | undefined>();\n\n useEffect(\n () => setRequestUrl(new URL(window.location.href)),\n [setRequestUrl],\n );\n\n return (\n <AppProxyProviderContext.Provider\n value={{appUrl, requestUrl, formatUrl: formatProxyUrl(requestUrl)}}\n >\n <base href={appUrl} />\n\n {children}\n </AppProxyProviderContext.Provider>\n );\n}\n\nfunction formatProxyUrl(requestUrl: URL | undefined): FormatUrlFunction {\n return (url: string | undefined, addOrigin = true) => {\n if (!url) {\n return url;\n }\n\n let finalUrl = url;\n\n if (addOrigin && requestUrl && finalUrl.startsWith('/')) {\n finalUrl = new URL(`${requestUrl.origin}${url}`).href;\n }\n if (!finalUrl.endsWith('/')) {\n finalUrl = `${finalUrl}/`;\n }\n\n return finalUrl;\n };\n}\n"],"names":["_jsxs","_jsx"],"mappings":";;;MAyBa,uBAAuB,GAClC,aAAa,CAAsC,IAAI;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCG;AACG,SAAU,gBAAgB,CAAC,KAA4B,EAAA;AAC3D,IAAA,MAAM,EAAC,QAAQ,EAAE,MAAM,EAAC,GAAG,KAAK;IAChC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,EAAmB;IAE/D,SAAS,CACP,MAAM,aAAa,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAClD,CAAC,aAAa,CAAC,CAChB;AAED,IAAA,QACEA,IAAA,CAAC,uBAAuB,CAAC,QAAQ,EAAA,EAC/B,KAAK,EAAE,EAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,EAAC,EAAA,QAAA,EAAA,CAElEC,GAAA,CAAA,MAAA,EAAA,EAAM,IAAI,EAAE,MAAM,EAAA,CAAI,EAErB,QAAQ,CAAA,EAAA,CACwB;AAEvC;AAEA,SAAS,cAAc,CAAC,UAA2B,EAAA;AACjD,IAAA,OAAO,CAAC,GAAuB,EAAE,SAAS,GAAG,IAAI,KAAI;QACnD,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,GAAG;QACZ;QAEA,IAAI,QAAQ,GAAG,GAAG;QAElB,IAAI,SAAS,IAAI,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACvD,YAAA,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC,CAAC,IAAI;QACvD;QACA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC3B,YAAA,QAAQ,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAG;QAC3B;AAEA,QAAA,OAAO,QAAQ;AACjB,IAAA,CAAC;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RemixPolarisLink.mjs","sources":["../../../../../src/react/components/RemixPolarisLink.tsx"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"RemixPolarisLink.mjs","sources":["../../../../../src/react/components/RemixPolarisLink.tsx"],"sourcesContent":["import React from 'react';\nimport {Link} from '@remix-run/react';\n// Polaris' LinkProps doesn't match this type, so we need to import it directly\nimport type {\n LinkLikeComponent,\n LinkLikeComponentProps,\n} from '@shopify/polaris/build/ts/src/utilities/link';\n\nexport const RemixPolarisLink = React.forwardRef<\n HTMLAnchorElement,\n LinkLikeComponentProps\n>((props, ref) => (\n <Link {...props} to={props.url ?? props.to} ref={ref} />\n)) as LinkLikeComponent;\n"],"names":["_jsx"],"mappings":";;;;AAQO,MAAM,gBAAgB,GAAG,KAAK,CAAC,UAAU,CAG9C,CAAC,KAAK,EAAE,GAAG,MACXA,GAAA,CAAC,IAAI,EAAA,EAAA,GAAK,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAA,CAAI,CACzD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.mjs","sources":["../../../../src/react/const.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"const.mjs","sources":["../../../../src/react/const.ts"],"sourcesContent":["export const APP_BRIDGE_URL =\n 'https://cdn.shopify.com/shopifycloud/app-bridge.js';\n"],"names":[],"mappings":"AAAO,MAAM,cAAc,GACzB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../../../src/server/adapters/node/index.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../../../src/server/adapters/node/index.ts"],"sourcesContent":["import crypto from 'crypto';\n\nimport {\n setAbstractRuntimeString,\n setCrypto,\n} from '@shopify/shopify-api/runtime';\n\nimport {setAppBridgeUrlOverride} from '../../authenticate/helpers';\n\nsetCrypto(crypto as any);\n\nsetAbstractRuntimeString(() => {\n return `Remix (Node)`;\n});\n\n/* eslint-disable no-process-env */\nif (process.env.APP_BRIDGE_URL) {\n setAppBridgeUrlOverride(process.env.APP_BRIDGE_URL);\n}\n/* eslint-enable no-process-env */\n"],"names":[],"mappings":";;;;;;;AASA,SAAS,CAAC,MAAa,CAAC;AAExB,wBAAwB,CAAC,MAAK;AAC5B,IAAA,OAAO,cAAc;AACvB,CAAC,CAAC;AAEF;AACA,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE;AAC9B,IAAA,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AACrD;AACA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../../../src/server/adapters/vercel/index.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../../../src/server/adapters/vercel/index.ts"],"sourcesContent":["import {setAbstractFetchFunc} from '@shopify/shopify-api/runtime';\nimport {installGlobals} from '@remix-run/node';\n\nimport '../node';\n\ninstallGlobals();\n\nconst fetchFunc = fetch;\nsetAbstractFetchFunc(async (...args) => {\n const response = await fetchFunc(...args);\n\n return response as any;\n});\n"],"names":[],"mappings":";;;;AAKA,cAAc,EAAE;AAEhB,MAAM,SAAS,GAAG,KAAK;AACvB,oBAAoB,CAAC,OAAO,GAAG,IAAI,KAAI;IACrC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC;AAEzC,IAAA,OAAO,QAAe;AACxB,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authenticate.mjs","sources":["../../../../../../src/server/authenticate/admin/authenticate.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAkDM,SAAU,mBAAmB,CAGjC,EACA,QAAQ,EACR,GAAG,MAAM,EACU,EAAA;IACnB,MAAM,EAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAC,GAAG,MAAM;IAEpC,eAAe,0BAA0B,CAAC,OAAgB,EAAA;QACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;QAEhC,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;AACtD,YAAA,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;AACpC,gBAAA,IAAI,EAAE,kBAAkB,CAAC,OAAO,CAAC;AAClC,aAAA,CAAC;AACF,YAAA,MAAM,eAAe,CAAC,EAAC,MAAoB,CAAA,EAAE,OAAO,CAAC;;;IAIzD,eAAe,0BAA0B,CAAC,OAAgB,EAAA;QACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;QAEhC,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;YAC/C,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAE;AAEvD,YAAA,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE;AACzC,gBAAA,IAAI,EAAE,kBAAkB,CAAC,OAAO,CAAC;gBACjC,WAAW;AACZ,aAAA,CAAC;AACF,YAAA,MAAM,eAAe,CAAC,EAAC,MAAmB,CAAC,EAAE,OAAO,EAAE,EAAC,GAAG,EAAE,WAAW,EAAC,CAAC;;;IAQ7E,SAAS,aAAa,CACpB,OAAgB,EAChB,OAAgB,EAChB,YAAmC,EACnC,YAAyB,EAAA;AAEzB,QAAA,IAAI,OAAO,GAAqB;AAC9B,YAAA,KAAK,EAAE,qBAAqB,CAC1B,OAAO,EACP,MAAM,EACN,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,CACxC;AACD,YAAA,OAAO,EAAE;gBACP,OAAO,EAAE,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;gBACxD,KAAK,EAAE,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;gBACpD,OAAO,EAAE,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;gBACxD,MAAM,EAAE,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;gBACtD,iBAAiB,EAAE,wBAAwB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;gBACrE,uBAAuB,EAAE,8BAA8B,CACrD,MAAM,EACN,OAAO,EACP,OAAO,CACR;AACF,aAAA;YAED,OAAO;AACP,YAAA,IAAI,EAAE,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC;SAChD;QAED,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC;AACtE,QAAA,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC;AAEpC,QAAA,OAAO,OAA6C;;IAGtD,SAAS,mBAAmB,CAC1B,OAAyB,EACzB,OAAgB,EAChB,OAAgB,EAChB,YAAyB,EAAA;AAEzB,QAAA,IAAI,MAAM,CAAC,aAAa,EAAE;YACxB,OAAO;AACL,gBAAA,GAAG,OAAO;gBACV,YAAY;gBACZ,QAAQ,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;aACzD;;AAEH,QAAA,OAAO,OAAO;;IAGhB,SAAS,iBAAiB,CAAC,OAAyB,EAAA;QAClD,OAAO;AACL,YAAA,GAAG,OAAO;AACV,YAAA,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC;SACjE;;AAGH,IAAA,OAAO,eAAe,iBAAiB,CAAC,OAAgB,EAAA;AACtD,QAAA,IAAI;AACF,YAAA,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC;AACpC,YAAA,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC;AACxC,YAAA,MAAM,0BAA0B,CAAC,OAAO,CAAC;AACzC,YAAA,MAAM,0BAA0B,CAAC,OAAO,CAAC;AACzC,YAAA,MAAM,QAAQ,CAAC,sBAAsB,CAAC,OAAO,CAAC;;;AAI9C,YAAA,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE;AACnC,gBAAA,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC;AAC1C,gBAAA,MAAM,6BAA6B,CAAC,MAAM,EAAE,OAAO,CAAC;AACpD,gBAAA,MAAM,uCAAuC,CAAC,MAAM,EAAE,OAAO,CAAC;;AAGhE,YAAA,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;AAC1C,gBAAA,IAAI,EAAE,kBAAkB,CAAC,OAAO,CAAC;AAClC,aAAA,CAAC;AAEF,YAAA,MAAM,EAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAC,GAC5C,MAAM,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC;YAE/C,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAC,IAAI,EAAE,SAAS,EAAC,CAAC;YAC/D,MAAM,eAAe,GAAG;kBACpB,MAAM,MAAM,CAAC,cAAe,CAAC,WAAW,CAAC,SAAS;kBAClD,SAAS;YAEb,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE;AACnD,gBAAA,OAAO,EAAE,eAAe;gBACxB,YAAY;gBACZ,IAAI;AACL,aAAA,CAAC;YAEF,OAAO,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC;;QACzD,OAAO,eAAe,EAAE;AACxB,YAAA,IAAI,eAAe,YAAY,QAAQ,EAAE;AACvC,gBAAA,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE;AAC/C,oBAAA,IAAI,EAAE,kBAAkB,CAAC,OAAO,CAAC;AAClC,iBAAA,CAAC;gBACF,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,eAAe,CAAC;;AAG5D,YAAA,MAAM,eAAe;;AAEzB,KAAC;AACH;AAEA,eAAe,sBAAsB,CACnC,MAAmB,EACnB,OAAgB,EAAA;IAEhB,MAAM,EAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAC,GAAG,MAAM;AAEpC,IAAA,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,OAAO,CAAC;AACzD,IAAA,MAAM,uBAAuB,GAAG,2BAA2B,CAAC,OAAO,CAAC;AACpE,IAAA,MAAM,YAAY,IAAI,kBAAkB,IAAI,uBAAuB,CAAE;AAErE,IAAA,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE;AACvD,QAAA,IAAI,EAAE,kBAAkB,CAAC,OAAO,CAAC;AACjC,QAAA,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC;AAC3B,YAAA,MAAM,EAAE,kBAAkB;AAC1B,YAAA,MAAM,EAAE,uBAAuB;SAChC,CAAC;AACH,KAAA,CAAC;AAEF,IAAA,IAAI,MAAM,CAAC,aAAa,EAAE;QACxB,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC;QACzE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;AAClC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ;QAE1B,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC;AACvE,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC;AACvB,cAAE,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG;cAC7C,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;QAElC,OAAO,EAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAC;;IAGjD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;IAChC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE;IAE1C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;QAC/C,QAAQ,EAAE,MAAM,CAAC,eAAe;AAChC,QAAA,UAAU,EAAE,OAAO;AACpB,KAAA,CAAC;IAEF,OAAO,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAC;AAC5D;;;;"}
|
|
1
|
+
{"version":3,"file":"authenticate.mjs","sources":["../../../../../../src/server/authenticate/admin/authenticate.ts"],"sourcesContent":["import {JwtPayload, Session, ShopifyRestResources} from '@shopify/shopify-api';\n\nimport type {BasicParams} from '../../types';\nimport type {AppConfigArg} from '../../config-types';\nimport {\n getSessionTokenHeader,\n ensureCORSHeadersFactory,\n getSessionTokenFromUrlParam,\n respondToBotRequest,\n respondToOptionsRequest,\n validateSessionToken,\n getShopFromRequest,\n} from '../helpers';\n\nimport {\n cancelBillingFactory,\n requestBillingFactory,\n requireBillingFactory,\n checkBillingFactory,\n createUsageRecordFactory,\n updateUsageCappedAmountFactory,\n} from './billing';\nimport type {\n AdminContext,\n AuthenticateAdmin,\n EmbeddedAdminContext,\n NonEmbeddedAdminContext,\n} from './types';\nimport {\n createAdminApiContext,\n ensureAppIsEmbeddedIfRequired,\n ensureSessionTokenSearchParamIfRequired,\n redirectFactory,\n renderAppBridge,\n validateShopAndHostParams,\n} from './helpers';\nimport {AuthorizationStrategy} from './strategies/types';\nimport {scopesApiFactory} from './scope/factory';\n\nexport interface SessionTokenContext {\n shop: string;\n sessionId?: string;\n sessionToken?: string;\n payload?: JwtPayload;\n}\n\ninterface AuthStrategyParams extends BasicParams {\n strategy: AuthorizationStrategy;\n}\n\nexport function authStrategyFactory<\n ConfigArg extends AppConfigArg,\n Resources extends ShopifyRestResources = ShopifyRestResources,\n>({\n strategy,\n ...params\n}: AuthStrategyParams): AuthenticateAdmin<ConfigArg, Resources> {\n const {api, logger, config} = params;\n\n async function respondToBouncePageRequest(request: Request) {\n const url = new URL(request.url);\n\n if (url.pathname === config.auth.patchSessionTokenPath) {\n logger.debug('Rendering bounce page', {\n shop: getShopFromRequest(request),\n });\n throw renderAppBridge({config, logger, api}, request);\n }\n }\n\n async function respondToExitIframeRequest(request: Request) {\n const url = new URL(request.url);\n\n if (url.pathname === config.auth.exitIframePath) {\n const destination = url.searchParams.get('exitIframe')!;\n\n logger.debug('Rendering exit iframe page', {\n shop: getShopFromRequest(request),\n destination,\n });\n throw renderAppBridge({config, logger, api}, request, {url: destination});\n }\n }\n\n type AdminContextBase =\n | EmbeddedAdminContext<ConfigArg, Resources>\n | NonEmbeddedAdminContext<ConfigArg, Resources>;\n\n function createContext(\n request: Request,\n session: Session,\n authStrategy: AuthorizationStrategy,\n sessionToken?: JwtPayload,\n ): AdminContext<ConfigArg, Resources> {\n let context: AdminContextBase = {\n admin: createAdminApiContext<ConfigArg, Resources>(\n session,\n params,\n authStrategy.handleClientError(request),\n ),\n billing: {\n require: requireBillingFactory(params, request, session),\n check: checkBillingFactory(params, request, session),\n request: requestBillingFactory(params, request, session),\n cancel: cancelBillingFactory(params, request, session),\n createUsageRecord: createUsageRecordFactory(params, request, session),\n updateUsageCappedAmount: updateUsageCappedAmountFactory(\n params,\n request,\n session,\n ),\n },\n\n session,\n cors: ensureCORSHeadersFactory(params, request),\n };\n\n context = addEmbeddedFeatures(context, request, session, sessionToken);\n context = addScopesFeatures(context);\n\n return context as AdminContext<ConfigArg, Resources>;\n }\n\n function addEmbeddedFeatures(\n context: AdminContextBase,\n request: Request,\n session: Session,\n sessionToken?: JwtPayload,\n ) {\n if (config.isEmbeddedApp) {\n return {\n ...context,\n sessionToken,\n redirect: redirectFactory(params, request, session.shop),\n };\n }\n return context;\n }\n\n function addScopesFeatures(context: AdminContextBase) {\n return {\n ...context,\n scopes: scopesApiFactory(params, context.session, context.admin),\n };\n }\n\n return async function authenticateAdmin(request: Request) {\n try {\n respondToBotRequest(params, request);\n respondToOptionsRequest(params, request);\n await respondToBouncePageRequest(request);\n await respondToExitIframeRequest(request);\n await strategy.respondToOAuthRequests(request);\n\n // If this is a valid request, but it doesn't have a session token header, this is a document request. We need to\n // ensure we're embedded if needed and we have the information needed to load the session.\n if (!getSessionTokenHeader(request)) {\n validateShopAndHostParams(params, request);\n await ensureAppIsEmbeddedIfRequired(params, request);\n await ensureSessionTokenSearchParamIfRequired(params, request);\n }\n\n logger.info('Authenticating admin request', {\n shop: getShopFromRequest(request),\n });\n\n const {payload, shop, sessionId, sessionToken} =\n await getSessionTokenContext(params, request);\n\n logger.debug('Loading session from storage', {shop, sessionId});\n const existingSession = sessionId\n ? await config.sessionStorage!.loadSession(sessionId)\n : undefined;\n\n const session = await strategy.authenticate(request, {\n session: existingSession,\n sessionToken,\n shop,\n });\n\n return createContext(request, session, strategy, payload);\n } catch (errorOrResponse) {\n if (errorOrResponse instanceof Response) {\n logger.debug('Authenticate returned a response', {\n shop: getShopFromRequest(request),\n });\n ensureCORSHeadersFactory(params, request)(errorOrResponse);\n }\n\n throw errorOrResponse;\n }\n };\n}\n\nasync function getSessionTokenContext(\n params: BasicParams,\n request: Request,\n): Promise<SessionTokenContext> {\n const {api, config, logger} = params;\n\n const headerSessionToken = getSessionTokenHeader(request);\n const searchParamSessionToken = getSessionTokenFromUrlParam(request);\n const sessionToken = (headerSessionToken || searchParamSessionToken)!;\n\n logger.debug('Attempting to authenticate session token', {\n shop: getShopFromRequest(request),\n sessionToken: JSON.stringify({\n header: headerSessionToken,\n search: searchParamSessionToken,\n }),\n });\n\n if (config.isEmbeddedApp) {\n const payload = await validateSessionToken(params, request, sessionToken);\n const dest = new URL(payload.dest);\n const shop = dest.hostname;\n\n logger.debug('Session token is valid - authenticated', {shop, payload});\n const sessionId = config.useOnlineTokens\n ? api.session.getJwtSessionId(shop, payload.sub)\n : api.session.getOfflineId(shop);\n\n return {shop, payload, sessionId, sessionToken};\n }\n\n const url = new URL(request.url);\n const shop = url.searchParams.get('shop')!;\n\n const sessionId = await api.session.getCurrentId({\n isOnline: config.useOnlineTokens,\n rawRequest: request,\n });\n\n return {shop, sessionId, payload: undefined, sessionToken};\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cancel.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/cancel.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"cancel.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/cancel.ts"],"sourcesContent":["import {HttpResponseError, Session} from '@shopify/shopify-api';\n\nimport type {BasicParams} from '../../../types';\nimport {redirectToAuthPage} from '../helpers';\nimport {invalidateAccessToken} from '../../helpers';\n\nimport type {CancelBillingOptions} from './types';\n\nexport function cancelBillingFactory(\n params: BasicParams,\n request: Request,\n session: Session,\n) {\n return async function cancelBilling(options: CancelBillingOptions) {\n const {api, logger} = params;\n\n logger.debug('Cancelling billing', {shop: session.shop, ...options});\n\n try {\n return await api.billing.cancel({\n session,\n subscriptionId: options.subscriptionId,\n isTest: options.isTest,\n prorate: options.prorate,\n });\n } catch (error) {\n if (error instanceof HttpResponseError && error.response.code === 401) {\n logger.debug('API token was invalid, redirecting to OAuth', {\n shop: session.shop,\n });\n await invalidateAccessToken(params, session);\n throw await redirectToAuthPage(params, request, session.shop);\n } else {\n throw error;\n }\n }\n };\n}\n"],"names":[],"mappings":";;;;;;;SAQgB,oBAAoB,CAClC,MAAmB,EACnB,OAAgB,EAChB,OAAgB,EAAA;AAEhB,IAAA,OAAO,eAAe,aAAa,CAAC,OAA6B,EAAA;AAC/D,QAAA,MAAM,EAAC,GAAG,EAAE,MAAM,EAAC,GAAG,MAAM;AAE5B,QAAA,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC;AAEpE,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC9B,OAAO;gBACP,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO,EAAE,OAAO,CAAC,OAAO;AACzB,aAAA,CAAC;QACJ;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,KAAK,YAAY,iBAAiB,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE;AACrE,gBAAA,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE;oBAC1D,IAAI,EAAE,OAAO,CAAC,IAAI;AACnB,iBAAA,CAAC;AACF,gBAAA,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC;gBAC5C,MAAM,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;YAC/D;iBAAO;AACL,gBAAA,MAAM,KAAK;YACb;QACF;AACF,IAAA,CAAC;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/check.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"check.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/check.ts"],"sourcesContent":["import {HttpResponseError, Session} from '@shopify/shopify-api';\n\nimport type {BasicParams} from '../../../types';\nimport {redirectToAuthPage} from '../helpers';\nimport type {AppConfigArg} from '../../../config-types';\nimport {invalidateAccessToken} from '../../helpers';\n\nimport type {CheckBillingOptions} from './types';\n\nexport function checkBillingFactory<Config extends AppConfigArg>(\n params: BasicParams,\n request: Request,\n session: Session,\n) {\n return async function checkBilling(\n options: CheckBillingOptions<Config> = {},\n ) {\n const {api, logger} = params;\n\n logger.debug('Checking billing plans', {shop: session.shop, ...options});\n\n try {\n return await api.billing.check({\n session,\n plans: options.plans as string[],\n isTest: options.isTest,\n returnObject: true,\n });\n } catch (error) {\n if (error instanceof HttpResponseError && error.response.code === 401) {\n logger.debug('API token was invalid, redirecting to OAuth', {\n shop: session.shop,\n });\n await invalidateAccessToken(params, session);\n throw await redirectToAuthPage(params, request, session.shop);\n } else {\n throw error;\n }\n }\n };\n}\n"],"names":[],"mappings":";;;;;;;SASgB,mBAAmB,CACjC,MAAmB,EACnB,OAAgB,EAChB,OAAgB,EAAA;AAEhB,IAAA,OAAO,eAAe,YAAY,CAChC,UAAuC,EAAE,EAAA;AAEzC,QAAA,MAAM,EAAC,GAAG,EAAE,MAAM,EAAC,GAAG,MAAM;AAE5B,QAAA,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC;AAExE,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC7B,OAAO;gBACP,KAAK,EAAE,OAAO,CAAC,KAAiB;gBAChC,MAAM,EAAE,OAAO,CAAC,MAAM;AACtB,gBAAA,YAAY,EAAE,IAAI;AACnB,aAAA,CAAC;QACJ;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,KAAK,YAAY,iBAAiB,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE;AACrE,gBAAA,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE;oBAC1D,IAAI,EAAE,OAAO,CAAC,IAAI;AACnB,iBAAA,CAAC;AACF,gBAAA,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC;gBAC5C,MAAM,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;YAC/D;iBAAO;AACL,gBAAA,MAAM,KAAK;YACb;QACF;AACF,IAAA,CAAC;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-usage-record.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/create-usage-record.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"create-usage-record.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/create-usage-record.ts"],"sourcesContent":["import {HttpResponseError, Session} from '@shopify/shopify-api';\n\nimport type {BasicParams} from '../../../types';\nimport {redirectToAuthPage} from '../helpers';\nimport {invalidateAccessToken} from '../../helpers';\n\nimport type {CreateUsageRecordOptions} from './types';\n\nexport function createUsageRecordFactory(\n params: BasicParams,\n request: Request,\n session: Session,\n) {\n return async function createUsageRecord(options: CreateUsageRecordOptions) {\n const {api, logger} = params;\n\n logger.debug('Create usage record', {shop: session.shop, ...options});\n\n try {\n return await api.billing.createUsageRecord({\n ...options,\n session,\n });\n } catch (error) {\n if (error instanceof HttpResponseError && error.response.code === 401) {\n logger.debug('API token was invalid, redirecting to OAuth', {\n shop: session.shop,\n });\n await invalidateAccessToken(params, session);\n throw await redirectToAuthPage(params, request, session.shop);\n } else {\n throw error;\n }\n }\n };\n}\n"],"names":[],"mappings":";;;;;;;SAQgB,wBAAwB,CACtC,MAAmB,EACnB,OAAgB,EAChB,OAAgB,EAAA;AAEhB,IAAA,OAAO,eAAe,iBAAiB,CAAC,OAAiC,EAAA;AACvE,QAAA,MAAM,EAAC,GAAG,EAAE,MAAM,EAAC,GAAG,MAAM;AAE5B,QAAA,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,OAAO,EAAC,CAAC;AAErE,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC;AACzC,gBAAA,GAAG,OAAO;gBACV,OAAO;AACR,aAAA,CAAC;QACJ;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,KAAK,YAAY,iBAAiB,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE;AACrE,gBAAA,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE;oBAC1D,IAAI,EAAE,OAAO,CAAC,IAAI;AACnB,iBAAA,CAAC;AACF,gBAAA,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC;gBAC5C,MAAM,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;YAC/D;iBAAO;AACL,gBAAA,MAAM,KAAK;YACb;QACF;AACF,IAAA,CAAC;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/helpers.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"helpers.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/helpers.ts"],"sourcesContent":["import {redirect} from '@remix-run/server-runtime';\n\nimport {BasicParams} from '../../../types';\nimport {getAppBridgeHeaders} from '../helpers';\n\nexport function redirectOutOfApp(\n params: BasicParams,\n request: Request,\n url: string,\n shop: string,\n): never {\n const {config, logger} = params;\n\n logger.debug('Redirecting out of app', {shop, url});\n\n const requestUrl = new URL(request.url);\n const isEmbeddedRequest = requestUrl.searchParams.get('embedded') === '1';\n const isXhrRequest = request.headers.get('authorization');\n\n if (isXhrRequest) {\n // eslint-disable-next-line no-warning-comments\n // TODO Check this with the beta flag disabled (with the bounce page)\n // Remix is not including the X-Shopify-API-Request-Failure-Reauthorize-Url when throwing a Response\n // https://github.com/remix-run/remix/issues/5356\n throw new Response(undefined, {\n status: 401,\n statusText: 'Unauthorized',\n headers: getAppBridgeHeaders(url),\n });\n } else if (isEmbeddedRequest) {\n const params = new URLSearchParams({\n shop,\n host: requestUrl.searchParams.get('host')!,\n exitIframe: url,\n });\n\n throw redirect(`${config.auth.exitIframePath}?${params.toString()}`);\n } else {\n // This will only ever happen for non-embedded apps, because the authenticator will stop before reaching this point\n throw redirect(url);\n }\n}\n"],"names":[],"mappings":";;;;AAKM,SAAU,gBAAgB,CAC9B,MAAmB,EACnB,OAAgB,EAChB,GAAW,EACX,IAAY,EAAA;AAEZ,IAAA,MAAM,EAAC,MAAM,EAAE,MAAM,EAAC,GAAG,MAAM;IAE/B,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAC,IAAI,EAAE,GAAG,EAAC,CAAC;IAEnD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;AACvC,IAAA,MAAM,iBAAiB,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG;IACzE,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAEzD,IAAI,YAAY,EAAE;;;;;AAKhB,QAAA,MAAM,IAAI,QAAQ,CAAC,SAAS,EAAE;AAC5B,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,UAAU,EAAE,cAAc;AAC1B,YAAA,OAAO,EAAE,mBAAmB,CAAC,GAAG,CAAC;AAClC,SAAA,CAAC;IACJ;SAAO,IAAI,iBAAiB,EAAE;AAC5B,QAAA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,IAAI;YACJ,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE;AAC1C,YAAA,UAAU,EAAE,GAAG;AAChB,SAAA,CAAC;AAEF,QAAA,MAAM,QAAQ,CAAC,CAAA,EAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAA,CAAA,EAAI,MAAM,CAAC,QAAQ,EAAE,CAAA,CAAE,CAAC;IACtE;SAAO;;AAEL,QAAA,MAAM,QAAQ,CAAC,GAAG,CAAC;IACrB;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/request.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"request.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/request.ts"],"sourcesContent":["import {\n BillingRequestResponseObject,\n HttpResponseError,\n Session,\n} from '@shopify/shopify-api';\n\nimport {AppConfigArg} from '../../../config-types';\nimport {BasicParams} from '../../../types';\nimport {redirectToAuthPage} from '../helpers';\nimport {invalidateAccessToken} from '../../helpers';\n\nimport {redirectOutOfApp} from './helpers';\nimport type {RequestBillingOptions} from './types';\n\nexport function requestBillingFactory<Config extends AppConfigArg>(\n params: BasicParams,\n request: Request,\n session: Session,\n) {\n return async function requestBilling({\n plan,\n isTest,\n returnUrl,\n ...overrides\n }: RequestBillingOptions<Config>): Promise<never> {\n const {api, logger} = params;\n\n logger.info('Requesting billing', {\n shop: session.shop,\n plan,\n isTest,\n returnUrl,\n });\n\n let result: BillingRequestResponseObject;\n try {\n result = await api.billing.request({\n plan: plan as string,\n session,\n isTest,\n returnUrl,\n returnObject: true,\n ...overrides,\n });\n } catch (error) {\n if (error instanceof HttpResponseError && error.response.code === 401) {\n logger.debug('API token was invalid, redirecting to OAuth', {\n shop: session.shop,\n });\n await invalidateAccessToken(params, session);\n throw await redirectToAuthPage(params, request, session.shop);\n } else {\n throw error;\n }\n }\n\n throw redirectOutOfApp(\n params,\n request,\n result.confirmationUrl,\n session.shop,\n );\n };\n}\n"],"names":[],"mappings":";;;;;;;;SAcgB,qBAAqB,CACnC,MAAmB,EACnB,OAAgB,EAChB,OAAgB,EAAA;AAEhB,IAAA,OAAO,eAAe,cAAc,CAAC,EACnC,IAAI,EACJ,MAAM,EACN,SAAS,EACT,GAAG,SAAS,EACkB,EAAA;AAC9B,QAAA,MAAM,EAAC,GAAG,EAAE,MAAM,EAAC,GAAG,MAAM;AAE5B,QAAA,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAChC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI;YACJ,MAAM;YACN,SAAS;AACV,SAAA,CAAC;AAEF,QAAA,IAAI,MAAoC;AACxC,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;AACjC,gBAAA,IAAI,EAAE,IAAc;gBACpB,OAAO;gBACP,MAAM;gBACN,SAAS;AACT,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,GAAG,SAAS;AACb,aAAA,CAAC;QACJ;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,KAAK,YAAY,iBAAiB,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE;AACrE,gBAAA,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE;oBAC1D,IAAI,EAAE,OAAO,CAAC,IAAI;AACnB,iBAAA,CAAC;AACF,gBAAA,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC;gBAC5C,MAAM,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;YAC/D;iBAAO;AACL,gBAAA,MAAM,KAAK;YACb;QACF;AAEA,QAAA,MAAM,gBAAgB,CACpB,MAAM,EACN,OAAO,EACP,MAAM,CAAC,eAAe,EACtB,OAAO,CAAC,IAAI,CACb;AACH,IAAA,CAAC;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"require.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/require.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"require.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/require.ts"],"sourcesContent":["import {\n BillingCheckResponseObject,\n HttpResponseError,\n Session,\n} from '@shopify/shopify-api';\n\nimport type {BasicParams} from '../../../types';\nimport type {AppConfigArg} from '../../../config-types';\nimport {redirectToAuthPage} from '../helpers';\nimport {invalidateAccessToken} from '../../helpers';\n\nimport type {RequireBillingOptions} from './types';\n\nexport function requireBillingFactory<Config extends AppConfigArg>(\n params: BasicParams,\n request: Request,\n session: Session,\n) {\n const {api, logger} = params;\n\n return async function requireBilling(options: RequireBillingOptions<Config>) {\n const logContext = {\n shop: session.shop,\n plans: options.plans,\n isTest: options.isTest,\n };\n\n logger.debug('Checking billing for the shop', logContext);\n\n let data: BillingCheckResponseObject;\n try {\n data = await api.billing.check({\n session,\n plans: options.plans as string[],\n isTest: options.isTest,\n returnObject: true,\n });\n } catch (error) {\n if (error instanceof HttpResponseError && error.response.code === 401) {\n logger.debug('API token was invalid, redirecting to OAuth', logContext);\n\n await invalidateAccessToken(params, session);\n throw await redirectToAuthPage(params, request, session.shop);\n } else {\n throw error;\n }\n }\n\n if (!data.hasActivePayment) {\n logger.debug('Billing check failed', logContext);\n throw await options.onFailure(new Error('Billing check failed'));\n }\n\n logger.debug('Billing check succeeded', logContext);\n\n return data;\n };\n}\n"],"names":[],"mappings":";;;;;;;SAagB,qBAAqB,CACnC,MAAmB,EACnB,OAAgB,EAChB,OAAgB,EAAA;AAEhB,IAAA,MAAM,EAAC,GAAG,EAAE,MAAM,EAAC,GAAG,MAAM;AAE5B,IAAA,OAAO,eAAe,cAAc,CAAC,OAAsC,EAAA;AACzE,QAAA,MAAM,UAAU,GAAG;YACjB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB;AAED,QAAA,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,UAAU,CAAC;AAEzD,QAAA,IAAI,IAAgC;AACpC,QAAA,IAAI;AACF,YAAA,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC7B,OAAO;gBACP,KAAK,EAAE,OAAO,CAAC,KAAiB;gBAChC,MAAM,EAAE,OAAO,CAAC,MAAM;AACtB,gBAAA,YAAY,EAAE,IAAI;AACnB,aAAA,CAAC;QACJ;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,KAAK,YAAY,iBAAiB,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE;AACrE,gBAAA,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,UAAU,CAAC;AAEvE,gBAAA,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC;gBAC5C,MAAM,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;YAC/D;iBAAO;AACL,gBAAA,MAAM,KAAK;YACb;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC1B,YAAA,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,UAAU,CAAC;YAChD,MAAM,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAClE;AAEA,QAAA,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,UAAU,CAAC;AAEnD,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AACH;;;;"}
|
package/dist/esm/server/authenticate/admin/billing/update-usage-subscription-capped-amount.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-usage-subscription-capped-amount.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/update-usage-subscription-capped-amount.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"update-usage-subscription-capped-amount.mjs","sources":["../../../../../../../src/server/authenticate/admin/billing/update-usage-subscription-capped-amount.ts"],"sourcesContent":["import {\n HttpResponseError,\n Session,\n UpdateCappedAmountConfirmation,\n} from '@shopify/shopify-api';\n\nimport type {BasicParams} from '../../../types';\nimport {redirectToAuthPage} from '../helpers';\nimport {invalidateAccessToken} from '../../helpers';\n\nimport {UpdateUsageCappedAmountOptions} from './types';\nimport {redirectOutOfApp} from './helpers';\n\nexport function updateUsageCappedAmountFactory(\n params: BasicParams,\n request: Request,\n session: Session,\n) {\n return async function updateUsageCappedAmount(\n options: UpdateUsageCappedAmountOptions,\n ): Promise<never> {\n const {api, logger} = params;\n\n logger.debug('Updating usage subscription capped amount', {\n shop: session.shop,\n ...options,\n });\n\n let result: UpdateCappedAmountConfirmation;\n try {\n result = await api.billing.updateUsageCappedAmount({\n session,\n subscriptionLineItemId: options.subscriptionLineItemId,\n cappedAmount: options.cappedAmount,\n });\n } catch (error) {\n if (error instanceof HttpResponseError && error.response.code === 401) {\n logger.debug('API token was invalid, redirecting to OAuth', {\n shop: session.shop,\n });\n await invalidateAccessToken(params, session);\n throw await redirectToAuthPage(params, request, session.shop);\n } else {\n throw error;\n }\n }\n\n throw redirectOutOfApp(\n params,\n request,\n result.confirmationUrl,\n session.shop,\n );\n };\n}\n"],"names":[],"mappings":";;;;;;;;SAagB,8BAA8B,CAC5C,MAAmB,EACnB,OAAgB,EAChB,OAAgB,EAAA;AAEhB,IAAA,OAAO,eAAe,uBAAuB,CAC3C,OAAuC,EAAA;AAEvC,QAAA,MAAM,EAAC,GAAG,EAAE,MAAM,EAAC,GAAG,MAAM;AAE5B,QAAA,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE;YACxD,IAAI,EAAE,OAAO,CAAC,IAAI;AAClB,YAAA,GAAG,OAAO;AACX,SAAA,CAAC;AAEF,QAAA,IAAI,MAAsC;AAC1C,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAC;gBACjD,OAAO;gBACP,sBAAsB,EAAE,OAAO,CAAC,sBAAsB;gBACtD,YAAY,EAAE,OAAO,CAAC,YAAY;AACnC,aAAA,CAAC;QACJ;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,KAAK,YAAY,iBAAiB,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE;AACrE,gBAAA,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE;oBAC1D,IAAI,EAAE,OAAO,CAAC,IAAI;AACnB,iBAAA,CAAC;AACF,gBAAA,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC;gBAC5C,MAAM,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;YAC/D;iBAAO;AACL,gBAAA,MAAM,KAAK;YACb;QACF;AAEA,QAAA,MAAM,gBAAgB,CACpB,MAAM,EACN,OAAO,EACP,MAAM,CAAC,eAAe,EACtB,OAAO,CAAC,IAAI,CACb;AACH,IAAA,CAAC;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"begin-auth.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/begin-auth.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"begin-auth.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/begin-auth.ts"],"sourcesContent":["import type {BasicParams} from '../../../types';\n\nexport async function beginAuth(\n params: BasicParams,\n request: Request,\n isOnline: boolean,\n shop: string,\n): Promise<never> {\n const {api, config} = params;\n\n throw await api.auth.begin({\n shop,\n callbackPath: config.auth.callbackPath,\n isOnline,\n rawRequest: request,\n });\n}\n"],"names":[],"mappings":"AAEO,eAAe,SAAS,CAC7B,MAAmB,EACnB,OAAgB,EAChB,QAAiB,EACjB,IAAY,EAAA;AAEZ,IAAA,MAAM,EAAC,GAAG,EAAE,MAAM,EAAC,GAAG,MAAM;AAE5B,IAAA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI;AACJ,QAAA,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY;QACtC,QAAQ;AACR,QAAA,UAAU,EAAE,OAAO;AACpB,KAAA,CAAC;AACJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-admin-api-context.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/create-admin-api-context.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"create-admin-api-context.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/create-admin-api-context.ts"],"sourcesContent":["import {Session, ShopifyRestResources} from '@shopify/shopify-api';\n\nimport {AppConfigArg} from '../../../config-types';\nimport type {BasicParams} from '../../../types';\nimport {\n AdminApiContext,\n HandleAdminClientError,\n adminClientFactory,\n} from '../../../clients/admin';\n\nexport function createAdminApiContext<\n ConfigArg extends AppConfigArg,\n Resources extends ShopifyRestResources = ShopifyRestResources,\n>(\n session: Session,\n params: BasicParams,\n handleClientError: HandleAdminClientError,\n): AdminApiContext<ConfigArg, Resources> {\n return adminClientFactory<ConfigArg, Resources>({\n session,\n params,\n handleClientError,\n });\n}\n"],"names":[],"mappings":";;SAUgB,qBAAqB,CAInC,OAAgB,EAChB,MAAmB,EACnB,iBAAyC,EAAA;AAEzC,IAAA,OAAO,kBAAkB,CAAuB;QAC9C,OAAO;QACP,MAAM;QACN,iBAAiB;AAClB,KAAA,CAAC;AACJ;;;;"}
|
package/dist/esm/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure-app-is-embedded-if-required.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"ensure-app-is-embedded-if-required.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.ts"],"sourcesContent":["import {BasicParams} from '../../../types';\n\nimport {redirectToShopifyOrAppRoot} from './redirect-to-shopify-or-app-root';\n\nexport const ensureAppIsEmbeddedIfRequired = async (\n params: BasicParams,\n request: Request,\n) => {\n const {api, logger, config} = params;\n const url = new URL(request.url);\n\n const shop = url.searchParams.get('shop')!;\n\n if (api.config.isEmbeddedApp && url.searchParams.get('embedded') !== '1') {\n logger.debug('App is not embedded, redirecting to Shopify', {shop});\n await redirectToShopifyOrAppRoot(request, {api, logger, config});\n }\n};\n"],"names":[],"mappings":";;AAIO,MAAM,6BAA6B,GAAG,OAC3C,MAAmB,EACnB,OAAgB,KACd;IACF,MAAM,EAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAC,GAAG,MAAM;IACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;IAEhC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE;AAE1C,IAAA,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE;QACxE,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,EAAC,IAAI,EAAC,CAAC;AACnE,QAAA,MAAM,0BAA0B,CAAC,OAAO,EAAE,EAAC,GAAmB,CAAC,CAAC;IAClE;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure-session-token-search-param-if-required.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"ensure-session-token-search-param-if-required.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.ts"],"sourcesContent":["import {BasicParams} from '../../../types';\n\nimport {redirectToBouncePage} from './redirect-to-bounce-page';\n\nconst SESSION_TOKEN_PARAM = 'id_token';\n\nexport const ensureSessionTokenSearchParamIfRequired = async (\n params: BasicParams,\n request: Request,\n) => {\n const {api, logger} = params;\n const url = new URL(request.url);\n\n const shop = url.searchParams.get('shop')!;\n const searchParamSessionToken = url.searchParams.get(SESSION_TOKEN_PARAM);\n const isEmbedded = url.searchParams.get('embedded') === '1';\n\n if (api.config.isEmbeddedApp && isEmbedded && !searchParamSessionToken) {\n logger.debug(\n 'Missing session token in search params, going to bounce page',\n {shop},\n );\n redirectToBouncePage(params, url);\n }\n};\n"],"names":[],"mappings":";;AAIA,MAAM,mBAAmB,GAAG,UAAU;AAE/B,MAAM,uCAAuC,GAAG,OACrD,MAAmB,EACnB,OAAgB,KACd;AACF,IAAA,MAAM,EAAC,GAAG,EAAE,MAAM,EAAC,GAAG,MAAM;IAC5B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;IAEhC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE;IAC1C,MAAM,uBAAuB,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC;AACzE,IAAA,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG;IAE3D,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,UAAU,IAAI,CAAC,uBAAuB,EAAE;QACtE,MAAM,CAAC,KAAK,CACV,8DAA8D,EAC9D,EAAC,IAAI,EAAC,CACP;AACD,QAAA,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC;IACnC;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-client-error.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/handle-client-error.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"handle-client-error.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/handle-client-error.ts"],"sourcesContent":["import {HttpResponseError} from '@shopify/shopify-api';\n\nimport type {HandleAdminClientError} from '../../../clients/admin/types';\nimport {HandleClientErrorOptions} from '../strategies/types';\n\nexport function handleClientErrorFactory({\n request,\n onError,\n}: HandleClientErrorOptions): HandleAdminClientError {\n return async function handleClientError({\n error,\n params,\n session,\n }): Promise<never> {\n if (error instanceof HttpResponseError !== true) {\n params.logger.debug(\n `Got a response error from the API: ${error.message}`,\n {shop: session.shop},\n );\n throw error;\n }\n\n params.logger.debug(\n `Got an HTTP response error from the API: ${error.message}`,\n {\n shop: session.shop,\n code: error.response.code,\n statusText: error.response.statusText,\n body: JSON.stringify(error.response.body),\n },\n );\n\n if (onError) {\n await onError({request, session, error});\n }\n\n // forward a minimal copy of the upstream HTTP response instead of an Error:\n throw new Response(JSON.stringify(error.response.body), {\n status: error.response.code,\n headers: {\n 'Content-Type': error.response.headers!['Content-Type'] as string,\n },\n });\n };\n}\n"],"names":[],"mappings":";;SAKgB,wBAAwB,CAAC,EACvC,OAAO,EACP,OAAO,GACkB,EAAA;IACzB,OAAO,eAAe,iBAAiB,CAAC,EACtC,KAAK,EACL,MAAM,EACN,OAAO,GACR,EAAA;AACC,QAAA,IAAI,KAAK,YAAY,iBAAiB,KAAK,IAAI,EAAE;AAC/C,YAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CACjB,CAAA,mCAAA,EAAsC,KAAK,CAAC,OAAO,EAAE,EACrD,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAC,CACrB;AACD,YAAA,MAAM,KAAK;QACb;QAEA,MAAM,CAAC,MAAM,CAAC,KAAK,CACjB,4CAA4C,KAAK,CAAC,OAAO,CAAA,CAAE,EAC3D;YACE,IAAI,EAAE,OAAO,CAAC,IAAI;AAClB,YAAA,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;AACzB,YAAA,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU;YACrC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC1C,SAAA,CACF;QAED,IAAI,OAAO,EAAE;YACX,MAAM,OAAO,CAAC,EAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAC,CAAC;QAC1C;;AAGA,QAAA,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACtD,YAAA,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;AAC3B,YAAA,OAAO,EAAE;gBACP,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAQ,CAAC,cAAc,CAAW;AAClE,aAAA;AACF,SAAA,CAAC;AACJ,IAAA,CAAC;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect-to-auth-page.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect-to-auth-page.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"redirect-to-auth-page.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect-to-auth-page.ts"],"sourcesContent":["import type {BasicParams} from '../../../types';\n\nimport {beginAuth} from './begin-auth';\nimport {redirectWithExitIframe} from './redirect-with-exitiframe';\nimport {redirectWithAppBridgeHeaders} from './redirect-with-app-bridge-headers';\n\nexport async function redirectToAuthPage(\n params: BasicParams,\n request: Request,\n shop: string,\n isOnline = false,\n): Promise<never> {\n const {config} = params;\n\n const url = new URL(request.url);\n const isEmbeddedRequest = url.searchParams.get('embedded') === '1';\n const isXhrRequest = request.headers.get('authorization');\n\n if (isXhrRequest) {\n const redirectUri = new URL(config.auth.path, config.appUrl);\n redirectUri.searchParams.set('shop', shop);\n redirectWithAppBridgeHeaders(redirectUri.toString());\n } else if (isEmbeddedRequest) {\n redirectWithExitIframe(params, request, shop);\n } else {\n throw await beginAuth(params, request, isOnline, shop);\n }\n}\n"],"names":[],"mappings":";;;;AAMO,eAAe,kBAAkB,CACtC,MAAmB,EACnB,OAAgB,EAChB,IAAY,EACZ,QAAQ,GAAG,KAAK,EAAA;AAEhB,IAAA,MAAM,EAAC,MAAM,EAAC,GAAG,MAAM;IAEvB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;AAChC,IAAA,MAAM,iBAAiB,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG;IAClE,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAEzD,IAAI,YAAY,EAAE;AAChB,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;QAC5D,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;AAC1C,QAAA,4BAA4B,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IACtD;SAAO,IAAI,iBAAiB,EAAE;AAC5B,QAAA,sBAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;IAC/C;SAAO;QACL,MAAM,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;IACxD;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect-to-bounce-page.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect-to-bounce-page.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"redirect-to-bounce-page.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect-to-bounce-page.ts"],"sourcesContent":["import {redirect} from '@remix-run/server-runtime';\n\nimport {BasicParams} from '../../../types';\n\nexport const redirectToBouncePage = (params: BasicParams, url: URL): never => {\n const {config} = params;\n\n // Make sure we always point to the configured app URL so it also works behind reverse proxies (that alter the Host\n // header).\n const searchParams = url.searchParams;\n searchParams.delete('id_token');\n searchParams.set(\n 'shopify-reload',\n `${config.appUrl}${url.pathname}?${searchParams.toString()}`,\n );\n\n // eslint-disable-next-line no-warning-comments\n // TODO Make sure this works on chrome without a tunnel (weird HTTPS redirect issue)\n // https://github.com/orgs/Shopify/projects/6899/views/1?pane=issue&itemId=28376650\n throw redirect(\n `${config.auth.patchSessionTokenPath}?${searchParams.toString()}`,\n );\n};\n"],"names":[],"mappings":";;MAIa,oBAAoB,GAAG,CAAC,MAAmB,EAAE,GAAQ,KAAW;AAC3E,IAAA,MAAM,EAAC,MAAM,EAAC,GAAG,MAAM;;;AAIvB,IAAA,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY;AACrC,IAAA,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC;IAC/B,YAAY,CAAC,GAAG,CACd,gBAAgB,EAChB,CAAA,EAAG,MAAM,CAAC,MAAM,CAAA,EAAG,GAAG,CAAC,QAAQ,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAA,CAAE,CAC7D;;;;AAKD,IAAA,MAAM,QAAQ,CACZ,CAAA,EAAG,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAA,CAAA,EAAI,YAAY,CAAC,QAAQ,EAAE,CAAA,CAAE,CAClE;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect-to-install-page.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect-to-install-page.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"redirect-to-install-page.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect-to-install-page.ts"],"sourcesContent":["import {redirect as remixRedirect} from '@remix-run/server-runtime';\n\nimport type {BasicParams} from '../../../types';\n\nimport {redirectWithAppBridgeHeaders} from './redirect-with-app-bridge-headers';\n\nexport async function redirectToInstallPage(\n params: BasicParams,\n shop: string,\n optionalScopes: string[] = [],\n): Promise<never> {\n const installUrl = buildInstallUrl(params, shop, optionalScopes);\n if (params.config.isEmbeddedApp) {\n throw redirectWithAppBridgeHeaders(installUrl);\n } else {\n throw remixRedirect(installUrl);\n }\n}\n\nfunction buildInstallUrl(\n params: BasicParams,\n shop: string,\n optionalScopes: string[] = [],\n) {\n const baseInstallUrl = buildBaseInstallUrl(params, shop);\n baseInstallUrl.search = buildParamsInstallUrl(\n params,\n optionalScopes,\n ).toString();\n return baseInstallUrl.href;\n}\n\nfunction buildBaseInstallUrl({api}: BasicParams, shop: string) {\n const cleanShop = api.utils.sanitizeShop(shop, true);\n return new URL(`https://${cleanShop}/admin/oauth/install`);\n}\n\nfunction buildParamsInstallUrl(\n {config}: BasicParams,\n optionalScopes: string[] = [],\n) {\n const optionalScopesParam =\n optionalScopes && optionalScopes.length > 0\n ? {optional_scopes: optionalScopes.join(',')}\n : undefined;\n\n const query = {\n client_id: config.apiKey,\n scope: config.scopes?.toString() || '',\n ...optionalScopesParam,\n };\n return new URLSearchParams(query);\n}\n"],"names":["remixRedirect"],"mappings":";;;AAMO,eAAe,qBAAqB,CACzC,MAAmB,EACnB,IAAY,EACZ,cAAA,GAA2B,EAAE,EAAA;IAE7B,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC;AAChE,IAAA,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE;AAC/B,QAAA,MAAM,4BAA4B,CAAC,UAAU,CAAC;IAChD;SAAO;AACL,QAAA,MAAMA,QAAa,CAAC,UAAU,CAAC;IACjC;AACF;AAEA,SAAS,eAAe,CACtB,MAAmB,EACnB,IAAY,EACZ,iBAA2B,EAAE,EAAA;IAE7B,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC;AACxD,IAAA,cAAc,CAAC,MAAM,GAAG,qBAAqB,CAC3C,MAAM,EACN,cAAc,CACf,CAAC,QAAQ,EAAE;IACZ,OAAO,cAAc,CAAC,IAAI;AAC5B;AAEA,SAAS,mBAAmB,CAAC,EAAC,GAAG,EAAc,EAAE,IAAY,EAAA;AAC3D,IAAA,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;AACpD,IAAA,OAAO,IAAI,GAAG,CAAC,WAAW,SAAS,CAAA,oBAAA,CAAsB,CAAC;AAC5D;AAEA,SAAS,qBAAqB,CAC5B,EAAC,MAAM,EAAc,EACrB,iBAA2B,EAAE,EAAA;IAE7B,MAAM,mBAAmB,GACvB,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG;UACtC,EAAC,eAAe,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;UAC1C,SAAS;AAEf,IAAA,MAAM,KAAK,GAAG;QACZ,SAAS,EAAE,MAAM,CAAC,MAAM;QACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;AACtC,QAAA,GAAG,mBAAmB;KACvB;AACD,IAAA,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC;AACnC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect-to-shopify-or-app-root.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"redirect-to-shopify-or-app-root.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.ts"],"sourcesContent":["import {redirect} from '@remix-run/server-runtime';\n\nimport type {BasicParams} from '../../../types';\n\nexport async function redirectToShopifyOrAppRoot(\n request: Request,\n params: BasicParams,\n responseHeaders?: Headers,\n): Promise<never> {\n const {api} = params;\n const url = new URL(request.url);\n\n const host = api.utils.sanitizeHost(url.searchParams.get('host')!)!;\n const shop = api.utils.sanitizeShop(url.searchParams.get('shop')!)!;\n\n const redirectUrl = api.config.isEmbeddedApp\n ? await api.auth.getEmbeddedAppUrl({rawRequest: request})\n : `/?shop=${shop}&host=${encodeURIComponent(host)}`;\n\n throw redirect(redirectUrl, {headers: responseHeaders});\n}\n"],"names":[],"mappings":";;AAIO,eAAe,0BAA0B,CAC9C,OAAgB,EAChB,MAAmB,EACnB,eAAyB,EAAA;AAEzB,IAAA,MAAM,EAAC,GAAG,EAAC,GAAG,MAAM;IACpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;AAEhC,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE,CAAE;AACnE,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE,CAAE;AAEnE,IAAA,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC;AAC7B,UAAE,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAC,UAAU,EAAE,OAAO,EAAC;UACtD,UAAU,IAAI,CAAA,MAAA,EAAS,kBAAkB,CAAC,IAAI,CAAC,CAAA,CAAE;IAErD,MAAM,QAAQ,CAAC,WAAW,EAAE,EAAC,OAAO,EAAE,eAAe,EAAC,CAAC;AACzD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect-with-app-bridge-headers.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"redirect-with-app-bridge-headers.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.ts"],"sourcesContent":["import {REAUTH_URL_HEADER} from '../../const';\n\nexport function redirectWithAppBridgeHeaders(redirectUri: string): never {\n throw new Response(undefined, {\n status: 401,\n statusText: 'Unauthorized',\n headers: getAppBridgeHeaders(redirectUri),\n });\n}\n\nexport function getAppBridgeHeaders(url: string) {\n return new Headers({[REAUTH_URL_HEADER]: url});\n}\n"],"names":[],"mappings":";;AAEM,SAAU,4BAA4B,CAAC,WAAmB,EAAA;AAC9D,IAAA,MAAM,IAAI,QAAQ,CAAC,SAAS,EAAE;AAC5B,QAAA,MAAM,EAAE,GAAG;AACX,QAAA,UAAU,EAAE,cAAc;AAC1B,QAAA,OAAO,EAAE,mBAAmB,CAAC,WAAW,CAAC;AAC1C,KAAA,CAAC;AACJ;AAEM,SAAU,mBAAmB,CAAC,GAAW,EAAA;IAC7C,OAAO,IAAI,OAAO,CAAC,EAAC,CAAC,iBAAiB,GAAG,GAAG,EAAC,CAAC;AAChD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect-with-exitiframe.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect-with-exitiframe.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"redirect-with-exitiframe.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect-with-exitiframe.ts"],"sourcesContent":["import {redirect} from '@remix-run/server-runtime';\n\nimport type {BasicParams} from '../../../types';\n\nexport function redirectWithExitIframe(\n params: BasicParams,\n request: Request,\n shop: string,\n): never {\n const {api, config} = params;\n const url = new URL(request.url);\n\n const queryParams = url.searchParams;\n\n const host = api.utils.sanitizeHost(queryParams.get('host')!);\n\n queryParams.set('shop', shop);\n\n let destination = `${config.auth.path}?shop=${shop}`;\n\n if (host) {\n queryParams.set('host', host);\n destination = `${destination}&host=${host}`;\n }\n queryParams.set('exitIframe', destination);\n\n throw redirect(`${config.auth.exitIframePath}?${queryParams.toString()}`);\n}\n"],"names":[],"mappings":";;SAIgB,sBAAsB,CACpC,MAAmB,EACnB,OAAgB,EAChB,IAAY,EAAA;AAEZ,IAAA,MAAM,EAAC,GAAG,EAAE,MAAM,EAAC,GAAG,MAAM;IAC5B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;AAEhC,IAAA,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY;AAEpC,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;AAE7D,IAAA,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;IAE7B,IAAI,WAAW,GAAG,CAAA,EAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE;IAEpD,IAAI,IAAI,EAAE;AACR,QAAA,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;AAC7B,QAAA,WAAW,GAAG,CAAA,EAAG,WAAW,CAAA,MAAA,EAAS,IAAI,EAAE;IAC7C;AACA,IAAA,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC;AAE1C,IAAA,MAAM,QAAQ,CAAC,CAAA,EAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAA,CAAA,EAAI,WAAW,CAAC,QAAQ,EAAE,CAAA,CAAE,CAAC;AAC3E;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"redirect.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/redirect.ts"],"sourcesContent":["import {\n TypedResponse,\n redirect as remixRedirect,\n} from '@remix-run/server-runtime';\n\nimport {BasicParams} from '../../../types';\nimport {getSessionTokenHeader} from '../../helpers/get-session-token-header';\n\nimport {renderAppBridge} from './render-app-bridge';\nimport {redirectWithAppBridgeHeaders} from './redirect-with-app-bridge-headers';\n\nexport type RedirectTarget = '_self' | '_parent' | '_top' | '_blank';\nexport type RedirectInit = number | (ResponseInit & {target?: RedirectTarget});\nexport type RedirectFunction = (\n url: string,\n init?: RedirectInit,\n) => TypedResponse<never>;\n\ninterface ParseURLOptions {\n params: BasicParams;\n url: string;\n base: string;\n shop: string;\n init: RedirectInit;\n}\n\ninterface ParsedURL {\n url: URL;\n target: RedirectTarget;\n}\n\nexport function redirectFactory(\n params: BasicParams,\n request: Request,\n shop: string,\n): RedirectFunction {\n const {config, logger} = params;\n\n return function redirect(url, init: RedirectInit) {\n const {searchParams} = new URL(request.url);\n const {url: parsedUrl, target} = parseURL({\n params,\n url,\n base: config.appUrl,\n shop,\n init,\n });\n\n logger.debug('Redirecting', {shop, url: parsedUrl.toString()});\n\n const isSameOrigin = parsedUrl.origin === config.appUrl;\n if (isSameOrigin || url.startsWith('/')) {\n searchParams.forEach((value, key) => {\n if (!parsedUrl.searchParams.has(key)) {\n parsedUrl.searchParams.set(key, value);\n }\n });\n }\n\n if (target === '_self') {\n if (isBounceRequest(request)) {\n throw renderAppBridge(params, request, {\n url: parsedUrl.toString(),\n target,\n });\n } else {\n return remixRedirect(parsedUrl.toString(), init);\n }\n } else if (isDataRequest(request)) {\n throw redirectWithAppBridgeHeaders(parsedUrl.toString());\n } else if (isEmbeddedRequest(request)) {\n throw renderAppBridge(params, request, {\n url: parsedUrl.toString(),\n target,\n });\n }\n return remixRedirect(url, init);\n };\n}\n\nfunction isBounceRequest(request: Request) {\n return (\n Boolean(getSessionTokenHeader(request)) &&\n request.headers.has('X-Shopify-Bounce')\n );\n}\n\nfunction isDataRequest(request: Request) {\n const isGet = request.method === 'GET';\n const sessionTokenHeader = Boolean(getSessionTokenHeader(request));\n\n return (\n sessionTokenHeader &&\n !isBounceRequest(request) &&\n (!isEmbeddedRequest(request) || !isGet)\n );\n}\n\nfunction isEmbeddedRequest(request: Request) {\n const {searchParams} = new URL(request.url);\n\n return searchParams.get('embedded') === '1';\n}\n\nfunction parseURL({params, base, init, shop, url}: ParseURLOptions): ParsedURL {\n let target: RedirectTarget | undefined =\n typeof init !== 'number' && init?.target ? init.target : undefined;\n\n if (isAdminRemotePath(url)) {\n const {config} = params;\n\n const adminPath = getAdminRemotePath(url);\n const cleanShopName = shop.replace('.myshopify.com', '');\n\n if (!target) {\n target = config.isEmbeddedApp ? '_parent' : '_self';\n }\n\n return {\n url: new URL(\n `https://admin.shopify.com/store/${cleanShopName}${adminPath}`,\n ),\n target,\n };\n } else {\n return {\n url: new URL(url, base),\n target: target ?? '_self',\n };\n }\n}\n\nconst ADMIN_REGEX = /^shopify:\\/*admin\\//i;\n\nfunction isAdminRemotePath(url: string) {\n return ADMIN_REGEX.test(url);\n}\n\nfunction getAdminRemotePath(url: string | URL) {\n const parsedUrl = removeRestrictedParams(new URL(url)).href;\n return parsedUrl.replace(ADMIN_REGEX, '/');\n}\n\nconst embeddedFrameParamsToRemove = [\n 'hmac',\n 'locale',\n 'protocol',\n 'session',\n 'id_token',\n 'shop',\n 'timestamp',\n 'host',\n 'embedded',\n // sent when clicking rel=\"home\" nav item\n 'appLoadId',\n];\n\nfunction removeRestrictedParams(url: URL | string) {\n const newUrl = new URL(url);\n embeddedFrameParamsToRemove.forEach((param) =>\n newUrl.searchParams.delete(param),\n );\n return newUrl;\n}\n"],"names":["redirect","remixRedirect"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-app-bridge.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/render-app-bridge.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"render-app-bridge.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/render-app-bridge.ts"],"sourcesContent":["import {BasicParams} from '../../../types';\nimport {appBridgeUrl} from '../../helpers/app-bridge-url';\nimport {addDocumentResponseHeaders} from '../../helpers/add-response-headers';\n\nimport {sanitizeRedirectUrl} from './validate-redirect-url';\n\nimport type {RedirectTarget} from '.';\n\nexport interface RedirectToOptions {\n url: string | URL;\n target?: RedirectTarget;\n}\n\nexport function renderAppBridge(\n {config}: BasicParams,\n request: Request,\n redirectTo?: RedirectToOptions,\n): never {\n let redirectToScript = '';\n if (redirectTo) {\n const destination = sanitizeRedirectUrl(config.appUrl, redirectTo.url);\n\n const target = redirectTo.target ?? '_top';\n\n redirectToScript = `<script>window.open(${JSON.stringify(\n destination.toString(),\n )}, ${JSON.stringify(target)})</script>`;\n }\n\n const responseHeaders = new Headers({\n 'content-type': 'text/html;charset=utf-8',\n });\n addDocumentResponseHeaders(\n responseHeaders,\n config.isEmbeddedApp,\n new URL(request.url).searchParams.get('shop'),\n );\n\n throw new Response(\n `\n <script data-api-key=\"${config.apiKey}\" src=\"${appBridgeUrl()}\"></script>\n ${redirectToScript}\n `,\n {headers: responseHeaders},\n );\n}\n"],"names":[],"mappings":";;;;AAaM,SAAU,eAAe,CAC7B,EAAC,MAAM,EAAc,EACrB,OAAgB,EAChB,UAA8B,EAAA;IAE9B,IAAI,gBAAgB,GAAG,EAAE;IACzB,IAAI,UAAU,EAAE;AACd,QAAA,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC;AAEtE,QAAA,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,MAAM;AAE1C,QAAA,gBAAgB,GAAG,CAAA,oBAAA,EAAuB,IAAI,CAAC,SAAS,CACtD,WAAW,CAAC,QAAQ,EAAE,CACvB,CAAA,EAAA,EAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY;IAC1C;AAEA,IAAA,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC;AAClC,QAAA,cAAc,EAAE,yBAAyB;AAC1C,KAAA,CAAC;IACF,0BAA0B,CACxB,eAAe,EACf,MAAM,CAAC,aAAa,EACpB,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAC9C;IAED,MAAM,IAAI,QAAQ,CAChB;AAC0B,4BAAA,EAAA,MAAM,CAAC,MAAM,CAAA,OAAA,EAAU,YAAY,EAAE,CAAA;QAC3D,gBAAgB;AACnB,IAAA,CAAA,EACD,EAAC,OAAO,EAAE,eAAe,EAAC,CAC3B;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger-after-auth-hook.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/trigger-after-auth-hook.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"trigger-after-auth-hook.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/trigger-after-auth-hook.ts"],"sourcesContent":["import {Session, ShopifyRestResources} from '@shopify/shopify-api';\n\nimport type {AppConfigArg} from '../../../config-types';\nimport {AdminApiContextWithRest} from '../../../clients';\nimport type {BasicParams} from '../../../types';\nimport {AuthorizationStrategy} from '../strategies/types';\n\nimport {createAdminApiContext} from './create-admin-api-context';\n\nexport async function triggerAfterAuthHook<\n ConfigArg extends AppConfigArg,\n Resources extends ShopifyRestResources = ShopifyRestResources,\n>(\n params: BasicParams,\n session: Session,\n request: Request,\n authStrategy: AuthorizationStrategy,\n) {\n const {config, logger} = params;\n if (config.hooks.afterAuth) {\n logger.info('Running afterAuth hook', {shop: session.shop});\n\n const admin = createAdminApiContext<ConfigArg, Resources>(\n session,\n params,\n authStrategy.handleClientError(request),\n ) as AdminApiContextWithRest<Resources>;\n\n await config.hooks.afterAuth({\n session,\n admin,\n });\n }\n}\n"],"names":[],"mappings":";;AASO,eAAe,oBAAoB,CAIxC,MAAmB,EACnB,OAAgB,EAChB,OAAgB,EAChB,YAAmC,EAAA;AAEnC,IAAA,MAAM,EAAC,MAAM,EAAE,MAAM,EAAC,GAAG,MAAM;AAC/B,IAAA,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE;AAC1B,QAAA,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAC,CAAC;AAE3D,QAAA,MAAM,KAAK,GAAG,qBAAqB,CACjC,OAAO,EACP,MAAM,EACN,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,CACF;AAEvC,QAAA,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;YAC3B,OAAO;YACP,KAAK;AACN,SAAA,CAAC;IACJ;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-redirect-url.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/validate-redirect-url.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"validate-redirect-url.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/validate-redirect-url.ts"],"sourcesContent":["import {ShopifyError} from '@shopify/shopify-api';\n\ninterface Options {\n requireSSL?: boolean;\n throwOnInvalid?: boolean;\n}\n\ntype SanitizedRedirectUrl<OptionsArg extends Options> =\n OptionsArg['throwOnInvalid'] extends false ? URL | undefined : URL;\n\nconst FILE_URI_MATCH = /\\/\\/\\//;\nconst INVALID_RELATIVE_URL = /[/\\\\][/\\\\]/;\nconst WHITESPACE_CHARACTER = /\\s/;\nconst VALID_PROTOCOLS = ['https:', 'http:'];\n\nfunction isSafe(\n domain: string,\n redirectUrl: unknown,\n requireSSL: boolean | undefined = true,\n): redirectUrl is string {\n if (typeof redirectUrl !== 'string') {\n return false;\n }\n\n if (\n FILE_URI_MATCH.test(redirectUrl) ||\n WHITESPACE_CHARACTER.test(redirectUrl)\n ) {\n return false;\n }\n\n let url: URL;\n\n try {\n url = new URL(redirectUrl, domain);\n } catch (error) {\n return false;\n }\n\n if (INVALID_RELATIVE_URL.test(url.pathname)) {\n return false;\n }\n\n if (!VALID_PROTOCOLS.includes(url.protocol)) {\n return false;\n }\n\n if (requireSSL && url.protocol !== 'https:') {\n return false;\n }\n\n return true;\n}\n\nexport function sanitizeRedirectUrl<OptionsArg extends Options>(\n domain: string,\n redirectUrl: unknown,\n options: OptionsArg = {} as OptionsArg,\n): SanitizedRedirectUrl<OptionsArg> {\n if (isSafe(domain, redirectUrl, options.requireSSL)) {\n return new URL(redirectUrl, domain) as SanitizedRedirectUrl<OptionsArg>;\n } else if (options.throwOnInvalid === false) {\n return undefined as SanitizedRedirectUrl<OptionsArg>;\n } else {\n throw new ShopifyError('Invalid URL. Refusing to redirect');\n }\n}\n"],"names":[],"mappings":";;AAUA,MAAM,cAAc,GAAG,QAAQ;AAC/B,MAAM,oBAAoB,GAAG,YAAY;AACzC,MAAM,oBAAoB,GAAG,IAAI;AACjC,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC;AAE3C,SAAS,MAAM,CACb,MAAc,EACd,WAAoB,EACpB,aAAkC,IAAI,EAAA;AAEtC,IAAA,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;AACnC,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IACE,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;AAChC,QAAA,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,EACtC;AACA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IAAI,GAAQ;AAEZ,IAAA,IAAI;QACF,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC;IACpC;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC3C,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC3C,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,UAAU,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE;AAC3C,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,mBAAmB,CACjC,MAAc,EACd,WAAoB,EACpB,UAAsB,EAAgB,EAAA;IAEtC,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE;AACnD,QAAA,OAAO,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM,CAAqC;IACzE;AAAO,SAAA,IAAI,OAAO,CAAC,cAAc,KAAK,KAAK,EAAE;AAC3C,QAAA,OAAO,SAA6C;IACtD;SAAO;AACL,QAAA,MAAM,IAAI,YAAY,CAAC,mCAAmC,CAAC;IAC7D;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-shop-and-host-params.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/validate-shop-and-host-params.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"validate-shop-and-host-params.mjs","sources":["../../../../../../../src/server/authenticate/admin/helpers/validate-shop-and-host-params.ts"],"sourcesContent":["import {redirect} from '@remix-run/server-runtime';\n\nimport {BasicParams} from '../../../types';\n\nexport function validateShopAndHostParams(\n params: BasicParams,\n request: Request,\n) {\n const {api, config, logger} = params;\n\n if (config.isEmbeddedApp) {\n const url = new URL(request.url);\n const shop = api.utils.sanitizeShop(url.searchParams.get('shop')!);\n if (!shop) {\n logger.debug('Missing or invalid shop, redirecting to login path', {\n shop,\n });\n throw redirectToLoginPath(request, params);\n }\n\n const host = api.utils.sanitizeHost(url.searchParams.get('host')!);\n if (!host) {\n logger.debug('Invalid host, redirecting to login path', {\n shop,\n host: url.searchParams.get('host'),\n });\n throw redirectToLoginPath(request, params);\n }\n }\n}\n\nfunction redirectToLoginPath(request: Request, params: BasicParams): never {\n const {config, logger} = params;\n\n const {pathname} = new URL(request.url);\n if (pathname === config.auth.loginPath) {\n const message =\n `Detected call to shopify.authenticate.admin() from configured login path ` +\n `('${config.auth.loginPath}'), please make sure to call shopify.login() from that route instead.`;\n\n logger.debug(message);\n throw new Response(message, {status: 500});\n }\n\n throw redirect(config.auth.loginPath);\n}\n"],"names":[],"mappings":";;AAIM,SAAU,yBAAyB,CACvC,MAAmB,EACnB,OAAgB,EAAA;IAEhB,MAAM,EAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAC,GAAG,MAAM;AAEpC,IAAA,IAAI,MAAM,CAAC,aAAa,EAAE;QACxB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;AAChC,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QAClE,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,MAAM,CAAC,KAAK,CAAC,oDAAoD,EAAE;gBACjE,IAAI;AACL,aAAA,CAAC;AACF,YAAA,MAAM,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC;QAC5C;AAEA,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QAClE,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE;gBACtD,IAAI;gBACJ,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;AACnC,aAAA,CAAC;AACF,YAAA,MAAM,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC;QAC5C;IACF;AACF;AAEA,SAAS,mBAAmB,CAAC,OAAgB,EAAE,MAAmB,EAAA;AAChE,IAAA,MAAM,EAAC,MAAM,EAAE,MAAM,EAAC,GAAG,MAAM;IAE/B,MAAM,EAAC,QAAQ,EAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;IACvC,IAAI,QAAQ,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE;QACtC,MAAM,OAAO,GACX,CAAA,yEAAA,CAA2E;AAC3E,YAAA,CAAA,EAAA,EAAK,MAAM,CAAC,IAAI,CAAC,SAAS,uEAAuE;AAEnG,QAAA,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;QACrB,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAC,MAAM,EAAE,GAAG,EAAC,CAAC;IAC5C;IAEA,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;AACvC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-scopes-details.mjs","sources":["../../../../../../../../src/server/authenticate/admin/scope/client/fetch-scopes-details.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"fetch-scopes-details.mjs","sources":["../../../../../../../../src/server/authenticate/admin/scope/client/fetch-scopes-details.ts"],"sourcesContent":["import {AppConfigArg} from '../../../../config-types';\nimport {AdminApiContext} from '../../../../clients';\n\nexport interface FetchScopesDetailResponse {\n app: {\n requestedAccessScopes: {\n handle: string;\n }[];\n optionalAccessScopes: {\n handle: string;\n }[];\n installation: {\n accessScopes: {\n handle: string;\n }[];\n };\n };\n}\n\nconst FETCH_SCOPES_DETAIL_QUERY = `#graphql\nquery FetchAccessScopes{\n app {\n requestedAccessScopes {\n handle\n }\n optionalAccessScopes {\n handle\n }\n installation {\n accessScopes {\n handle\n }\n }\n }\n}`;\n\nexport async function fetchScopeDetail<ConfigArg extends AppConfigArg>(\n admin: AdminApiContext<ConfigArg>,\n): Promise<FetchScopesDetailResponse> {\n const fetchScopeDetailResult = await admin.graphql(FETCH_SCOPES_DETAIL_QUERY);\n\n const resultContent = await fetchScopeDetailResult.json();\n return resultContent.data;\n}\n"],"names":[],"mappings":"AAmBA,MAAM,yBAAyB,GAAG,CAAA;;;;;;;;;;;;;;;EAehC;AAEK,eAAe,gBAAgB,CACpC,KAAiC,EAAA;IAEjC,MAAM,sBAAsB,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,yBAAyB,CAAC;AAE7E,IAAA,MAAM,aAAa,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE;IACzD,OAAO,aAAa,CAAC,IAAI;AAC3B;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revoke-scopes.mjs","sources":["../../../../../../../../src/server/authenticate/admin/scope/client/revoke-scopes.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"revoke-scopes.mjs","sources":["../../../../../../../../src/server/authenticate/admin/scope/client/revoke-scopes.ts"],"sourcesContent":["import {AppConfigArg} from '../../../../config-types';\nimport {AdminApiContext} from '../../../../clients';\n\nexport interface RevokeScopesResponse {\n revoked: {\n handle: string;\n }[];\n userErrors: {\n field: string;\n message: string;\n }[];\n}\n\nconst REVOKE_SCOPE_MUTATION = `#graphql\nmutation AppRevokeAccessScopes($scopes: [String!]!) {\n appRevokeAccessScopes(scopes: $scopes){\n revoked {\n handle\n }\n userErrors {\n field\n message\n }\n }\n}`;\n\nexport async function revokeScopes<ConfigArg extends AppConfigArg>(\n admin: AdminApiContext<ConfigArg>,\n scopes: string[],\n): Promise<RevokeScopesResponse> {\n const revokeScopesResult = await admin.graphql(REVOKE_SCOPE_MUTATION, {\n variables: {\n scopes,\n },\n });\n\n const resultContent = await revokeScopesResult.json();\n return resultContent.data.appRevokeAccessScopes;\n}\n"],"names":[],"mappings":"AAaA,MAAM,qBAAqB,GAAG,CAAA;;;;;;;;;;;EAW5B;AAEK,eAAe,YAAY,CAChC,KAAiC,EACjC,MAAgB,EAAA;IAEhB,MAAM,kBAAkB,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE;AACpE,QAAA,SAAS,EAAE;YACT,MAAM;AACP,SAAA;AACF,KAAA,CAAC;AAEF,IAAA,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE;AACrD,IAAA,OAAO,aAAa,CAAC,IAAI,CAAC,qBAAqB;AACjD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.mjs","sources":["../../../../../../../src/server/authenticate/admin/scope/factory.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"factory.mjs","sources":["../../../../../../../src/server/authenticate/admin/scope/factory.ts"],"sourcesContent":["import {Session} from '@shopify/shopify-api';\n\nimport {AppConfigArg} from '../../../config-types';\nimport {BasicParams} from '../../../types';\nimport {AdminApiContext} from '../../../clients';\n\nimport {ScopesApiContext} from './types';\nimport {requestScopesFactory} from './request';\nimport {queryScopesFactory} from './query';\nimport {revokeScopesFactory} from './revoke';\n\nexport function scopesApiFactory<ConfigArg extends AppConfigArg>(\n params: BasicParams,\n session: Session,\n admin: AdminApiContext<ConfigArg>,\n): ScopesApiContext {\n return {\n query: queryScopesFactory(params, session, admin),\n request: requestScopesFactory(params, session, admin),\n revoke: revokeScopesFactory(params, session, admin),\n };\n}\n"],"names":[],"mappings":";;;;SAWgB,gBAAgB,CAC9B,MAAmB,EACnB,OAAgB,EAChB,KAAiC,EAAA;IAEjC,OAAO;QACL,KAAK,EAAE,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;QACjD,OAAO,EAAE,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;QACrD,MAAM,EAAE,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;KACpD;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.mjs","sources":["../../../../../../../src/server/authenticate/admin/scope/query.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"query.mjs","sources":["../../../../../../../src/server/authenticate/admin/scope/query.ts"],"sourcesContent":["import {AuthScopes, Session} from '@shopify/shopify-api';\n\nimport {AppConfigArg} from '../../../config-types';\nimport {AdminApiContext} from '../../../clients';\nimport type {BasicParams} from '../../../types';\n\nimport {ScopesDetail} from './types';\nimport {\n FetchScopesDetailResponse,\n fetchScopeDetail,\n} from './client/fetch-scopes-details';\n\nexport function queryScopesFactory<ConfigArg extends AppConfigArg>(\n params: BasicParams,\n session: Session,\n admin: AdminApiContext<ConfigArg>,\n) {\n return async function queryScopes() {\n const {logger} = params;\n\n logger.debug('Querying scopes details: ', {\n shop: session.shop,\n });\n\n const scopesDetail = await fetchScopeDetail(admin);\n return mapFetchScopeDetail(scopesDetail);\n };\n}\n\nexport function mapFetchScopeDetail(\n scopesDetailResponse: FetchScopesDetailResponse,\n): ScopesDetail {\n const appInformation = scopesDetailResponse.app;\n\n const granted = new AuthScopes(\n appInformation.installation.accessScopes.map((scope) => scope.handle),\n ).toArray(true);\n\n const required = new AuthScopes(\n appInformation.requestedAccessScopes.map((scope) => scope.handle),\n ).toArray(true);\n\n const optional = new AuthScopes(\n appInformation.optionalAccessScopes.map((scope) => scope.handle),\n ).toArray(true);\n\n return {\n granted,\n required,\n optional,\n };\n}\n"],"names":[],"mappings":";;;SAYgB,kBAAkB,CAChC,MAAmB,EACnB,OAAgB,EAChB,KAAiC,EAAA;IAEjC,OAAO,eAAe,WAAW,GAAA;AAC/B,QAAA,MAAM,EAAC,MAAM,EAAC,GAAG,MAAM;AAEvB,QAAA,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;YACxC,IAAI,EAAE,OAAO,CAAC,IAAI;AACnB,SAAA,CAAC;AAEF,QAAA,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC;AAClD,QAAA,OAAO,mBAAmB,CAAC,YAAY,CAAC;AAC1C,IAAA,CAAC;AACH;AAEM,SAAU,mBAAmB,CACjC,oBAA+C,EAAA;AAE/C,IAAA,MAAM,cAAc,GAAG,oBAAoB,CAAC,GAAG;AAE/C,IAAA,MAAM,OAAO,GAAG,IAAI,UAAU,CAC5B,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,CAAC,CACtE,CAAC,OAAO,CAAC,IAAI,CAAC;IAEf,MAAM,QAAQ,GAAG,IAAI,UAAU,CAC7B,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,CAAC,CAClE,CAAC,OAAO,CAAC,IAAI,CAAC;IAEf,MAAM,QAAQ,GAAG,IAAI,UAAU,CAC7B,cAAc,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,CAAC,CACjE,CAAC,OAAO,CAAC,IAAI,CAAC;IAEf,OAAO;QACL,OAAO;QACP,QAAQ;QACR,QAAQ;KACT;AACH;;;;"}
|