shopify-app-js 0.0.1-security → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of shopify-app-js might be problematic. Click here for more details.

Files changed (424) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/config.json +14 -0
  3. package/.changeset/flat-clouds-camp.md +5 -0
  4. package/.eslintrc.js +36 -0
  5. package/.github/CODEOWNERS +1 -0
  6. package/.github/ISSUE_TEMPLATE/BUG_REPORT.md +36 -0
  7. package/.github/ISSUE_TEMPLATE/ENHANCEMENT.md +9 -0
  8. package/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md +9 -0
  9. package/.github/PULL_REQUEST_TEMPLATE.md +34 -0
  10. package/.github/dependabot.yml +9 -0
  11. package/.github/workflows/changelog.yml +30 -0
  12. package/.github/workflows/ci.yml +22 -0
  13. package/.github/workflows/cla.yml +22 -0
  14. package/.github/workflows/close-waiting-for-response-issues.yml +20 -0
  15. package/.github/workflows/main-release.yml +36 -0
  16. package/.github/workflows/markdown_link_check.yml +14 -0
  17. package/.github/workflows/markdown_link_checker_config.json +9 -0
  18. package/.github/workflows/publish-experimental-build.yml +30 -0
  19. package/.github/workflows/release-candidate.yml +35 -0
  20. package/.github/workflows/remove-labels-on-activity.yml +16 -0
  21. package/.github/workflows/stale.yml +26 -0
  22. package/.prettierignore +5 -0
  23. package/.prettierrc +1 -0
  24. package/CODE_OF_CONDUCT.md +46 -0
  25. package/CONTRIBUTING.md +39 -0
  26. package/LICENSE.md +9 -0
  27. package/README.md +62 -3
  28. package/RELEASING.md +142 -0
  29. package/loom.config.ts +115 -0
  30. package/package.json +44 -3
  31. package/packages/.prettierrc +1 -0
  32. package/packages/shopify-app-express/CHANGELOG.md +316 -0
  33. package/packages/shopify-app-express/LICENSE.md +9 -0
  34. package/packages/shopify-app-express/README.md +93 -0
  35. package/packages/shopify-app-express/docs/reference/README.md +3 -0
  36. package/packages/shopify-app-express/docs/reference/auth.md +76 -0
  37. package/packages/shopify-app-express/docs/reference/cspHeaders.md +24 -0
  38. package/packages/shopify-app-express/docs/reference/ensureInstalledOnShop.md +17 -0
  39. package/packages/shopify-app-express/docs/reference/migrating-app-v6-api-lib-to-express-lib.md +345 -0
  40. package/packages/shopify-app-express/docs/reference/processWebhooks.md +67 -0
  41. package/packages/shopify-app-express/docs/reference/redirectOutOfApp.md +77 -0
  42. package/packages/shopify-app-express/docs/reference/redirectToShopifyOrAppRoot.md +20 -0
  43. package/packages/shopify-app-express/docs/reference/shopifyApp.md +148 -0
  44. package/packages/shopify-app-express/docs/reference/validateAuthenticatedSession.md +30 -0
  45. package/packages/shopify-app-express/loom.config.ts +27 -0
  46. package/packages/shopify-app-express/package.json +54 -0
  47. package/packages/shopify-app-express/src/__tests__/index.test.ts +100 -0
  48. package/packages/shopify-app-express/src/__tests__/integration/oauth.test.ts +445 -0
  49. package/packages/shopify-app-express/src/__tests__/integration/responses.ts +135 -0
  50. package/packages/shopify-app-express/src/__tests__/integration/types.ts +22 -0
  51. package/packages/shopify-app-express/src/__tests__/integration/utils.ts +68 -0
  52. package/packages/shopify-app-express/src/__tests__/integration/webhooks.test.ts +208 -0
  53. package/packages/shopify-app-express/src/__tests__/redirect-to-auth.test.ts +103 -0
  54. package/packages/shopify-app-express/src/__tests__/setup-jest.ts +8 -0
  55. package/packages/shopify-app-express/src/__tests__/test-helper.ts +204 -0
  56. package/packages/shopify-app-express/src/app-installations.ts +42 -0
  57. package/packages/shopify-app-express/src/auth/__tests__/auth.test.ts +303 -0
  58. package/packages/shopify-app-express/src/auth/auth-callback.ts +131 -0
  59. package/packages/shopify-app-express/src/auth/index.ts +32 -0
  60. package/packages/shopify-app-express/src/auth/types.ts +13 -0
  61. package/packages/shopify-app-express/src/config-types.ts +38 -0
  62. package/packages/shopify-app-express/src/error.ts +8 -0
  63. package/packages/shopify-app-express/src/index.ts +171 -0
  64. package/packages/shopify-app-express/src/middlewares/__tests__/csp-headers.test.ts +69 -0
  65. package/packages/shopify-app-express/src/middlewares/__tests__/ensure-installed-on-shop.test.ts +193 -0
  66. package/packages/shopify-app-express/src/middlewares/__tests__/redirect-to-shopify-or-app-root.test.ts +59 -0
  67. package/packages/shopify-app-express/src/middlewares/__tests__/validate-authenticated-session.test.ts +319 -0
  68. package/packages/shopify-app-express/src/middlewares/csp-headers.ts +31 -0
  69. package/packages/shopify-app-express/src/middlewares/ensure-installed-on-shop.ts +176 -0
  70. package/packages/shopify-app-express/src/middlewares/has-valid-access-token.ts +25 -0
  71. package/packages/shopify-app-express/src/middlewares/index.ts +15 -0
  72. package/packages/shopify-app-express/src/middlewares/redirect-to-shopify-or-app-root.ts +39 -0
  73. package/packages/shopify-app-express/src/middlewares/types.ts +6 -0
  74. package/packages/shopify-app-express/src/middlewares/validate-authenticated-session.ts +142 -0
  75. package/packages/shopify-app-express/src/redirect-out-of-app.ts +80 -0
  76. package/packages/shopify-app-express/src/redirect-to-auth.ts +70 -0
  77. package/packages/shopify-app-express/src/types.ts +26 -0
  78. package/packages/shopify-app-express/src/version.ts +1 -0
  79. package/packages/shopify-app-express/src/webhooks/__tests__/process.test.ts +138 -0
  80. package/packages/shopify-app-express/src/webhooks/index.ts +54 -0
  81. package/packages/shopify-app-express/src/webhooks/process.ts +22 -0
  82. package/packages/shopify-app-express/src/webhooks/types.ts +24 -0
  83. package/packages/shopify-app-express/tsconfig.json +10 -0
  84. package/packages/shopify-app-remix/.eslintrc.js +3 -0
  85. package/packages/shopify-app-remix/CHANGELOG.md +569 -0
  86. package/packages/shopify-app-remix/LICENSE.md +9 -0
  87. package/packages/shopify-app-remix/README.md +223 -0
  88. package/packages/shopify-app-remix/docs/build-docs.sh +11 -0
  89. package/packages/shopify-app-remix/docs/generated/generated_docs_data.json +18650 -0
  90. package/packages/shopify-app-remix/docs/generated/generated_static_pages.json +540 -0
  91. package/packages/shopify-app-remix/docs/staticPages/admin.doc.ts +130 -0
  92. package/packages/shopify-app-remix/docs/staticPages/examples/guides/admin/auth-cors.example.tsx +11 -0
  93. package/packages/shopify-app-remix/docs/staticPages/examples/guides/admin/auth.example.tsx +19 -0
  94. package/packages/shopify-app-remix/docs/staticPages/examples/guides/admin/graphql.example.tsx +29 -0
  95. package/packages/shopify-app-remix/docs/staticPages/examples/guides/admin/headers.example.tsx +10 -0
  96. package/packages/shopify-app-remix/docs/staticPages/examples/guides/admin/rest-resources.example.tsx +9 -0
  97. package/packages/shopify-app-remix/docs/staticPages/examples/guides/admin/rest.example.tsx +17 -0
  98. package/packages/shopify-app-remix/docs/staticPages/examples/guides/future-flags/config.example.ts +8 -0
  99. package/packages/shopify-app-remix/docs/staticPages/examples/guides/future-flags/unstable.example.ts +9 -0
  100. package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/.graphqlrc.ts +16 -0
  101. package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.npm.example.sh +2 -0
  102. package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.pnpm.example.sh +2 -0
  103. package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.yarn.example.sh +2 -0
  104. package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/package.json +5 -0
  105. package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.npm.example.sh +1 -0
  106. package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.pnpm.example.sh +1 -0
  107. package/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.yarn.example.sh +1 -0
  108. package/packages/shopify-app-remix/docs/staticPages/examples/guides/webhooks/config.example.ts +19 -0
  109. package/packages/shopify-app-remix/docs/staticPages/examples/guides/webhooks/endpoint.example.ts +24 -0
  110. package/packages/shopify-app-remix/docs/staticPages/examples/index/app-provider.example.ts +30 -0
  111. package/packages/shopify-app-remix/docs/staticPages/examples/index/boundaries.example.ts +9 -0
  112. package/packages/shopify-app-remix/docs/staticPages/examples/index/create.npm.example.sh +1 -0
  113. package/packages/shopify-app-remix/docs/staticPages/examples/index/create.pnpm.example.sh +1 -0
  114. package/packages/shopify-app-remix/docs/staticPages/examples/index/create.yarn.example.sh +1 -0
  115. package/packages/shopify-app-remix/docs/staticPages/examples/index/embedded-app-auth-strategy-config.example.ts +10 -0
  116. package/packages/shopify-app-remix/docs/staticPages/examples/index/entry-server.example.ts +12 -0
  117. package/packages/shopify-app-remix/docs/staticPages/examples/index/install.npm.example.sh +1 -0
  118. package/packages/shopify-app-remix/docs/staticPages/examples/index/install.pnpm.example.sh +1 -0
  119. package/packages/shopify-app-remix/docs/staticPages/examples/index/install.yarn.example.sh +1 -0
  120. package/packages/shopify-app-remix/docs/staticPages/examples/index/shopify-app.example.ts +14 -0
  121. package/packages/shopify-app-remix/docs/staticPages/examples/index/splat-route.example.ts +11 -0
  122. package/packages/shopify-app-remix/docs/staticPages/future-flags.doc.ts +94 -0
  123. package/packages/shopify-app-remix/docs/staticPages/graphql-types.doc.ts +148 -0
  124. package/packages/shopify-app-remix/docs/staticPages/index.doc.ts +227 -0
  125. package/packages/shopify-app-remix/docs/staticPages/webhooks.doc.ts +64 -0
  126. package/packages/shopify-app-remix/docs/tsconfig.docs.json +9 -0
  127. package/packages/shopify-app-remix/docs/typeOverride.json +1 -0
  128. package/packages/shopify-app-remix/docs/upcoming_changes.md +153 -0
  129. package/packages/shopify-app-remix/loom.config.ts +57 -0
  130. package/packages/shopify-app-remix/package.json +93 -0
  131. package/packages/shopify-app-remix/src/react/.eslintrc.js +16 -0
  132. package/packages/shopify-app-remix/src/react/__tests__/test-helper.ts +22 -0
  133. package/packages/shopify-app-remix/src/react/components/AppProvider/AppProvider.doc.ts +34 -0
  134. package/packages/shopify-app-remix/src/react/components/AppProvider/AppProvider.tsx +121 -0
  135. package/packages/shopify-app-remix/src/react/components/AppProvider/__tests__/AppProvider.test.tsx +68 -0
  136. package/packages/shopify-app-remix/src/react/components/AppProvider/index.ts +1 -0
  137. package/packages/shopify-app-remix/src/react/components/RemixPolarisLink.tsx +14 -0
  138. package/packages/shopify-app-remix/src/react/components/index.ts +1 -0
  139. package/packages/shopify-app-remix/src/react/const.ts +2 -0
  140. package/packages/shopify-app-remix/src/react/index.ts +1 -0
  141. package/packages/shopify-app-remix/src/server/.eslintrc.js +16 -0
  142. package/packages/shopify-app-remix/src/server/__test-helpers/__tests__/request-mock.test.ts +171 -0
  143. package/packages/shopify-app-remix/src/server/__test-helpers/const.ts +11 -0
  144. package/packages/shopify-app-remix/src/server/__test-helpers/expect-admin-api-client.ts +119 -0
  145. package/packages/shopify-app-remix/src/server/__test-helpers/expect-begin-auth-redirect.ts +22 -0
  146. package/packages/shopify-app-remix/src/server/__test-helpers/expect-document-request-headers.ts +25 -0
  147. package/packages/shopify-app-remix/src/server/__test-helpers/expect-exit-iframe.ts +37 -0
  148. package/packages/shopify-app-remix/src/server/__test-helpers/expect-login-redirect.ts +8 -0
  149. package/packages/shopify-app-remix/src/server/__test-helpers/expect-storefront-api-client.ts +50 -0
  150. package/packages/shopify-app-remix/src/server/__test-helpers/get-hmac.ts +10 -0
  151. package/packages/shopify-app-remix/src/server/__test-helpers/get-jwt.ts +31 -0
  152. package/packages/shopify-app-remix/src/server/__test-helpers/get-thrown-response.ts +17 -0
  153. package/packages/shopify-app-remix/src/server/__test-helpers/index.ts +14 -0
  154. package/packages/shopify-app-remix/src/server/__test-helpers/request-mock.ts +169 -0
  155. package/packages/shopify-app-remix/src/server/__test-helpers/setup-valid-session.ts +45 -0
  156. package/packages/shopify-app-remix/src/server/__test-helpers/sign-request-cookie.ts +21 -0
  157. package/packages/shopify-app-remix/src/server/__test-helpers/test-config.ts +112 -0
  158. package/packages/shopify-app-remix/src/server/__tests__/override-logger.test.ts +101 -0
  159. package/packages/shopify-app-remix/src/server/__tests__/shopify-app.test.ts +119 -0
  160. package/packages/shopify-app-remix/src/server/adapters/__tests__/node-app-bridge-url.test.ts +18 -0
  161. package/packages/shopify-app-remix/src/server/adapters/__tests__/node.test.ts +28 -0
  162. package/packages/shopify-app-remix/src/server/adapters/node/__tests__/setup-jest.ts +10 -0
  163. package/packages/shopify-app-remix/src/server/adapters/node/index.ts +20 -0
  164. package/packages/shopify-app-remix/src/server/adapters/vercel/__tests__/setup-jest.ts +12 -0
  165. package/packages/shopify-app-remix/src/server/adapters/vercel/index.ts +13 -0
  166. package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/admin-client.test.ts +181 -0
  167. package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/doc-request-path.test.ts +151 -0
  168. package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/exit-i-frame-path.test.ts +99 -0
  169. package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/patch-session-token-path.test.ts +58 -0
  170. package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/reject-bot.test.ts +23 -0
  171. package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/respond-to-options.test.ts +50 -0
  172. package/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/session-token-header-path.test.ts +91 -0
  173. package/packages/shopify-app-remix/src/server/authenticate/admin/authenticate.admin.doc.ts +37 -0
  174. package/packages/shopify-app-remix/src/server/authenticate/admin/authenticate.ts +201 -0
  175. package/packages/shopify-app-remix/src/server/authenticate/admin/billing/__tests__/cancel.test.ts +258 -0
  176. package/packages/shopify-app-remix/src/server/authenticate/admin/billing/__tests__/check.test.ts +254 -0
  177. package/packages/shopify-app-remix/src/server/authenticate/admin/billing/__tests__/mock-responses.ts +65 -0
  178. package/packages/shopify-app-remix/src/server/authenticate/admin/billing/__tests__/request.test.ts +373 -0
  179. package/packages/shopify-app-remix/src/server/authenticate/admin/billing/__tests__/require.test.ts +316 -0
  180. package/packages/shopify-app-remix/src/server/authenticate/admin/billing/authenticate.admin.billing.doc.ts +28 -0
  181. package/packages/shopify-app-remix/src/server/authenticate/admin/billing/cancel.ts +37 -0
  182. package/packages/shopify-app-remix/src/server/authenticate/admin/billing/check.ts +38 -0
  183. package/packages/shopify-app-remix/src/server/authenticate/admin/billing/index.ts +4 -0
  184. package/packages/shopify-app-remix/src/server/authenticate/admin/billing/request.ts +101 -0
  185. package/packages/shopify-app-remix/src/server/authenticate/admin/billing/require.ts +56 -0
  186. package/packages/shopify-app-remix/src/server/authenticate/admin/billing/types.ts +383 -0
  187. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/__tests__/redirect.test.ts +313 -0
  188. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/__tests__/validate-redirect-url.test.ts +84 -0
  189. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/begin-auth.ts +17 -0
  190. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/create-admin-api-context.ts +22 -0
  191. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/ensure-app-is-embedded-if-required.ts +18 -0
  192. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/ensure-session-token-search-param-if-required.ts +25 -0
  193. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/handle-client-error.ts +43 -0
  194. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/index.ts +14 -0
  195. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/redirect-to-auth-page.ts +28 -0
  196. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/redirect-to-bounce-page.ts +23 -0
  197. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/redirect-to-shopify-or-app-root.ts +21 -0
  198. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/redirect-with-app-bridge-headers.ts +13 -0
  199. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/redirect-with-exitiframe.ts +28 -0
  200. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/redirect.ts +83 -0
  201. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/render-app-bridge.ts +46 -0
  202. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/trigger-after-auth-hook.ts +28 -0
  203. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/validate-redirect-url.ts +67 -0
  204. package/packages/shopify-app-remix/src/server/authenticate/admin/helpers/validate-shop-and-host-params.ts +28 -0
  205. package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/admin-client.test.ts +222 -0
  206. package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/auth-callback-path.test.ts +395 -0
  207. package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/auth-path.test.ts +83 -0
  208. package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/authenticate.test.ts +183 -0
  209. package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/ensure-installed-on-shop.test.ts +234 -0
  210. package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/session-token-header-path.test.ts +79 -0
  211. package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/token-exchange/admin-client.test.ts +189 -0
  212. package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/token-exchange/authenticate.test.ts +310 -0
  213. package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/auth-code-flow.ts +333 -0
  214. package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/token-exchange.ts +169 -0
  215. package/packages/shopify-app-remix/src/server/authenticate/admin/strategies/types.ts +29 -0
  216. package/packages/shopify-app-remix/src/server/authenticate/admin/types.ts +199 -0
  217. package/packages/shopify-app-remix/src/server/authenticate/const.ts +15 -0
  218. package/packages/shopify-app-remix/src/server/authenticate/flow/__tests__/authenticate.test.ts +142 -0
  219. package/packages/shopify-app-remix/src/server/authenticate/flow/authenticate.flow.doc.ts +34 -0
  220. package/packages/shopify-app-remix/src/server/authenticate/flow/authenticate.ts +71 -0
  221. package/packages/shopify-app-remix/src/server/authenticate/flow/types.ts +90 -0
  222. package/packages/shopify-app-remix/src/server/authenticate/helpers/__tests__/add-response-headers.test.ts +25 -0
  223. package/packages/shopify-app-remix/src/server/authenticate/helpers/__tests__/app-bridge-url.test.ts +21 -0
  224. package/packages/shopify-app-remix/src/server/authenticate/helpers/__tests__/idempotent-promise-handler.test.ts +104 -0
  225. package/packages/shopify-app-remix/src/server/authenticate/helpers/add-response-headers.ts +43 -0
  226. package/packages/shopify-app-remix/src/server/authenticate/helpers/app-bridge-url.ts +10 -0
  227. package/packages/shopify-app-remix/src/server/authenticate/helpers/ensure-cors-headers.ts +38 -0
  228. package/packages/shopify-app-remix/src/server/authenticate/helpers/get-session-token-header.ts +11 -0
  229. package/packages/shopify-app-remix/src/server/authenticate/helpers/idempotent-promise-handler.ts +45 -0
  230. package/packages/shopify-app-remix/src/server/authenticate/helpers/index.ts +8 -0
  231. package/packages/shopify-app-remix/src/server/authenticate/helpers/reject-bot-request.ts +13 -0
  232. package/packages/shopify-app-remix/src/server/authenticate/helpers/respond-to-invalid-session-token.ts +29 -0
  233. package/packages/shopify-app-remix/src/server/authenticate/helpers/respond-to-options-request.ts +26 -0
  234. package/packages/shopify-app-remix/src/server/authenticate/helpers/validate-session-token.ts +32 -0
  235. package/packages/shopify-app-remix/src/server/authenticate/login/__tests__/login.test.ts +157 -0
  236. package/packages/shopify-app-remix/src/server/authenticate/login/login.ts +53 -0
  237. package/packages/shopify-app-remix/src/server/authenticate/public/__tests__/factory.test.ts +224 -0
  238. package/packages/shopify-app-remix/src/server/authenticate/public/appProxy/__tests__/authenticate.test.ts +282 -0
  239. package/packages/shopify-app-remix/src/server/authenticate/public/appProxy/authenticate.public.app-proxy.doc.ts +36 -0
  240. package/packages/shopify-app-remix/src/server/authenticate/public/appProxy/authenticate.ts +90 -0
  241. package/packages/shopify-app-remix/src/server/authenticate/public/appProxy/types.ts +164 -0
  242. package/packages/shopify-app-remix/src/server/authenticate/public/checkout/__tests__/authenticate.test.ts +142 -0
  243. package/packages/shopify-app-remix/src/server/authenticate/public/checkout/authenticate.public.checkout.doc.ts +23 -0
  244. package/packages/shopify-app-remix/src/server/authenticate/public/checkout/authenticate.ts +45 -0
  245. package/packages/shopify-app-remix/src/server/authenticate/public/checkout/types.ts +65 -0
  246. package/packages/shopify-app-remix/src/server/authenticate/public/factory.ts +49 -0
  247. package/packages/shopify-app-remix/src/server/authenticate/public/index.ts +1 -0
  248. package/packages/shopify-app-remix/src/server/authenticate/public/types.ts +77 -0
  249. package/packages/shopify-app-remix/src/server/authenticate/webhooks/__tests__/authenticate.test.ts +207 -0
  250. package/packages/shopify-app-remix/src/server/authenticate/webhooks/__tests__/mock-responses.ts +45 -0
  251. package/packages/shopify-app-remix/src/server/authenticate/webhooks/__tests__/register.test.ts +210 -0
  252. package/packages/shopify-app-remix/src/server/authenticate/webhooks/authenticate.ts +113 -0
  253. package/packages/shopify-app-remix/src/server/authenticate/webhooks/authenticate.webhooks.doc.ts +28 -0
  254. package/packages/shopify-app-remix/src/server/authenticate/webhooks/index.ts +1 -0
  255. package/packages/shopify-app-remix/src/server/authenticate/webhooks/register.ts +48 -0
  256. package/packages/shopify-app-remix/src/server/authenticate/webhooks/types.ts +246 -0
  257. package/packages/shopify-app-remix/src/server/boundary/__tests__/error.test.tsx +36 -0
  258. package/packages/shopify-app-remix/src/server/boundary/__tests__/headers.test.ts +66 -0
  259. package/packages/shopify-app-remix/src/server/boundary/error.tsx +14 -0
  260. package/packages/shopify-app-remix/src/server/boundary/headers.ts +15 -0
  261. package/packages/shopify-app-remix/src/server/boundary/index.ts +39 -0
  262. package/packages/shopify-app-remix/src/server/boundary/types.ts +4 -0
  263. package/packages/shopify-app-remix/src/server/clients/admin/authenticate.admin.api.doc.ts +34 -0
  264. package/packages/shopify-app-remix/src/server/clients/admin/factory.ts +30 -0
  265. package/packages/shopify-app-remix/src/server/clients/admin/graphql.ts +39 -0
  266. package/packages/shopify-app-remix/src/server/clients/admin/index.ts +2 -0
  267. package/packages/shopify-app-remix/src/server/clients/admin/rest.ts +157 -0
  268. package/packages/shopify-app-remix/src/server/clients/admin/types.ts +178 -0
  269. package/packages/shopify-app-remix/src/server/clients/index.ts +2 -0
  270. package/packages/shopify-app-remix/src/server/clients/storefront/authenticate.storefront.api.doc.ts +34 -0
  271. package/packages/shopify-app-remix/src/server/clients/storefront/factory.ts +32 -0
  272. package/packages/shopify-app-remix/src/server/clients/storefront/index.ts +2 -0
  273. package/packages/shopify-app-remix/src/server/clients/storefront/types.ts +31 -0
  274. package/packages/shopify-app-remix/src/server/clients/types.ts +27 -0
  275. package/packages/shopify-app-remix/src/server/config-types.ts +293 -0
  276. package/packages/shopify-app-remix/src/server/errors.ts +3 -0
  277. package/packages/shopify-app-remix/src/server/future/flags.ts +57 -0
  278. package/packages/shopify-app-remix/src/server/index.ts +20 -0
  279. package/packages/shopify-app-remix/src/server/override-logger.ts +42 -0
  280. package/packages/shopify-app-remix/src/server/shopify-app.doc.ts +45 -0
  281. package/packages/shopify-app-remix/src/server/shopify-app.ts +198 -0
  282. package/packages/shopify-app-remix/src/server/types.ts +509 -0
  283. package/packages/shopify-app-remix/src/server/unauthenticated/admin/__tests__/factory.test.ts +30 -0
  284. package/packages/shopify-app-remix/src/server/unauthenticated/admin/factory.ts +29 -0
  285. package/packages/shopify-app-remix/src/server/unauthenticated/admin/index.ts +1 -0
  286. package/packages/shopify-app-remix/src/server/unauthenticated/admin/types.ts +117 -0
  287. package/packages/shopify-app-remix/src/server/unauthenticated/admin/unauthenticated.admin.doc.ts +40 -0
  288. package/packages/shopify-app-remix/src/server/unauthenticated/helpers/get-offline-session.ts +13 -0
  289. package/packages/shopify-app-remix/src/server/unauthenticated/helpers/index.ts +1 -0
  290. package/packages/shopify-app-remix/src/server/unauthenticated/storefront/__tests__/factory.test.ts +30 -0
  291. package/packages/shopify-app-remix/src/server/unauthenticated/storefront/factory.ts +28 -0
  292. package/packages/shopify-app-remix/src/server/unauthenticated/storefront/index.ts +1 -0
  293. package/packages/shopify-app-remix/src/server/unauthenticated/storefront/types.ts +39 -0
  294. package/packages/shopify-app-remix/src/server/unauthenticated/storefront/unauthenticated.storefront.doc.ts +40 -0
  295. package/packages/shopify-app-remix/src/server/unauthenticated/types.ts +68 -0
  296. package/packages/shopify-app-remix/src/server/version.ts +1 -0
  297. package/packages/shopify-app-remix/tsconfig.json +11 -0
  298. package/packages/shopify-app-session-storage/CHANGELOG.md +149 -0
  299. package/packages/shopify-app-session-storage/LICENSE.md +9 -0
  300. package/packages/shopify-app-session-storage/README.md +5 -0
  301. package/packages/shopify-app-session-storage/implementing-session-storage.md +214 -0
  302. package/packages/shopify-app-session-storage/loom.config.ts +45 -0
  303. package/packages/shopify-app-session-storage/package.json +44 -0
  304. package/packages/shopify-app-session-storage/src/__tests__/setup-jest.ts +8 -0
  305. package/packages/shopify-app-session-storage/src/abstract-migration-engine.ts +53 -0
  306. package/packages/shopify-app-session-storage/src/index.ts +3 -0
  307. package/packages/shopify-app-session-storage/src/rdbms-session-storage-migrator.ts +59 -0
  308. package/packages/shopify-app-session-storage/src/types.ts +174 -0
  309. package/packages/shopify-app-session-storage/tsconfig.json +10 -0
  310. package/packages/shopify-app-session-storage-dynamodb/CHANGELOG.md +150 -0
  311. package/packages/shopify-app-session-storage-dynamodb/LICENSE.md +9 -0
  312. package/packages/shopify-app-session-storage-dynamodb/README.md +75 -0
  313. package/packages/shopify-app-session-storage-dynamodb/loom.config.ts +27 -0
  314. package/packages/shopify-app-session-storage-dynamodb/package.json +51 -0
  315. package/packages/shopify-app-session-storage-dynamodb/src/__tests__/dynamodb.test.ts +93 -0
  316. package/packages/shopify-app-session-storage-dynamodb/src/__tests__/setup-jest.ts +8 -0
  317. package/packages/shopify-app-session-storage-dynamodb/src/dynamodb.ts +126 -0
  318. package/packages/shopify-app-session-storage-dynamodb/tsconfig.json +10 -0
  319. package/packages/shopify-app-session-storage-kv/CHANGELOG.md +204 -0
  320. package/packages/shopify-app-session-storage-kv/LICENSE.md +9 -0
  321. package/packages/shopify-app-session-storage-kv/README.md +41 -0
  322. package/packages/shopify-app-session-storage-kv/loom.config.ts +27 -0
  323. package/packages/shopify-app-session-storage-kv/package.json +52 -0
  324. package/packages/shopify-app-session-storage-kv/src/__tests__/kv-namespace-dummy-worker.ts +8 -0
  325. package/packages/shopify-app-session-storage-kv/src/__tests__/kv.test.ts +22 -0
  326. package/packages/shopify-app-session-storage-kv/src/__tests__/setup-jest.ts +8 -0
  327. package/packages/shopify-app-session-storage-kv/src/kv.ts +87 -0
  328. package/packages/shopify-app-session-storage-kv/tsconfig.json +11 -0
  329. package/packages/shopify-app-session-storage-memory/CHANGELOG.md +190 -0
  330. package/packages/shopify-app-session-storage-memory/LICENSE.md +9 -0
  331. package/packages/shopify-app-session-storage-memory/README.md +19 -0
  332. package/packages/shopify-app-session-storage-memory/loom.config.ts +27 -0
  333. package/packages/shopify-app-session-storage-memory/package.json +46 -0
  334. package/packages/shopify-app-session-storage-memory/src/__tests__/memory.test.ts +12 -0
  335. package/packages/shopify-app-session-storage-memory/src/__tests__/setup-jest.ts +8 -0
  336. package/packages/shopify-app-session-storage-memory/src/memory.ts +34 -0
  337. package/packages/shopify-app-session-storage-memory/tsconfig.json +10 -0
  338. package/packages/shopify-app-session-storage-mongodb/CHANGELOG.md +208 -0
  339. package/packages/shopify-app-session-storage-mongodb/LICENSE.md +9 -0
  340. package/packages/shopify-app-session-storage-mongodb/README.md +30 -0
  341. package/packages/shopify-app-session-storage-mongodb/loom.config.ts +27 -0
  342. package/packages/shopify-app-session-storage-mongodb/package.json +49 -0
  343. package/packages/shopify-app-session-storage-mongodb/src/__tests__/mongodb.test.ts +54 -0
  344. package/packages/shopify-app-session-storage-mongodb/src/__tests__/setup-jest.ts +8 -0
  345. package/packages/shopify-app-session-storage-mongodb/src/mongodb.ts +120 -0
  346. package/packages/shopify-app-session-storage-mongodb/tsconfig.json +10 -0
  347. package/packages/shopify-app-session-storage-mysql/CHANGELOG.md +220 -0
  348. package/packages/shopify-app-session-storage-mysql/LICENSE.md +9 -0
  349. package/packages/shopify-app-session-storage-mysql/README.md +41 -0
  350. package/packages/shopify-app-session-storage-mysql/loom.config.ts +27 -0
  351. package/packages/shopify-app-session-storage-mysql/package.json +50 -0
  352. package/packages/shopify-app-session-storage-mysql/src/__tests__/mysql.test.ts +137 -0
  353. package/packages/shopify-app-session-storage-mysql/src/__tests__/setup-jest.ts +8 -0
  354. package/packages/shopify-app-session-storage-mysql/src/migrations.ts +18 -0
  355. package/packages/shopify-app-session-storage-mysql/src/mysql-connection.ts +108 -0
  356. package/packages/shopify-app-session-storage-mysql/src/mysql-migrator.ts +53 -0
  357. package/packages/shopify-app-session-storage-mysql/src/mysql.ts +178 -0
  358. package/packages/shopify-app-session-storage-mysql/tsconfig.json +10 -0
  359. package/packages/shopify-app-session-storage-postgresql/CHANGELOG.md +210 -0
  360. package/packages/shopify-app-session-storage-postgresql/LICENSE.md +9 -0
  361. package/packages/shopify-app-session-storage-postgresql/README.md +39 -0
  362. package/packages/shopify-app-session-storage-postgresql/loom.config.ts +27 -0
  363. package/packages/shopify-app-session-storage-postgresql/package.json +52 -0
  364. package/packages/shopify-app-session-storage-postgresql/src/__tests__/migrate-to-case-sensitivity.test.ts +344 -0
  365. package/packages/shopify-app-session-storage-postgresql/src/__tests__/postgresql.test.ts +136 -0
  366. package/packages/shopify-app-session-storage-postgresql/src/__tests__/setup-jest.ts +8 -0
  367. package/packages/shopify-app-session-storage-postgresql/src/migrations.ts +70 -0
  368. package/packages/shopify-app-session-storage-postgresql/src/postgres-connection.ts +94 -0
  369. package/packages/shopify-app-session-storage-postgresql/src/postgres-migrator.ts +27 -0
  370. package/packages/shopify-app-session-storage-postgresql/src/postgresql.ts +178 -0
  371. package/packages/shopify-app-session-storage-postgresql/tsconfig.json +10 -0
  372. package/packages/shopify-app-session-storage-prisma/CHANGELOG.md +148 -0
  373. package/packages/shopify-app-session-storage-prisma/LICENSE.md +9 -0
  374. package/packages/shopify-app-session-storage-prisma/README.md +68 -0
  375. package/packages/shopify-app-session-storage-prisma/loom.config.ts +27 -0
  376. package/packages/shopify-app-session-storage-prisma/package.json +51 -0
  377. package/packages/shopify-app-session-storage-prisma/prisma/migrations/20230425184828_init/migration.sql +11 -0
  378. package/packages/shopify-app-session-storage-prisma/prisma/migrations/20230906155758_mySession/migration.sql +11 -0
  379. package/packages/shopify-app-session-storage-prisma/prisma/migrations/migration_lock.toml +3 -0
  380. package/packages/shopify-app-session-storage-prisma/prisma/schema.prisma +30 -0
  381. package/packages/shopify-app-session-storage-prisma/src/__tests__/prisma.test.ts +66 -0
  382. package/packages/shopify-app-session-storage-prisma/src/__tests__/setup-jest.ts +8 -0
  383. package/packages/shopify-app-session-storage-prisma/src/prisma.ts +145 -0
  384. package/packages/shopify-app-session-storage-prisma/tsconfig.json +10 -0
  385. package/packages/shopify-app-session-storage-redis/CHANGELOG.md +200 -0
  386. package/packages/shopify-app-session-storage-redis/LICENSE.md +9 -0
  387. package/packages/shopify-app-session-storage-redis/README.md +38 -0
  388. package/packages/shopify-app-session-storage-redis/loom.config.ts +27 -0
  389. package/packages/shopify-app-session-storage-redis/package.json +50 -0
  390. package/packages/shopify-app-session-storage-redis/src/__tests__/migration-test-data.ts +46 -0
  391. package/packages/shopify-app-session-storage-redis/src/__tests__/redis.conf +2 -0
  392. package/packages/shopify-app-session-storage-redis/src/__tests__/redis.test.ts +236 -0
  393. package/packages/shopify-app-session-storage-redis/src/__tests__/setup-jest.ts +8 -0
  394. package/packages/shopify-app-session-storage-redis/src/migrations.ts +36 -0
  395. package/packages/shopify-app-session-storage-redis/src/redis-connection.ts +64 -0
  396. package/packages/shopify-app-session-storage-redis/src/redis-migrator.ts +58 -0
  397. package/packages/shopify-app-session-storage-redis/src/redis.ts +167 -0
  398. package/packages/shopify-app-session-storage-redis/tsconfig.json +10 -0
  399. package/packages/shopify-app-session-storage-sqlite/CHANGELOG.md +202 -0
  400. package/packages/shopify-app-session-storage-sqlite/LICENSE.md +9 -0
  401. package/packages/shopify-app-session-storage-sqlite/README.md +25 -0
  402. package/packages/shopify-app-session-storage-sqlite/loom.config.ts +27 -0
  403. package/packages/shopify-app-session-storage-sqlite/package.json +51 -0
  404. package/packages/shopify-app-session-storage-sqlite/src/__tests__/setup-jest.ts +8 -0
  405. package/packages/shopify-app-session-storage-sqlite/src/__tests__/sqlite.test.ts +44 -0
  406. package/packages/shopify-app-session-storage-sqlite/src/migrations.ts +54 -0
  407. package/packages/shopify-app-session-storage-sqlite/src/sqlite-connection.ts +80 -0
  408. package/packages/shopify-app-session-storage-sqlite/src/sqlite-migrator.ts +34 -0
  409. package/packages/shopify-app-session-storage-sqlite/src/sqlite.ts +147 -0
  410. package/packages/shopify-app-session-storage-sqlite/tsconfig.json +10 -0
  411. package/packages/shopify-app-session-storage-test-utils/CHANGELOG.md +185 -0
  412. package/packages/shopify-app-session-storage-test-utils/LICENSE.md +9 -0
  413. package/packages/shopify-app-session-storage-test-utils/loom.config.ts +27 -0
  414. package/packages/shopify-app-session-storage-test-utils/package.json +48 -0
  415. package/packages/shopify-app-session-storage-test-utils/src/__tests__/session-test-utils.test.ts +273 -0
  416. package/packages/shopify-app-session-storage-test-utils/src/battery-of-tests.ts +250 -0
  417. package/packages/shopify-app-session-storage-test-utils/src/index.ts +2 -0
  418. package/packages/shopify-app-session-storage-test-utils/src/session-test-utils.ts +24 -0
  419. package/packages/shopify-app-session-storage-test-utils/src/utils.ts +71 -0
  420. package/packages/shopify-app-session-storage-test-utils/tsconfig.json +10 -0
  421. package/tests/setup/build.js +1 -0
  422. package/tests/setup/setup-jest.ts +8 -0
  423. package/tsconfig.base.json +41 -0
  424. package/tsconfig.json +19 -0
@@ -0,0 +1,40 @@
1
+ import {ReferenceEntityTemplateSchema} from '@shopify/generate-docs';
2
+
3
+ const data: ReferenceEntityTemplateSchema = {
4
+ name: 'Unauthenticated admin',
5
+ description: `Allows interacting with the Admin API when working outside of Shopify requests.
6
+ This enables apps to integrate with 3rd party services and perform background tasks.
7
+
8
+ > Caution:
9
+ > This function doesn't perform **any** validation and shouldn't rely on raw user input.
10
+
11
+ When using this function, consider the following:
12
+
13
+ #### Background tasks
14
+
15
+ Apps should ensure that the shop domain is authenticated when enqueueing jobs.
16
+
17
+ #### 3rd party service requests
18
+
19
+ Apps must obtain the shop domain from the 3rd party service in a secure way.`,
20
+ category: 'Unauthenticated',
21
+ type: 'object',
22
+ isVisualComponent: false,
23
+ definitions: [
24
+ {
25
+ title: 'unauthenticated.admin',
26
+ description: 'Creates an unauthenticated Admin context.',
27
+ type: 'GetUnauthenticatedAdminContext',
28
+ },
29
+ ],
30
+ jsDocTypeExamples: ['UnauthenticatedAdminContext'],
31
+ related: [
32
+ {
33
+ name: 'API context',
34
+ subtitle: 'Interact with the Admin API.',
35
+ url: '/docs/api/shopify-app-remix/apis/admin-api',
36
+ },
37
+ ],
38
+ };
39
+
40
+ export default data;
@@ -0,0 +1,13 @@
1
+ import {Session} from '@shopify/shopify-api';
2
+
3
+ import {BasicParams} from '../../types';
4
+
5
+ export async function getOfflineSession(
6
+ shop: string,
7
+ {api, config}: BasicParams,
8
+ ): Promise<Session | undefined> {
9
+ const offlineSessionId = api.session.getOfflineId(shop);
10
+ const session = await config.sessionStorage.loadSession(offlineSessionId);
11
+
12
+ return session;
13
+ }
@@ -0,0 +1 @@
1
+ export * from './get-offline-session';
@@ -0,0 +1,30 @@
1
+ import {shopifyApp} from '../../../index';
2
+ import {
3
+ TEST_SHOP,
4
+ setUpValidSession,
5
+ testConfig,
6
+ expectStorefrontApiClient,
7
+ } from '../../../__test-helpers';
8
+
9
+ describe('unauthenticated storefront context', () => {
10
+ it('throws an error if there is no offline session for the shop', async () => {
11
+ // GIVEN
12
+ const shopify = shopifyApp(testConfig());
13
+
14
+ // EXPECT
15
+ await expect(
16
+ shopify.unauthenticated.storefront(TEST_SHOP),
17
+ ).rejects.toThrow();
18
+ });
19
+
20
+ expectStorefrontApiClient(async () => {
21
+ const shopify = shopifyApp(testConfig());
22
+ const expectedSession = await setUpValidSession(shopify.sessionStorage, {
23
+ isOnline: false,
24
+ });
25
+ const {storefront, session: actualSession} =
26
+ await shopify.unauthenticated.storefront(TEST_SHOP);
27
+
28
+ return {storefront, expectedSession, actualSession};
29
+ });
30
+ });
@@ -0,0 +1,28 @@
1
+ import {SessionNotFoundError} from '../../errors';
2
+ import {BasicParams} from '../../types';
3
+ import {storefrontClientFactory} from '../../clients/storefront';
4
+ import {getOfflineSession} from '../helpers';
5
+
6
+ import {
7
+ UnauthenticatedStorefrontContext,
8
+ GetUnauthenticatedStorefrontContext,
9
+ } from './types';
10
+
11
+ export function unauthenticatedStorefrontContextFactory(
12
+ params: BasicParams,
13
+ ): GetUnauthenticatedStorefrontContext {
14
+ return async (shop: string): Promise<UnauthenticatedStorefrontContext> => {
15
+ const session = await getOfflineSession(shop, params);
16
+
17
+ if (!session) {
18
+ throw new SessionNotFoundError(
19
+ `Could not find a session for shop ${shop} when creating unauthenticated storefront context`,
20
+ );
21
+ }
22
+
23
+ return {
24
+ session,
25
+ storefront: storefrontClientFactory({params, session}),
26
+ };
27
+ };
28
+ }
@@ -0,0 +1 @@
1
+ export * from './factory';
@@ -0,0 +1,39 @@
1
+ import {Session} from '@shopify/shopify-api';
2
+
3
+ import type {StorefrontContext} from '../../clients';
4
+
5
+ export interface UnauthenticatedStorefrontContext {
6
+ /**
7
+ * The session for the given shop.
8
+ *
9
+ * This comes from the session storage which `shopifyApp` uses to store sessions in your database of choice.
10
+ *
11
+ * This will always be an offline session. You can use this to get shop specific data.
12
+ *
13
+ * @example
14
+ * <caption>Using the offline session.</caption>
15
+ * <description>Get your app's shop-specific data using the returned offline `session` object.</description>
16
+ * ```ts
17
+ * // app/routes/**\/.ts
18
+ * import { LoaderFunctionArgs, json } from "@remix-run/node";
19
+ * import { unauthenticated } from "../shopify.server";
20
+ * import { getMyAppData } from "~/db/model.server";
21
+ *
22
+ * export const loader = async ({ request }: LoaderFunctionArgs) => {
23
+ * const shop = getShopFromExternalRequest(request);
24
+ * const { session } = await unauthenticated.storefront(shop);
25
+ * return json(await getMyAppData({shop: session.shop));
26
+ * };
27
+ * ```
28
+ */
29
+ session: Session;
30
+
31
+ /**
32
+ * Method for interacting with the Shopify GraphQL Storefront API for the given store.
33
+ */
34
+ storefront: StorefrontContext;
35
+ }
36
+
37
+ export type GetUnauthenticatedStorefrontContext = (
38
+ shop: string,
39
+ ) => Promise<UnauthenticatedStorefrontContext>;
@@ -0,0 +1,40 @@
1
+ import {ReferenceEntityTemplateSchema} from '@shopify/generate-docs';
2
+
3
+ const data: ReferenceEntityTemplateSchema = {
4
+ name: 'Unauthenticated storefront',
5
+ description: `Allows interacting with the Storefront API when working outside of Shopify requests.
6
+ This enables apps to integrate with 3rd party services and perform background tasks.
7
+
8
+ > Caution:
9
+ > This function doesn't perform **any** validation and shouldn't rely on raw user input.
10
+
11
+ When using this function, consider the following:
12
+
13
+ #### Background tasks
14
+
15
+ Apps should ensure that the shop domain is authenticated when enqueueing jobs.
16
+
17
+ #### 3rd party service requests
18
+
19
+ Apps must obtain the shop domain from the 3rd party service in a secure way.`,
20
+ category: 'Unauthenticated',
21
+ type: 'object',
22
+ isVisualComponent: false,
23
+ definitions: [
24
+ {
25
+ title: 'unauthenticated.storefront',
26
+ description: 'Creates an unauthenticated Storefront context.',
27
+ type: 'GetUnauthenticatedStorefrontContext',
28
+ },
29
+ ],
30
+ jsDocTypeExamples: ['UnauthenticatedStorefrontContext', 'StorefrontContext'],
31
+ related: [
32
+ {
33
+ name: 'API context',
34
+ subtitle: 'Interact with the Storefront API.',
35
+ url: '/docs/api/shopify-app-remix/apis/storefront-api',
36
+ },
37
+ ],
38
+ };
39
+
40
+ export default data;
@@ -0,0 +1,68 @@
1
+ import type {ShopifyRestResources} from '@shopify/shopify-api';
2
+
3
+ import type {GetUnauthenticatedAdminContext} from './admin/types';
4
+ import type {GetUnauthenticatedStorefrontContext} from './storefront/types';
5
+
6
+ export interface Unauthenticated<Resources extends ShopifyRestResources> {
7
+ /**
8
+ * Get an admin context by passing a shop
9
+ *
10
+ * **Warning** This should only be used for Requests that do not originate from Shopify.
11
+ * You must do your own authentication before using this method.
12
+ * This method throws an error if there is no session for the shop.
13
+ *
14
+ * @example
15
+ * <caption>Responding to a request not controlled by Shopify.</caption>
16
+ * ```ts
17
+ * // /app/shopify.server.ts
18
+ * import { LATEST_API_VERSION, shopifyApp } from "@shopify/shopify-app-remix/server";
19
+ * import { restResources } from "@shopify/shopify-api/rest/admin/2023-04";
20
+ *
21
+ * const shopify = shopifyApp({
22
+ * restResources,
23
+ * // ...etc
24
+ * });
25
+ * export default shopify;
26
+ * ```
27
+ * ```ts
28
+ * // /app/routes/**\/*.jsx
29
+ * import { LoaderFunctionArgs, json } from "@remix-run/node";
30
+ * import { authenticateExternal } from "~/helpers/authenticate"
31
+ * import shopify from "../../shopify.server";
32
+ *
33
+ * export async function loader({ request }: LoaderFunctionArgs) {
34
+ * const shop = await authenticateExternal(request)
35
+ * const {admin} = await shopify.unauthenticated.admin(shop);
36
+ *
37
+ * return json(await admin.rest.resources.Product.count({ session }));
38
+ * }
39
+ * ```
40
+ */
41
+ admin: GetUnauthenticatedAdminContext<Resources>;
42
+
43
+ /**
44
+ * Get a storefront context by passing a shop
45
+ *
46
+ * **Warning** This should only be used for Requests that do not originate from Shopify.
47
+ * You must do your own authentication before using this method.
48
+ * This method throws an error if there is no session for the shop.
49
+ *
50
+ * @example
51
+ * <caption>Responding to a request not controlled by Shopify</caption>
52
+ * ```ts
53
+ * // /app/routes/**\/*.jsx
54
+ * import { LoaderFunctionArgs, json } from "@remix-run/node";
55
+ * import { authenticateExternal } from "~/helpers/authenticate"
56
+ * import shopify from "../../shopify.server";
57
+ *
58
+ * export async function loader({ request }: LoaderFunctionArgs) {
59
+ * const shop = await authenticateExternal(request)
60
+ * const {storefront} = await shopify.unauthenticated.storefront(shop);
61
+ * const response = await storefront.graphql(`{blogs(first: 10) { edges { node { id } } } }`);
62
+ *
63
+ * return json(await response.json());
64
+ * }
65
+ * ```
66
+ */
67
+ storefront: GetUnauthenticatedStorefrontContext;
68
+ }
@@ -0,0 +1 @@
1
+ export const SHOPIFY_REMIX_LIBRARY_VERSION = '2.6.1';
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "baseUrl": ".",
5
+ "outDir": "./build/ts",
6
+ "rootDir": "src",
7
+ "jsx": "react-jsx"
8
+ },
9
+ "include": ["src/**/*.ts", "src/**/*.tsx"],
10
+ "exclude": ["**/*.test.ts", "**/*.test.tsx", "**/test/*", "**/__tests__/*"]
11
+ }
@@ -0,0 +1,149 @@
1
+ # @shopify/shopify-app-session-storage
2
+
3
+ ## 2.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 02a8341: Updated dependency on `@shopify/shopify-api` to 9.3.1
8
+ - 321d6a4: Update @shopify/shopify-api to 9.3.2
9
+
10
+ ## 2.1.0
11
+
12
+ ### Minor Changes
13
+
14
+ - 64e0246: Update shopify-api version to 9.2.0
15
+
16
+ ### Patch Changes
17
+
18
+ - f5742c1: Updated dependency on `@shopify/shopify-api`
19
+
20
+ ## 2.0.4
21
+
22
+ ### Patch Changes
23
+
24
+ - b4eeb24: Improved and simplified package.json dependencies
25
+ - b998c30: Bump shopify-api version from 9.0.1 to 9.0.2
26
+
27
+ ## 2.0.3
28
+
29
+ ### Patch Changes
30
+
31
+ - d3e4b5e: Updated the dependency on `@shopify/shopify-api`
32
+
33
+ ## 2.0.2
34
+
35
+ ### Patch Changes
36
+
37
+ - 3685bd4: Bump shopify-api to ^8.1.1
38
+
39
+ ## 2.0.1
40
+
41
+ ### Patch Changes
42
+
43
+ - 6d12840: Updating dependencies on @shopify/shopify-api
44
+
45
+ ## 2.0.0
46
+
47
+ ### Major Changes
48
+
49
+ - f837060: **Removed support for Node 14**
50
+
51
+ Node 14 has reached its [EOL](https://endoflife.date/nodejs), and dependencies to this package no longer work on Node 14.
52
+ Because of that, we can no longer support that version.
53
+
54
+ If your app is running on Node 14, you'll need to update to a more recent version before upgrading this package.
55
+
56
+ This upgrade does not require any code changes.
57
+
58
+ ### Patch Changes
59
+
60
+ - a69d6fc: Updating dependency on @shopify/shopify-api to v.8.0.1
61
+
62
+ ## 1.1.10
63
+
64
+ ### Patch Changes
65
+
66
+ - 616388d: Updating dependency on @shopify/shopify-api to 7.7.0
67
+
68
+ ## 1.1.9
69
+
70
+ ### Patch Changes
71
+
72
+ - 5b862fe: Upgraded shopify-api dependency to 7.6.0
73
+
74
+ ## 1.1.8
75
+
76
+ ### Patch Changes
77
+
78
+ - 346b623: Updating dependency on @shopify/shopify-api
79
+
80
+ ## 1.1.7
81
+
82
+ ### Patch Changes
83
+
84
+ - 13b9048: Updating @shopify/shopify-api dependency to the latest version
85
+
86
+ ## 1.1.6
87
+
88
+ ### Patch Changes
89
+
90
+ - 32296d7: Update @shopify/shopify-api dependency to 7.5.0
91
+
92
+ ## 1.1.5
93
+
94
+ ### Patch Changes
95
+
96
+ - 93e9126: Updating @shopify/shopify-api dependency
97
+
98
+ ## 1.1.4
99
+
100
+ ### Patch Changes
101
+
102
+ - b3453ff: Bumping @shopify/shopify-api dependency to latest version
103
+
104
+ ## 1.1.3
105
+
106
+ ### Patch Changes
107
+
108
+ - e1d4f4f: Add @shopify/shopify-api as a peerDependencies entry for each session-storage package, to avoid API library conflicts (e.g., scopesArray.map error). Should help avoid issues like #93
109
+ - 1d007e8: Bumps [@shopify/shopify-api](https://github.com/Shopify/shopify-api-js) from 7.0.0 to 7.1.0. See `@shopify/shopify-api`'s [changelog](https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/CHANGELOG.md) for more details.
110
+
111
+ ## 1.1.2
112
+
113
+ ### Patch Changes
114
+
115
+ - e4f3415: Bump @shopify/shopify-api from 6.2.0 to 7.0.0. See [changelog](https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/CHANGELOG.md) for details.
116
+
117
+ ## 1.1.1
118
+
119
+ ### Patch Changes
120
+
121
+ - 97346b3: Fix #132: mysql migrator was unable to detect already applied migrations
122
+
123
+ ## 1.1.0
124
+
125
+ ### Minor Changes
126
+
127
+ - becc305: Migrations capabilities that can handle persistence changes for all session storage implementations
128
+
129
+ ### Patch Changes
130
+
131
+ - b6501b0: Bump typescript to 4.9.5
132
+
133
+ ## 1.0.2
134
+
135
+ ### Patch Changes
136
+
137
+ - 222b755: Updating @shopify/shopify-api to v6.1.0
138
+
139
+ ## 1.0.1
140
+
141
+ ### Patch Changes
142
+
143
+ - 866b50c: Update dependencies on shopify-api v6.0.2
144
+
145
+ ## 1.0.0
146
+
147
+ ### Major Changes
148
+
149
+ - Initial public release of @shopify/shopify-app-session-storage
@@ -0,0 +1,9 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022-present, Shopify Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,5 @@
1
+ # Session Storage
2
+
3
+ This folder contains the `SessionStorage` interface that the individual [packages](../) for most common databases implement.
4
+
5
+ See the [`session-storage.ts`](./src/types.ts) file for the methods that need to be implemented, the params they accept and values they return.
@@ -0,0 +1,214 @@
1
+ # Implementing session storage
2
+
3
+ A custom implementaton of `SessionStorage` will need to implement the following methods, as documented by the abstract [`SessionStorage`](./src/types.ts) class:
4
+
5
+ | Method | Parameter type | Return value | Description |
6
+ | :------------------: | :------------: | :-----------------------------: | ------------------------------------------------------------------------------------------------------------- |
7
+ | `storeSession` | `Session` | `Promise<boolean>` | Creates or updates the given session in storage; returns `true` if successfully stored, `false` otherwise |
8
+ | `loadSession` | `string` | `Promise<Session \| undefined>` | Returns a `Session` matching the given session id from storage, or returns `undefined` if not found |
9
+ | `deleteSession` | `string` | `Promise<boolean>` | Deletes a session matching the given session id from storage; returns `true` if successful, `false` otherwise |
10
+ | `deleteSessions` | `string[]` | `Promise<boolean>` | Deletes each of the given session ids (array) from storage; returns `true` if successful, `false` otherwise |
11
+ | `findSessionsByShop` | `string` | `Promise<Session[]>` | Returns an array of `Session`s for the given shop domain; returns an empty array of none found |
12
+
13
+ ## Example
14
+
15
+ As an example of an implementation, the following saves sessions to a text file, stored in CSV format.
16
+
17
+ > **Note 1**: This is for the purposes of example only - this implementation would not be suitable for production as it would be too inefficient nor would it scale beyond a single app instance.
18
+
19
+ > **Note 2**: The format of a line in the csv file is a list of property name/property value pairs, e.g.
20
+
21
+ ```csv
22
+ id,this-is-a-session-id,shop,my-test-shop.myshopify.com,state,150801840581085,isOnline,true,...
23
+ ```
24
+
25
+ ```ts
26
+ import fs from 'fs';
27
+ import {Session} from '@shopify/shopify-api';
28
+ import {SessionStorage} from '@shopify/shopify-app-session-storage';
29
+
30
+ export class CsvSessionStorage implements SessionStorage {
31
+ constructor(private filename: string) {
32
+ super();
33
+
34
+ this.init();
35
+ }
36
+
37
+ public async storeSession(session: Session): Promise<boolean> {
38
+ try {
39
+ const lines = this.readLines();
40
+
41
+ let found = false;
42
+
43
+ // process each line
44
+ for (let i = 0; i < lines.length; i++) {
45
+ // split the line by comma into columns
46
+ const columns = lines[i].split(',');
47
+ // check if the id column matches (second column is value of 'id')
48
+ if (columns[1] === session.id) {
49
+ // if the session id already exists, update the line
50
+ lines[i] = session.toPropertyArray().join(',');
51
+ found = true;
52
+ break;
53
+ }
54
+ }
55
+
56
+ if (!found) {
57
+ // if the session id does not exist, add a new line
58
+ lines.push(session.toPropertyArray().join(','));
59
+ }
60
+
61
+ try {
62
+ this.writeLines(lines);
63
+ return true;
64
+ } catch (err) {
65
+ // error on write
66
+ return false;
67
+ }
68
+ } catch (err) {
69
+ // error on read
70
+ return false;
71
+ }
72
+ }
73
+
74
+ public async loadSession(id: string): Promise<Session | undefined> {
75
+ try {
76
+ const lines = this.readLines();
77
+
78
+ // process each line
79
+ for (const line of lines) {
80
+ // split the line by comma into columns
81
+ const columns = line.split(',');
82
+ // check if the id column matches (second column is value of 'id')
83
+ if (columns[1] === id) {
84
+ // if the session id already exists, convert to session and return
85
+ return Session.fromPropertyArray(
86
+ this.columnsToPropertyArray(columns),
87
+ );
88
+ }
89
+ }
90
+
91
+ return undefined;
92
+ } catch (err) {
93
+ // error on read
94
+ return undefined;
95
+ }
96
+ }
97
+
98
+ public async deleteSession(id: string): Promise<boolean> {
99
+ try {
100
+ const lines = this.readLines();
101
+
102
+ // process each line
103
+ for (let i = 0; i < lines.length; i++) {
104
+ // split the line by comma into columns
105
+ const columns = lines[i].split(',');
106
+ // check if the id column matches (second column is value of 'id')
107
+ if (columns[1] === id) {
108
+ // if the session id matches, remove the line
109
+ lines.splice(i, 1);
110
+ break;
111
+ }
112
+ }
113
+
114
+ try {
115
+ this.writeLines(lines);
116
+ return true;
117
+ } catch (err) {
118
+ // error on write
119
+ return false;
120
+ }
121
+ } catch (err) {
122
+ // error on read
123
+ return false;
124
+ }
125
+ }
126
+
127
+ public async deleteSessions(ids: string[]): Promise<boolean> {
128
+ try {
129
+ const lines = this.readLines();
130
+
131
+ // process each line
132
+ for (let i = 0; i < lines.length; i++) {
133
+ // split the line by comma into columns
134
+ const columns = lines[i].split(',');
135
+ // check if the id column matches (second column is value of 'id')
136
+ if (ids.includes(columns[1])) {
137
+ // if the session id already exists, remove the line
138
+ lines.splice(i, 1);
139
+ }
140
+ }
141
+
142
+ try {
143
+ this.writeLines(lines);
144
+ return true;
145
+ } catch (err) {
146
+ // error on write
147
+ return false;
148
+ }
149
+ } catch (err) {
150
+ // error on read
151
+ return false;
152
+ }
153
+ }
154
+
155
+ public async findSessionsByShop(shop: string): Promise<Session[]> {
156
+ try {
157
+ const lines = this.readLines();
158
+
159
+ const sessions: Session[] = [];
160
+
161
+ // process each line
162
+ for (const line of lines) {
163
+ // split the line by comma into columns
164
+ const columns = line.split(',');
165
+ // check if the shop column matches (fourth column is value of 'shop')
166
+ if (columns[3] === shop) {
167
+ // if the shop matches, convert to session and add to array
168
+ sessions.push(
169
+ Session.fromPropertyArray(this.columnsToPropertyArray(columns)),
170
+ );
171
+ }
172
+ }
173
+
174
+ return sessions;
175
+ } catch (err) {
176
+ // error on read
177
+ return [];
178
+ }
179
+ }
180
+
181
+ private init() {
182
+ if (!fs.existsSync(this.filename)) {
183
+ fs.writeFileSync(this.filename, '');
184
+ }
185
+ }
186
+
187
+ private readLines(): string[] {
188
+ // read contents of the file
189
+ const data = fs.readFileSync(this.filename, {
190
+ encoding: 'utf8',
191
+ flag: 'r',
192
+ });
193
+
194
+ // split the contents by new line
195
+ return data.split(/\r?\n/);
196
+ }
197
+
198
+ private writeLines(lines: string[]) {
199
+ // write the lines back to the file
200
+ fs.writeFileSync(this.filename, lines.join('\n'), {
201
+ encoding: 'utf8',
202
+ flag: 'w',
203
+ });
204
+ }
205
+
206
+ private columnsToPropertyArray(columns: string[]): [string, string][] {
207
+ const propertyArray: [string, string][] = [];
208
+ for (let i = 0; i < columns.length; i += 2) {
209
+ propertyArray.push([columns[i], columns[i + 1]]);
210
+ }
211
+ return propertyArray;
212
+ }
213
+ }
214
+ ```