@shopify/shopify-app-remix 4.1.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/dist/cjs/react/components/AppProvider/AppProvider.js.map +1 -1
  2. package/dist/cjs/react/components/AppProxyLink/AppProxyLink.js.map +1 -1
  3. package/dist/cjs/server/authenticate/admin/strategies/auth-code-flow.js.map +1 -1
  4. package/dist/cjs/server/authenticate/admin/strategies/merchant-custom-app.js.map +1 -1
  5. package/dist/cjs/server/authenticate/admin/strategies/token-exchange.js.map +1 -1
  6. package/dist/cjs/server/authenticate/webhooks/authenticate.js +34 -10
  7. package/dist/cjs/server/authenticate/webhooks/authenticate.js.map +1 -1
  8. package/dist/cjs/server/version.js +1 -1
  9. package/dist/cjs/server/version.js.map +1 -1
  10. package/dist/esm/react/components/AppProvider/AppProvider.mjs.map +1 -1
  11. package/dist/esm/react/components/AppProxyLink/AppProxyLink.mjs.map +1 -1
  12. package/dist/esm/server/authenticate/admin/strategies/auth-code-flow.mjs.map +1 -1
  13. package/dist/esm/server/authenticate/admin/strategies/merchant-custom-app.mjs.map +1 -1
  14. package/dist/esm/server/authenticate/admin/strategies/token-exchange.mjs.map +1 -1
  15. package/dist/esm/server/authenticate/webhooks/authenticate.mjs +35 -11
  16. package/dist/esm/server/authenticate/webhooks/authenticate.mjs.map +1 -1
  17. package/dist/esm/server/version.mjs +1 -1
  18. package/dist/esm/server/version.mjs.map +1 -1
  19. package/dist/ts/react/components/AppProvider/AppProvider.d.ts.map +1 -1
  20. package/dist/ts/react/components/AppProxyLink/AppProxyLink.d.ts.map +1 -1
  21. package/dist/ts/server/authenticate/admin/billing/types.d.ts.map +1 -1
  22. package/dist/ts/server/authenticate/admin/strategies/auth-code-flow.d.ts.map +1 -1
  23. package/dist/ts/server/authenticate/admin/strategies/merchant-custom-app.d.ts.map +1 -1
  24. package/dist/ts/server/authenticate/admin/strategies/token-exchange.d.ts.map +1 -1
  25. package/dist/ts/server/authenticate/admin/types.d.ts.map +1 -1
  26. package/dist/ts/server/authenticate/public/extension/types.d.ts.map +1 -1
  27. package/dist/ts/server/authenticate/webhooks/authenticate.d.ts.map +1 -1
  28. package/dist/ts/server/authenticate/webhooks/types.d.ts +34 -2
  29. package/dist/ts/server/authenticate/webhooks/types.d.ts.map +1 -1
  30. package/dist/ts/server/config-types.d.ts.map +1 -1
  31. package/dist/ts/server/version.d.ts +1 -1
  32. package/dist/tsconfig.build.tsbuildinfo +1 -1
  33. package/package.json +18 -14
  34. package/src/react/components/AppProvider/AppProvider.doc.ts +35 -0
  35. package/src/react/components/AppProvider/AppProvider.tsx +147 -0
  36. package/src/react/components/AppProvider/index.ts +1 -0
  37. package/src/react/components/AppProxyForm/AppProxyForm.doc.ts +28 -0
  38. package/src/react/components/AppProxyForm/AppProxyForm.tsx +82 -0
  39. package/src/react/components/AppProxyForm/index.ts +1 -0
  40. package/src/react/components/AppProxyLink/AppProxyLink.doc.ts +28 -0
  41. package/src/react/components/AppProxyLink/AppProxyLink.tsx +58 -0
  42. package/src/react/components/AppProxyLink/index.ts +1 -0
  43. package/src/react/components/AppProxyProvider/AppProxyProvider.doc.ts +40 -0
  44. package/src/react/components/AppProxyProvider/AppProxyProvider.tsx +100 -0
  45. package/src/react/components/AppProxyProvider/index.ts +5 -0
  46. package/src/react/components/RemixPolarisLink.tsx +14 -0
  47. package/src/react/components/index.ts +4 -0
  48. package/src/react/const.ts +2 -0
  49. package/src/react/index.ts +1 -0
  50. package/src/server/__test-helpers/const.ts +14 -0
  51. package/src/server/__test-helpers/expect-admin-api-client.ts +51 -0
  52. package/src/server/__test-helpers/expect-begin-auth-redirect.ts +22 -0
  53. package/src/server/__test-helpers/expect-document-request-headers.ts +25 -0
  54. package/src/server/__test-helpers/expect-exit-iframe.ts +37 -0
  55. package/src/server/__test-helpers/expect-login-redirect.ts +8 -0
  56. package/src/server/__test-helpers/expect-storefront-api-client.ts +49 -0
  57. package/src/server/__test-helpers/expect-token-refresh.ts +188 -0
  58. package/src/server/__test-helpers/get-hmac.ts +7 -0
  59. package/src/server/__test-helpers/get-jwt.ts +10 -0
  60. package/src/server/__test-helpers/get-thrown-error.ts +19 -0
  61. package/src/server/__test-helpers/get-thrown-response.ts +17 -0
  62. package/src/server/__test-helpers/index.ts +21 -0
  63. package/src/server/__test-helpers/mock-graphql-request.ts +60 -0
  64. package/src/server/__test-helpers/request-mock.ts +169 -0
  65. package/src/server/__test-helpers/setup-embedded-flow.ts +30 -0
  66. package/src/server/__test-helpers/setup-fetch-flow.ts +29 -0
  67. package/src/server/__test-helpers/setup-non-embedded-flow.ts +31 -0
  68. package/src/server/__test-helpers/setup-valid-request.ts +78 -0
  69. package/src/server/__test-helpers/setup-valid-session.ts +28 -0
  70. package/src/server/__test-helpers/sign-request-cookie.ts +21 -0
  71. package/src/server/__test-helpers/test-config.ts +56 -0
  72. package/src/server/adapters/node/index.ts +13 -0
  73. package/src/server/adapters/vercel/index.ts +13 -0
  74. package/src/server/authenticate/admin/authenticate.admin.doc.example.ts +34 -0
  75. package/src/server/authenticate/admin/authenticate.admin.doc.ts +51 -0
  76. package/src/server/authenticate/admin/authenticate.ts +232 -0
  77. package/src/server/authenticate/admin/billing/authenticate.admin.billing.doc.ts +29 -0
  78. package/src/server/authenticate/admin/billing/cancel.ts +38 -0
  79. package/src/server/authenticate/admin/billing/check.ts +41 -0
  80. package/src/server/authenticate/admin/billing/create-usage-record.ts +36 -0
  81. package/src/server/authenticate/admin/billing/helpers.ts +42 -0
  82. package/src/server/authenticate/admin/billing/index.ts +6 -0
  83. package/src/server/authenticate/admin/billing/request.ts +64 -0
  84. package/src/server/authenticate/admin/billing/require.ts +58 -0
  85. package/src/server/authenticate/admin/billing/types.ts +613 -0
  86. package/src/server/authenticate/admin/billing/update-usage-subscription-capped-amount.ts +55 -0
  87. package/src/server/authenticate/admin/helpers/begin-auth.ts +17 -0
  88. package/src/server/authenticate/admin/helpers/create-admin-api-context.ts +20 -0
  89. package/src/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.ts +18 -0
  90. package/src/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.ts +25 -0
  91. package/src/server/authenticate/admin/helpers/handle-client-error.ts +45 -0
  92. package/src/server/authenticate/admin/helpers/index.ts +14 -0
  93. package/src/server/authenticate/admin/helpers/redirect-to-auth-page.ts +28 -0
  94. package/src/server/authenticate/admin/helpers/redirect-to-bounce-page.ts +23 -0
  95. package/src/server/authenticate/admin/helpers/redirect-to-install-page.ts +53 -0
  96. package/src/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.ts +21 -0
  97. package/src/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.ts +13 -0
  98. package/src/server/authenticate/admin/helpers/redirect-with-exitiframe.ts +28 -0
  99. package/src/server/authenticate/admin/helpers/redirect.ts +164 -0
  100. package/src/server/authenticate/admin/helpers/render-app-bridge.ts +46 -0
  101. package/src/server/authenticate/admin/helpers/trigger-after-auth-hook.ts +29 -0
  102. package/src/server/authenticate/admin/helpers/validate-redirect-url.ts +67 -0
  103. package/src/server/authenticate/admin/helpers/validate-shop-and-host-params.ts +46 -0
  104. package/src/server/authenticate/admin/scope/authenticate.admin.scopes.doc.ts +28 -0
  105. package/src/server/authenticate/admin/scope/client/fetch-scopes-details.ts +43 -0
  106. package/src/server/authenticate/admin/scope/client/revoke-scopes.ts +38 -0
  107. package/src/server/authenticate/admin/scope/factory.ts +21 -0
  108. package/src/server/authenticate/admin/scope/query.ts +51 -0
  109. package/src/server/authenticate/admin/scope/request.ts +32 -0
  110. package/src/server/authenticate/admin/scope/revoke.ts +48 -0
  111. package/src/server/authenticate/admin/scope/types.ts +126 -0
  112. package/src/server/authenticate/admin/strategies/auth-code-flow.ts +332 -0
  113. package/src/server/authenticate/admin/strategies/merchant-custom-app.ts +65 -0
  114. package/src/server/authenticate/admin/strategies/token-exchange.ts +188 -0
  115. package/src/server/authenticate/admin/strategies/types.ts +29 -0
  116. package/src/server/authenticate/admin/types.ts +216 -0
  117. package/src/server/authenticate/const.ts +15 -0
  118. package/src/server/authenticate/flow/authenticate.flow.doc.example.ts +39 -0
  119. package/src/server/authenticate/flow/authenticate.flow.doc.ts +47 -0
  120. package/src/server/authenticate/flow/authenticate.ts +68 -0
  121. package/src/server/authenticate/flow/types.ts +85 -0
  122. package/src/server/authenticate/fulfillment-service/authenticate.fulfillment-service.doc.example.ts +52 -0
  123. package/src/server/authenticate/fulfillment-service/authenticate.fulfillment-service.doc.ts +48 -0
  124. package/src/server/authenticate/fulfillment-service/authenticate.ts +82 -0
  125. package/src/server/authenticate/fulfillment-service/types.ts +82 -0
  126. package/src/server/authenticate/helpers/add-response-headers.ts +43 -0
  127. package/src/server/authenticate/helpers/app-bridge-url.ts +10 -0
  128. package/src/server/authenticate/helpers/ensure-cors-headers.ts +38 -0
  129. package/src/server/authenticate/helpers/get-session-token-header.ts +11 -0
  130. package/src/server/authenticate/helpers/get-shop-from-request.ts +4 -0
  131. package/src/server/authenticate/helpers/idempotent-promise-handler.ts +45 -0
  132. package/src/server/authenticate/helpers/index.ts +10 -0
  133. package/src/server/authenticate/helpers/invalidate-access-token.ts +17 -0
  134. package/src/server/authenticate/helpers/reject-bot-request.ts +27 -0
  135. package/src/server/authenticate/helpers/respond-to-invalid-session-token.ts +28 -0
  136. package/src/server/authenticate/helpers/respond-to-options-request.ts +26 -0
  137. package/src/server/authenticate/helpers/validate-session-token.ts +40 -0
  138. package/src/server/authenticate/login/login.ts +53 -0
  139. package/src/server/authenticate/public/appProxy/authenticate.public.app-proxy.doc.example.ts +27 -0
  140. package/src/server/authenticate/public/appProxy/authenticate.public.app-proxy.doc.ts +55 -0
  141. package/src/server/authenticate/public/appProxy/authenticate.ts +150 -0
  142. package/src/server/authenticate/public/appProxy/types.ts +215 -0
  143. package/src/server/authenticate/public/checkout/authenticate.public.checkout.doc.example.offers.ts +21 -0
  144. package/src/server/authenticate/public/checkout/authenticate.public.checkout.doc.example.ts +17 -0
  145. package/src/server/authenticate/public/checkout/authenticate.public.checkout.doc.ts +49 -0
  146. package/src/server/authenticate/public/checkout/authenticate.ts +13 -0
  147. package/src/server/authenticate/public/checkout/types.ts +65 -0
  148. package/src/server/authenticate/public/customer-account/authenticate.public.customerAccount.doc.example.offers.ts +36 -0
  149. package/src/server/authenticate/public/customer-account/authenticate.public.customerAccount.doc.example.ts +18 -0
  150. package/src/server/authenticate/public/customer-account/authenticate.public.customerAccount.doc.ts +49 -0
  151. package/src/server/authenticate/public/customer-account/authenticate.ts +13 -0
  152. package/src/server/authenticate/public/customer-account/types.ts +65 -0
  153. package/src/server/authenticate/public/extension/authenticate.ts +54 -0
  154. package/src/server/authenticate/public/extension/types.ts +11 -0
  155. package/src/server/authenticate/public/factory.ts +24 -0
  156. package/src/server/authenticate/public/index.ts +1 -0
  157. package/src/server/authenticate/public/pos/authenticate.ts +8 -0
  158. package/src/server/authenticate/public/pos/types.ts +65 -0
  159. package/src/server/authenticate/public/types.ts +96 -0
  160. package/src/server/authenticate/webhooks/authenticate.ts +105 -0
  161. package/src/server/authenticate/webhooks/authenticate.webhooks.doc.example.ts +43 -0
  162. package/src/server/authenticate/webhooks/authenticate.webhooks.doc.ts +39 -0
  163. package/src/server/authenticate/webhooks/index.ts +1 -0
  164. package/src/server/authenticate/webhooks/register.ts +48 -0
  165. package/src/server/authenticate/webhooks/types.ts +266 -0
  166. package/src/server/boundary/error.tsx +14 -0
  167. package/src/server/boundary/headers.ts +15 -0
  168. package/src/server/boundary/index.ts +39 -0
  169. package/src/server/boundary/types.ts +4 -0
  170. package/src/server/clients/admin/authenticate.admin.api.doc.ts +34 -0
  171. package/src/server/clients/admin/factory.ts +22 -0
  172. package/src/server/clients/admin/graphql.ts +39 -0
  173. package/src/server/clients/admin/index.ts +2 -0
  174. package/src/server/clients/admin/types.ts +120 -0
  175. package/src/server/clients/index.ts +2 -0
  176. package/src/server/clients/storefront/authenticate.storefront.api.doc.ts +34 -0
  177. package/src/server/clients/storefront/factory.ts +32 -0
  178. package/src/server/clients/storefront/index.ts +2 -0
  179. package/src/server/clients/storefront/types.ts +78 -0
  180. package/src/server/clients/types.ts +47 -0
  181. package/src/server/config-types.ts +309 -0
  182. package/src/server/errors.ts +3 -0
  183. package/src/server/future/flags.ts +62 -0
  184. package/src/server/helpers/create-or-load-offline-session.ts +19 -0
  185. package/src/server/helpers/ensure-offline-token-is-not-expired.ts +32 -0
  186. package/src/server/helpers/ensure-valid-offline-session.ts +15 -0
  187. package/src/server/helpers/index.ts +4 -0
  188. package/src/server/helpers/refresh-token.ts +35 -0
  189. package/src/server/index.ts +24 -0
  190. package/src/server/override-logger.ts +42 -0
  191. package/src/server/shopify-app.doc.ts +45 -0
  192. package/src/server/shopify-app.ts +215 -0
  193. package/src/server/test-helpers/index.ts +1 -0
  194. package/src/server/test-helpers/test-config.ts +79 -0
  195. package/src/server/types-contexts.ts +44 -0
  196. package/src/server/types.ts +507 -0
  197. package/src/server/unauthenticated/admin/factory.ts +23 -0
  198. package/src/server/unauthenticated/admin/index.ts +1 -0
  199. package/src/server/unauthenticated/admin/types.ts +79 -0
  200. package/src/server/unauthenticated/admin/unauthenticated.admin.doc.ts +40 -0
  201. package/src/server/unauthenticated/storefront/factory.ts +28 -0
  202. package/src/server/unauthenticated/storefront/index.ts +1 -0
  203. package/src/server/unauthenticated/storefront/types.ts +105 -0
  204. package/src/server/unauthenticated/storefront/unauthenticated.storefront.doc.ts +40 -0
  205. package/src/server/unauthenticated/types.ts +65 -0
  206. package/src/server/version.ts +1 -0
@@ -0,0 +1,105 @@
1
+ import {Session} from '@shopify/shopify-api';
2
+
3
+ import type {StorefrontContext} from '../../clients';
4
+
5
+ export interface UnauthenticatedStorefrontContext {
6
+ /**
7
+ * The session for the given shop.
8
+ *
9
+ * This comes from the session storage which `shopifyApp` uses to store sessions in your database of choice.
10
+ *
11
+ * This will always be an offline session. You can use this to get shop specific data.
12
+ *
13
+ * @example
14
+ * <caption>Using the offline session.</caption>
15
+ * <description>Get your app's shop-specific data using the returned offline `session` object.</description>
16
+ * ```ts
17
+ * // app/routes/**\/.ts
18
+ * import { LoaderFunctionArgs, json } from "@remix-run/node";
19
+ * import { unauthenticated } from "../shopify.server";
20
+ * import { getMyAppData } from "~/db/model.server";
21
+ *
22
+ * export const loader = async ({ request }: LoaderFunctionArgs) => {
23
+ * const shop = getShopFromExternalRequest(request);
24
+ * const { session } = await unauthenticated.storefront(shop);
25
+ * return json(await getMyAppData({shop: session.shop));
26
+ * };
27
+ * ```
28
+ */
29
+ session: Session;
30
+
31
+ /**
32
+ * Method for interacting with the Shopify GraphQL Storefront API for the given store.
33
+ *
34
+ * @example
35
+ * <caption>Querying the GraphQL API.</caption>
36
+ * <description>Use `storefront.graphql` to make query / mutation requests.</description>
37
+ * ```ts
38
+ * // app/routes/**\/.ts
39
+ * import { json } from "@remix-run/node";
40
+ * import { authenticate } from "../shopify.server";
41
+ *
42
+ * export async function action({ request }: ActionFunctionArgs) {
43
+ * const shop = getShopFromExternalRequest(request);
44
+ * const { storefront } = await unauthenticated.storefront(shop);
45
+ *
46
+ * const response = await storefront.graphql(`{blogs(first: 10) { edges { node { id } } } }`);
47
+ *
48
+ * return json(await response.json());
49
+ * }
50
+ * ```
51
+ *
52
+ * @example
53
+ * <caption>Handling GraphQL errors.</caption>
54
+ * <description>Catch `GraphqlQueryError` errors to see error messages from the API.</description>
55
+ * ```ts
56
+ * // /app/routes/**\/*.ts
57
+ * import { ActionFunctionArgs } from "@remix-run/node";
58
+ * import { authenticate } from "../shopify.server";
59
+ *
60
+ * export const action = async ({ request }: ActionFunctionArgs) => {
61
+ * const shop = getShopFromExternalRequest(request);
62
+ * const { storefront } = await unauthenticated.storefront(shop);
63
+ *
64
+ * try {
65
+ * const response = await storefront.graphql(
66
+ * `#graphql
67
+ * query incorrectQuery {
68
+ * products(first: 10) {
69
+ * nodes {
70
+ * not_a_field
71
+ * }
72
+ * }
73
+ * }`,
74
+ * );
75
+ *
76
+ * return json({ data: await response.json() });
77
+ * } catch (error) {
78
+ * if (error instanceof GraphqlQueryError) {
79
+ * // { errors: { graphQLErrors: [
80
+ * // { message: "Field 'not_a_field' doesn't exist on type 'Product'" }
81
+ * // ] } }
82
+ * return json({ errors: error.body?.errors }, { status: 500 });
83
+ * }
84
+ * return json({ message: "An error occurred" }, { status: 500 });
85
+ * }
86
+ * }
87
+ * ```
88
+ *
89
+ * ```ts
90
+ * // /app/shopify.server.ts
91
+ * import { shopifyApp } from "@shopify/shopify-app-remix/server";
92
+ *
93
+ * const shopify = shopifyApp({
94
+ * // ...
95
+ * });
96
+ * export default shopify;
97
+ * export const unauthenticated = shopify.unauthenticated;
98
+ * ```
99
+ */
100
+ storefront: StorefrontContext;
101
+ }
102
+
103
+ export type GetUnauthenticatedStorefrontContext = (
104
+ shop: string,
105
+ ) => Promise<UnauthenticatedStorefrontContext>;
@@ -0,0 +1,40 @@
1
+ import {ReferenceEntityTemplateSchema} from '@shopify/generate-docs';
2
+
3
+ const data: ReferenceEntityTemplateSchema = {
4
+ name: 'Unauthenticated storefront',
5
+ description: `Allows interacting with the Storefront API when working outside of Shopify requests.
6
+ This enables apps to integrate with 3rd party services and perform background tasks.
7
+
8
+ > Caution:
9
+ > This function doesn't perform **any** validation and shouldn't rely on raw user input.
10
+
11
+ When using this function, consider the following:
12
+
13
+ #### Background tasks
14
+
15
+ Apps should ensure that the shop domain is authenticated when enqueueing jobs.
16
+
17
+ #### 3rd party service requests
18
+
19
+ Apps must obtain the shop domain from the 3rd party service in a secure way.`,
20
+ category: 'Unauthenticated',
21
+ type: 'object',
22
+ isVisualComponent: false,
23
+ definitions: [
24
+ {
25
+ title: 'unauthenticated.storefront',
26
+ description: 'Creates an unauthenticated Storefront context.',
27
+ type: 'GetUnauthenticatedStorefrontContext',
28
+ },
29
+ ],
30
+ jsDocTypeExamples: ['UnauthenticatedStorefrontContext'],
31
+ related: [
32
+ {
33
+ name: 'API context',
34
+ subtitle: 'Interact with the Storefront API.',
35
+ url: '/docs/api/shopify-app-remix/apis/storefront-api',
36
+ },
37
+ ],
38
+ };
39
+
40
+ export default data;
@@ -0,0 +1,65 @@
1
+ import type {GetUnauthenticatedAdminContext} from './admin/types';
2
+ import type {GetUnauthenticatedStorefrontContext} from './storefront/types';
3
+
4
+ export interface Unauthenticated {
5
+ /**
6
+ * Get an admin context by passing a shop
7
+ *
8
+ * **Warning** This should only be used for Requests that do not originate from Shopify.
9
+ * You must do your own authentication before using this method.
10
+ * This method throws an error if there is no session for the shop.
11
+ *
12
+ * @example
13
+ * <caption>Responding to a request not controlled by Shopify.</caption>
14
+ * ```ts
15
+ * // /app/shopify.server.ts
16
+ * import { ApiVersion, shopifyApp } from "@shopify/shopify-app-remix/server";
17
+ *
18
+ * const shopify = shopifyApp({
19
+ * // ...etc
20
+ * });
21
+ * export default shopify;
22
+ * ```
23
+ * ```ts
24
+ * // /app/routes/**\/*.jsx
25
+ * import { LoaderFunctionArgs, json } from "@remix-run/node";
26
+ * import { authenticateExternal } from "~/helpers/authenticate"
27
+ * import shopify from "../../shopify.server";
28
+ *
29
+ * export async function loader({ request }: LoaderFunctionArgs) {
30
+ * const shop = await authenticateExternal(request)
31
+ * const {admin} = await shopify.unauthenticated.admin(shop);
32
+ * const response = await admin.graphql("{ shop { name} }")
33
+ *
34
+ * return json(await response.json());
35
+ * }
36
+ * ```
37
+ */
38
+ admin: GetUnauthenticatedAdminContext;
39
+
40
+ /**
41
+ * Get a storefront context by passing a shop
42
+ *
43
+ * **Warning** This should only be used for Requests that do not originate from Shopify.
44
+ * You must do your own authentication before using this method.
45
+ * This method throws an error if there is no session for the shop.
46
+ *
47
+ * @example
48
+ * <caption>Responding to a request not controlled by Shopify</caption>
49
+ * ```ts
50
+ * // /app/routes/**\/*.jsx
51
+ * import { LoaderFunctionArgs, json } from "@remix-run/node";
52
+ * import { authenticateExternal } from "~/helpers/authenticate"
53
+ * import shopify from "../../shopify.server";
54
+ *
55
+ * export async function loader({ request }: LoaderFunctionArgs) {
56
+ * const shop = await authenticateExternal(request)
57
+ * const {storefront} = await shopify.unauthenticated.storefront(shop);
58
+ * const response = await storefront.graphql(`{blogs(first: 10) { edges { node { id } } } }`);
59
+ *
60
+ * return json(await response.json());
61
+ * }
62
+ * ```
63
+ */
64
+ storefront: GetUnauthenticatedStorefrontContext;
65
+ }
@@ -0,0 +1 @@
1
+ export const SHOPIFY_REMIX_LIBRARY_VERSION = '4.2.0';