diff --git a/.github/workflows/publish-experimental-build.yml b/.github/workflows/publish-experimental-build.yml index 3310341ca5..6a50414a83 100644 --- a/.github/workflows/publish-experimental-build.yml +++ b/.github/workflows/publish-experimental-build.yml @@ -12,11 +12,15 @@ jobs: with: ref: experimental + # Setup .npmrc file to publish to npm - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: 18.x cache: 'yarn' + registry-url: 'https://registry.npmjs.org' + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Install dependencies run: yarn --frozen-lockfile @@ -24,13 +28,11 @@ jobs: - name: Build run: yarn build + - name: Version + run: yarn changeset version --snapshot experimental + - name: Publish to NPM - id: changesets - uses: changesets/action@v1 - with: - version: yarn changeset version --snapshot experimental - publish: yarn changeset publish --tag experimental - setupGitUser: false - createGithubReleases: false + run: yarn changeset publish --tag experimental env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/package.json b/package.json index 136606cbf7..b70701b160 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "@shopify/loom-plugin-prettier": "^2.0.1", "@shopify/prettier-config": "^1.1.2", "@shopify/typescript-configs": "^5.1.0", - "eslint": "^8.40.0", + "eslint": "^8.55.0", "jest": "^29.1.0", "jest-fetch-mock": "^3.0.3", "jest-runner-eslint": "^2.0.0", diff --git a/packages/shopify-app-express/CHANGELOG.md b/packages/shopify-app-express/CHANGELOG.md index f9874ce20a..b7cf5e3c4a 100644 --- a/packages/shopify-app-express/CHANGELOG.md +++ b/packages/shopify-app-express/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 4.0.0 + +### Major Changes + +- d3e4b5e: Updated `@shopify/shopify-api` to the latest major version. Please follow [the v9 migration guide](https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/migrating-to-v9.md) to update your app. + +### Patch Changes + +- Updated dependencies [d3e4b5e] + - @shopify/shopify-app-session-storage-memory@2.0.3 + - @shopify/shopify-app-session-storage@2.0.3 + ## 3.0.2 ### Patch Changes diff --git a/packages/shopify-app-express/package.json b/packages/shopify-app-express/package.json index 93a71a01bd..08de2a6551 100644 --- a/packages/shopify-app-express/package.json +++ b/packages/shopify-app-express/package.json @@ -1,6 +1,6 @@ { "name": "@shopify/shopify-app-express", - "version": "3.0.2", + "version": "4.0.0", "description": "Shopify Express Middleware - to simplify the building of Shopify Apps with Express", "repository": { "type": "git", @@ -30,13 +30,13 @@ "Storefront API" ], "dependencies": { - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2", - "@shopify/shopify-app-session-storage-memory": "^2.0.2", + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3", + "@shopify/shopify-app-session-storage-memory": "^2.0.3", "cookie-parser": "^1.4.6", "express": "^4.18.1", - "semver": "^7.5.1", - "tslib": "^2.4.0" + "semver": "^7.5.4", + "tslib": "^2.6.2" }, "devDependencies": { "@shopify/eslint-plugin": "^42.1.0", @@ -44,10 +44,10 @@ "@types/compression": "^1.7.2", "@types/cookie-parser": "^1.4.3", "@types/express": "^4.17.16", - "@types/jsonwebtoken": "^9.0.2", - "eslint": "^8.40.0", + "@types/jsonwebtoken": "^9.0.5", + "eslint": "^8.55.0", "eslint-plugin-prettier": "^4.2.1", - "jsonwebtoken": "^9.0.0", + "jsonwebtoken": "^9.0.2", "prettier": "^2.8.8", "supertest": "^6.3.3", "typescript": "^4.9.5" diff --git a/packages/shopify-app-express/src/__tests__/integration/oauth.test.ts b/packages/shopify-app-express/src/__tests__/integration/oauth.test.ts index f6395d2851..bb9d29c599 100644 --- a/packages/shopify-app-express/src/__tests__/integration/oauth.test.ts +++ b/packages/shopify-app-express/src/__tests__/integration/oauth.test.ts @@ -335,7 +335,7 @@ function assertOAuthRequests( expect({ method: 'POST', url: `https://${TEST_SHOP}/admin/api/${LATEST_API_VERSION}/graphql.json`, - body: expect.stringContaining(query), + body: expect.objectContaining({query: expect.stringContaining(query)}), }).toMatchMadeHttpRequest(), ); diff --git a/packages/shopify-app-express/src/__tests__/integration/webhooks.test.ts b/packages/shopify-app-express/src/__tests__/integration/webhooks.test.ts index f74259ea27..6520d2975a 100644 --- a/packages/shopify-app-express/src/__tests__/integration/webhooks.test.ts +++ b/packages/shopify-app-express/src/__tests__/integration/webhooks.test.ts @@ -127,7 +127,9 @@ describe('webhook integration', () => { expect({ method: 'POST', url: `https://${TEST_SHOP}/admin/api/${LATEST_API_VERSION}/graphql.json`, - body: expect.stringContaining(query), + body: expect.objectContaining({ + query: expect.stringContaining(query), + }), }).toMatchMadeHttpRequest(), ); diff --git a/packages/shopify-app-express/src/__tests__/test-helper.ts b/packages/shopify-app-express/src/__tests__/test-helper.ts index e89bbf38f6..3a58eb5315 100644 --- a/packages/shopify-app-express/src/__tests__/test-helper.ts +++ b/packages/shopify-app-express/src/__tests__/test-helper.ts @@ -73,7 +73,7 @@ interface AssertHttpRequestParams { export function mockShopifyResponse(body: MockBody, init?: MockParams) { fetchMock.mockResponse( typeof body === 'string' ? body : JSON.stringify(body), - init, + mockResponseInit(init), ); } @@ -84,13 +84,22 @@ export function mockShopifyResponses( ([body, init]) => { const bodyString = typeof body === 'string' ? body : JSON.stringify(body); - return init ? [bodyString, init] : [bodyString, {}]; + return [bodyString, mockResponseInit(init)]; }, ); fetchMock.mockResponses(...parsedResponses); } +function mockResponseInit(init?: MockParams): MockParams { + const initObj = init ?? {}; + + return { + ...initObj, + headers: {'Content-Type': 'application/json', ...initObj.headers}, + }; +} + declare global { // eslint-disable-next-line @typescript-eslint/no-namespace namespace jest { diff --git a/packages/shopify-app-express/src/auth/auth-callback.ts b/packages/shopify-app-express/src/auth/auth-callback.ts index e46e85154a..37ad7251f7 100644 --- a/packages/shopify-app-express/src/auth/auth-callback.ts +++ b/packages/shopify-app-express/src/auth/auth-callback.ts @@ -2,7 +2,7 @@ import {Request, Response} from 'express'; import { BotActivityDetected, CookieNotFound, - gdprTopics, + privacyTopics, InvalidOAuthError, Session, Shopify, @@ -83,7 +83,7 @@ async function registerWebhooks( } for (const response of responsesByTopic[topic]) { - if (!response.success && !gdprTopics.includes(topic)) { + if (!response.success && !privacyTopics.includes(topic)) { const result: any = response.result; if (result.errors) { diff --git a/packages/shopify-app-express/src/middlewares/__tests__/ensure-installed-on-shop.test.ts b/packages/shopify-app-express/src/middlewares/__tests__/ensure-installed-on-shop.test.ts index 646e8902b1..da6c3c4a32 100644 --- a/packages/shopify-app-express/src/middlewares/__tests__/ensure-installed-on-shop.test.ts +++ b/packages/shopify-app-express/src/middlewares/__tests__/ensure-installed-on-shop.test.ts @@ -167,7 +167,10 @@ describe('ensureInstalledOnShop', () => { )}`, ]; - mockShopifyResponse({}); + mockShopifyResponse({ + data: {}, + extensions: {}, + }); await shopify.config.sessionStorage.storeSession(session); await request(app) diff --git a/packages/shopify-app-express/src/middlewares/__tests__/validate-authenticated-session.test.ts b/packages/shopify-app-express/src/middlewares/__tests__/validate-authenticated-session.test.ts index 4e5f55fd68..686e0e7d70 100644 --- a/packages/shopify-app-express/src/middlewares/__tests__/validate-authenticated-session.test.ts +++ b/packages/shopify-app-express/src/middlewares/__tests__/validate-authenticated-session.test.ts @@ -266,7 +266,10 @@ describe('validateAuthenticatedSession', () => { }); it('finds a session with the right cookie', async () => { - mockShopifyResponse({}); + mockShopifyResponse({ + data: {}, + extensions: {}, + }); const response = await request(app) .get('/test/shop?shop=my-shop.myshopify.io') diff --git a/packages/shopify-app-express/src/version.ts b/packages/shopify-app-express/src/version.ts index 3ffe48b89a..cfc5c814c6 100644 --- a/packages/shopify-app-express/src/version.ts +++ b/packages/shopify-app-express/src/version.ts @@ -1 +1 @@ -export const SHOPIFY_EXPRESS_LIBRARY_VERSION = '3.0.2'; +export const SHOPIFY_EXPRESS_LIBRARY_VERSION = '4.0.0'; diff --git a/packages/shopify-app-remix/CHANGELOG.md b/packages/shopify-app-remix/CHANGELOG.md index 1c6b704b57..e0272a7a5c 100644 --- a/packages/shopify-app-remix/CHANGELOG.md +++ b/packages/shopify-app-remix/CHANGELOG.md @@ -1,5 +1,18 @@ # @shopify/shopify-app-remix +## 2.3.0 + +### Minor Changes + +- a9c7836: Adding support for the new clients from `@shopify/admin-api-client` and `@shopify/storefront-api-client` that can leverage `@shopify/api-codegen-preset` to automatically type GraphQL operations using Codegen. + + For more information on how to add types to your queries, see [the `@shopify/api-codegen-preset` documentation](https://github.com/Shopify/shopify-api-js/tree/main/packages/api-codegen-preset). + +### Patch Changes + +- Updated dependencies [d3e4b5e] + - @shopify/shopify-app-session-storage@2.0.3 + ## 2.2.0 ### Minor Changes diff --git a/packages/shopify-app-remix/docs/generated/generated_docs_data.json b/packages/shopify-app-remix/docs/generated/generated_docs_data.json index e96852b1b9..eecf09ad23 100644 --- a/packages/shopify-app-remix/docs/generated/generated_docs_data.json +++ b/packages/shopify-app-remix/docs/generated/generated_docs_data.json @@ -296,7 +296,7 @@ "filePath": "/server/clients/admin/types.ts", "syntaxKind": "PropertySignature", "name": "graphql", - "value": "GraphQLClient", + "value": "GraphQLClient", "description": "Methods for interacting with the Shopify Admin GraphQL API\n\n\n\n\n\n\n\n\n\n", "examples": [ { @@ -312,7 +312,7 @@ ] } ], - "value": "export interface AdminApiContext<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n> {\n /**\n * Methods for interacting with the Shopify Admin REST API\n *\n * There are methods for interacting with individual REST resources. You can also make `GET`, `POST`, `PUT` and `DELETE` requests should the REST resources not meet your needs.\n *\n * {@link https://shopify.dev/docs/api/admin-rest}\n *\n * @example\n * Using REST resources.\n * Getting the number of orders in a store using REST resources. Visit the [Admin REST API references](/docs/api/admin-rest) for examples on using each resource. \n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * return json(admin.rest.resources.Order.count({ session }));\n * };\n * ```\n *\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-07\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n *\n *\n * @example\n * Performing a GET request to the REST API.\n * Use `admin.rest.get` to make custom requests to make a request to to the `customer/count` endpoint\n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = await admin.rest.get({ path: \"/customers/count.json\" });\n * const customers = await response.json();\n * return json({ customers });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n * @example\n * Performing a POST request to the REST API.\n * Use `admin.rest.post` to make custom requests to make a request to to the `customers.json` endpoint to send a welcome email\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = admin.rest.post({\n * path: \"customers/7392136888625/send_invite.json\",\n * body: {\n * customer_invite: {\n * to: \"new_test_email@shopify.com\",\n * from: \"j.limited@example.com\",\n * bcc: [\"j.limited@example.com\"],\n * subject: \"Welcome to my new shop\",\n * custom_message: \"My awesome new store\",\n * },\n * },\n * });\n * const customerInvite = await response.json();\n * return json({ customerInvite });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n rest: RestClientWithResources;\n\n /**\n * Methods for interacting with the Shopify Admin GraphQL API\n *\n * {@link https://shopify.dev/docs/api/admin-graphql}\n * {@link https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/reference/clients/Graphql.md}\n *\n * @example\n * Querying the GraphQL API.\n * Use `admin.graphql` to make query / mutation requests.\n * ```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 } = await authenticate.admin(request);\n *\n * const response = await admin.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" + "value": "export interface AdminApiContext<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n> {\n /**\n * Methods for interacting with the Shopify Admin REST API\n *\n * There are methods for interacting with individual REST resources. You can also make `GET`, `POST`, `PUT` and `DELETE` requests should the REST resources not meet your needs.\n *\n * {@link https://shopify.dev/docs/api/admin-rest}\n *\n * @example\n * Using REST resources.\n * Getting the number of orders in a store using REST resources. Visit the [Admin REST API references](/docs/api/admin-rest) for examples on using each resource. \n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * return json(admin.rest.resources.Order.count({ session }));\n * };\n * ```\n *\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-07\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n *\n *\n * @example\n * Performing a GET request to the REST API.\n * Use `admin.rest.get` to make custom requests to make a request to to the `customer/count` endpoint\n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = await admin.rest.get({ path: \"/customers/count.json\" });\n * const customers = await response.json();\n * return json({ customers });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n * @example\n * Performing a POST request to the REST API.\n * Use `admin.rest.post` to make custom requests to make a request to to the `customers.json` endpoint to send a welcome email\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = admin.rest.post({\n * path: \"customers/7392136888625/send_invite.json\",\n * body: {\n * customer_invite: {\n * to: \"new_test_email@shopify.com\",\n * from: \"j.limited@example.com\",\n * bcc: [\"j.limited@example.com\"],\n * subject: \"Welcome to my new shop\",\n * custom_message: \"My awesome new store\",\n * },\n * },\n * });\n * const customerInvite = await response.json();\n * return json({ customerInvite });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n rest: RestClientWithResources;\n\n /**\n * Methods for interacting with the Shopify Admin GraphQL API\n *\n * {@link https://shopify.dev/docs/api/admin-graphql}\n * {@link https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/reference/clients/Graphql.md}\n *\n * @example\n * Querying the GraphQL API.\n * Use `admin.graphql` to make query / mutation requests.\n * ```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 } = await authenticate.admin(request);\n *\n * const response = await admin.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" }, "RestClientWithResources": { "filePath": "/server/clients/admin/rest.ts", @@ -1547,7 +1547,7 @@ "filePath": "/server/clients/admin/types.ts", "syntaxKind": "PropertySignature", "name": "graphql", - "value": "GraphQLClient", + "value": "GraphQLClient", "description": "Methods for interacting with the Shopify Admin GraphQL API\n\n\n\n\n\n\n\n\n\n", "examples": [ { @@ -1563,7 +1563,7 @@ ] } ], - "value": "export interface AdminApiContext<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n> {\n /**\n * Methods for interacting with the Shopify Admin REST API\n *\n * There are methods for interacting with individual REST resources. You can also make `GET`, `POST`, `PUT` and `DELETE` requests should the REST resources not meet your needs.\n *\n * {@link https://shopify.dev/docs/api/admin-rest}\n *\n * @example\n * Using REST resources.\n * Getting the number of orders in a store using REST resources. Visit the [Admin REST API references](/docs/api/admin-rest) for examples on using each resource. \n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * return json(admin.rest.resources.Order.count({ session }));\n * };\n * ```\n *\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-07\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n *\n *\n * @example\n * Performing a GET request to the REST API.\n * Use `admin.rest.get` to make custom requests to make a request to to the `customer/count` endpoint\n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = await admin.rest.get({ path: \"/customers/count.json\" });\n * const customers = await response.json();\n * return json({ customers });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n * @example\n * Performing a POST request to the REST API.\n * Use `admin.rest.post` to make custom requests to make a request to to the `customers.json` endpoint to send a welcome email\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = admin.rest.post({\n * path: \"customers/7392136888625/send_invite.json\",\n * body: {\n * customer_invite: {\n * to: \"new_test_email@shopify.com\",\n * from: \"j.limited@example.com\",\n * bcc: [\"j.limited@example.com\"],\n * subject: \"Welcome to my new shop\",\n * custom_message: \"My awesome new store\",\n * },\n * },\n * });\n * const customerInvite = await response.json();\n * return json({ customerInvite });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n rest: RestClientWithResources;\n\n /**\n * Methods for interacting with the Shopify Admin GraphQL API\n *\n * {@link https://shopify.dev/docs/api/admin-graphql}\n * {@link https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/reference/clients/Graphql.md}\n *\n * @example\n * Querying the GraphQL API.\n * Use `admin.graphql` to make query / mutation requests.\n * ```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 } = await authenticate.admin(request);\n *\n * const response = await admin.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" + "value": "export interface AdminApiContext<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n> {\n /**\n * Methods for interacting with the Shopify Admin REST API\n *\n * There are methods for interacting with individual REST resources. You can also make `GET`, `POST`, `PUT` and `DELETE` requests should the REST resources not meet your needs.\n *\n * {@link https://shopify.dev/docs/api/admin-rest}\n *\n * @example\n * Using REST resources.\n * Getting the number of orders in a store using REST resources. Visit the [Admin REST API references](/docs/api/admin-rest) for examples on using each resource. \n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * return json(admin.rest.resources.Order.count({ session }));\n * };\n * ```\n *\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-07\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n *\n *\n * @example\n * Performing a GET request to the REST API.\n * Use `admin.rest.get` to make custom requests to make a request to to the `customer/count` endpoint\n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = await admin.rest.get({ path: \"/customers/count.json\" });\n * const customers = await response.json();\n * return json({ customers });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n * @example\n * Performing a POST request to the REST API.\n * Use `admin.rest.post` to make custom requests to make a request to to the `customers.json` endpoint to send a welcome email\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = admin.rest.post({\n * path: \"customers/7392136888625/send_invite.json\",\n * body: {\n * customer_invite: {\n * to: \"new_test_email@shopify.com\",\n * from: \"j.limited@example.com\",\n * bcc: [\"j.limited@example.com\"],\n * subject: \"Welcome to my new shop\",\n * custom_message: \"My awesome new store\",\n * },\n * },\n * });\n * const customerInvite = await response.json();\n * return json({ customerInvite });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n rest: RestClientWithResources;\n\n /**\n * Methods for interacting with the Shopify Admin GraphQL API\n *\n * {@link https://shopify.dev/docs/api/admin-graphql}\n * {@link https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/reference/clients/Graphql.md}\n *\n * @example\n * Querying the GraphQL API.\n * Use `admin.graphql` to make query / mutation requests.\n * ```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 } = await authenticate.admin(request);\n *\n * const response = await admin.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" }, "RestClientWithResources": { "filePath": "/server/clients/admin/rest.ts", @@ -1581,7 +1581,7 @@ "filePath": "/server/clients/storefront/types.ts", "syntaxKind": "PropertySignature", "name": "graphql", - "value": "GraphQLClient", + "value": "GraphQLClient", "description": "Method for interacting with the Shopify Storefront GraphQL API\n\nIf you're getting incorrect type hints in the Shopify template, follow [these instructions](https://github.com/Shopify/shopify-app-template-remix/tree/main#incorrect-graphql-hints).\n\n\n\n\n", "examples": [ { @@ -1597,7 +1597,7 @@ ] } ], - "value": "export interface StorefrontContext {\n /**\n * Method for interacting with the Shopify Storefront GraphQL API\n *\n * If you're getting incorrect type hints in the Shopify template, follow [these instructions](https://github.com/Shopify/shopify-app-template-remix/tree/main#incorrect-graphql-hints).\n *\n * {@link https://shopify.dev/docs/api/storefront}\n *\n * @example\n * Querying the GraphQL API.\n * Use `storefront.graphql` to make query / mutation requests.\n * ```ts\n * // app/routes/**\\/.ts\n * import { json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { storefront } = await authenticate.public.appProxy(request);\n *\n * const response = await storefront.graphql(`{blogs(first: 10) { edges { node { id } } } }`);\n *\n * return json(await response.json());\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" + "value": "export interface StorefrontContext {\n /**\n * Method for interacting with the Shopify Storefront GraphQL API\n *\n * If you're getting incorrect type hints in the Shopify template, follow [these instructions](https://github.com/Shopify/shopify-app-template-remix/tree/main#incorrect-graphql-hints).\n *\n * {@link https://shopify.dev/docs/api/storefront}\n *\n * @example\n * Querying the GraphQL API.\n * Use `storefront.graphql` to make query / mutation requests.\n * ```ts\n * // app/routes/**\\/.ts\n * import { json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { storefront } = await authenticate.public.appProxy(request);\n *\n * const response = await storefront.graphql(`{blogs(first: 10) { edges { node { id } } } }`);\n *\n * return json(await response.json());\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" } } } @@ -1917,7 +1917,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { apiVersion } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -1936,7 +1936,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { shop } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -1955,7 +1955,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { topic } = await authenticate.webhook(request);\n\n switch (topic) {\n case \"APP_UNINSTALLED\":\n // Do something when the app is uninstalled.\n break;\n }\n\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -1974,7 +1974,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { webhookId } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -1993,7 +1993,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { payload } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -2254,14 +2254,14 @@ { "filePath": "/server/types.ts", "syntaxKind": "MethodSignature", - "name": "__@iterator@629", + "name": "__@iterator@716", "value": "() => IterableIterator", "description": "Iterator" }, { "filePath": "/server/types.ts", "syntaxKind": "MethodSignature", - "name": "__@unscopables@631", + "name": "__@unscopables@718", "value": "() => { copyWithin: boolean; entries: boolean; fill: boolean; find: boolean; findIndex: boolean; keys: boolean; values: boolean; }", "description": "Returns an object whose properties have the value 'true'\r\nwhen they will be absent when used in a 'with' statement." }, @@ -2300,7 +2300,7 @@ "tabs": [ { "code": "import { ActionFunctionArgs } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport async function action({ request }: ActionFunctionArgs) {\n const { admin } = await authenticate.webhook(request);\n\n const response = await admin?.graphql(\n `#graphql\n mutation populateProduct($input: ProductInput!) {\n productCreate(input: $input) {\n product {\n id\n }\n }\n }`,\n { variables: { input: { title: \"Product Name\" } } }\n );\n\n const productData = await response.json();\n return json({ data: productData.data });\n}", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] }, @@ -2310,7 +2310,7 @@ "tabs": [ { "code": "import { json, ActionFunctionArgs } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport async function action({ request }: ActionFunctionArgs) {\n const { admin } = await authenticate.webhook(request);\n\n const response = await admin?.graphql.query({\n data: {\n query: `#graphql\n mutation populateProduct($input: ProductInput!) {\n productCreate(input: $input) {\n product {\n id\n }\n }\n }`,\n variables: { input: { title: \"Product Name\" } },\n },\n });\n\n const productData = response?.body.data;\n return json({ data: productData.data });\n}", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -2329,7 +2329,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { apiVersion } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -2348,7 +2348,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { shop } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -2367,7 +2367,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { topic } = await authenticate.webhook(request);\n\n switch (topic) {\n case \"APP_UNINSTALLED\":\n // Do something when the app is uninstalled.\n break;\n }\n\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -2386,7 +2386,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { webhookId } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -2405,14 +2405,14 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { payload } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } ] } ], - "value": "export interface WebhookContextWithSession<\n Future extends FutureFlagOptions,\n Resources extends ShopifyRestResources,\n Topics = string | number | symbol,\n> extends Context {\n /**\n * A session with an offline token for the shop.\n *\n * Returned only if there is a session for the shop.\n */\n session: Session;\n\n /**\n * An admin context for the webhook.\n *\n * Returned only if there is a session for the shop.\n *\n * @example\n * [V3] Webhook admin context.\n * With the `v3_webhookAdminContext` future flag enabled, use the `admin` object in the context to interact with the Admin API.\n * ```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 } = await authenticate.webhook(request);\n *\n * const response = await admin?.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n *\n * @example\n * Webhook admin context.\n * Use the `admin` object in the context to interact with the Admin API. This format will be removed in V3 of the package.\n * ```ts\n * import { json, ActionFunctionArgs } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { admin } = await authenticate.webhook(request);\n *\n * const response = await admin?.graphql.query({\n * data: {\n * query: `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * variables: { input: { title: \"Product Name\" } },\n * },\n * });\n *\n * const productData = response?.body.data;\n * return json({ data: productData.data });\n * }\n * ```\n */\n admin: WebhookAdminContext;\n}" + "value": "export interface WebhookContextWithSession<\n Future extends FutureFlagOptions,\n Resources extends ShopifyRestResources,\n Topics = string | number | symbol,\n> extends Context {\n /**\n * A session with an offline token for the shop.\n *\n * Returned only if there is a session for the shop.\n */\n session: Session;\n\n /**\n * An admin context for the webhook.\n *\n * Returned only if there is a session for the shop.\n *\n * @example\n * [V3] Webhook admin context.\n * With the `v3_webhookAdminContext` future flag enabled, use the `admin` object in the context to interact with the Admin API.\n * ```ts\n * // /app/routes/webhooks.tsx\n * import { ActionFunctionArgs } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { admin } = await authenticate.webhook(request);\n *\n * const response = await admin?.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n *\n * @example\n * Webhook admin context.\n * Use the `admin` object in the context to interact with the Admin API. This format will be removed in V3 of the package.\n * ```ts\n * // /app/routes/webhooks.tsx\n * import { json, ActionFunctionArgs } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { admin } = await authenticate.webhook(request);\n *\n * const response = await admin?.graphql.query({\n * data: {\n * query: `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * variables: { input: { title: \"Product Name\" } },\n * },\n * });\n *\n * const productData = response?.body.data;\n * return json({ data: productData.data });\n * }\n * ```\n */\n admin: WebhookAdminContext;\n}" }, "WebhookAdminContext": { "filePath": "/server/authenticate/webhooks/types.ts", @@ -2599,7 +2599,7 @@ "filePath": "/server/clients/admin/types.ts", "syntaxKind": "PropertySignature", "name": "graphql", - "value": "GraphQLClient", + "value": "GraphQLClient", "description": "Methods for interacting with the Shopify Admin GraphQL API\n\n\n\n\n\n\n\n\n\n", "examples": [ { @@ -2615,7 +2615,7 @@ ] } ], - "value": "export interface AdminApiContext<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n> {\n /**\n * Methods for interacting with the Shopify Admin REST API\n *\n * There are methods for interacting with individual REST resources. You can also make `GET`, `POST`, `PUT` and `DELETE` requests should the REST resources not meet your needs.\n *\n * {@link https://shopify.dev/docs/api/admin-rest}\n *\n * @example\n * Using REST resources.\n * Getting the number of orders in a store using REST resources. Visit the [Admin REST API references](/docs/api/admin-rest) for examples on using each resource. \n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * return json(admin.rest.resources.Order.count({ session }));\n * };\n * ```\n *\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-07\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n *\n *\n * @example\n * Performing a GET request to the REST API.\n * Use `admin.rest.get` to make custom requests to make a request to to the `customer/count` endpoint\n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = await admin.rest.get({ path: \"/customers/count.json\" });\n * const customers = await response.json();\n * return json({ customers });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n * @example\n * Performing a POST request to the REST API.\n * Use `admin.rest.post` to make custom requests to make a request to to the `customers.json` endpoint to send a welcome email\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = admin.rest.post({\n * path: \"customers/7392136888625/send_invite.json\",\n * body: {\n * customer_invite: {\n * to: \"new_test_email@shopify.com\",\n * from: \"j.limited@example.com\",\n * bcc: [\"j.limited@example.com\"],\n * subject: \"Welcome to my new shop\",\n * custom_message: \"My awesome new store\",\n * },\n * },\n * });\n * const customerInvite = await response.json();\n * return json({ customerInvite });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n rest: RestClientWithResources;\n\n /**\n * Methods for interacting with the Shopify Admin GraphQL API\n *\n * {@link https://shopify.dev/docs/api/admin-graphql}\n * {@link https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/reference/clients/Graphql.md}\n *\n * @example\n * Querying the GraphQL API.\n * Use `admin.graphql` to make query / mutation requests.\n * ```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 } = await authenticate.admin(request);\n *\n * const response = await admin.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" + "value": "export interface AdminApiContext<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n> {\n /**\n * Methods for interacting with the Shopify Admin REST API\n *\n * There are methods for interacting with individual REST resources. You can also make `GET`, `POST`, `PUT` and `DELETE` requests should the REST resources not meet your needs.\n *\n * {@link https://shopify.dev/docs/api/admin-rest}\n *\n * @example\n * Using REST resources.\n * Getting the number of orders in a store using REST resources. Visit the [Admin REST API references](/docs/api/admin-rest) for examples on using each resource. \n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * return json(admin.rest.resources.Order.count({ session }));\n * };\n * ```\n *\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-07\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n *\n *\n * @example\n * Performing a GET request to the REST API.\n * Use `admin.rest.get` to make custom requests to make a request to to the `customer/count` endpoint\n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = await admin.rest.get({ path: \"/customers/count.json\" });\n * const customers = await response.json();\n * return json({ customers });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n * @example\n * Performing a POST request to the REST API.\n * Use `admin.rest.post` to make custom requests to make a request to to the `customers.json` endpoint to send a welcome email\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = admin.rest.post({\n * path: \"customers/7392136888625/send_invite.json\",\n * body: {\n * customer_invite: {\n * to: \"new_test_email@shopify.com\",\n * from: \"j.limited@example.com\",\n * bcc: [\"j.limited@example.com\"],\n * subject: \"Welcome to my new shop\",\n * custom_message: \"My awesome new store\",\n * },\n * },\n * });\n * const customerInvite = await response.json();\n * return json({ customerInvite });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n rest: RestClientWithResources;\n\n /**\n * Methods for interacting with the Shopify Admin GraphQL API\n *\n * {@link https://shopify.dev/docs/api/admin-graphql}\n * {@link https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/reference/clients/Graphql.md}\n *\n * @example\n * Querying the GraphQL API.\n * Use `admin.graphql` to make query / mutation requests.\n * ```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 } = await authenticate.admin(request);\n *\n * const response = await admin.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" }, "RestClientWithResources": { "filePath": "/server/clients/admin/rest.ts", @@ -3025,7 +3025,7 @@ "title": "[V3] Webhook admin context", "tabs": [ { - "title": "Example", + "title": "/app/routes/webhooks.tsx", "code": "import { ActionFunctionArgs } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport async function action({ request }: ActionFunctionArgs) {\n const { admin } = await authenticate.webhook(request);\n\n const response = await admin?.graphql(\n `#graphql\n mutation populateProduct($input: ProductInput!) {\n productCreate(input: $input) {\n product {\n id\n }\n }\n }`,\n { variables: { input: { title: \"Product Name\" } } }\n );\n\n const productData = await response.json();\n return json({ data: productData.data });\n}", "language": "typescript" } @@ -3038,7 +3038,7 @@ "title": "Webhook admin context", "tabs": [ { - "title": "Example", + "title": "/app/routes/webhooks.tsx", "code": "import { json, ActionFunctionArgs } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport async function action({ request }: ActionFunctionArgs) {\n const { admin } = await authenticate.webhook(request);\n\n const response = await admin?.graphql.query<any>({\n data: {\n query: `#graphql\n mutation populateProduct($input: ProductInput!) {\n productCreate(input: $input) {\n product {\n id\n }\n }\n }`,\n variables: { input: { title: \"Product Name\" } },\n },\n });\n\n const productData = response?.body.data;\n return json({ data: productData.data });\n}", "language": "typescript" } @@ -3056,7 +3056,7 @@ "title": "Webhook API version", "tabs": [ { - "title": "Example", + "title": "/app/routes/webhooks.tsx", "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { apiVersion } = await authenticate.webhook(request);\n return new Response();\n};", "language": "typescript" } @@ -3074,7 +3074,7 @@ "title": "Webhook shop", "tabs": [ { - "title": "Example", + "title": "/app/routes/webhooks.tsx", "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { shop } = await authenticate.webhook(request);\n return new Response();\n};", "language": "typescript" } @@ -3092,7 +3092,7 @@ "title": "Webhook topic", "tabs": [ { - "title": "Example", + "title": "/app/routes/webhooks.tsx", "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { topic } = await authenticate.webhook(request);\n\n switch (topic) {\n case \"APP_UNINSTALLED\":\n // Do something when the app is uninstalled.\n break;\n }\n\n return new Response();\n};", "language": "typescript" } @@ -3110,7 +3110,7 @@ "title": "Webhook ID", "tabs": [ { - "title": "Example", + "title": "/app/routes/webhooks.tsx", "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { webhookId } = await authenticate.webhook(request);\n return new Response();\n};", "language": "typescript" } @@ -3128,7 +3128,7 @@ "title": "Webhook payload", "tabs": [ { - "title": "Example", + "title": "/app/routes/webhooks.tsx", "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { payload } = await authenticate.webhook(request);\n return new Response();\n};", "language": "typescript" } @@ -3212,7 +3212,7 @@ "filePath": "/server/clients/admin/types.ts", "syntaxKind": "PropertySignature", "name": "graphql", - "value": "GraphQLClient", + "value": "GraphQLClient", "description": "Methods for interacting with the Shopify Admin GraphQL API\n\n\n\n\n\n\n\n\n\n", "examples": [ { @@ -3228,7 +3228,7 @@ ] } ], - "value": "export interface AdminApiContext<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n> {\n /**\n * Methods for interacting with the Shopify Admin REST API\n *\n * There are methods for interacting with individual REST resources. You can also make `GET`, `POST`, `PUT` and `DELETE` requests should the REST resources not meet your needs.\n *\n * {@link https://shopify.dev/docs/api/admin-rest}\n *\n * @example\n * Using REST resources.\n * Getting the number of orders in a store using REST resources. Visit the [Admin REST API references](/docs/api/admin-rest) for examples on using each resource. \n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * return json(admin.rest.resources.Order.count({ session }));\n * };\n * ```\n *\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-07\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n *\n *\n * @example\n * Performing a GET request to the REST API.\n * Use `admin.rest.get` to make custom requests to make a request to to the `customer/count` endpoint\n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = await admin.rest.get({ path: \"/customers/count.json\" });\n * const customers = await response.json();\n * return json({ customers });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n * @example\n * Performing a POST request to the REST API.\n * Use `admin.rest.post` to make custom requests to make a request to to the `customers.json` endpoint to send a welcome email\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = admin.rest.post({\n * path: \"customers/7392136888625/send_invite.json\",\n * body: {\n * customer_invite: {\n * to: \"new_test_email@shopify.com\",\n * from: \"j.limited@example.com\",\n * bcc: [\"j.limited@example.com\"],\n * subject: \"Welcome to my new shop\",\n * custom_message: \"My awesome new store\",\n * },\n * },\n * });\n * const customerInvite = await response.json();\n * return json({ customerInvite });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n rest: RestClientWithResources;\n\n /**\n * Methods for interacting with the Shopify Admin GraphQL API\n *\n * {@link https://shopify.dev/docs/api/admin-graphql}\n * {@link https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/reference/clients/Graphql.md}\n *\n * @example\n * Querying the GraphQL API.\n * Use `admin.graphql` to make query / mutation requests.\n * ```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 } = await authenticate.admin(request);\n *\n * const response = await admin.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" + "value": "export interface AdminApiContext<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n> {\n /**\n * Methods for interacting with the Shopify Admin REST API\n *\n * There are methods for interacting with individual REST resources. You can also make `GET`, `POST`, `PUT` and `DELETE` requests should the REST resources not meet your needs.\n *\n * {@link https://shopify.dev/docs/api/admin-rest}\n *\n * @example\n * Using REST resources.\n * Getting the number of orders in a store using REST resources. Visit the [Admin REST API references](/docs/api/admin-rest) for examples on using each resource. \n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * return json(admin.rest.resources.Order.count({ session }));\n * };\n * ```\n *\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-07\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n *\n *\n * @example\n * Performing a GET request to the REST API.\n * Use `admin.rest.get` to make custom requests to make a request to to the `customer/count` endpoint\n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = await admin.rest.get({ path: \"/customers/count.json\" });\n * const customers = await response.json();\n * return json({ customers });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n * @example\n * Performing a POST request to the REST API.\n * Use `admin.rest.post` to make custom requests to make a request to to the `customers.json` endpoint to send a welcome email\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = admin.rest.post({\n * path: \"customers/7392136888625/send_invite.json\",\n * body: {\n * customer_invite: {\n * to: \"new_test_email@shopify.com\",\n * from: \"j.limited@example.com\",\n * bcc: [\"j.limited@example.com\"],\n * subject: \"Welcome to my new shop\",\n * custom_message: \"My awesome new store\",\n * },\n * },\n * });\n * const customerInvite = await response.json();\n * return json({ customerInvite });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n rest: RestClientWithResources;\n\n /**\n * Methods for interacting with the Shopify Admin GraphQL API\n *\n * {@link https://shopify.dev/docs/api/admin-graphql}\n * {@link https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/reference/clients/Graphql.md}\n *\n * @example\n * Querying the GraphQL API.\n * Use `admin.graphql` to make query / mutation requests.\n * ```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 } = await authenticate.admin(request);\n *\n * const response = await admin.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" }, "RestClientWithResources": { "filePath": "/server/clients/admin/rest.ts", @@ -3359,7 +3359,7 @@ "filePath": "/server/clients/storefront/types.ts", "syntaxKind": "PropertySignature", "name": "graphql", - "value": "GraphQLClient", + "value": "GraphQLClient", "description": "Method for interacting with the Shopify Storefront GraphQL API\n\nIf you're getting incorrect type hints in the Shopify template, follow [these instructions](https://github.com/Shopify/shopify-app-template-remix/tree/main#incorrect-graphql-hints).\n\n\n\n\n", "examples": [ { @@ -3375,7 +3375,7 @@ ] } ], - "value": "export interface StorefrontContext {\n /**\n * Method for interacting with the Shopify Storefront GraphQL API\n *\n * If you're getting incorrect type hints in the Shopify template, follow [these instructions](https://github.com/Shopify/shopify-app-template-remix/tree/main#incorrect-graphql-hints).\n *\n * {@link https://shopify.dev/docs/api/storefront}\n *\n * @example\n * Querying the GraphQL API.\n * Use `storefront.graphql` to make query / mutation requests.\n * ```ts\n * // app/routes/**\\/.ts\n * import { json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { storefront } = await authenticate.public.appProxy(request);\n *\n * const response = await storefront.graphql(`{blogs(first: 10) { edges { node { id } } } }`);\n *\n * return json(await response.json());\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" + "value": "export interface StorefrontContext {\n /**\n * Method for interacting with the Shopify Storefront GraphQL API\n *\n * If you're getting incorrect type hints in the Shopify template, follow [these instructions](https://github.com/Shopify/shopify-app-template-remix/tree/main#incorrect-graphql-hints).\n *\n * {@link https://shopify.dev/docs/api/storefront}\n *\n * @example\n * Querying the GraphQL API.\n * Use `storefront.graphql` to make query / mutation requests.\n * ```ts\n * // app/routes/**\\/.ts\n * import { json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { storefront } = await authenticate.public.appProxy(request);\n *\n * const response = await storefront.graphql(`{blogs(first: 10) { edges { node { id } } } }`);\n *\n * return json(await response.json());\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" } } } @@ -3457,7 +3457,7 @@ "tabs": [ { "code": "import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n\nconst shopify = shopifyApp({\n apiKey: process.env.SHOPIFY_API_KEY!,\n apiSecretKey: process.env.SHOPIFY_API_SECRET!,\n scopes: process.env.SCOPES?.split(\",\")!,\n appUrl: process.env.SHOPIFY_APP_URL!,\n});\nexport default shopify;", - "title": "Example" + "title": "/shopify.server.ts" } ] } @@ -3629,7 +3629,7 @@ "filePath": "/server/config-types.ts", "syntaxKind": "PropertySignature", "name": "scopes", - "value": "AuthScopes | string[]", + "value": "string[] | AuthScopes", "description": "", "isOptional": true }, @@ -3669,7 +3669,7 @@ "filePath": "/server/config-types.ts", "syntaxKind": "PropertySignature", "name": "billing", - "value": "BillingConfig", + "value": "BillingConfig", "description": "", "isOptional": true }, @@ -3688,17 +3688,9 @@ "value": "{ log?: LogFunction; level?: LogSeverity; httpRequests?: boolean; timestamps?: boolean; }", "description": "", "isOptional": true - }, - { - "filePath": "/server/config-types.ts", - "syntaxKind": "PropertySignature", - "name": "future", - "value": "FutureFlagOptions", - "description": "", - "isOptional": true } ], - "value": "export interface AppConfigArg<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n Storage extends SessionStorage = SessionStorage,\n Future extends FutureFlagOptions = FutureFlagOptions,\n> extends Omit<\n ApiConfigArg,\n | 'hostName'\n | 'hostScheme'\n | 'isEmbeddedApp'\n | 'apiVersion'\n | 'isCustomStoreApp'\n > {\n /**\n * The URL your app is running on.\n *\n * The `@shopify/cli` provides this URL as `process.env.SHOPIFY_APP_URL`. For development this is probably a tunnel URL that points to your local machine. If this is a production app, this is your production URL.\n */\n appUrl: string;\n\n /**\n * An adaptor for storing sessions in your database of choice.\n *\n * Shopify provides multiple session storage adaptors and you can create your own.\n *\n * {@link https://github.com/Shopify/shopify-app-js/blob/main/README.md#session-storage-options}\n *\n * @example\n * Storing sessions with Prisma.\n * Add the `@shopify/shopify-app-session-storage-prisma` package to use the Prisma session storage.\n * ```ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { PrismaSessionStorage } from \"@shopify/shopify-app-session-storage-prisma\";\n *\n * import prisma from \"~/db.server\";\n *\n * const shopify = shopifyApp({\n * // ... etc\n * sessionStorage: new PrismaSessionStorage(prisma),\n * });\n * export default shopify;\n * ```\n */\n sessionStorage: Storage;\n\n /**\n * Whether your app use online or offline tokens.\n *\n * If your app uses online tokens, then both online and offline tokens will be saved to your database. This ensures your app can perform background jobs.\n *\n * {@link https://shopify.dev/docs/apps/auth/oauth/access-modes}\n *\n * @defaultValue `false`\n */\n useOnlineTokens?: boolean;\n\n /**\n * The config for the webhook topics your app would like to subscribe to.\n *\n * {@link https://shopify.dev/docs/apps/webhooks}\n *\n * This can be in used in conjunction with the afterAuth hook to register webhook topics when a user installs your app. Or you can use this function in other processes such as background jobs.\n *\n * @example\n * Registering for a webhook when a merchant uninstalls your app.\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 * APP_UNINSTALLED: {\n * deliveryMethod: DeliveryMethod.Http,\n * callbackUrl: \"/webhooks\",\n * },\n * },\n * hooks: {\n * afterAuth: async ({ session }) => {\n * shopify.registerWebhooks({ session });\n * }\n * },\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n *\n * // /app/routes/webhooks.jsx\n * import { ActionFunctionArgs } from \"@remix-run/node\";\n *\n * import { authenticate } from \"../shopify.server\";\n * import db from \"../db.server\";\n *\n * export const action = async ({ request }: ActionFunctionArgs) => {\n * const { topic, shop } = await authenticate.webhook(request);\n *\n * switch (topic) {\n * case \"APP_UNINSTALLED\":\n * await db.session.deleteMany({ where: { shop } });\n * break;\n * case \"CUSTOMERS_DATA_REQUEST\":\n * case \"CUSTOMERS_REDACT\":\n * case \"SHOP_REDACT\":\n * default:\n * throw new Response(\"Unhandled webhook topic\", { status: 404 });\n * }\n * throw new Response();\n * };\n * ```\n */\n webhooks?: WebhookConfig;\n\n /**\n * Functions to call at key places during your apps lifecycle.\n *\n * These functions are called in the context of the request that triggered them. This means you can access the session.\n *\n * @example\n * Seeding your database custom data when a merchant installs your app.\n * ```ts\n * import { DeliveryMethod, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { seedStoreData } from \"~/db/seeds\"\n *\n * const shopify = shopifyApp({\n * hooks: {\n * afterAuth: async ({ session }) => {\n * seedStoreData({session})\n * }\n * },\n * // ...etc\n * });\n * ```\n */\n hooks?: HooksConfig;\n\n /**\n * Does your app render embedded inside the Shopify Admin or on its own.\n *\n * Unless you have very specific needs, this should be true.\n *\n * @defaultValue `true`\n */\n isEmbeddedApp?: boolean;\n\n /**\n * How your app is distributed. Default is `AppDistribution.AppStore`.\n *\n * {@link https://shopify.dev/docs/apps/distribution}\n */\n distribution?: AppDistribution;\n\n /**\n * What version of Shopify's Admin API's would you like to use.\n *\n * {@link https://shopify.dev/docs/api/}\n *\n * @defaultValue `LATEST_API_VERSION` from `@shopify/shopify-app-remix`\n *\n * @example\n * Using the latest API Version (Recommended)\n * ```ts\n * import { LATEST_API_VERSION, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n *\n * const shopify = shopifyApp({\n * // ...etc\n * apiVersion: LATEST_API_VERSION,\n * });\n * ```\n */\n apiVersion?: ApiVersion;\n\n /**\n * A path that Shopify can reserve for auth related endpoints.\n *\n * This must match a $ route in your Remix app. That route must export a loader function that calls `shopify.authenticate.admin(request)`.\n *\n * @default `\"/auth\"`\n *\n * @example\n * Using the latest API Version (Recommended)\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 * apiVersion: LATEST_API_VERSION,\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n *\n * // /app/routes/auth/$.jsx\n * import { LoaderFunctionArgs } from \"@remix-run/node\";\n * import { authenticate } from \"../../shopify.server\";\n *\n * export async function loader({ request }: LoaderFunctionArgs) {\n * await authenticate.admin(request);\n *\n * return null\n * }\n * ```\n */\n authPathPrefix?: string;\n\n /**\n * Features that will be introduced in future releases of this package.\n *\n * You can opt in to these features by setting the corresponding flags. By doing so, you can prepare for future\n * releases in advance and provide feedback on the new features.\n */\n future?: Future;\n}" + "value": "export interface AppConfigArg<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n Storage extends SessionStorage = SessionStorage,\n Future extends FutureFlagOptions = FutureFlagOptions,\n> extends Omit<\n ApiConfigArg,\n | 'hostName'\n | 'hostScheme'\n | 'isEmbeddedApp'\n | 'apiVersion'\n | 'isCustomStoreApp'\n | 'future'\n > {\n /**\n * The URL your app is running on.\n *\n * The `@shopify/cli` provides this URL as `process.env.SHOPIFY_APP_URL`. For development this is probably a tunnel URL that points to your local machine. If this is a production app, this is your production URL.\n */\n appUrl: string;\n\n /**\n * An adaptor for storing sessions in your database of choice.\n *\n * Shopify provides multiple session storage adaptors and you can create your own.\n *\n * {@link https://github.com/Shopify/shopify-app-js/blob/main/README.md#session-storage-options}\n *\n * @example\n * Storing sessions with Prisma.\n * Add the `@shopify/shopify-app-session-storage-prisma` package to use the Prisma session storage.\n * ```ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { PrismaSessionStorage } from \"@shopify/shopify-app-session-storage-prisma\";\n *\n * import prisma from \"~/db.server\";\n *\n * const shopify = shopifyApp({\n * // ... etc\n * sessionStorage: new PrismaSessionStorage(prisma),\n * });\n * export default shopify;\n * ```\n */\n sessionStorage: Storage;\n\n /**\n * Whether your app use online or offline tokens.\n *\n * If your app uses online tokens, then both online and offline tokens will be saved to your database. This ensures your app can perform background jobs.\n *\n * {@link https://shopify.dev/docs/apps/auth/oauth/access-modes}\n *\n * @defaultValue `false`\n */\n useOnlineTokens?: boolean;\n\n /**\n * The config for the webhook topics your app would like to subscribe to.\n *\n * {@link https://shopify.dev/docs/apps/webhooks}\n *\n * This can be in used in conjunction with the afterAuth hook to register webhook topics when a user installs your app. Or you can use this function in other processes such as background jobs.\n *\n * @example\n * Registering for a webhook when a merchant uninstalls your app.\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 * APP_UNINSTALLED: {\n * deliveryMethod: DeliveryMethod.Http,\n * callbackUrl: \"/webhooks\",\n * },\n * },\n * hooks: {\n * afterAuth: async ({ session }) => {\n * shopify.registerWebhooks({ session });\n * }\n * },\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n *\n * // /app/routes/webhooks.jsx\n * import { ActionFunctionArgs } from \"@remix-run/node\";\n *\n * import { authenticate } from \"../shopify.server\";\n * import db from \"../db.server\";\n *\n * export const action = async ({ request }: ActionFunctionArgs) => {\n * const { topic, shop } = await authenticate.webhook(request);\n *\n * switch (topic) {\n * case \"APP_UNINSTALLED\":\n * await db.session.deleteMany({ where: { shop } });\n * break;\n * case \"CUSTOMERS_DATA_REQUEST\":\n * case \"CUSTOMERS_REDACT\":\n * case \"SHOP_REDACT\":\n * default:\n * throw new Response(\"Unhandled webhook topic\", { status: 404 });\n * }\n * throw new Response();\n * };\n * ```\n */\n webhooks?: WebhookConfig;\n\n /**\n * Functions to call at key places during your apps lifecycle.\n *\n * These functions are called in the context of the request that triggered them. This means you can access the session.\n *\n * @example\n * Seeding your database custom data when a merchant installs your app.\n * ```ts\n * import { DeliveryMethod, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { seedStoreData } from \"~/db/seeds\"\n *\n * const shopify = shopifyApp({\n * hooks: {\n * afterAuth: async ({ session }) => {\n * seedStoreData({session})\n * }\n * },\n * // ...etc\n * });\n * ```\n */\n hooks?: HooksConfig;\n\n /**\n * Does your app render embedded inside the Shopify Admin or on its own.\n *\n * Unless you have very specific needs, this should be true.\n *\n * @defaultValue `true`\n */\n isEmbeddedApp?: boolean;\n\n /**\n * How your app is distributed. Default is `AppDistribution.AppStore`.\n *\n * {@link https://shopify.dev/docs/apps/distribution}\n */\n distribution?: AppDistribution;\n\n /**\n * What version of Shopify's Admin API's would you like to use.\n *\n * {@link https://shopify.dev/docs/api/}\n *\n * @defaultValue `LATEST_API_VERSION` from `@shopify/shopify-app-remix`\n *\n * @example\n * Using the latest API Version (Recommended)\n * ```ts\n * import { LATEST_API_VERSION, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n *\n * const shopify = shopifyApp({\n * // ...etc\n * apiVersion: LATEST_API_VERSION,\n * });\n * ```\n */\n apiVersion?: ApiVersion;\n\n /**\n * A path that Shopify can reserve for auth related endpoints.\n *\n * This must match a $ route in your Remix app. That route must export a loader function that calls `shopify.authenticate.admin(request)`.\n *\n * @default `\"/auth\"`\n *\n * @example\n * Using the latest API Version (Recommended)\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 * apiVersion: LATEST_API_VERSION,\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n *\n * // /app/routes/auth/$.jsx\n * import { LoaderFunctionArgs } from \"@remix-run/node\";\n * import { authenticate } from \"../../shopify.server\";\n *\n * export async function loader({ request }: LoaderFunctionArgs) {\n * await authenticate.admin(request);\n *\n * return null\n * }\n * ```\n */\n authPathPrefix?: string;\n\n /**\n * Features that will be introduced in future releases of this package.\n *\n * You can opt in to these features by setting the corresponding flags. By doing so, you can prepare for future\n * releases in advance and provide feedback on the new features.\n */\n future?: Future;\n}" }, "WebhookConfig": { "filePath": "/server/config-types.ts", @@ -3823,7 +3815,7 @@ "filePath": "/server/clients/admin/types.ts", "syntaxKind": "PropertySignature", "name": "graphql", - "value": "GraphQLClient", + "value": "GraphQLClient", "description": "Methods for interacting with the Shopify Admin GraphQL API\n\n\n\n\n\n\n\n\n\n", "examples": [ { @@ -3839,7 +3831,7 @@ ] } ], - "value": "export interface AdminApiContext<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n> {\n /**\n * Methods for interacting with the Shopify Admin REST API\n *\n * There are methods for interacting with individual REST resources. You can also make `GET`, `POST`, `PUT` and `DELETE` requests should the REST resources not meet your needs.\n *\n * {@link https://shopify.dev/docs/api/admin-rest}\n *\n * @example\n * Using REST resources.\n * Getting the number of orders in a store using REST resources. Visit the [Admin REST API references](/docs/api/admin-rest) for examples on using each resource. \n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * return json(admin.rest.resources.Order.count({ session }));\n * };\n * ```\n *\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-07\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n *\n *\n * @example\n * Performing a GET request to the REST API.\n * Use `admin.rest.get` to make custom requests to make a request to to the `customer/count` endpoint\n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = await admin.rest.get({ path: \"/customers/count.json\" });\n * const customers = await response.json();\n * return json({ customers });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n * @example\n * Performing a POST request to the REST API.\n * Use `admin.rest.post` to make custom requests to make a request to to the `customers.json` endpoint to send a welcome email\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = admin.rest.post({\n * path: \"customers/7392136888625/send_invite.json\",\n * body: {\n * customer_invite: {\n * to: \"new_test_email@shopify.com\",\n * from: \"j.limited@example.com\",\n * bcc: [\"j.limited@example.com\"],\n * subject: \"Welcome to my new shop\",\n * custom_message: \"My awesome new store\",\n * },\n * },\n * });\n * const customerInvite = await response.json();\n * return json({ customerInvite });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n rest: RestClientWithResources;\n\n /**\n * Methods for interacting with the Shopify Admin GraphQL API\n *\n * {@link https://shopify.dev/docs/api/admin-graphql}\n * {@link https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/reference/clients/Graphql.md}\n *\n * @example\n * Querying the GraphQL API.\n * Use `admin.graphql` to make query / mutation requests.\n * ```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 } = await authenticate.admin(request);\n *\n * const response = await admin.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" + "value": "export interface AdminApiContext<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n> {\n /**\n * Methods for interacting with the Shopify Admin REST API\n *\n * There are methods for interacting with individual REST resources. You can also make `GET`, `POST`, `PUT` and `DELETE` requests should the REST resources not meet your needs.\n *\n * {@link https://shopify.dev/docs/api/admin-rest}\n *\n * @example\n * Using REST resources.\n * Getting the number of orders in a store using REST resources. Visit the [Admin REST API references](/docs/api/admin-rest) for examples on using each resource. \n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * return json(admin.rest.resources.Order.count({ session }));\n * };\n * ```\n *\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-07\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n *\n *\n * @example\n * Performing a GET request to the REST API.\n * Use `admin.rest.get` to make custom requests to make a request to to the `customer/count` endpoint\n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = await admin.rest.get({ path: \"/customers/count.json\" });\n * const customers = await response.json();\n * return json({ customers });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n * @example\n * Performing a POST request to the REST API.\n * Use `admin.rest.post` to make custom requests to make a request to to the `customers.json` endpoint to send a welcome email\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = admin.rest.post({\n * path: \"customers/7392136888625/send_invite.json\",\n * body: {\n * customer_invite: {\n * to: \"new_test_email@shopify.com\",\n * from: \"j.limited@example.com\",\n * bcc: [\"j.limited@example.com\"],\n * subject: \"Welcome to my new shop\",\n * custom_message: \"My awesome new store\",\n * },\n * },\n * });\n * const customerInvite = await response.json();\n * return json({ customerInvite });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n rest: RestClientWithResources;\n\n /**\n * Methods for interacting with the Shopify Admin GraphQL API\n *\n * {@link https://shopify.dev/docs/api/admin-graphql}\n * {@link https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/reference/clients/Graphql.md}\n *\n * @example\n * Querying the GraphQL API.\n * Use `admin.graphql` to make query / mutation requests.\n * ```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 } = await authenticate.admin(request);\n *\n * const response = await admin.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" }, "RestClientWithResources": { "filePath": "/server/clients/admin/rest.ts", @@ -3871,13 +3863,6 @@ } ] }, - "FutureFlagOptions": { - "filePath": "/server/future/flags.ts", - "syntaxKind": "TypeAliasDeclaration", - "name": "FutureFlagOptions", - "value": "FutureFlags | undefined", - "description": "" - }, "FutureFlags": { "filePath": "/server/future/flags.ts", "name": "FutureFlags", @@ -3973,7 +3958,7 @@ "tabs": [ { "code": "import { DeliveryMethod, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n\nconst shopify = shopifyApp({\n hooks: {\n afterAuth: async ({ session }) => {\n shopify.registerWebhooks({ session });\n }\n },\n webhooks: {\n APP_UNINSTALLED: {\n deliveryMethod: DeliveryMethod.Http,\n callbackUrl: \"/webhooks\",\n },\n },\n // ...etc\n});", - "title": "Example" + "title": "/app/shopify.server.ts" } ] } @@ -4987,7 +4972,7 @@ "filePath": "/server/clients/storefront/types.ts", "syntaxKind": "PropertySignature", "name": "graphql", - "value": "GraphQLClient", + "value": "GraphQLClient", "description": "Method for interacting with the Shopify Storefront GraphQL API\n\nIf you're getting incorrect type hints in the Shopify template, follow [these instructions](https://github.com/Shopify/shopify-app-template-remix/tree/main#incorrect-graphql-hints).\n\n\n\n\n", "examples": [ { @@ -5003,7 +4988,7 @@ ] } ], - "value": "export interface StorefrontContext {\n /**\n * Method for interacting with the Shopify Storefront GraphQL API\n *\n * If you're getting incorrect type hints in the Shopify template, follow [these instructions](https://github.com/Shopify/shopify-app-template-remix/tree/main#incorrect-graphql-hints).\n *\n * {@link https://shopify.dev/docs/api/storefront}\n *\n * @example\n * Querying the GraphQL API.\n * Use `storefront.graphql` to make query / mutation requests.\n * ```ts\n * // app/routes/**\\/.ts\n * import { json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { storefront } = await authenticate.public.appProxy(request);\n *\n * const response = await storefront.graphql(`{blogs(first: 10) { edges { node { id } } } }`);\n *\n * return json(await response.json());\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" + "value": "export interface StorefrontContext {\n /**\n * Method for interacting with the Shopify Storefront GraphQL API\n *\n * If you're getting incorrect type hints in the Shopify template, follow [these instructions](https://github.com/Shopify/shopify-app-template-remix/tree/main#incorrect-graphql-hints).\n *\n * {@link https://shopify.dev/docs/api/storefront}\n *\n * @example\n * Querying the GraphQL API.\n * Use `storefront.graphql` to make query / mutation requests.\n * ```ts\n * // app/routes/**\\/.ts\n * import { json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { storefront } = await authenticate.public.appProxy(request);\n *\n * const response = await storefront.graphql(`{blogs(first: 10) { edges { node { id } } } }`);\n *\n * return json(await response.json());\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" }, "AuthenticatePublicLegacy": { "filePath": "/server/authenticate/public/types.ts", @@ -5071,7 +5056,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { apiVersion } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -5090,7 +5075,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { shop } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -5109,7 +5094,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { topic } = await authenticate.webhook(request);\n\n switch (topic) {\n case \"APP_UNINSTALLED\":\n // Do something when the app is uninstalled.\n break;\n }\n\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -5128,7 +5113,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { webhookId } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -5147,7 +5132,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { payload } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -5408,14 +5393,14 @@ { "filePath": "/server/types.ts", "syntaxKind": "MethodSignature", - "name": "__@iterator@629", + "name": "__@iterator@716", "value": "() => IterableIterator", "description": "Iterator" }, { "filePath": "/server/types.ts", "syntaxKind": "MethodSignature", - "name": "__@unscopables@631", + "name": "__@unscopables@718", "value": "() => { copyWithin: boolean; entries: boolean; fill: boolean; find: boolean; findIndex: boolean; keys: boolean; values: boolean; }", "description": "Returns an object whose properties have the value 'true'\r\nwhen they will be absent when used in a 'with' statement." }, @@ -5454,7 +5439,7 @@ "tabs": [ { "code": "import { ActionFunctionArgs } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport async function action({ request }: ActionFunctionArgs) {\n const { admin } = await authenticate.webhook(request);\n\n const response = await admin?.graphql(\n `#graphql\n mutation populateProduct($input: ProductInput!) {\n productCreate(input: $input) {\n product {\n id\n }\n }\n }`,\n { variables: { input: { title: \"Product Name\" } } }\n );\n\n const productData = await response.json();\n return json({ data: productData.data });\n}", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] }, @@ -5464,7 +5449,7 @@ "tabs": [ { "code": "import { json, ActionFunctionArgs } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport async function action({ request }: ActionFunctionArgs) {\n const { admin } = await authenticate.webhook(request);\n\n const response = await admin?.graphql.query({\n data: {\n query: `#graphql\n mutation populateProduct($input: ProductInput!) {\n productCreate(input: $input) {\n product {\n id\n }\n }\n }`,\n variables: { input: { title: \"Product Name\" } },\n },\n });\n\n const productData = response?.body.data;\n return json({ data: productData.data });\n}", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -5483,7 +5468,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { apiVersion } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -5502,7 +5487,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { shop } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -5521,7 +5506,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { topic } = await authenticate.webhook(request);\n\n switch (topic) {\n case \"APP_UNINSTALLED\":\n // Do something when the app is uninstalled.\n break;\n }\n\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -5540,7 +5525,7 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { webhookId } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } @@ -5559,14 +5544,14 @@ "tabs": [ { "code": "import { ActionFunction } from \"@remix-run/node\";\nimport { authenticate } from \"../shopify.server\";\n\nexport const action: ActionFunction = async ({ request }) => {\n const { payload } = await authenticate.webhook(request);\n return new Response();\n};", - "title": "Example" + "title": "/app/routes/webhooks.tsx" } ] } ] } ], - "value": "export interface WebhookContextWithSession<\n Future extends FutureFlagOptions,\n Resources extends ShopifyRestResources,\n Topics = string | number | symbol,\n> extends Context {\n /**\n * A session with an offline token for the shop.\n *\n * Returned only if there is a session for the shop.\n */\n session: Session;\n\n /**\n * An admin context for the webhook.\n *\n * Returned only if there is a session for the shop.\n *\n * @example\n * [V3] Webhook admin context.\n * With the `v3_webhookAdminContext` future flag enabled, use the `admin` object in the context to interact with the Admin API.\n * ```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 } = await authenticate.webhook(request);\n *\n * const response = await admin?.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n *\n * @example\n * Webhook admin context.\n * Use the `admin` object in the context to interact with the Admin API. This format will be removed in V3 of the package.\n * ```ts\n * import { json, ActionFunctionArgs } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { admin } = await authenticate.webhook(request);\n *\n * const response = await admin?.graphql.query({\n * data: {\n * query: `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * variables: { input: { title: \"Product Name\" } },\n * },\n * });\n *\n * const productData = response?.body.data;\n * return json({ data: productData.data });\n * }\n * ```\n */\n admin: WebhookAdminContext;\n}" + "value": "export interface WebhookContextWithSession<\n Future extends FutureFlagOptions,\n Resources extends ShopifyRestResources,\n Topics = string | number | symbol,\n> extends Context {\n /**\n * A session with an offline token for the shop.\n *\n * Returned only if there is a session for the shop.\n */\n session: Session;\n\n /**\n * An admin context for the webhook.\n *\n * Returned only if there is a session for the shop.\n *\n * @example\n * [V3] Webhook admin context.\n * With the `v3_webhookAdminContext` future flag enabled, use the `admin` object in the context to interact with the Admin API.\n * ```ts\n * // /app/routes/webhooks.tsx\n * import { ActionFunctionArgs } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { admin } = await authenticate.webhook(request);\n *\n * const response = await admin?.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n *\n * @example\n * Webhook admin context.\n * Use the `admin` object in the context to interact with the Admin API. This format will be removed in V3 of the package.\n * ```ts\n * // /app/routes/webhooks.tsx\n * import { json, ActionFunctionArgs } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { admin } = await authenticate.webhook(request);\n *\n * const response = await admin?.graphql.query({\n * data: {\n * query: `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * variables: { input: { title: \"Product Name\" } },\n * },\n * });\n *\n * const productData = response?.body.data;\n * return json({ data: productData.data });\n * }\n * ```\n */\n admin: WebhookAdminContext;\n}" }, "WebhookAdminContext": { "filePath": "/server/authenticate/webhooks/types.ts", @@ -5829,7 +5814,7 @@ "tabs": [ { "code": "import { DeliveryMethod, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n\nconst shopify = shopifyApp({\n hooks: {\n afterAuth: async ({ session }) => {\n shopify.registerWebhooks({ session });\n }\n },\n webhooks: {\n APP_UNINSTALLED: {\n deliveryMethod: DeliveryMethod.Http,\n callbackUrl: \"/webhooks\",\n },\n },\n // ...etc\n});", - "title": "Example" + "title": "/app/shopify.server.ts" } ] } @@ -5882,7 +5867,7 @@ ] } ], - "value": "export interface ShopifyAppBase {\n /**\n * The `SessionStorage` instance you passed in as a config option.\n *\n * @example\n * Storing sessions with Prisma.\n * Import the `@shopify/shopify-app-session-storage-prisma` package to store sessions in your Prisma database.\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 * sesssionStorage: new PrismaSessionStorage(prisma),\n * // ...etc\n * })\n *\n * // shopify.sessionStorage is an instance of PrismaSessionStorage\n * ```\n */\n sessionStorage: SessionStorageType;\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 * Return headers on all requests.\n * Add headers to all HTML requests by calling `shopify.addDocumentResponseHeaders` in `entry.server.tsx`.\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 * \n * );\n *\n * responseHeaders.set(\"Content-Type\", \"text/html\");\n * addDocumentResponseHeaders(request, responseHeaders);\n *\n * return new Response(\"\" + markup, {\n * status: responseStatusCode,\n * headers: responseHeaders,\n * });\n * }\n * ```\n */\n addDocumentResponseHeaders: AddDocumentResponseHeaders;\n\n /**\n * Register webhook topics for a store using the given session. Most likely you want to use this in combination with the afterAuth hook.\n *\n * @example\n * Registering webhooks after install\n * Trigger the registration to create the webhook subscriptions after a merchant installs your app using the `afterAuth` hook. Learn more about [subscribing to webhooks.](/docs/api/shopify-app-remix/v1/guide-webhooks)\n * ```ts\n * import { DeliveryMethod, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n *\n * const shopify = shopifyApp({\n * hooks: {\n * afterAuth: async ({ session }) => {\n * shopify.registerWebhooks({ session });\n * }\n * },\n * webhooks: {\n * APP_UNINSTALLED: {\n * deliveryMethod: DeliveryMethod.Http,\n * callbackUrl: \"/webhooks\",\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 * Authenticate Shopify requests.\n * Use the functions in `authenticate` to validate requests coming from Shopify.\n * ```ts\n * // /app/shopify.server.ts\n * import { LATEST_API_VERSION, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\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 *\n * return json(await admin.rest.resources.Product.count({ session }));\n * }\n * ```\n */\n authenticate: Authenticate;\n\n /**\n * Ways to get Contexts from requests that do not originate from Shopify.\n *\n * @example\n * Using unauthenticated contexts.\n * Create contexts for requests that don't come from Shopify.\n * ```ts\n * // /app/shopify.server.ts\n * import { LATEST_API_VERSION, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\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 *\n * return json(await admin.rest.resources.Product.count({ session }));\n * }\n * ```\n */\n unauthenticated: Unauthenticated>;\n}" + "value": "export interface ShopifyAppBase {\n /**\n * The `SessionStorage` instance you passed in as a config option.\n *\n * @example\n * Storing sessions with Prisma.\n * Import the `@shopify/shopify-app-session-storage-prisma` package to store sessions in your Prisma database.\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 * sesssionStorage: new PrismaSessionStorage(prisma),\n * // ...etc\n * })\n *\n * // shopify.sessionStorage is an instance of PrismaSessionStorage\n * ```\n */\n sessionStorage: SessionStorageType;\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 * Return headers on all requests.\n * Add headers to all HTML requests by calling `shopify.addDocumentResponseHeaders` in `entry.server.tsx`.\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 * \n * );\n *\n * responseHeaders.set(\"Content-Type\", \"text/html\");\n * addDocumentResponseHeaders(request, responseHeaders);\n *\n * return new Response(\"\" + markup, {\n * status: responseStatusCode,\n * headers: responseHeaders,\n * });\n * }\n * ```\n */\n addDocumentResponseHeaders: AddDocumentResponseHeaders;\n\n /**\n * Register webhook topics for a store using the given session. Most likely you want to use this in combination with the afterAuth hook.\n *\n * @example\n * Registering webhooks after install\n * Trigger the registration to create the webhook subscriptions after a merchant installs your app using the `afterAuth` hook. Learn more about [subscribing to webhooks.](/docs/api/shopify-app-remix/v1/guide-webhooks)\n * ```ts\n * // /app/shopify.server.ts\n * import { DeliveryMethod, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n *\n * const shopify = shopifyApp({\n * hooks: {\n * afterAuth: async ({ session }) => {\n * shopify.registerWebhooks({ session });\n * }\n * },\n * webhooks: {\n * APP_UNINSTALLED: {\n * deliveryMethod: DeliveryMethod.Http,\n * callbackUrl: \"/webhooks\",\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 * Authenticate Shopify requests.\n * Use the functions in `authenticate` to validate requests coming from Shopify.\n * ```ts\n * // /app/shopify.server.ts\n * import { LATEST_API_VERSION, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\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 *\n * return json(await admin.rest.resources.Product.count({ session }));\n * }\n * ```\n */\n authenticate: Authenticate;\n\n /**\n * Ways to get Contexts from requests that do not originate from Shopify.\n *\n * @example\n * Using unauthenticated contexts.\n * Create contexts for requests that don't come from Shopify.\n * ```ts\n * // /app/shopify.server.ts\n * import { LATEST_API_VERSION, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\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 *\n * return json(await admin.rest.resources.Product.count({ session }));\n * }\n * ```\n */\n unauthenticated: Unauthenticated>;\n}" }, "ShopifyAppLogin": { "filePath": "/server/types.ts", @@ -6035,7 +6020,7 @@ "title": "The minimum viable configuration", "tabs": [ { - "title": "Example", + "title": "/shopify.server.ts", "code": "import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n\nconst shopify = shopifyApp({\n apiKey: process.env.SHOPIFY_API_KEY!,\n apiSecretKey: process.env.SHOPIFY_API_SECRET!,\n scopes: process.env.SCOPES?.split(\",\")!,\n appUrl: process.env.SHOPIFY_APP_URL!,\n});\nexport default shopify;", "language": "typescript" } @@ -6095,7 +6080,7 @@ "title": "Registering webhooks after install", "tabs": [ { - "title": "Example", + "title": "/app/shopify.server.ts", "code": "import { DeliveryMethod, shopifyApp } from \"@shopify/shopify-app-remix/server\";\n\nconst shopify = shopifyApp({\n hooks: {\n afterAuth: async ({ session }) => {\n shopify.registerWebhooks({ session });\n }\n },\n webhooks: {\n APP_UNINSTALLED: {\n deliveryMethod: DeliveryMethod.Http,\n callbackUrl: \"/webhooks\",\n },\n },\n // ...etc\n});", "language": "typescript" } @@ -6302,7 +6287,7 @@ "filePath": "/server/clients/admin/types.ts", "syntaxKind": "PropertySignature", "name": "graphql", - "value": "GraphQLClient", + "value": "GraphQLClient", "description": "Methods for interacting with the Shopify Admin GraphQL API\n\n\n\n\n\n\n\n\n\n", "examples": [ { @@ -6318,7 +6303,7 @@ ] } ], - "value": "export interface AdminApiContext<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n> {\n /**\n * Methods for interacting with the Shopify Admin REST API\n *\n * There are methods for interacting with individual REST resources. You can also make `GET`, `POST`, `PUT` and `DELETE` requests should the REST resources not meet your needs.\n *\n * {@link https://shopify.dev/docs/api/admin-rest}\n *\n * @example\n * Using REST resources.\n * Getting the number of orders in a store using REST resources. Visit the [Admin REST API references](/docs/api/admin-rest) for examples on using each resource. \n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * return json(admin.rest.resources.Order.count({ session }));\n * };\n * ```\n *\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-07\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n *\n *\n * @example\n * Performing a GET request to the REST API.\n * Use `admin.rest.get` to make custom requests to make a request to to the `customer/count` endpoint\n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = await admin.rest.get({ path: \"/customers/count.json\" });\n * const customers = await response.json();\n * return json({ customers });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n * @example\n * Performing a POST request to the REST API.\n * Use `admin.rest.post` to make custom requests to make a request to to the `customers.json` endpoint to send a welcome email\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = admin.rest.post({\n * path: \"customers/7392136888625/send_invite.json\",\n * body: {\n * customer_invite: {\n * to: \"new_test_email@shopify.com\",\n * from: \"j.limited@example.com\",\n * bcc: [\"j.limited@example.com\"],\n * subject: \"Welcome to my new shop\",\n * custom_message: \"My awesome new store\",\n * },\n * },\n * });\n * const customerInvite = await response.json();\n * return json({ customerInvite });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n rest: RestClientWithResources;\n\n /**\n * Methods for interacting with the Shopify Admin GraphQL API\n *\n * {@link https://shopify.dev/docs/api/admin-graphql}\n * {@link https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/reference/clients/Graphql.md}\n *\n * @example\n * Querying the GraphQL API.\n * Use `admin.graphql` to make query / mutation requests.\n * ```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 } = await authenticate.admin(request);\n *\n * const response = await admin.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" + "value": "export interface AdminApiContext<\n Resources extends ShopifyRestResources = ShopifyRestResources,\n> {\n /**\n * Methods for interacting with the Shopify Admin REST API\n *\n * There are methods for interacting with individual REST resources. You can also make `GET`, `POST`, `PUT` and `DELETE` requests should the REST resources not meet your needs.\n *\n * {@link https://shopify.dev/docs/api/admin-rest}\n *\n * @example\n * Using REST resources.\n * Getting the number of orders in a store using REST resources. Visit the [Admin REST API references](/docs/api/admin-rest) for examples on using each resource. \n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * return json(admin.rest.resources.Order.count({ session }));\n * };\n * ```\n *\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-07\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n *\n *\n * @example\n * Performing a GET request to the REST API.\n * Use `admin.rest.get` to make custom requests to make a request to to the `customer/count` endpoint\n *\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = await admin.rest.get({ path: \"/customers/count.json\" });\n * const customers = await response.json();\n * return json({ customers });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n * @example\n * Performing a POST request to the REST API.\n * Use `admin.rest.post` to make custom requests to make a request to to the `customers.json` endpoint to send a welcome email\n * ```ts\n * // /app/routes/**\\/*.ts\n * import { LoaderFunctionArgs, json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export const loader = async ({ request }: LoaderFunctionArgs) => {\n * const { admin, session } = await authenticate.admin(request);\n * const response = admin.rest.post({\n * path: \"customers/7392136888625/send_invite.json\",\n * body: {\n * customer_invite: {\n * to: \"new_test_email@shopify.com\",\n * from: \"j.limited@example.com\",\n * bcc: [\"j.limited@example.com\"],\n * subject: \"Welcome to my new shop\",\n * custom_message: \"My awesome new store\",\n * },\n * },\n * });\n * const customerInvite = await response.json();\n * return json({ customerInvite });\n * };\n * ```\n *\n * ```ts\n * // /app/shopify.server.ts\n * import { shopifyApp } from \"@shopify/shopify-app-remix/server\";\n * import { restResources } from \"@shopify/shopify-api/rest/admin/2023-04\";\n *\n * const shopify = shopifyApp({\n * restResources,\n * // ...etc\n * });\n * export default shopify;\n * export const authenticate = shopify.authenticate;\n * ```\n */\n rest: RestClientWithResources;\n\n /**\n * Methods for interacting with the Shopify Admin GraphQL API\n *\n * {@link https://shopify.dev/docs/api/admin-graphql}\n * {@link https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/reference/clients/Graphql.md}\n *\n * @example\n * Querying the GraphQL API.\n * Use `admin.graphql` to make query / mutation requests.\n * ```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 } = await authenticate.admin(request);\n *\n * const response = await admin.graphql(\n * `#graphql\n * mutation populateProduct($input: ProductInput!) {\n * productCreate(input: $input) {\n * product {\n * id\n * }\n * }\n * }`,\n * { variables: { input: { title: \"Product Name\" } } }\n * );\n *\n * const productData = await response.json();\n * return json({ data: productData.data });\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" }, "RestClientWithResources": { "filePath": "/server/clients/admin/rest.ts", @@ -6517,7 +6502,7 @@ "filePath": "/server/clients/storefront/types.ts", "syntaxKind": "PropertySignature", "name": "graphql", - "value": "GraphQLClient", + "value": "GraphQLClient", "description": "Method for interacting with the Shopify Storefront GraphQL API\n\nIf you're getting incorrect type hints in the Shopify template, follow [these instructions](https://github.com/Shopify/shopify-app-template-remix/tree/main#incorrect-graphql-hints).\n\n\n\n\n", "examples": [ { @@ -6533,7 +6518,7 @@ ] } ], - "value": "export interface StorefrontContext {\n /**\n * Method for interacting with the Shopify Storefront GraphQL API\n *\n * If you're getting incorrect type hints in the Shopify template, follow [these instructions](https://github.com/Shopify/shopify-app-template-remix/tree/main#incorrect-graphql-hints).\n *\n * {@link https://shopify.dev/docs/api/storefront}\n *\n * @example\n * Querying the GraphQL API.\n * Use `storefront.graphql` to make query / mutation requests.\n * ```ts\n * // app/routes/**\\/.ts\n * import { json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { storefront } = await authenticate.public.appProxy(request);\n *\n * const response = await storefront.graphql(`{blogs(first: 10) { edges { node { id } } } }`);\n *\n * return json(await response.json());\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" + "value": "export interface StorefrontContext {\n /**\n * Method for interacting with the Shopify Storefront GraphQL API\n *\n * If you're getting incorrect type hints in the Shopify template, follow [these instructions](https://github.com/Shopify/shopify-app-template-remix/tree/main#incorrect-graphql-hints).\n *\n * {@link https://shopify.dev/docs/api/storefront}\n *\n * @example\n * Querying the GraphQL API.\n * Use `storefront.graphql` to make query / mutation requests.\n * ```ts\n * // app/routes/**\\/.ts\n * import { json } from \"@remix-run/node\";\n * import { authenticate } from \"../shopify.server\";\n *\n * export async function action({ request }: ActionFunctionArgs) {\n * const { storefront } = await authenticate.public.appProxy(request);\n *\n * const response = await storefront.graphql(`{blogs(first: 10) { edges { node { id } } } }`);\n *\n * return json(await response.json());\n * }\n * ```\n */\n graphql: GraphQLClient;\n}" } } } diff --git a/packages/shopify-app-remix/docs/generated/generated_static_pages.json b/packages/shopify-app-remix/docs/generated/generated_static_pages.json index 0a5cf3a77f..820614e730 100644 --- a/packages/shopify-app-remix/docs/generated/generated_static_pages.json +++ b/packages/shopify-app-remix/docs/generated/generated_static_pages.json @@ -10,7 +10,7 @@ "title": "Authenticating requests", "sectionContent": "To authenticate admin requests you can call `authenticate.admin(request)` in a loader or an action.\n\nIf there's a session for this user, then this loader will return null. If there's no session for the user, then the loader will throw the appropriate redirect Response.\n\n> Tip: If you are authenticating more than one route, then we recommend using [Remix layout routes](https://remix.run/docs/en/1.18.1/file-conventions/routes-files#layout-routes) to automatically authenticate them.", "codeblock": { - "title": "/app/routes/**/*.tsx", + "title": "Authenticating requests", "tabs": [ { "title": "/app/routes/**/*.tsx", @@ -26,7 +26,7 @@ "title": "Headers", "sectionContent": "The OAuth process can't happen inside the admin iframe, and this package is capable of detecting that scenario and properly redirecting using the [Remix `ErrorBoundary`](https://remix.run/docs/en/main/guides/errors) export to set the correct headers for App Bridge.\n\nUse the abstractions provided by this package in your authenticated routes, to automatically set up the error and headers boundaries to redirect outside the iframe when needed.\n\n> Tip: You can also add this to a [Remix layout](https://remix.run/docs/en/main/file-conventions/route-files-v2) if you want to authenticate more than one route, but make sure to call the Shopify boundary methods whenever you need to add your own exports.", "codeblock": { - "title": "/app/routes/**/*.tsx", + "title": "Configure header boundaries", "tabs": [ { "title": "/app/routes/**/*.tsx", @@ -42,7 +42,7 @@ "title": "Authenticating cross-origin admin requests", "sectionContent": "If your Remix server is authenticating an admin extension, then a request from the extension to Remix will be cross-origin.\n\nHere `authenticate.admin` provides a `cors` function to add the required cross-origin headers.", "codeblock": { - "title": "/app/routes/**/*.tsx", + "title": "Add cross-origin headers", "tabs": [ { "title": "/app/routes/**/*.tsx", @@ -58,7 +58,7 @@ "title": "Using the GraphQL API", "sectionContent": "Once a request is authenticated, `authenticate.admin` will return an `admin` object that contains a GraphQL client that can interact with the [GraphQL Admin API](/docs/api/admin-graphql).", "codeblock": { - "title": "/app/routes/**/*.tsx", + "title": "Make GraphQL requests", "tabs": [ { "title": "/app/routes/**/*.tsx", @@ -66,7 +66,14 @@ "language": "tsx" } ] - } + }, + "sectionCard": [ + { + "url": "/docs/api/shopify-app-remix/guide-graphql-types", + "name": "Typing GraphQL operations", + "type": "tutorial" + } + ] }, { "type": "Generic", @@ -113,7 +120,7 @@ "title": "Setting future flags", "sectionContent": "To opt in to a feature, simply enable the appropriate flag in the `future` option of the `shopifyApp` function.\n\nOnce a flag is set, the returned `shopify` object will start using the new APIs, including using any new types. That allows apps to rely on TypeScript to use a feature regardless of a flag being enabled or not.", "codeblock": { - "title": "/app/shopify.server.ts", + "title": "Enable future flags", "tabs": [ { "title": "/app/shopify.server.ts", @@ -129,7 +136,7 @@ "title": "Unstable APIs", "sectionContent": "When introducing new features to the package for which we want to gather feedback, we will add them behind a future flag, starting with the `unstable_` prefix.\n\nThat allows early adopters to try them out individually, without having to install a release candidate package.\n\nWhen the feature is ready for release, the future flag will be removed and it will be available by default.\n\nIn this example, `shopify` has a new function called `newFeature`. If the future flag is disabled, TypeScript will be unaware of the new function, and the app will fail to compile if it tries to use it.", "codeblock": { - "title": "/app/routes/*.tsx", + "title": "Use unstable APIs", "tabs": [ { "title": "/app/routes/*.tsx", @@ -161,6 +168,130 @@ } ] }, + { + "id": "guide-graphql-types", + "title": "Typing GraphQL operations", + "description": "The GraphQL clients provided in this package can use [Codegen](https://the-guild.dev/graphql/codegen) to automatically parse and create types for your queries and mutations.\n\nBy installing a few packages in your app, you can use the `graphql-codegen` script, which will look for strings with the `#graphql` tag and extract types from them.\n\nIf your IDE supports it, you will also get syntax highlighting and auto-complete features when writing your queries.", + "sections": [ + { + "type": "Markdown", + "anchorLink": "example", + "title": "See it in action", + "sectionContent": "\nIn this example, we use the `graphql-codegen` script to parse a query in the `/app/routes/new.tsx` file.\n\nNote how VSCode shows the types for both the return type of `response.json()`, and the `variables` option in the `graphql` function.\n\n\n " + }, + { + "type": "Generic", + "anchorLink": "install", + "title": "Installing packages", + "sectionContent": "To use the `graphql-codegen` script, you will need to install a few packages in your app.\n\nThey will include the scripts to run, and the types that will be overridden by the results of parsing your operations.", + "codeblock": { + "title": "Installing packages", + "tabs": [ + { + "title": "npm", + "language": "sh", + "code": "npm add --save-dev @shopify/api-codegen-preset\nnpm add @shopify/admin-api-client @shopify/storefront-api-client\n" + }, + { + "title": "yarn", + "language": "sh", + "code": "yarn add --dev @shopify/api-codegen-preset\nyarn add @shopify/admin-api-client @shopify/storefront-api-client\n" + }, + { + "title": "pnpm", + "language": "sh", + "code": "pnpm add --save-dev @shopify/api-codegen-preset\npnpm add @shopify/admin-api-client @shopify/storefront-api-client\n" + } + ] + } + }, + { + "type": "Generic", + "anchorLink": "configure", + "title": "Setting up .graphqlrc.ts", + "sectionContent": "Before you can parse operations, you'll need to create a `.graphqlrc.ts` file in your project, and configure it to use the `@shopify/api-codegen-preset`.\n\n> Caution: Parsing will not work on `.graphql` documents, because the preset can only apply types from JavaScript and TypeScript const strings.", + "codeblock": { + "title": "Codegen configuration example", + "tabs": [ + { + "title": "/.graphqlrc.ts", + "language": "ts", + "code": "import {shopifyApiProject, ApiType} from '@shopify/api-codegen-preset';\n\nexport default {\n // For syntax highlighting / auto-complete when writing operations\n schema: 'https://shopify.dev/admin-graphql-direct-proxy/2023-10',\n documents: ['./app/**/*.{js,ts,jsx,tsx}'],\n projects: {\n // To produce variable / return types for Admin API operations\n default: shopifyApiProject({\n apiType: ApiType.Admin,\n apiVersion: '2023-10',\n documents: ['./app/**/*.{js,ts,jsx,tsx}'],\n outputDir: './app/types',\n }),\n },\n};\n" + } + ] + }, + "sectionCard": [ + { + "url": "https://github.com/Shopify/shopify-api-js/tree/main/packages/api-codegen-preset#configuration", + "name": "Configuration options", + "subtitle": "Learn more about the available configurations.", + "type": "github" + } + ] + }, + { + "type": "Generic", + "anchorLink": "set-up-script", + "title": "Setting up the script", + "sectionContent": "To generate types, you'll need to add an entry for `graphql-codegen` in the `\"scripts\"` section of your `package.json` file.", + "codeblock": { + "title": "Setting up the script", + "tabs": [ + { + "title": "/package.json", + "language": "json", + "code": "{\n \"scripts\": {\n \"graphql-codegen\": \"graphql-codegen\"\n }\n}\n" + } + ] + } + }, + { + "type": "Generic", + "anchorLink": "run", + "title": "Generating types", + "sectionContent": "When you run `graphql-codegen`, it will look in all your configured documents for strings marked with a `#graphql` tag.\n\nIDEs that support the `.graphqlrc.ts` file will provide syntax highlighting for your operations, as well as typing.\n\n> Tip: You can pass in a `--watch` flag to the script, which will update your types every time you save a file.", + "codeblock": { + "title": "Running graphql-codegen", + "tabs": [ + { + "title": "npm", + "language": "sh", + "code": "npm run graphql-codegen\n" + }, + { + "title": "yarn", + "language": "sh", + "code": "yarn graphql-codegen\n" + }, + { + "title": "pnpm", + "language": "sh", + "code": "pnpm run graphql-codegen\n" + } + ] + } + }, + { + "type": "Resource", + "title": "Resources", + "anchorLink": "resources", + "resources": [ + { + "name": "Admin API", + "url": "/docs/api/shopify-app-remix/apis/admin-api", + "type": "shopify", + "subtitle": "Make requests to the Admin API" + }, + { + "name": "Storefront API", + "url": "/docs/api/shopify-app-remix/apis/storefront-api", + "type": "shopify", + "subtitle": "Make requests to the Storefront API" + } + ] + } + ] + }, { "id": "shopify-app-remix", "title": "Shopify App package for Remix", @@ -239,7 +370,7 @@ } ], "codeblock": { - "title": "/app/shopify.server.ts", + "title": "Configure ShopifyApp", "tabs": [ { "title": "/app/shopify.server.ts", @@ -255,7 +386,7 @@ "title": "Response headers", "sectionContent": "When loading inside the Shopify Admin, your app will need to add the required `Content-Security-Policy` header directives, as per [our documentation](/docs/apps/store/security/iframe-protection). To do that, this package provides the `shopify.addDocumentResponseHeaders` method.\n\nYou should return these headers from any endpoint that renders HTML in your app. Most likely you'll want to add this to every HTML response by updating the `entry.server.tsx` file:", "codeblock": { - "title": "/app/entry.server.tsx", + "title": "Add required headers", "tabs": [ { "title": "/app/entry.server.tsx", @@ -271,7 +402,7 @@ "title": "Error boundaries", "sectionContent": "The OAuth process can't happen inside the admin iframe, and this package is capable of detecting that scenario and properly redirecting using the [Remix `ErrorBoundary`](https://remix.run/docs/en/main/guides/errors) export to set the correct headers for App Bridge.\n\nUse the abstractions provided by this package in your authenticated routes, to automatically set up the error and headers boundaries to redirect outside the iframe when needed.\n\n> Tip: You can also add this to a [Remix layout](https://remix.run/docs/en/main/file-conventions/route-files-v2) if you want to authenticate more than one route, but make sure to call the Shopify boundary methods whenever you need to add your own exports.", "codeblock": { - "title": "/app/routes/**/*.tsx", + "title": "Configure header boundaries", "tabs": [ { "title": "/app/routes/**/*.tsx", @@ -287,7 +418,7 @@ "title": "OAuth route", "sectionContent": "To install an app or refresh tokens, you'll need to set up an [OAuth](docs/apps/auth/oauth) route. To do that, set up a [splat route](https://remix.run/docs/en/main/guides/routing#splats) that calls `authenticate.admin`.\n\nWhen that function is called, the package will start the OAuth process, and handle the callback from Shopify after it completes.\n\nThe default route is `/app/routes/auth/$.tsx`, but you can configure this route using the `authPathPrefix` option.", "codeblock": { - "title": "/app/routes/auth/$.tsx", + "title": "Add OAuth route", "tabs": [ { "title": "/app/routes/auth/$.tsx", @@ -322,7 +453,7 @@ } ], "codeblock": { - "title": "/app/root.tsx", + "title": "Add AppProvider", "tabs": [ { "title": "/app/root.tsx", @@ -345,7 +476,7 @@ "title": "Configuring webhooks subscriptions", "sectionContent": "Configure `shopifyApp` and setup webhook subscription with the following steps:\n1. The webhooks you want to subscribe to. In this example we subscribe to the `APP_UNINSTALLED` topic.\n1. The code to register the `APP_UNINSTALLED` topic after a merchant installs you app. Here `shopifyApp` provides an `afterAuth` hook.\n1. Review the required scopes for the webhook topics, and update your [app scopes](/docs/apps/tools/cli/configuration#access_scopes) as necessary.\n\n> Note: You can't register mandatory topics using this package, you must [configure those in the Partner Dashboard](/docs/apps/webhooks/configuration/mandatory-webhooks) instead.", "codeblock": { - "title": "/app/shopify.server.ts", + "title": "Configure webhooks subscriptions", "tabs": [ { "title": "/app/shopify.server.ts", @@ -361,7 +492,7 @@ "title": "Set up your endpoints", "sectionContent": "Create a route in your app to handle incoming webhook requests for each `callbackUrl` you set in your configuration.Legitimate webhook requests are always `POST` requests signed by Shopify, so you must authenticate them before taking any action. To do this you must set up an `action` that uses the `authenticate.webhook` function to authenticate the request.\n\nPlease keep in mind that webhook endpoints should respond as quickly as possible. If you need to run a long-running job, then consider using background tasks.\n\n> Caution: Webhook endpoints **must** respond with an `HTTP 200` code, or Shopify will retry.", "codeblock": { - "title": "/app/routes/webhooks.tsx", + "title": "Receive webhook requests", "tabs": [ { "title": "/app/routes/webhooks.tsx", diff --git a/packages/shopify-app-remix/docs/staticPages/admin.doc.ts b/packages/shopify-app-remix/docs/staticPages/admin.doc.ts index f6c6ffe3c5..29db5497ac 100644 --- a/packages/shopify-app-remix/docs/staticPages/admin.doc.ts +++ b/packages/shopify-app-remix/docs/staticPages/admin.doc.ts @@ -14,11 +14,11 @@ const data: LandingTemplateSchema = { anchorLink: 'auth', title: 'Authenticating requests', sectionContent: - "To authenticate admin requests you can call `authenticate.admin(request)` in a loader or an action." + + 'To authenticate admin requests you can call `authenticate.admin(request)` in a loader or an action.' + "\n\nIf there's a session for this user, then this loader will return null. If there's no session for the user, then the loader will throw the appropriate redirect Response." + - "\n\n> Tip: If you are authenticating more than one route, then we recommend using [Remix layout routes](https://remix.run/docs/en/1.18.1/file-conventions/routes-files#layout-routes) to automatically authenticate them.", + '\n\n> Tip: If you are authenticating more than one route, then we recommend using [Remix layout routes](https://remix.run/docs/en/1.18.1/file-conventions/routes-files#layout-routes) to automatically authenticate them.', codeblock: { - title: '/app/routes/**/*.tsx', + title: 'Authenticating requests', tabs: [ { title: '/app/routes/**/*.tsx', @@ -34,10 +34,10 @@ const data: LandingTemplateSchema = { title: 'Headers', sectionContent: "The OAuth process can't happen inside the admin iframe, and this package is capable of detecting that scenario and properly redirecting using the [Remix `ErrorBoundary`](https://remix.run/docs/en/main/guides/errors) export to set the correct headers for App Bridge." + - "\n\nUse the abstractions provided by this package in your authenticated routes, to automatically set up the error and headers boundaries to redirect outside the iframe when needed." + - "\n\n> Tip: You can also add this to a [Remix layout](https://remix.run/docs/en/main/file-conventions/route-files-v2) if you want to authenticate more than one route, but make sure to call the Shopify boundary methods whenever you need to add your own exports.", + '\n\nUse the abstractions provided by this package in your authenticated routes, to automatically set up the error and headers boundaries to redirect outside the iframe when needed.' + + '\n\n> Tip: You can also add this to a [Remix layout](https://remix.run/docs/en/main/file-conventions/route-files-v2) if you want to authenticate more than one route, but make sure to call the Shopify boundary methods whenever you need to add your own exports.', codeblock: { - title: '/app/routes/**/*.tsx', + title: 'Configure header boundaries', tabs: [ { title: '/app/routes/**/*.tsx', @@ -55,7 +55,7 @@ const data: LandingTemplateSchema = { 'If your Remix server is authenticating an admin extension, then a request from the extension to Remix will be cross-origin.' + '\n\nHere `authenticate.admin` provides a `cors` function to add the required cross-origin headers.', codeblock: { - title: '/app/routes/**/*.tsx', + title: 'Add cross-origin headers', tabs: [ { title: '/app/routes/**/*.tsx', @@ -72,7 +72,7 @@ const data: LandingTemplateSchema = { sectionContent: 'Once a request is authenticated, `authenticate.admin` will return an `admin` object that contains a GraphQL client that can interact with the [GraphQL Admin API](/docs/api/admin-graphql).', codeblock: { - title: '/app/routes/**/*.tsx', + title: 'Make GraphQL requests', tabs: [ { title: '/app/routes/**/*.tsx', @@ -81,6 +81,13 @@ const data: LandingTemplateSchema = { }, ], }, + sectionCard: [ + { + url: '/docs/api/shopify-app-remix/guide-graphql-types', + name: 'Typing GraphQL operations', + type: 'tutorial', + }, + ], }, { type: 'Generic', diff --git a/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/.graphqlrc.ts b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/.graphqlrc.ts new file mode 100644 index 0000000000..727e206620 --- /dev/null +++ b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/.graphqlrc.ts @@ -0,0 +1,16 @@ +import {shopifyApiProject, ApiType} from '@shopify/api-codegen-preset'; + +export default { + // For syntax highlighting / auto-complete when writing operations + schema: 'https://shopify.dev/admin-graphql-direct-proxy/2023-10', + documents: ['./app/**/*.{js,ts,jsx,tsx}'], + projects: { + // To produce variable / return types for Admin API operations + default: shopifyApiProject({ + apiType: ApiType.Admin, + apiVersion: '2023-10', + documents: ['./app/**/*.{js,ts,jsx,tsx}'], + outputDir: './app/types', + }), + }, +}; diff --git a/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.npm.example.sh b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.npm.example.sh new file mode 100644 index 0000000000..31d8c45a3d --- /dev/null +++ b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.npm.example.sh @@ -0,0 +1,2 @@ +npm add --save-dev @shopify/api-codegen-preset +npm add @shopify/admin-api-client @shopify/storefront-api-client diff --git a/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.pnpm.example.sh b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.pnpm.example.sh new file mode 100644 index 0000000000..c1033dd508 --- /dev/null +++ b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.pnpm.example.sh @@ -0,0 +1,2 @@ +pnpm add --save-dev @shopify/api-codegen-preset +pnpm add @shopify/admin-api-client @shopify/storefront-api-client diff --git a/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.yarn.example.sh b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.yarn.example.sh new file mode 100644 index 0000000000..1e4b491dbf --- /dev/null +++ b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/install.yarn.example.sh @@ -0,0 +1,2 @@ +yarn add --dev @shopify/api-codegen-preset +yarn add @shopify/admin-api-client @shopify/storefront-api-client diff --git a/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/package.json b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/package.json new file mode 100644 index 0000000000..1c1a6e81b7 --- /dev/null +++ b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/package.json @@ -0,0 +1,5 @@ +{ + "scripts": { + "graphql-codegen": "graphql-codegen" + } +} diff --git a/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.npm.example.sh b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.npm.example.sh new file mode 100644 index 0000000000..3750706a7a --- /dev/null +++ b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.npm.example.sh @@ -0,0 +1 @@ +npm run graphql-codegen diff --git a/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.pnpm.example.sh b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.pnpm.example.sh new file mode 100644 index 0000000000..6de9d524b6 --- /dev/null +++ b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.pnpm.example.sh @@ -0,0 +1 @@ +pnpm run graphql-codegen diff --git a/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.yarn.example.sh b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.yarn.example.sh new file mode 100644 index 0000000000..5aba6e39e2 --- /dev/null +++ b/packages/shopify-app-remix/docs/staticPages/examples/guides/graphql-types/run.yarn.example.sh @@ -0,0 +1 @@ +yarn graphql-codegen diff --git a/packages/shopify-app-remix/docs/staticPages/future-flags.doc.ts b/packages/shopify-app-remix/docs/staticPages/future-flags.doc.ts index 1abee0192a..26b1e56155 100644 --- a/packages/shopify-app-remix/docs/staticPages/future-flags.doc.ts +++ b/packages/shopify-app-remix/docs/staticPages/future-flags.doc.ts @@ -16,7 +16,7 @@ const data: LandingTemplateSchema = { 'To opt in to a feature, simply enable the appropriate flag in the `future` option of the `shopifyApp` function.' + '\n\nOnce a flag is set, the returned `shopify` object will start using the new APIs, including using any new types. That allows apps to rely on TypeScript to use a feature regardless of a flag being enabled or not.', codeblock: { - title: '/app/shopify.server.ts', + title: 'Enable future flags', tabs: [ { title: '/app/shopify.server.ts', @@ -36,7 +36,7 @@ const data: LandingTemplateSchema = { '\n\nWhen the feature is ready for release, the future flag will be removed and it will be available by default.' + '\n\nIn this example, `shopify` has a new function called `newFeature`. If the future flag is disabled, TypeScript will be unaware of the new function, and the app will fail to compile if it tries to use it.', codeblock: { - title: '/app/routes/*.tsx', + title: 'Use unstable APIs', tabs: [ { title: '/app/routes/*.tsx', diff --git a/packages/shopify-app-remix/docs/staticPages/graphql-types.doc.ts b/packages/shopify-app-remix/docs/staticPages/graphql-types.doc.ts new file mode 100644 index 0000000000..e7212b7b0b --- /dev/null +++ b/packages/shopify-app-remix/docs/staticPages/graphql-types.doc.ts @@ -0,0 +1,148 @@ +import {LandingTemplateSchema} from '@shopify/generate-docs'; + +const data: LandingTemplateSchema = { + id: 'guide-graphql-types', + title: 'Typing GraphQL operations', + description: + 'The GraphQL clients provided in this package can use [Codegen](https://the-guild.dev/graphql/codegen) to automatically parse and create types for your queries and mutations.' + + '\n\nBy installing a few packages in your app, you can use the `graphql-codegen` script, which will look for strings with the `#graphql` tag and extract types from them.' + + '\n\nIf your IDE supports it, you will also get syntax highlighting and auto-complete features when writing your queries.', + sections: [ + { + type: 'Markdown', + anchorLink: 'example', + title: 'See it in action', + sectionContent: ` +In this example, we use the \`graphql-codegen\` script to parse a query in the \`/app/routes/new.tsx\` file. + +Note how VSCode shows the types for both the return type of \`response.json()\`, and the \`variables\` option in the \`graphql\` function. + + + `, + }, + { + type: 'Generic', + anchorLink: 'install', + title: 'Installing packages', + sectionContent: + 'To use the `graphql-codegen` script, you will need to install a few packages in your app.' + + '\n\nThey will include the scripts to run, and the types that will be overridden by the results of parsing your operations.', + codeblock: { + title: 'Installing packages', + tabs: [ + { + title: 'npm', + language: 'sh', + code: './examples/guides/graphql-types/install.npm.example.sh', + }, + { + title: 'yarn', + language: 'sh', + code: './examples/guides/graphql-types/install.yarn.example.sh', + }, + { + title: 'pnpm', + language: 'sh', + code: './examples/guides/graphql-types/install.pnpm.example.sh', + }, + ], + }, + }, + { + type: 'Generic', + anchorLink: 'configure', + title: 'Setting up .graphqlrc.ts', + sectionContent: + "Before you can parse operations, you'll need to create a `.graphqlrc.ts` file in your project, and configure it to use the `@shopify/api-codegen-preset`." + + '\n\n> Caution: Parsing will not work on `.graphql` documents, because the preset can only apply types from JavaScript and TypeScript const strings.', + codeblock: { + title: 'Codegen configuration example', + tabs: [ + { + title: '/.graphqlrc.ts', + language: 'ts', + code: './examples/guides/graphql-types/.graphqlrc.ts', + }, + ], + }, + sectionCard: [ + { + url: 'https://github.com/Shopify/shopify-api-js/tree/main/packages/api-codegen-preset#configuration', + name: 'Configuration options', + subtitle: 'Learn more about the available configurations.', + type: 'github', + }, + ], + }, + { + type: 'Generic', + anchorLink: 'set-up-script', + title: 'Setting up the script', + sectionContent: + 'To generate types, you\'ll need to add an entry for `graphql-codegen` in the `"scripts"` section of your `package.json` file.', + codeblock: { + title: 'Setting up the script', + tabs: [ + { + title: '/package.json', + language: 'json', + code: './examples/guides/graphql-types/package.json', + }, + ], + }, + }, + { + type: 'Generic', + anchorLink: 'run', + title: 'Generating types', + sectionContent: + 'When you run `graphql-codegen`, it will look in all your configured documents for strings marked with a `#graphql` tag.' + + '\n\nIDEs that support the `.graphqlrc.ts` file will provide syntax highlighting for your operations, as well as typing.' + + '\n\n> Tip: You can pass in a `--watch` flag to the script, which will update your types every time you save a file.', + codeblock: { + title: 'Running graphql-codegen', + tabs: [ + { + title: 'npm', + language: 'sh', + code: './examples/guides/graphql-types/run.npm.example.sh', + }, + { + title: 'yarn', + language: 'sh', + code: './examples/guides/graphql-types/run.yarn.example.sh', + }, + { + title: 'pnpm', + language: 'sh', + code: './examples/guides/graphql-types/run.pnpm.example.sh', + }, + ], + }, + }, + { + type: 'Resource', + title: 'Resources', + anchorLink: 'resources', + resources: [ + { + name: 'Admin API', + url: '/docs/api/shopify-app-remix/apis/admin-api', + type: 'shopify', + subtitle: 'Make requests to the Admin API', + }, + { + name: 'Storefront API', + url: '/docs/api/shopify-app-remix/apis/storefront-api', + type: 'shopify', + subtitle: 'Make requests to the Storefront API', + }, + ], + }, + ], +}; + +export default data; diff --git a/packages/shopify-app-remix/docs/staticPages/index.doc.ts b/packages/shopify-app-remix/docs/staticPages/index.doc.ts index 465263f809..4a0dd634bd 100644 --- a/packages/shopify-app-remix/docs/staticPages/index.doc.ts +++ b/packages/shopify-app-remix/docs/staticPages/index.doc.ts @@ -86,7 +86,7 @@ const data: LandingTemplateSchema = { }, ], codeblock: { - title: '/app/shopify.server.ts', + title: 'Configure ShopifyApp', tabs: [ { title: '/app/shopify.server.ts', @@ -104,7 +104,7 @@ const data: LandingTemplateSchema = { 'When loading inside the Shopify Admin, your app will need to add the required `Content-Security-Policy` header directives, as per [our documentation](/docs/apps/store/security/iframe-protection). To do that, this package provides the `shopify.addDocumentResponseHeaders` method.' + "\n\nYou should return these headers from any endpoint that renders HTML in your app. Most likely you'll want to add this to every HTML response by updating the `entry.server.tsx` file:", codeblock: { - title: '/app/entry.server.tsx', + title: 'Add required headers', tabs: [ { title: '/app/entry.server.tsx', @@ -123,7 +123,7 @@ const data: LandingTemplateSchema = { "\n\nUse the abstractions provided by this package in your authenticated routes, to automatically set up the error and headers boundaries to redirect outside the iframe when needed." + "\n\n> Tip: You can also add this to a [Remix layout](https://remix.run/docs/en/main/file-conventions/route-files-v2) if you want to authenticate more than one route, but make sure to call the Shopify boundary methods whenever you need to add your own exports.", codeblock: { - title: '/app/routes/**/*.tsx', + title: 'Configure header boundaries', tabs: [ { title: '/app/routes/**/*.tsx', @@ -142,7 +142,7 @@ const data: LandingTemplateSchema = { '\n\nWhen that function is called, the package will start the OAuth process, and handle the callback from Shopify after it completes.' + '\n\nThe default route is `/app/routes/auth/$.tsx`, but you can configure this route using the `authPathPrefix` option.', codeblock: { - title: '/app/routes/auth/$.tsx', + title: 'Add OAuth route', tabs: [ { title: '/app/routes/auth/$.tsx', @@ -180,7 +180,7 @@ const data: LandingTemplateSchema = { }, ], codeblock: { - title: '/app/root.tsx', + title: 'Add AppProvider', tabs: [ { title: '/app/root.tsx', diff --git a/packages/shopify-app-remix/docs/staticPages/webhooks.doc.ts b/packages/shopify-app-remix/docs/staticPages/webhooks.doc.ts index fc46b032bd..4a6470912f 100644 --- a/packages/shopify-app-remix/docs/staticPages/webhooks.doc.ts +++ b/packages/shopify-app-remix/docs/staticPages/webhooks.doc.ts @@ -17,7 +17,7 @@ const data: LandingTemplateSchema = { '\n1. Review the required scopes for the webhook topics, and update your [app scopes](/docs/apps/tools/cli/configuration#access_scopes) as necessary.' + "\n\n> Note: You can't register mandatory topics using this package, you must [configure those in the Partner Dashboard](/docs/apps/webhooks/configuration/mandatory-webhooks) instead.", codeblock: { - title: '/app/shopify.server.ts', + title: 'Configure webhooks subscriptions', tabs: [ { title: '/app/shopify.server.ts', @@ -37,7 +37,7 @@ const data: LandingTemplateSchema = { '\n\nPlease keep in mind that webhook endpoints should respond as quickly as possible. If you need to run a long-running job, then consider using background tasks.' + '\n\n> Caution: Webhook endpoints **must** respond with an `HTTP 200` code, or Shopify will retry.', codeblock: { - title: '/app/routes/webhooks.tsx', + title: 'Receive webhook requests', tabs: [ { title: '/app/routes/webhooks.tsx', diff --git a/packages/shopify-app-remix/package.json b/packages/shopify-app-remix/package.json index 8302e0dd53..2f567255df 100644 --- a/packages/shopify-app-remix/package.json +++ b/packages/shopify-app-remix/package.json @@ -1,6 +1,6 @@ { "name": "@shopify/shopify-app-remix", - "version": "2.2.0", + "version": "2.3.0", "description": "Shopify Remix - to simplify the building of Shopify Apps with Remix", "repository": { "type": "git", @@ -54,25 +54,27 @@ "@shopify/generate-docs": "^0.11.1", "@shopify/polaris": "^11.8.0", "@shopify/react-testing": "^5.1.3", - "@shopify/shopify-app-session-storage-memory": "^2.0.2", + "@shopify/shopify-app-session-storage-memory": "^2.0.3", "@types/jest": "^29.5.1", - "@types/jsonwebtoken": "^9.0.2", + "@types/jsonwebtoken": "^9.0.5", "@types/react": "^18.2.18", - "@types/semver": "^7.3.13", + "@types/semver": "^7.5.6", "jest": "^29.5.0", "jest-fetch-mock": "^3.0.3", - "jsonwebtoken": "^9.0.0", + "jsonwebtoken": "^9.0.2", "react": "^18.2.0", "react-dom": "^18.2.0", "ts-jest": "^29.1.0" }, "dependencies": { "@remix-run/server-runtime": "^2.0.0", - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2", - "isbot": "^3.6.5", - "semver": "^7.5.0", - "tslib": "^2.5.0" + "@shopify/admin-api-client": "^0.2.1", + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3", + "@shopify/storefront-api-client": "^0.2.1", + "isbot": "^3.7.1", + "semver": "^7.5.4", + "tslib": "^2.6.2" }, "peerDependencies": { "@remix-run/react": "*", diff --git a/packages/shopify-app-remix/src/server/__test-helpers/expect-admin-api-client.ts b/packages/shopify-app-remix/src/server/__test-helpers/expect-admin-api-client.ts index 2c83ad614c..fcdefe8023 100644 --- a/packages/shopify-app-remix/src/server/__test-helpers/expect-admin-api-client.ts +++ b/packages/shopify-app-remix/src/server/__test-helpers/expect-admin-api-client.ts @@ -96,7 +96,9 @@ export function expectAdminApiClient( headers: {'X-Shopify-Access-Token': actualSession.accessToken!}, }, ), - response: new Response(JSON.stringify({shop: {name: 'Test shop'}})), + response: new Response( + JSON.stringify({data: {shop: {name: 'Test shop'}}}), + ), }); // WHEN @@ -104,7 +106,7 @@ export function expectAdminApiClient( // THEN expect(response.status).toEqual(200); - expect(await response.json()).toEqual({shop: {name: 'Test shop'}}); + expect(await response.json()).toEqual({data: {shop: {name: 'Test shop'}}}); }); it('returns a session object as part of the context', async () => { diff --git a/packages/shopify-app-remix/src/server/__test-helpers/expect-storefront-api-client.ts b/packages/shopify-app-remix/src/server/__test-helpers/expect-storefront-api-client.ts index bf6a4dd3e4..aa2c014cc9 100644 --- a/packages/shopify-app-remix/src/server/__test-helpers/expect-storefront-api-client.ts +++ b/packages/shopify-app-remix/src/server/__test-helpers/expect-storefront-api-client.ts @@ -16,7 +16,7 @@ export function expectStorefrontApiClient( it('Storefront client can perform GraphQL Requests', async () => { // GIVEN const {storefront, actualSession} = await factory(); - const apiResponse = {blogs: {nodes: [{id: 1}]}}; + const apiResponse = {data: {blogs: {nodes: [{id: 1}]}}}; await mockExternalRequest({ request: new Request( `https://${TEST_SHOP}/api/${LATEST_API_VERSION}/graphql.json`, diff --git a/packages/shopify-app-remix/src/server/__test-helpers/request-mock.ts b/packages/shopify-app-remix/src/server/__test-helpers/request-mock.ts index fa8804deee..ea8df63ae2 100644 --- a/packages/shopify-app-remix/src/server/__test-helpers/request-mock.ts +++ b/packages/shopify-app-remix/src/server/__test-helpers/request-mock.ts @@ -45,7 +45,10 @@ async function mockParams(response: Response): Promise { status: response.status, statusText: response.statusText, url: response.url, - headers: Object.fromEntries(response.headers.entries()), + headers: { + ...Object.fromEntries(response.headers.entries()), + 'content-type': 'application/json', + }, }, }; } diff --git a/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/admin-client.test.ts b/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/admin-client.test.ts index 50e81ef343..4b6205f258 100644 --- a/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/admin-client.test.ts +++ b/packages/shopify-app-remix/src/server/authenticate/admin/__tests__/admin-client.test.ts @@ -166,21 +166,21 @@ async function setUpNonEmbeddedFlow() { }; } -async function mockRestRequest(status = 401) { +async function mockRestRequest(status) { const requestMock = new Request( `https://${TEST_SHOP}/admin/api/${LATEST_API_VERSION}/customers.json`, ); await mockExternalRequest({ request: requestMock, - response: new Response(undefined, {status}), + response: new Response('{}', {status}), }); return requestMock; } function mockGraphqlRequest(apiVersion = LATEST_API_VERSION) { - return async function (status = 401) { + return async function (status) { const requestMock = new Request( `https://${TEST_SHOP}/admin/api/${apiVersion}/graphql.json`, {method: 'POST'}, diff --git a/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/admin-client.test.ts b/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/admin-client.test.ts index ee8a2ddc05..c1ba4673e1 100644 --- a/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/admin-client.test.ts +++ b/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/admin-client.test.ts @@ -72,26 +72,7 @@ describe('admin.authenticate context', () => { it('redirects to auth when request receives a 401 response and not embedded', async () => { // GIVEN const {admin, session} = await setUpNonEmbeddedFlow(); - const requestMock = await mockRequest(); - - // WHEN - const response = await getThrownResponse( - async () => action(admin, session), - requestMock, - ); - - // THEN - expect(response.status).toEqual(302); - - const {hostname, pathname} = new URL(response.headers.get('Location')!); - expect(hostname).toEqual(TEST_SHOP); - expect(pathname).toEqual('/admin/oauth/authorize'); - }); - - it('redirects to auth when request receives a 401 response and not embedded', async () => { - // GIVEN - const {admin, session} = await setUpNonEmbeddedFlow(); - const requestMock = await mockRequest(); + const requestMock = await mockRequest(401); // WHEN const response = await getThrownResponse( @@ -218,7 +199,7 @@ async function mockRestRequest(status = 401) { await mockExternalRequest({ request: requestMock, - response: new Response(undefined, {status}), + response: new Response('{}', {status}), }); return requestMock; diff --git a/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/ensure-installed-on-shop.test.ts b/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/ensure-installed-on-shop.test.ts index 492e256044..7f33a0182d 100644 --- a/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/ensure-installed-on-shop.test.ts +++ b/packages/shopify-app-remix/src/server/authenticate/admin/strategies/__tests__/auth-code-flow/ensure-installed-on-shop.test.ts @@ -91,10 +91,10 @@ describe('authorize.admin doc request path', () => { await mockExternalRequest({ request: new Request(GRAPHQL_URL, {method: 'POST'}), - response: new Response( - JSON.stringify({errors: [{message: 'Something went wrong!'}]}), - {status: 500, statusText: 'Internal Server Error'}, - ), + response: new Response('', { + status: 500, + statusText: 'Internal Server Error', + }), }); // WHEN @@ -107,7 +107,7 @@ describe('authorize.admin doc request path', () => { expect(response.status).toBe(500); expect(config.logger?.log).toHaveBeenCalledWith( LogSeverity.Error, - expect.stringContaining('Something went wrong!'), + expect.stringContaining('Internal Server Error'), ); }); @@ -123,7 +123,7 @@ describe('authorize.admin doc request path', () => { await mockExternalRequest({ request: new Request(GRAPHQL_URL, {method: 'POST'}), response: new Response( - JSON.stringify({errors: ['Something went wrong!']}), + JSON.stringify({errors: [{message: 'Something went wrong!'}]}), ), }); diff --git a/packages/shopify-app-remix/src/server/authenticate/admin/strategies/auth-code-flow.ts b/packages/shopify-app-remix/src/server/authenticate/admin/strategies/auth-code-flow.ts index f0514cf406..69a6dba4cc 100644 --- a/packages/shopify-app-remix/src/server/authenticate/admin/strategies/auth-code-flow.ts +++ b/packages/shopify-app-remix/src/server/authenticate/admin/strategies/auth-code-flow.ts @@ -243,15 +243,13 @@ export class AuthCodeFlowStrategy< session, }); - await client.query({ - data: `#graphql - query shopifyAppShopName { - shop { - name - } + await client.request(`#graphql + query shopifyAppShopName { + shop { + name } - `, - }); + } + `); } private async oauthCallbackError( diff --git a/packages/shopify-app-remix/src/server/authenticate/webhooks/__tests__/register.test.ts b/packages/shopify-app-remix/src/server/authenticate/webhooks/__tests__/register.test.ts index ed941e1a3c..c8cec6fdc4 100644 --- a/packages/shopify-app-remix/src/server/authenticate/webhooks/__tests__/register.test.ts +++ b/packages/shopify-app-remix/src/server/authenticate/webhooks/__tests__/register.test.ts @@ -97,9 +97,7 @@ describe('Webhook registration', () => { body: 'webhookSubscriptionCreate', }), response: new Response( - JSON.stringify({ - body: mockResponses.HTTP_WEBHOOK_CREATE_ERROR_RESPONSE, - }), + JSON.stringify(mockResponses.HTTP_WEBHOOK_CREATE_ERROR_RESPONSE), ), }, ); diff --git a/packages/shopify-app-remix/src/server/authenticate/webhooks/types.ts b/packages/shopify-app-remix/src/server/authenticate/webhooks/types.ts index 3d8d35679c..1c738ab612 100644 --- a/packages/shopify-app-remix/src/server/authenticate/webhooks/types.ts +++ b/packages/shopify-app-remix/src/server/authenticate/webhooks/types.ts @@ -18,7 +18,8 @@ interface Context { * @example * Webhook API version. * Get the API version used for webhook request. - * ``` + * ```ts + * // /app/routes/webhooks.tsx * import { ActionFunction } from "@remix-run/node"; * import { authenticate } from "../shopify.server"; * @@ -35,7 +36,8 @@ interface Context { * @example * Webhook shop. * Get the shop that triggered a webhook. - * ``` + * ```ts + * // /app/routes/webhooks.tsx * import { ActionFunction } from "@remix-run/node"; * import { authenticate } from "../shopify.server"; * @@ -52,7 +54,8 @@ interface Context { * @example * Webhook topic. * Get the event topic for the webhook. - * ``` + * ```ts + * // /app/routes/webhooks.tsx * import { ActionFunction } from "@remix-run/node"; * import { authenticate } from "../shopify.server"; * @@ -76,7 +79,8 @@ interface Context { * @example * Webhook ID. * Get the webhook ID. - * ``` + * ```ts + * // /app/routes/webhooks.tsx * import { ActionFunction } from "@remix-run/node"; * import { authenticate } from "../shopify.server"; * @@ -93,7 +97,8 @@ interface Context { * @example * Webhook payload. * Get the request's POST payload. - * ``` + * ```ts + * // /app/routes/webhooks.tsx * import { ActionFunction } from "@remix-run/node"; * import { authenticate } from "../shopify.server"; * @@ -149,6 +154,7 @@ export interface WebhookContextWithSession< * [V3] Webhook admin context. * With the `v3_webhookAdminContext` future flag enabled, use the `admin` object in the context to interact with the Admin API. * ```ts + * // /app/routes/webhooks.tsx * import { ActionFunctionArgs } from "@remix-run/node"; * import { authenticate } from "../shopify.server"; * @@ -176,6 +182,7 @@ export interface WebhookContextWithSession< * Webhook admin context. * Use the `admin` object in the context to interact with the Admin API. This format will be removed in V3 of the package. * ```ts + * // /app/routes/webhooks.tsx * import { json, ActionFunctionArgs } from "@remix-run/node"; * import { authenticate } from "../shopify.server"; * diff --git a/packages/shopify-app-remix/src/server/clients/admin/graphql.ts b/packages/shopify-app-remix/src/server/clients/admin/graphql.ts index 13ea7ee35c..3f4c688b42 100644 --- a/packages/shopify-app-remix/src/server/clients/admin/graphql.ts +++ b/packages/shopify-app-remix/src/server/clients/admin/graphql.ts @@ -1,14 +1,9 @@ -import {flatHeaders} from '@shopify/shopify-api/runtime'; +import {AdminOperations} from '@shopify/admin-api-client'; -import {GraphQLClient, GraphQLQueryOptions} from '../types'; +import {GraphQLClient} from '../types'; import {AdminClientOptions} from './types'; -export type GraphqlQueryFunction = ( - query: string, - options?: GraphQLQueryOptions, -) => Promise; - // eslint-disable-next-line no-warning-comments // TODO: This is actually just a call through to the Shopify API client, but with a different API. We should eventually // move this over to the library layer. While doing that, we should also allow the apiVersion to be passed into the REST @@ -17,7 +12,7 @@ export function graphqlClientFactory({ params, handleClientError, session, -}: AdminClientOptions): GraphQLClient { +}: AdminClientOptions): GraphQLClient { return async function query(operation, options) { const client = new params.api.clients.Graphql({ session, @@ -26,15 +21,13 @@ export function graphqlClientFactory({ try { // We convert the incoming response to a Response object to bring this client closer to the Remix client. - const apiResponse = await client.query({ - data: {query: operation, variables: options?.variables}, - tries: options?.tries, - extraHeaders: options?.headers, + const apiResponse = await client.request(operation, { + variables: options?.variables, + retries: options?.tries ? options.tries - 1 : 0, + headers: options?.headers, }); - return new Response(JSON.stringify(apiResponse.body), { - headers: flatHeaders(apiResponse.headers), - }); + return new Response(JSON.stringify(apiResponse)); } catch (error) { if (handleClientError) { throw await handleClientError({error, params, session}); diff --git a/packages/shopify-app-remix/src/server/clients/admin/types.ts b/packages/shopify-app-remix/src/server/clients/admin/types.ts index db8571c72c..5d49d1f001 100644 --- a/packages/shopify-app-remix/src/server/clients/admin/types.ts +++ b/packages/shopify-app-remix/src/server/clients/admin/types.ts @@ -1,4 +1,5 @@ import {Session, ShopifyRestResources} from '@shopify/shopify-api'; +import {AdminOperations} from '@shopify/admin-api-client'; import {BasicParams} from '../../types'; import {GraphQLClient} from '../types'; @@ -161,5 +162,5 @@ export interface AdminApiContext< * } * ``` */ - graphql: GraphQLClient; + graphql: GraphQLClient; } diff --git a/packages/shopify-app-remix/src/server/clients/storefront/factory.ts b/packages/shopify-app-remix/src/server/clients/storefront/factory.ts index b19f1782e0..1127ff75be 100644 --- a/packages/shopify-app-remix/src/server/clients/storefront/factory.ts +++ b/packages/shopify-app-remix/src/server/clients/storefront/factory.ts @@ -1,4 +1,3 @@ -import {flatHeaders} from '@shopify/shopify-api/runtime'; import {Session} from '@shopify/shopify-api'; import {BasicParams} from '../../types'; @@ -21,15 +20,13 @@ export function storefrontClientFactory({ apiVersion: options.apiVersion, }); - const apiResponse = await client.query({ - data: {query, variables: options?.variables}, - tries: options.tries, - extraHeaders: options.headers, + const apiResponse = await client.request(query, { + variables: options?.variables, + retries: options?.tries ? options.tries - 1 : 0, + headers: options?.headers, }); - return new Response(JSON.stringify(apiResponse.body), { - headers: flatHeaders(apiResponse.headers), - }); + return new Response(JSON.stringify(apiResponse)); }, }; } diff --git a/packages/shopify-app-remix/src/server/clients/storefront/types.ts b/packages/shopify-app-remix/src/server/clients/storefront/types.ts index 42e2fde77c..8e22eb9b7d 100644 --- a/packages/shopify-app-remix/src/server/clients/storefront/types.ts +++ b/packages/shopify-app-remix/src/server/clients/storefront/types.ts @@ -1,3 +1,5 @@ +import {StorefrontOperations} from '@shopify/storefront-api-client'; + import {GraphQLClient} from '../types'; export interface StorefrontContext { @@ -25,5 +27,5 @@ export interface StorefrontContext { * } * ``` */ - graphql: GraphQLClient; + graphql: GraphQLClient; } diff --git a/packages/shopify-app-remix/src/server/clients/types.ts b/packages/shopify-app-remix/src/server/clients/types.ts index 1bbc348c6d..81cf793639 100644 --- a/packages/shopify-app-remix/src/server/clients/types.ts +++ b/packages/shopify-app-remix/src/server/clients/types.ts @@ -1,17 +1,27 @@ +import type { + AllOperations, + ReturnData, + FetchResponseBody, + ApiClientRequestOptions, + ResponseWithType, +} from '@shopify/admin-api-client'; import {ApiVersion} from '@shopify/shopify-api'; -interface QueryVariables { - [key: string]: any; -} - -export interface GraphQLQueryOptions { - variables?: QueryVariables; +export interface GraphQLQueryOptions< + Operation extends keyof Operations, + Operations extends AllOperations, +> { + variables?: ApiClientRequestOptions['variables']; apiVersion?: ApiVersion; headers?: {[key: string]: any}; tries?: number; } -export type GraphQLClient = ( - query: string, - options?: GraphQLQueryOptions, -) => Promise; +export type GraphQLClient = < + Operation extends keyof Operations, +>( + query: Operation, + options?: GraphQLQueryOptions, +) => Promise< + ResponseWithType>> +>; diff --git a/packages/shopify-app-remix/src/server/shopify-app.ts b/packages/shopify-app-remix/src/server/shopify-app.ts index a842bfca7b..b3f5ac187a 100644 --- a/packages/shopify-app-remix/src/server/shopify-app.ts +++ b/packages/shopify-app-remix/src/server/shopify-app.ts @@ -42,6 +42,7 @@ import {IdempotentPromiseHandler} from './authenticate/helpers/idempotent-promis * @example * The minimum viable configuration * ```ts + * // /shopify.server.ts * import { shopifyApp } from "@shopify/shopify-app-remix/server"; * * const shopify = shopifyApp({ diff --git a/packages/shopify-app-remix/src/server/types.ts b/packages/shopify-app-remix/src/server/types.ts index e156c70fab..323f7b0af4 100644 --- a/packages/shopify-app-remix/src/server/types.ts +++ b/packages/shopify-app-remix/src/server/types.ts @@ -285,6 +285,7 @@ export interface ShopifyAppBase { * Registering webhooks after install * Trigger the registration to create the webhook subscriptions after a merchant installs your app using the `afterAuth` hook. Learn more about [subscribing to webhooks.](/docs/api/shopify-app-remix/v1/guide-webhooks) * ```ts + * // /app/shopify.server.ts * import { DeliveryMethod, shopifyApp } from "@shopify/shopify-app-remix/server"; * * const shopify = shopifyApp({ diff --git a/packages/shopify-app-remix/src/server/version.ts b/packages/shopify-app-remix/src/server/version.ts index a1b75ab176..4fa7937c6a 100644 --- a/packages/shopify-app-remix/src/server/version.ts +++ b/packages/shopify-app-remix/src/server/version.ts @@ -1 +1 @@ -export const SHOPIFY_REMIX_LIBRARY_VERSION = '2.2.0'; +export const SHOPIFY_REMIX_LIBRARY_VERSION = '2.3.0'; diff --git a/packages/shopify-app-session-storage-dynamodb/CHANGELOG.md b/packages/shopify-app-session-storage-dynamodb/CHANGELOG.md index adb9953de5..5951a55d51 100644 --- a/packages/shopify-app-session-storage-dynamodb/CHANGELOG.md +++ b/packages/shopify-app-session-storage-dynamodb/CHANGELOG.md @@ -1,5 +1,13 @@ # @shopify/shopify-app-session-storage-dynamodb +## 2.0.3 + +### Patch Changes + +- d3e4b5e: Updated the dependency on `@shopify/shopify-api` +- Updated dependencies [d3e4b5e] + - @shopify/shopify-app-session-storage@2.0.3 + ## 2.0.2 ### Patch Changes diff --git a/packages/shopify-app-session-storage-dynamodb/README.md b/packages/shopify-app-session-storage-dynamodb/README.md index e543786392..be7b6c2735 100644 --- a/packages/shopify-app-session-storage-dynamodb/README.md +++ b/packages/shopify-app-session-storage-dynamodb/README.md @@ -23,4 +23,53 @@ const shopify = shopifyApp({ }); ``` +## Table Schema + +```js +{ + TableName: sessionTableName, + AttributeDefinitions: [ + {AttributeName: 'id', AttributeType: 'S'}, + {AttributeName: 'shop', AttributeType: 'S'}, + ], + KeySchema: [{AttributeName: 'id', KeyType: 'HASH'}], + GlobalSecondaryIndexes: [ + { + IndexName: shopIndexName, + KeySchema: [{AttributeName: 'shop', KeyType: 'HASH'}], + Projection: {ProjectionType: 'KEYS_ONLY'}, + ProvisionedThroughput: { + ReadCapacityUnits: 1, + WriteCapacityUnits: 1, + }, + }, + ], + ProvisionedThroughput: {ReadCapacityUnits: 1, WriteCapacityUnits: 1}, +} +``` + +### AWS Policy for DynamoDB + +This policy must be attached to a user -- `dynamodb:Query` does not work with inline policies. + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "Statement1", + "Effect": "Allow", + "Action": [ + "dynamodb:GetItem", + "dynamodb:DeleteItem", + "dynamodb:PutItem", + "dynamodb:Query", + "dynamodb:DescribeTable" + ], + "Resource": ["arn:aws:dynamodb:::table/"] + } + ] +} +``` + If you prefer to use your own implementation of a session storage mechanism that uses the `SessionStorage` interface, see the [implementing session storage guide](https://github.com/Shopify/shopify-app-js/blob/main/packages/shopify-app-session-storage/implementing-session-storage.md). diff --git a/packages/shopify-app-session-storage-dynamodb/package.json b/packages/shopify-app-session-storage-dynamodb/package.json index 0d04602d8f..87fb300289 100644 --- a/packages/shopify-app-session-storage-dynamodb/package.json +++ b/packages/shopify-app-session-storage-dynamodb/package.json @@ -1,6 +1,6 @@ { "name": "@shopify/shopify-app-session-storage-dynamodb", - "version": "2.0.2", + "version": "2.0.3", "description": "Shopify App Session Storage for DynamoDB", "repository": { "type": "git", @@ -32,21 +32,21 @@ "AWS" ], "dependencies": { - "@aws-sdk/client-dynamodb": "^3.332.0", + "@aws-sdk/client-dynamodb": "^3.470.0", "@aws-sdk/util-dynamodb": "^3.332.0", - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2" + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3" }, "devDependencies": { "@shopify/eslint-plugin": "^42.1.0", "@shopify/prettier-config": "^1.1.2", - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2", - "@shopify/shopify-app-session-storage-test-utils": "^1.0.2", - "eslint": "^8.40.0", + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3", + "@shopify/shopify-app-session-storage-test-utils": "^1.0.3", + "eslint": "^8.55.0", "eslint-plugin-prettier": "^4.2.1", "prettier": "^2.8.8", "typescript": "^4.9.5" diff --git a/packages/shopify-app-session-storage-kv/CHANGELOG.md b/packages/shopify-app-session-storage-kv/CHANGELOG.md index b5756c6fe3..d3ad1cf427 100644 --- a/packages/shopify-app-session-storage-kv/CHANGELOG.md +++ b/packages/shopify-app-session-storage-kv/CHANGELOG.md @@ -1,5 +1,13 @@ # @shopify/shopify-app-session-storage-kv +## 2.0.3 + +### Patch Changes + +- d3e4b5e: Updated the dependency on `@shopify/shopify-api` +- Updated dependencies [d3e4b5e] + - @shopify/shopify-app-session-storage@2.0.3 + ## 2.0.2 ### Patch Changes diff --git a/packages/shopify-app-session-storage-kv/package.json b/packages/shopify-app-session-storage-kv/package.json index 23f81cb4b6..129f86fe7a 100644 --- a/packages/shopify-app-session-storage-kv/package.json +++ b/packages/shopify-app-session-storage-kv/package.json @@ -1,6 +1,6 @@ { "name": "@shopify/shopify-app-session-storage-kv", - "version": "2.0.2", + "version": "2.0.3", "description": "Shopify App Session Storage for KV", "repository": { "type": "git", @@ -32,19 +32,19 @@ "CloudFlare" ], "dependencies": { - "semver": "^7.5.1", - "tslib": "^2.4.0" + "semver": "^7.5.4", + "tslib": "^2.6.2" }, "peerDependencies": { - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2" + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3" }, "devDependencies": { "@cloudflare/workers-types": "^4.20230511.0", "@shopify/eslint-plugin": "^42.1.0", "@shopify/prettier-config": "^1.1.2", - "@shopify/shopify-app-session-storage-test-utils": "^1.0.2", - "eslint": "^8.40.0", + "@shopify/shopify-app-session-storage-test-utils": "^1.0.3", + "eslint": "^8.55.0", "eslint-plugin-prettier": "^4.2.1", "miniflare": "^2.14.0", "prettier": "^2.8.8", diff --git a/packages/shopify-app-session-storage-memory/CHANGELOG.md b/packages/shopify-app-session-storage-memory/CHANGELOG.md index e2ada60a5e..a55299bd0b 100644 --- a/packages/shopify-app-session-storage-memory/CHANGELOG.md +++ b/packages/shopify-app-session-storage-memory/CHANGELOG.md @@ -1,5 +1,13 @@ # @shopify/shopify-app-session-storage-memory +## 2.0.3 + +### Patch Changes + +- d3e4b5e: Updated the dependency on `@shopify/shopify-api` +- Updated dependencies [d3e4b5e] + - @shopify/shopify-app-session-storage@2.0.3 + ## 2.0.2 ### Patch Changes diff --git a/packages/shopify-app-session-storage-memory/package.json b/packages/shopify-app-session-storage-memory/package.json index e875919eaa..d568d00b03 100644 --- a/packages/shopify-app-session-storage-memory/package.json +++ b/packages/shopify-app-session-storage-memory/package.json @@ -1,6 +1,6 @@ { "name": "@shopify/shopify-app-session-storage-memory", - "version": "2.0.2", + "version": "2.0.3", "description": "Shopify App Session Storage for Memory", "repository": { "type": "git", @@ -30,18 +30,18 @@ "session storage" ], "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2" + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3" }, "devDependencies": { "@shopify/eslint-plugin": "^42.1.0", "@shopify/prettier-config": "^1.1.2", - "@shopify/shopify-app-session-storage-test-utils": "^1.0.2", + "@shopify/shopify-app-session-storage-test-utils": "^1.0.3", "@types/jest": "^29.5.1", - "eslint": "^8.40.0", + "eslint": "^8.55.0", "eslint-plugin-prettier": "^4.2.1", "prettier": "^2.8.8", "typescript": "4.9.5" diff --git a/packages/shopify-app-session-storage-mongodb/CHANGELOG.md b/packages/shopify-app-session-storage-mongodb/CHANGELOG.md index 030481bf65..9d6a8e7dc2 100644 --- a/packages/shopify-app-session-storage-mongodb/CHANGELOG.md +++ b/packages/shopify-app-session-storage-mongodb/CHANGELOG.md @@ -1,5 +1,13 @@ # @shopify/shopify-app-session-storage-mongodb +## 2.0.3 + +### Patch Changes + +- d3e4b5e: Updated the dependency on `@shopify/shopify-api` +- Updated dependencies [d3e4b5e] + - @shopify/shopify-app-session-storage@2.0.3 + ## 2.0.2 ### Patch Changes diff --git a/packages/shopify-app-session-storage-mongodb/package.json b/packages/shopify-app-session-storage-mongodb/package.json index dc1e32fab4..8f9b7ff615 100644 --- a/packages/shopify-app-session-storage-mongodb/package.json +++ b/packages/shopify-app-session-storage-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@shopify/shopify-app-session-storage-mongodb", - "version": "2.0.2", + "version": "2.0.3", "description": "Shopify App Session Storage for MongoDB", "repository": { "type": "git", @@ -31,19 +31,19 @@ "session storage" ], "dependencies": { - "mongodb": "^5.5.0", - "tslib": "^2.4.0" + "mongodb": "^6.3.0", + "tslib": "^2.6.2" }, "peerDependencies": { - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2" + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3" }, "devDependencies": { "@shopify/eslint-plugin": "^42.1.0", "@shopify/prettier-config": "^1.1.2", - "@shopify/shopify-app-session-storage-test-utils": "^1.0.2", + "@shopify/shopify-app-session-storage-test-utils": "^1.0.3", "@types/jest": "^29.5.1", - "eslint": "^8.40.0", + "eslint": "^8.55.0", "eslint-plugin-prettier": "^4.2.1", "prettier": "^2.8.8", "typescript": "4.9.5" diff --git a/packages/shopify-app-session-storage-mysql/CHANGELOG.md b/packages/shopify-app-session-storage-mysql/CHANGELOG.md index b075777a2c..a5fcd2d46e 100644 --- a/packages/shopify-app-session-storage-mysql/CHANGELOG.md +++ b/packages/shopify-app-session-storage-mysql/CHANGELOG.md @@ -1,5 +1,13 @@ # @shopify/shopify-app-session-storage-mysql +## 2.0.3 + +### Patch Changes + +- d3e4b5e: Updated the dependency on `@shopify/shopify-api` +- Updated dependencies [d3e4b5e] + - @shopify/shopify-app-session-storage@2.0.3 + ## 2.0.2 ### Patch Changes diff --git a/packages/shopify-app-session-storage-mysql/package.json b/packages/shopify-app-session-storage-mysql/package.json index d8c0c84283..6510f8a373 100644 --- a/packages/shopify-app-session-storage-mysql/package.json +++ b/packages/shopify-app-session-storage-mysql/package.json @@ -1,6 +1,6 @@ { "name": "@shopify/shopify-app-session-storage-mysql", - "version": "2.0.2", + "version": "2.0.3", "description": "Shopify App Session Storage for MySQL", "repository": { "type": "git", @@ -33,18 +33,18 @@ ], "dependencies": { "mysql2": "^3.3.1", - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2" + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3" }, "devDependencies": { "@shopify/eslint-plugin": "^42.1.0", "@shopify/prettier-config": "^1.1.2", - "@shopify/shopify-app-session-storage-test-utils": "^1.0.2", + "@shopify/shopify-app-session-storage-test-utils": "^1.0.3", "@types/jest": "^29.5.1", - "eslint": "^8.40.0", + "eslint": "^8.55.0", "eslint-plugin-prettier": "^4.2.1", "prettier": "^2.8.8", "typescript": "4.9.5" diff --git a/packages/shopify-app-session-storage-postgresql/CHANGELOG.md b/packages/shopify-app-session-storage-postgresql/CHANGELOG.md index 32a3756f2d..f10aca953c 100644 --- a/packages/shopify-app-session-storage-postgresql/CHANGELOG.md +++ b/packages/shopify-app-session-storage-postgresql/CHANGELOG.md @@ -1,5 +1,13 @@ # @shopify/shopify-app-session-storage-postgresql +## 2.0.3 + +### Patch Changes + +- d3e4b5e: Updated the dependency on `@shopify/shopify-api` +- Updated dependencies [d3e4b5e] + - @shopify/shopify-app-session-storage@2.0.3 + ## 2.0.2 ### Patch Changes diff --git a/packages/shopify-app-session-storage-postgresql/package.json b/packages/shopify-app-session-storage-postgresql/package.json index 4378045f1d..6aa8836e64 100644 --- a/packages/shopify-app-session-storage-postgresql/package.json +++ b/packages/shopify-app-session-storage-postgresql/package.json @@ -1,6 +1,6 @@ { "name": "@shopify/shopify-app-session-storage-postgresql", - "version": "2.0.2", + "version": "2.0.3", "description": "Shopify App Session Storage for PostgreSQL", "repository": { "type": "git", @@ -33,20 +33,20 @@ ], "dependencies": { "pg": "^8.11.0", - "pg-connection-string": "^2.5.0", - "tslib": "^2.4.0" + "pg-connection-string": "^2.6.2", + "tslib": "^2.6.2" }, "peerDependencies": { - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2" + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3" }, "devDependencies": { "@shopify/eslint-plugin": "^42.1.0", "@shopify/prettier-config": "^1.1.2", - "@shopify/shopify-app-session-storage-test-utils": "^1.0.2", + "@shopify/shopify-app-session-storage-test-utils": "^1.0.3", "@types/jest": "^29.5.1", "@types/pg": "^8.6.6", - "eslint": "^8.40.0", + "eslint": "^8.55.0", "eslint-plugin-prettier": "^4.2.1", "prettier": "^2.8.8", "typescript": "4.9.5" diff --git a/packages/shopify-app-session-storage-prisma/CHANGELOG.md b/packages/shopify-app-session-storage-prisma/CHANGELOG.md index 0d6a672706..0aee607c72 100644 --- a/packages/shopify-app-session-storage-prisma/CHANGELOG.md +++ b/packages/shopify-app-session-storage-prisma/CHANGELOG.md @@ -1,5 +1,13 @@ # @shopify/shopify-app-session-storage-prisma +## 2.0.3 + +### Patch Changes + +- d3e4b5e: Updated the dependency on `@shopify/shopify-api` +- Updated dependencies [d3e4b5e] + - @shopify/shopify-app-session-storage@2.0.3 + ## 2.0.2 ### Patch Changes diff --git a/packages/shopify-app-session-storage-prisma/package.json b/packages/shopify-app-session-storage-prisma/package.json index 29ca86b1f4..9e23a0365b 100644 --- a/packages/shopify-app-session-storage-prisma/package.json +++ b/packages/shopify-app-session-storage-prisma/package.json @@ -1,6 +1,6 @@ { "name": "@shopify/shopify-app-session-storage-prisma", - "version": "2.0.2", + "version": "2.0.3", "description": "Shopify App Session Storage for Prisma", "repository": { "type": "git", @@ -31,23 +31,23 @@ "Prisma" ], "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { "@prisma/client": "^4.13.0", - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2", + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3", "prisma": "^4.13.0" }, "devDependencies": { "@prisma/client": "^4.13.0", - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2", + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3", "prisma": "^4.13.0", "@shopify/eslint-plugin": "^42.1.0", "@shopify/prettier-config": "^1.1.2", - "@shopify/shopify-app-session-storage-test-utils": "^1.0.2", - "eslint": "^8.38.0", + "@shopify/shopify-app-session-storage-test-utils": "^1.0.3", + "eslint": "^8.55.0", "eslint-plugin-prettier": "^4.2.1", "prettier": "^2.8.7", "typescript": "4.9.5" diff --git a/packages/shopify-app-session-storage-redis/CHANGELOG.md b/packages/shopify-app-session-storage-redis/CHANGELOG.md index f896bc6841..c0c94cc825 100644 --- a/packages/shopify-app-session-storage-redis/CHANGELOG.md +++ b/packages/shopify-app-session-storage-redis/CHANGELOG.md @@ -1,5 +1,13 @@ # @shopify/shopify-app-session-storage-redis +## 2.0.3 + +### Patch Changes + +- d3e4b5e: Updated the dependency on `@shopify/shopify-api` +- Updated dependencies [d3e4b5e] + - @shopify/shopify-app-session-storage@2.0.3 + ## 2.0.2 ### Patch Changes diff --git a/packages/shopify-app-session-storage-redis/package.json b/packages/shopify-app-session-storage-redis/package.json index 95e095ad35..8c322e5e60 100644 --- a/packages/shopify-app-session-storage-redis/package.json +++ b/packages/shopify-app-session-storage-redis/package.json @@ -1,6 +1,6 @@ { "name": "@shopify/shopify-app-session-storage-redis", - "version": "2.0.2", + "version": "2.0.3", "description": "Shopify App Session Storage for Redis", "repository": { "type": "git", @@ -32,19 +32,19 @@ "Redis" ], "dependencies": { - "redis": "^4.6.6", - "tslib": "^2.4.0" + "redis": "^4.6.11", + "tslib": "^2.6.2" }, "peerDependencies": { - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2" + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3" }, "devDependencies": { "@shopify/eslint-plugin": "^42.1.0", "@shopify/prettier-config": "^1.1.2", - "@shopify/shopify-app-session-storage-test-utils": "^1.0.2", + "@shopify/shopify-app-session-storage-test-utils": "^1.0.3", "@types/jest": "^29.5.1", - "eslint": "^8.40.0", + "eslint": "^8.55.0", "eslint-plugin-prettier": "^4.2.1", "prettier": "^2.8.8", "typescript": "4.9.5" diff --git a/packages/shopify-app-session-storage-redis/src/redis-connection.ts b/packages/shopify-app-session-storage-redis/src/redis-connection.ts index 7eb4f40f83..38459e63a8 100644 --- a/packages/shopify-app-session-storage-redis/src/redis-connection.ts +++ b/packages/shopify-app-session-storage-redis/src/redis-connection.ts @@ -17,7 +17,7 @@ export class RedisConnection implements DBConnection { } async connect(): Promise { - return this.client.connect(); + await this.client.connect(); } async disconnect(): Promise { diff --git a/packages/shopify-app-session-storage-sqlite/CHANGELOG.md b/packages/shopify-app-session-storage-sqlite/CHANGELOG.md index e9848b064d..2db10ccf26 100644 --- a/packages/shopify-app-session-storage-sqlite/CHANGELOG.md +++ b/packages/shopify-app-session-storage-sqlite/CHANGELOG.md @@ -1,5 +1,13 @@ # @shopify/shopify-app-session-storage-sqlite +## 2.0.3 + +### Patch Changes + +- d3e4b5e: Updated the dependency on `@shopify/shopify-api` +- Updated dependencies [d3e4b5e] + - @shopify/shopify-app-session-storage@2.0.3 + ## 2.0.2 ### Patch Changes diff --git a/packages/shopify-app-session-storage-sqlite/package.json b/packages/shopify-app-session-storage-sqlite/package.json index caef4644c0..9b29613350 100644 --- a/packages/shopify-app-session-storage-sqlite/package.json +++ b/packages/shopify-app-session-storage-sqlite/package.json @@ -1,6 +1,6 @@ { "name": "@shopify/shopify-app-session-storage-sqlite", - "version": "2.0.2", + "version": "2.0.3", "description": "Shopify App Session Storage for SQLite", "repository": { "type": "git", @@ -33,19 +33,19 @@ ], "dependencies": { "sqlite3": "^5.1.6", - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2" + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3" }, "devDependencies": { "@shopify/eslint-plugin": "^42.1.0", "@shopify/prettier-config": "^1.1.2", - "@shopify/shopify-app-session-storage-test-utils": "^1.0.2", + "@shopify/shopify-app-session-storage-test-utils": "^1.0.3", "@types/jest": "^29.5.1", "@types/sqlite3": "^3.1.8", - "eslint": "^8.40.0", + "eslint": "^8.55.0", "eslint-plugin-prettier": "^4.2.1", "prettier": "^2.8.8", "typescript": "4.9.5" diff --git a/packages/shopify-app-session-storage-test-utils/CHANGELOG.md b/packages/shopify-app-session-storage-test-utils/CHANGELOG.md index e7e55a808e..89fae1974d 100644 --- a/packages/shopify-app-session-storage-test-utils/CHANGELOG.md +++ b/packages/shopify-app-session-storage-test-utils/CHANGELOG.md @@ -1,5 +1,12 @@ # @shopify/shopify-app-session-storage-test-utils +## 1.0.3 + +### Patch Changes + +- Updated dependencies [d3e4b5e] + - @shopify/shopify-app-session-storage@2.0.3 + ## 1.0.2 ### Patch Changes diff --git a/packages/shopify-app-session-storage-test-utils/package.json b/packages/shopify-app-session-storage-test-utils/package.json index 41af05bef3..e90cd2d1f0 100644 --- a/packages/shopify-app-session-storage-test-utils/package.json +++ b/packages/shopify-app-session-storage-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@shopify/shopify-app-session-storage-test-utils", - "version": "1.0.2", + "version": "1.0.3", "description": "Utilities for testing Shopify App Session Storage", "repository": { "type": "git", @@ -35,17 +35,17 @@ ], "dependencies": { "jest-fetch-mock": "^3.0.3", - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@shopify/shopify-api": "^8.1.1", - "@shopify/shopify-app-session-storage": "^2.0.2" + "@shopify/shopify-api": "^9.0.1", + "@shopify/shopify-app-session-storage": "^2.0.3" }, "devDependencies": { "@shopify/eslint-plugin": "^42.1.0", "@shopify/prettier-config": "^1.1.2", "@types/jest": "^29.5.1", - "eslint": "^8.40.0", + "eslint": "^8.55.0", "eslint-plugin-prettier": "^4.2.1", "jest": "^29.5.0", "jest-fetch-mock": "^3.0.3", diff --git a/packages/shopify-app-session-storage/CHANGELOG.md b/packages/shopify-app-session-storage/CHANGELOG.md index ccabdb6dcd..53db77adf6 100644 --- a/packages/shopify-app-session-storage/CHANGELOG.md +++ b/packages/shopify-app-session-storage/CHANGELOG.md @@ -1,5 +1,11 @@ # @shopify/shopify-app-session-storage +## 2.0.3 + +### Patch Changes + +- d3e4b5e: Updated the dependency on `@shopify/shopify-api` + ## 2.0.2 ### Patch Changes diff --git a/packages/shopify-app-session-storage/package.json b/packages/shopify-app-session-storage/package.json index a8a3b521c2..f3e01f870a 100644 --- a/packages/shopify-app-session-storage/package.json +++ b/packages/shopify-app-session-storage/package.json @@ -1,6 +1,6 @@ { "name": "@shopify/shopify-app-session-storage", - "version": "2.0.2", + "version": "2.0.3", "description": "Shopify App Session Storage - abstract class", "repository": { "type": "git", @@ -31,16 +31,16 @@ "session storage" ], "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.6.2" }, "peerDependencies": { - "@shopify/shopify-api": "^8.1.1" + "@shopify/shopify-api": "^9.0.1" }, "devDependencies": { "@shopify/eslint-plugin": "^42.1.0", "@shopify/prettier-config": "^1.1.2", "@types/jest": "^29.5.1", - "eslint": "^8.40.0", + "eslint": "^8.55.0", "eslint-plugin-prettier": "^4.2.1", "prettier": "^2.8.8", "typescript": "^4.9.5" diff --git a/yarn.lock b/yarn.lock index b27c4785df..b9a5416c4c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" @@ -10,6 +15,15 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@aws-crypto/crc32@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa" + integrity sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + "@aws-crypto/ie11-detection@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz#640ae66b4ec3395cee6a8e94ebcd9f80c24cd688" @@ -56,600 +70,370 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" -"@aws-sdk/abort-controller@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.329.0.tgz#f311f79cad1040b84b853c5e9386ea2e069e571a" - integrity sha512-hzrjPNQcJoSPe0oS20V5i98oiEZSM3mKNiR6P3xHTHTPI/F23lyjGZ+/CSkCmJbSWfGZ5sHZZcU6AWuS7xBdTw== - dependencies: - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/client-dynamodb@^3.332.0": - version "3.332.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-dynamodb/-/client-dynamodb-3.332.0.tgz#ae141f8d6c98e460864c4d04e0766fff7bcb7b67" - integrity sha512-v+4a0drW4Q9IZDKbolteyQKbTt42cwbD9CVy2EISB0rThKJKwe/QSUWoeO/nUxmZ7Q4bB/r15Vga5r274FrQ4Q== +"@aws-sdk/client-dynamodb@^3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-dynamodb/-/client-dynamodb-3.470.0.tgz#9fc7e8daedd478273dd82135d879952277189190" + integrity sha512-a6wQd0Il9bLFnOY6/ANZl4Lv0UxiIJjrJFkyAuLOMs4heVfCSgDs16AD+Ujm4Qm9byl9/jF6gLxDrRRuN2FrMg== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.332.0" - "@aws-sdk/config-resolver" "3.329.0" - "@aws-sdk/credential-provider-node" "3.332.0" - "@aws-sdk/fetch-http-handler" "3.329.0" - "@aws-sdk/hash-node" "3.329.0" - "@aws-sdk/invalid-dependency" "3.329.0" - "@aws-sdk/middleware-content-length" "3.329.0" - "@aws-sdk/middleware-endpoint" "3.329.0" - "@aws-sdk/middleware-endpoint-discovery" "3.329.0" - "@aws-sdk/middleware-host-header" "3.329.0" - "@aws-sdk/middleware-logger" "3.329.0" - "@aws-sdk/middleware-recursion-detection" "3.329.0" - "@aws-sdk/middleware-retry" "3.329.0" - "@aws-sdk/middleware-serde" "3.329.0" - "@aws-sdk/middleware-signing" "3.329.0" - "@aws-sdk/middleware-stack" "3.329.0" - "@aws-sdk/middleware-user-agent" "3.332.0" - "@aws-sdk/node-config-provider" "3.329.0" - "@aws-sdk/node-http-handler" "3.329.0" - "@aws-sdk/protocol-http" "3.329.0" - "@aws-sdk/smithy-client" "3.329.0" - "@aws-sdk/types" "3.329.0" - "@aws-sdk/url-parser" "3.329.0" - "@aws-sdk/util-base64" "3.310.0" - "@aws-sdk/util-body-length-browser" "3.310.0" - "@aws-sdk/util-body-length-node" "3.310.0" - "@aws-sdk/util-defaults-mode-browser" "3.329.0" - "@aws-sdk/util-defaults-mode-node" "3.329.0" - "@aws-sdk/util-endpoints" "3.332.0" - "@aws-sdk/util-retry" "3.329.0" - "@aws-sdk/util-user-agent-browser" "3.329.0" - "@aws-sdk/util-user-agent-node" "3.329.0" - "@aws-sdk/util-utf8" "3.310.0" - "@aws-sdk/util-waiter" "3.329.0" + "@aws-sdk/client-sts" "3.470.0" + "@aws-sdk/core" "3.468.0" + "@aws-sdk/credential-provider-node" "3.470.0" + "@aws-sdk/middleware-endpoint-discovery" "3.470.0" + "@aws-sdk/middleware-host-header" "3.468.0" + "@aws-sdk/middleware-logger" "3.468.0" + "@aws-sdk/middleware-recursion-detection" "3.468.0" + "@aws-sdk/middleware-signing" "3.468.0" + "@aws-sdk/middleware-user-agent" "3.470.0" + "@aws-sdk/region-config-resolver" "3.470.0" + "@aws-sdk/types" "3.468.0" + "@aws-sdk/util-endpoints" "3.470.0" + "@aws-sdk/util-user-agent-browser" "3.468.0" + "@aws-sdk/util-user-agent-node" "3.470.0" + "@smithy/config-resolver" "^2.0.21" + "@smithy/fetch-http-handler" "^2.3.1" + "@smithy/hash-node" "^2.0.17" + "@smithy/invalid-dependency" "^2.0.15" + "@smithy/middleware-content-length" "^2.0.17" + "@smithy/middleware-endpoint" "^2.2.3" + "@smithy/middleware-retry" "^2.0.24" + "@smithy/middleware-serde" "^2.0.15" + "@smithy/middleware-stack" "^2.0.9" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/node-http-handler" "^2.2.1" + "@smithy/protocol-http" "^3.0.11" + "@smithy/smithy-client" "^2.1.18" + "@smithy/types" "^2.7.0" + "@smithy/url-parser" "^2.0.15" + "@smithy/util-base64" "^2.0.1" + "@smithy/util-body-length-browser" "^2.0.1" + "@smithy/util-body-length-node" "^2.1.0" + "@smithy/util-defaults-mode-browser" "^2.0.22" + "@smithy/util-defaults-mode-node" "^2.0.29" + "@smithy/util-endpoints" "^1.0.7" + "@smithy/util-retry" "^2.0.8" + "@smithy/util-utf8" "^2.0.2" + "@smithy/util-waiter" "^2.0.15" tslib "^2.5.0" uuid "^8.3.2" -"@aws-sdk/client-sso-oidc@3.332.0": - version "3.332.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.332.0.tgz#8875ce4834d5d0decefadec828e32cbc0465fc30" - integrity sha512-tz8k8Yqm4TScIfit0Tum2zWAq1md+gZKr747CSixd4Zwcp7Vwh75cRoL7Rz1ZHSEn1Yo983MWREevVez3SubLw== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/config-resolver" "3.329.0" - "@aws-sdk/fetch-http-handler" "3.329.0" - "@aws-sdk/hash-node" "3.329.0" - "@aws-sdk/invalid-dependency" "3.329.0" - "@aws-sdk/middleware-content-length" "3.329.0" - "@aws-sdk/middleware-endpoint" "3.329.0" - "@aws-sdk/middleware-host-header" "3.329.0" - "@aws-sdk/middleware-logger" "3.329.0" - "@aws-sdk/middleware-recursion-detection" "3.329.0" - "@aws-sdk/middleware-retry" "3.329.0" - "@aws-sdk/middleware-serde" "3.329.0" - "@aws-sdk/middleware-stack" "3.329.0" - "@aws-sdk/middleware-user-agent" "3.332.0" - "@aws-sdk/node-config-provider" "3.329.0" - "@aws-sdk/node-http-handler" "3.329.0" - "@aws-sdk/protocol-http" "3.329.0" - "@aws-sdk/smithy-client" "3.329.0" - "@aws-sdk/types" "3.329.0" - "@aws-sdk/url-parser" "3.329.0" - "@aws-sdk/util-base64" "3.310.0" - "@aws-sdk/util-body-length-browser" "3.310.0" - "@aws-sdk/util-body-length-node" "3.310.0" - "@aws-sdk/util-defaults-mode-browser" "3.329.0" - "@aws-sdk/util-defaults-mode-node" "3.329.0" - "@aws-sdk/util-endpoints" "3.332.0" - "@aws-sdk/util-retry" "3.329.0" - "@aws-sdk/util-user-agent-browser" "3.329.0" - "@aws-sdk/util-user-agent-node" "3.329.0" - "@aws-sdk/util-utf8" "3.310.0" - tslib "^2.5.0" - -"@aws-sdk/client-sso@3.332.0": - version "3.332.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.332.0.tgz#e22fa9ded125cce75ca2cd63d3f3f9a6b8dfaa77" - integrity sha512-4q1Nko8M6YVANdEiLYvdv1qb00j4xN4ppE/6d4xpGp7DxHYlm0GA762h0/TR2dun+2I+SMnwj4Fv6BxOmzBaEw== +"@aws-sdk/client-sso@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.470.0.tgz#2fab6cc63af15a5dccbd985d784e49a3a3c634b4" + integrity sha512-iMXqdXuypE3OK0rggbvSz7vBGlLDG418dNidHhdaeLluMTG/GfHbh1fLOlavhYxRwrsPrtYvFiVkxXFGzXva4w== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/config-resolver" "3.329.0" - "@aws-sdk/fetch-http-handler" "3.329.0" - "@aws-sdk/hash-node" "3.329.0" - "@aws-sdk/invalid-dependency" "3.329.0" - "@aws-sdk/middleware-content-length" "3.329.0" - "@aws-sdk/middleware-endpoint" "3.329.0" - "@aws-sdk/middleware-host-header" "3.329.0" - "@aws-sdk/middleware-logger" "3.329.0" - "@aws-sdk/middleware-recursion-detection" "3.329.0" - "@aws-sdk/middleware-retry" "3.329.0" - "@aws-sdk/middleware-serde" "3.329.0" - "@aws-sdk/middleware-stack" "3.329.0" - "@aws-sdk/middleware-user-agent" "3.332.0" - "@aws-sdk/node-config-provider" "3.329.0" - "@aws-sdk/node-http-handler" "3.329.0" - "@aws-sdk/protocol-http" "3.329.0" - "@aws-sdk/smithy-client" "3.329.0" - "@aws-sdk/types" "3.329.0" - "@aws-sdk/url-parser" "3.329.0" - "@aws-sdk/util-base64" "3.310.0" - "@aws-sdk/util-body-length-browser" "3.310.0" - "@aws-sdk/util-body-length-node" "3.310.0" - "@aws-sdk/util-defaults-mode-browser" "3.329.0" - "@aws-sdk/util-defaults-mode-node" "3.329.0" - "@aws-sdk/util-endpoints" "3.332.0" - "@aws-sdk/util-retry" "3.329.0" - "@aws-sdk/util-user-agent-browser" "3.329.0" - "@aws-sdk/util-user-agent-node" "3.329.0" - "@aws-sdk/util-utf8" "3.310.0" + "@aws-sdk/core" "3.468.0" + "@aws-sdk/middleware-host-header" "3.468.0" + "@aws-sdk/middleware-logger" "3.468.0" + "@aws-sdk/middleware-recursion-detection" "3.468.0" + "@aws-sdk/middleware-user-agent" "3.470.0" + "@aws-sdk/region-config-resolver" "3.470.0" + "@aws-sdk/types" "3.468.0" + "@aws-sdk/util-endpoints" "3.470.0" + "@aws-sdk/util-user-agent-browser" "3.468.0" + "@aws-sdk/util-user-agent-node" "3.470.0" + "@smithy/config-resolver" "^2.0.21" + "@smithy/fetch-http-handler" "^2.3.1" + "@smithy/hash-node" "^2.0.17" + "@smithy/invalid-dependency" "^2.0.15" + "@smithy/middleware-content-length" "^2.0.17" + "@smithy/middleware-endpoint" "^2.2.3" + "@smithy/middleware-retry" "^2.0.24" + "@smithy/middleware-serde" "^2.0.15" + "@smithy/middleware-stack" "^2.0.9" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/node-http-handler" "^2.2.1" + "@smithy/protocol-http" "^3.0.11" + "@smithy/smithy-client" "^2.1.18" + "@smithy/types" "^2.7.0" + "@smithy/url-parser" "^2.0.15" + "@smithy/util-base64" "^2.0.1" + "@smithy/util-body-length-browser" "^2.0.1" + "@smithy/util-body-length-node" "^2.1.0" + "@smithy/util-defaults-mode-browser" "^2.0.22" + "@smithy/util-defaults-mode-node" "^2.0.29" + "@smithy/util-endpoints" "^1.0.7" + "@smithy/util-retry" "^2.0.8" + "@smithy/util-utf8" "^2.0.2" tslib "^2.5.0" -"@aws-sdk/client-sts@3.332.0": - version "3.332.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.332.0.tgz#15bb163319d3da69f152f80fb4583eabe73e0e30" - integrity sha512-uVobnXIzMcEhwBDyk6iOt36N/TRNI8hwq7MQugjYGj7Inma9g4vnR09hXJ24HxyKCoVUoIgMbEguQ43+/+uvDQ== +"@aws-sdk/client-sts@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.470.0.tgz#f161d087564f9e545fbcd199c7197ec0cfce29b9" + integrity sha512-TP3A4t8FoFEQinm6axxduTUnlMMLpmLi4Sf00JTI2CszxLUFh/JyUhYQ5gSOoXgPFmfwVXUNKCtmR3jdP0ZGPw== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/config-resolver" "3.329.0" - "@aws-sdk/credential-provider-node" "3.332.0" - "@aws-sdk/fetch-http-handler" "3.329.0" - "@aws-sdk/hash-node" "3.329.0" - "@aws-sdk/invalid-dependency" "3.329.0" - "@aws-sdk/middleware-content-length" "3.329.0" - "@aws-sdk/middleware-endpoint" "3.329.0" - "@aws-sdk/middleware-host-header" "3.329.0" - "@aws-sdk/middleware-logger" "3.329.0" - "@aws-sdk/middleware-recursion-detection" "3.329.0" - "@aws-sdk/middleware-retry" "3.329.0" - "@aws-sdk/middleware-sdk-sts" "3.329.0" - "@aws-sdk/middleware-serde" "3.329.0" - "@aws-sdk/middleware-signing" "3.329.0" - "@aws-sdk/middleware-stack" "3.329.0" - "@aws-sdk/middleware-user-agent" "3.332.0" - "@aws-sdk/node-config-provider" "3.329.0" - "@aws-sdk/node-http-handler" "3.329.0" - "@aws-sdk/protocol-http" "3.329.0" - "@aws-sdk/smithy-client" "3.329.0" - "@aws-sdk/types" "3.329.0" - "@aws-sdk/url-parser" "3.329.0" - "@aws-sdk/util-base64" "3.310.0" - "@aws-sdk/util-body-length-browser" "3.310.0" - "@aws-sdk/util-body-length-node" "3.310.0" - "@aws-sdk/util-defaults-mode-browser" "3.329.0" - "@aws-sdk/util-defaults-mode-node" "3.329.0" - "@aws-sdk/util-endpoints" "3.332.0" - "@aws-sdk/util-retry" "3.329.0" - "@aws-sdk/util-user-agent-browser" "3.329.0" - "@aws-sdk/util-user-agent-node" "3.329.0" - "@aws-sdk/util-utf8" "3.310.0" - fast-xml-parser "4.1.2" - tslib "^2.5.0" - -"@aws-sdk/config-resolver@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.329.0.tgz#f4283c9c8e61752cecad8cfaebb4db52ac1bbf60" - integrity sha512-Oj6eiT3q+Jn685yvUrfRi8PhB3fb81hasJqdrsEivA8IP8qAgnVUTJzXsh8O2UX8UM2MF6A1gTgToSgneJuw2Q== - dependencies: - "@aws-sdk/types" "3.329.0" - "@aws-sdk/util-config-provider" "3.310.0" - "@aws-sdk/util-middleware" "3.329.0" + "@aws-sdk/core" "3.468.0" + "@aws-sdk/credential-provider-node" "3.470.0" + "@aws-sdk/middleware-host-header" "3.468.0" + "@aws-sdk/middleware-logger" "3.468.0" + "@aws-sdk/middleware-recursion-detection" "3.468.0" + "@aws-sdk/middleware-sdk-sts" "3.468.0" + "@aws-sdk/middleware-signing" "3.468.0" + "@aws-sdk/middleware-user-agent" "3.470.0" + "@aws-sdk/region-config-resolver" "3.470.0" + "@aws-sdk/types" "3.468.0" + "@aws-sdk/util-endpoints" "3.470.0" + "@aws-sdk/util-user-agent-browser" "3.468.0" + "@aws-sdk/util-user-agent-node" "3.470.0" + "@smithy/config-resolver" "^2.0.21" + "@smithy/fetch-http-handler" "^2.3.1" + "@smithy/hash-node" "^2.0.17" + "@smithy/invalid-dependency" "^2.0.15" + "@smithy/middleware-content-length" "^2.0.17" + "@smithy/middleware-endpoint" "^2.2.3" + "@smithy/middleware-retry" "^2.0.24" + "@smithy/middleware-serde" "^2.0.15" + "@smithy/middleware-stack" "^2.0.9" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/node-http-handler" "^2.2.1" + "@smithy/protocol-http" "^3.0.11" + "@smithy/smithy-client" "^2.1.18" + "@smithy/types" "^2.7.0" + "@smithy/url-parser" "^2.0.15" + "@smithy/util-base64" "^2.0.1" + "@smithy/util-body-length-browser" "^2.0.1" + "@smithy/util-body-length-node" "^2.1.0" + "@smithy/util-defaults-mode-browser" "^2.0.22" + "@smithy/util-defaults-mode-node" "^2.0.29" + "@smithy/util-endpoints" "^1.0.7" + "@smithy/util-retry" "^2.0.8" + "@smithy/util-utf8" "^2.0.2" + fast-xml-parser "4.2.5" tslib "^2.5.0" -"@aws-sdk/credential-provider-env@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.329.0.tgz#54bb313de01324e302b5927733083a4c93ed9962" - integrity sha512-B4orC9hMt9hG82vAR0TAnQqjk6cFDbO2S14RdzUj2n2NPlGWW4Blkv3NTo86K0lq011VRhtqaLcuTwn5EJD5Sg== +"@aws-sdk/core@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.468.0.tgz#1f356adedd63ef77042a3de10fc4c1fdcce4ad42" + integrity sha512-ezUJR9VvknKoXzNZ4wvzGi1jdkmm+/1dUYQ9Sw4r8bzlJDTsUnWbyvaDlBQh81RuhLtVkaUfTnQKoec0cwlZKQ== dependencies: - "@aws-sdk/property-provider" "3.329.0" - "@aws-sdk/types" "3.329.0" + "@smithy/smithy-client" "^2.1.18" tslib "^2.5.0" -"@aws-sdk/credential-provider-imds@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.329.0.tgz#566b21c37f5e89730ef3b4229f0824b4c455f669" - integrity sha512-ggPlnd7QROPTid0CwT01TYYGvstRRTpzTGsQ/B31wkh30IrRXE81W3S4xrOYuqQD3u0RnflSxnvhs+EayJEYjg== +"@aws-sdk/credential-provider-env@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.468.0.tgz#4196d717d3f5485af863bd1fd84374ea3dcd6210" + integrity sha512-k/1WHd3KZn0EQYjadooj53FC0z24/e4dUZhbSKTULgmxyO62pwh9v3Brvw4WRa/8o2wTffU/jo54tf4vGuP/ZA== dependencies: - "@aws-sdk/node-config-provider" "3.329.0" - "@aws-sdk/property-provider" "3.329.0" - "@aws-sdk/types" "3.329.0" - "@aws-sdk/url-parser" "3.329.0" + "@aws-sdk/types" "3.468.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/types" "^2.7.0" tslib "^2.5.0" -"@aws-sdk/credential-provider-ini@3.332.0": - version "3.332.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.332.0.tgz#03c77480a94d07784c789eeca44ca67c0900ba4a" - integrity sha512-DTW6d6rcqizPVyvcIrwvxecQ7e5GONtVc5Wyf0RTfqf41sDOVZYmn6G+zEFSpBLW0975uZbJS0lyLWtJe2VujQ== - dependencies: - "@aws-sdk/credential-provider-env" "3.329.0" - "@aws-sdk/credential-provider-imds" "3.329.0" - "@aws-sdk/credential-provider-process" "3.329.0" - "@aws-sdk/credential-provider-sso" "3.332.0" - "@aws-sdk/credential-provider-web-identity" "3.329.0" - "@aws-sdk/property-provider" "3.329.0" - "@aws-sdk/shared-ini-file-loader" "3.329.0" - "@aws-sdk/types" "3.329.0" +"@aws-sdk/credential-provider-ini@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.470.0.tgz#d360d08f893d5d28a3e6a493bbef0989669c2f6a" + integrity sha512-eF22iPO6J2jY+LbuTv5dW0hZBmi6ksRDFFd/zT6TLasrzH2Ex+gAfN3c7rFHF+XAubL0JXFUKFA3UAwoZpO9Zg== + dependencies: + "@aws-sdk/credential-provider-env" "3.468.0" + "@aws-sdk/credential-provider-process" "3.468.0" + "@aws-sdk/credential-provider-sso" "3.470.0" + "@aws-sdk/credential-provider-web-identity" "3.468.0" + "@aws-sdk/types" "3.468.0" + "@smithy/credential-provider-imds" "^2.0.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/shared-ini-file-loader" "^2.0.6" + "@smithy/types" "^2.7.0" tslib "^2.5.0" -"@aws-sdk/credential-provider-node@3.332.0": - version "3.332.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.332.0.tgz#bfd4fa8855dd3cf80f1e0d8d160966441e44c4a7" - integrity sha512-KkBayS9k4WyJTvC86ngeRM+RmWxNCS1BHvudkR6PLXfnsNPDzxySDVY0UgxVhbNYDYsO561fXZt9ccpKyVWjgg== - dependencies: - "@aws-sdk/credential-provider-env" "3.329.0" - "@aws-sdk/credential-provider-imds" "3.329.0" - "@aws-sdk/credential-provider-ini" "3.332.0" - "@aws-sdk/credential-provider-process" "3.329.0" - "@aws-sdk/credential-provider-sso" "3.332.0" - "@aws-sdk/credential-provider-web-identity" "3.329.0" - "@aws-sdk/property-provider" "3.329.0" - "@aws-sdk/shared-ini-file-loader" "3.329.0" - "@aws-sdk/types" "3.329.0" +"@aws-sdk/credential-provider-node@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.470.0.tgz#9236a27f451fef06e1cb6c744b6b8b3dc3d633a3" + integrity sha512-paySXwzGxBVU+2cVUkRIXafKhYhtO2fJJ3MotR6euvRONK/dta+bhEc5Z4QnTo/gNLoELK/QUC0EGoF+oPfk8g== + dependencies: + "@aws-sdk/credential-provider-env" "3.468.0" + "@aws-sdk/credential-provider-ini" "3.470.0" + "@aws-sdk/credential-provider-process" "3.468.0" + "@aws-sdk/credential-provider-sso" "3.470.0" + "@aws-sdk/credential-provider-web-identity" "3.468.0" + "@aws-sdk/types" "3.468.0" + "@smithy/credential-provider-imds" "^2.0.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/shared-ini-file-loader" "^2.0.6" + "@smithy/types" "^2.7.0" tslib "^2.5.0" -"@aws-sdk/credential-provider-process@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.329.0.tgz#5c07b2f4c67cb97190c69d4af5890c9db3f8a31d" - integrity sha512-5oO220qoFc2pMdZDQa6XN/mVhp669I3+LqMbbscGtX/UgLJPSOb7YzPld9Wjv12L5rf+sD3G1PF3LZXO0vKLFA== +"@aws-sdk/credential-provider-process@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.468.0.tgz#770ed72db036c5d011445e5abf4a4bcc4424c486" + integrity sha512-OYSn1A/UsyPJ7Z8Q2cNhTf55O36shPmSsvOfND04nSfu1nPaR+VUvvsP7v+brhGpwC/GAKTIdGAo4blH31BS6A== dependencies: - "@aws-sdk/property-provider" "3.329.0" - "@aws-sdk/shared-ini-file-loader" "3.329.0" - "@aws-sdk/types" "3.329.0" + "@aws-sdk/types" "3.468.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/shared-ini-file-loader" "^2.0.6" + "@smithy/types" "^2.7.0" tslib "^2.5.0" -"@aws-sdk/credential-provider-sso@3.332.0": - version "3.332.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.332.0.tgz#ed12b58d30b6ee359462c7e78672734af22fe713" - integrity sha512-SaKXl48af3n6LRitcaEqbeg1YDXwQ0A5QziC1xQyYPraEIj3IZ/GyTjx04Lo2jxNYHuEOE8u4aTw1+IK1GDKbg== - dependencies: - "@aws-sdk/client-sso" "3.332.0" - "@aws-sdk/property-provider" "3.329.0" - "@aws-sdk/shared-ini-file-loader" "3.329.0" - "@aws-sdk/token-providers" "3.332.0" - "@aws-sdk/types" "3.329.0" +"@aws-sdk/credential-provider-sso@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.470.0.tgz#12f14557be50a01bc99166610d83ea5be79b154a" + integrity sha512-biGDSh9S9KDR9Tl/8cCPn9g5KPNkXg/CIJIOk3X+6valktbJ2UVYBzi0ZX4vZiudt5ry/Hsu6Pgo+KN1AmBWdg== + dependencies: + "@aws-sdk/client-sso" "3.470.0" + "@aws-sdk/token-providers" "3.470.0" + "@aws-sdk/types" "3.468.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/shared-ini-file-loader" "^2.0.6" + "@smithy/types" "^2.7.0" tslib "^2.5.0" -"@aws-sdk/credential-provider-web-identity@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.329.0.tgz#5610293c03bc4c323dfcae522c545c20e2d8dd86" - integrity sha512-lcEibZD7AlutCacpQ6DyNUqElZJDq+ylaIo5a8MH9jGh7Pg2WpDg0Sy+B6FbGCkVn4eIjdHxeX54JM245nhESg== +"@aws-sdk/credential-provider-web-identity@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.468.0.tgz#5befcb593d99a84e16af9e9f285f0d59ed42771f" + integrity sha512-rexymPmXjtkwCPfhnUq3EjO1rSkf39R4Jz9CqiM7OsqK2qlT5Y/V3gnMKn0ZMXsYaQOMfM3cT5xly5R+OKDHlw== dependencies: - "@aws-sdk/property-provider" "3.329.0" - "@aws-sdk/types" "3.329.0" + "@aws-sdk/types" "3.468.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/types" "^2.7.0" tslib "^2.5.0" -"@aws-sdk/endpoint-cache@3.310.0": - version "3.310.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/endpoint-cache/-/endpoint-cache-3.310.0.tgz#e6f84bfcd55462966811390ef797145559bab15a" - integrity sha512-y3wipforet41EDTI0vnzxILqwAGll1KfI5qcdX9pXF/WF1f+3frcOtPiWtQEZQpy4czRogKm3BHo70QBYAZxlQ== +"@aws-sdk/endpoint-cache@3.465.0": + version "3.465.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/endpoint-cache/-/endpoint-cache-3.465.0.tgz#c1d3d001a69d874b4d397fa5b29599bd4eea9756" + integrity sha512-0cuotk23hVSrqxHkJ3TTWC9MVMRgwlUvCatyegJEauJnk8kpLSGXE5KVdExlUBwShGNlj7ac29okZ9m17iTi5Q== dependencies: mnemonist "0.38.3" tslib "^2.5.0" -"@aws-sdk/fetch-http-handler@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.329.0.tgz#5aee0c9a32ad8ff4fa96c6869bba68c345818532" - integrity sha512-9jfIeJhYCcTX4ScXOueRTB3S/tVce0bRsKxKDP0PnTxnGYOwKXoM9lAPmiYItzYmQ/+QzjTI8xfkA9Usz2SK/Q== - dependencies: - "@aws-sdk/protocol-http" "3.329.0" - "@aws-sdk/querystring-builder" "3.329.0" - "@aws-sdk/types" "3.329.0" - "@aws-sdk/util-base64" "3.310.0" - tslib "^2.5.0" - -"@aws-sdk/hash-node@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.329.0.tgz#91ef8b1b55e1a438c367f63747673bf146a00499" - integrity sha512-6RmnWXNWpi7yAs0oRDQlkMn2wfXOStr/8kTCgiAiqrk1KopGSBkC2veKiKRSfv02FTd1yV/ISqYNIRqW1VLyxg== - dependencies: - "@aws-sdk/types" "3.329.0" - "@aws-sdk/util-buffer-from" "3.310.0" - "@aws-sdk/util-utf8" "3.310.0" - tslib "^2.5.0" - -"@aws-sdk/invalid-dependency@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.329.0.tgz#83dc33de710f80eba5e084a82aab656c1d240352" - integrity sha512-UXynGusDxN/HxLma5ByJ7u+XnuMd47NbHOjJgYsaAjb1CVZT7hEPXOB+mcZ+Ku7To5SCOKu2QbRn7m4bGespBg== - dependencies: - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/is-array-buffer@3.310.0": - version "3.310.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz#f87a79f1b858c88744f07e8d8d0a791df204017e" - integrity sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ== - dependencies: - tslib "^2.5.0" - -"@aws-sdk/middleware-content-length@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.329.0.tgz#cadd0c3ba7fe3d0b21812523bb7d7f7526c9c700" - integrity sha512-7kCd+CvY/4KbyXB0uyL7jCwPjMi2yERMALFdEH9dsUciwmxIQT6eSc4aF6wImC4UrbafaqmXvvHErABKMVBTKA== - dependencies: - "@aws-sdk/protocol-http" "3.329.0" - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-endpoint-discovery@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.329.0.tgz#495ddf8063d0a95b7fe133064d53623b2b86210b" - integrity sha512-gzzKuAqvnTSo2mLMpgxAwGB7bdoLMwpobqyoDVVOpGcRyZmffYq/MdaBLgjcGIvlyzFHhnTF3KKO83X0ufebaw== - dependencies: - "@aws-sdk/endpoint-cache" "3.310.0" - "@aws-sdk/protocol-http" "3.329.0" - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-endpoint@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.329.0.tgz#50c5f71afa3b6d3062d3b542279009454898314e" - integrity sha512-hdJRoNdCM0BT4W+rrtee+kfFRgGPGXQDgtbIQlf/FuuuYz2sdef7/SYWr0mxuncnVBW5WkYSPP8h6q07whSKbg== - dependencies: - "@aws-sdk/middleware-serde" "3.329.0" - "@aws-sdk/types" "3.329.0" - "@aws-sdk/url-parser" "3.329.0" - "@aws-sdk/util-middleware" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-host-header@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.329.0.tgz#22b1a6d91f3f281ef802f21f2ab0b426526d6066" - integrity sha512-JrHeUdTIpTCfXDo9JpbAbZTS1x4mt63CCytJRq0mpWp+FlP9hjckBcNxWdR/wSKEzP9pDRnTri638BOwWH7O8w== - dependencies: - "@aws-sdk/protocol-http" "3.329.0" - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-logger@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.329.0.tgz#fa8adc07928da24e713e384d4a32c8d0e36f96ee" - integrity sha512-lKeeTXsYC1NiwmxrXsZepcwNXPoQxTNNbeD1qaCELPGK2cJlrGoeAP2YRWzpwO2kNZWrDLaGAPT/EUEhqw+d1w== - dependencies: - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-recursion-detection@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.329.0.tgz#afa676f26f9a050cd3d57a2efa2b0247a6e1d614" - integrity sha512-0/TYOJwrj1Z8s+Y7thibD23hggBq/K/01NwPk32CwWG/G+1vWozs5DefknEl++w0vuV+39pkY4KHI8m/+wOCpg== - dependencies: - "@aws-sdk/protocol-http" "3.329.0" - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-retry@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.329.0.tgz#326fb0b7442d665689d311fba43eb49a510d2939" - integrity sha512-cB3D7GlhHUcHGOlygOYxD9cPhwsTYEAMcohK38An8+RHNp6VQEWezzLFCmHVKUSeCQ+wkjZfPA40jOG0rbjSgQ== - dependencies: - "@aws-sdk/protocol-http" "3.329.0" - "@aws-sdk/service-error-classification" "3.329.0" - "@aws-sdk/types" "3.329.0" - "@aws-sdk/util-middleware" "3.329.0" - "@aws-sdk/util-retry" "3.329.0" - tslib "^2.5.0" - uuid "^8.3.2" - -"@aws-sdk/middleware-sdk-sts@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.329.0.tgz#50056cca7688e708e3db6bd66203878bc373ff7d" - integrity sha512-bqtZuhkH8pANb2Gb4FEM1p27o+BoDBmVhEWm8sWH+APsyOor3jc6eUG2GxkfoO6D5tGNIuyCC/GuvW9XDIe4Kg== - dependencies: - "@aws-sdk/middleware-signing" "3.329.0" - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-serde@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.329.0.tgz#f822d7419953ba5d31104262724034340908dd28" - integrity sha512-tvM9NdPuRPCozPjTGNOeYZeLlyx3BcEyajrkRorCRf1YzG/mXdB6I1stote7i4q1doFtYTz0sYL8bqW3LUPn9A== - dependencies: - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-signing@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.329.0.tgz#25011abb0911c1a23840d8d228676758f5b55926" - integrity sha512-bL1nI+EUcF5B1ipwDXxiKL+Uw02Mbt/TNX54PbzunBGZIyO6DZG/H+M3U296bYbvPlwlZhp26O830g6K7VEWsA== - dependencies: - "@aws-sdk/property-provider" "3.329.0" - "@aws-sdk/protocol-http" "3.329.0" - "@aws-sdk/signature-v4" "3.329.0" - "@aws-sdk/types" "3.329.0" - "@aws-sdk/util-middleware" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/middleware-stack@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.329.0.tgz#745150a190cc025d0bd7a52c0db5580c05dbbb54" - integrity sha512-2huFLhJ45td2nuiIOjpc9JKJbFNn5CYmw9U8YDITTcydpteRN62CzCpeqroDvF89VOLWxh0ZFtuLCGUr7liSWQ== - dependencies: - tslib "^2.5.0" - -"@aws-sdk/middleware-user-agent@3.332.0": - version "3.332.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.332.0.tgz#6f2de9579b09dd7feeab27ef8a18c236694ad903" - integrity sha512-rSL1xP4QmcMOsunN1p5ZDR9GT3vvoSCnYa4iPvMSjP8Jx7l4ff/aVctwfZkMs/up12+68Jqwj4TvtaCvCFXdUA== - dependencies: - "@aws-sdk/protocol-http" "3.329.0" - "@aws-sdk/types" "3.329.0" - "@aws-sdk/util-endpoints" "3.332.0" - tslib "^2.5.0" - -"@aws-sdk/node-config-provider@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.329.0.tgz#32666077565924354a2216a5343ee768d3107eea" - integrity sha512-hg9rGNlkzh8aeR/sQbijrkFx2BIO53j4Z6qDxPNWwSGpl05jri1VHxHx2HZMwgbY6Zy/DSguETN/BL8vdFqyLg== - dependencies: - "@aws-sdk/property-provider" "3.329.0" - "@aws-sdk/shared-ini-file-loader" "3.329.0" - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/node-http-handler@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.329.0.tgz#6dc721e6a9df7baebefd145295ef1a8bf1000a51" - integrity sha512-OrjaHjU2ZTPfoHa5DruRvTIbeHH/cc0wvh4ml+FwDpWaPaBpOhLiluhZ3anqX1l5QjrXNiQnL8FxSM5OV/zVCA== - dependencies: - "@aws-sdk/abort-controller" "3.329.0" - "@aws-sdk/protocol-http" "3.329.0" - "@aws-sdk/querystring-builder" "3.329.0" - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/property-provider@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.329.0.tgz#069dda84e132c9d4eca1a4ae37c62f7a650a0046" - integrity sha512-1cHLTV6yyMGaMSWWDW/p4vTkJ1cc5BOEO+A0eHuAcoSOk+LDe9IKhUG3/ZOvvYKQYcqIj5jjGSni/noXNCl/qw== - dependencies: - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/protocol-http@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.329.0.tgz#a8a7e01477831961f5f040fe607c3552f9ccb013" - integrity sha512-0rLEHY6QTHTUUcVxzGbPUSmCKlXWplxT/fcYRh0bcc5MBK4naKfcQft1O6Ajp8uqs/9YPZ7XCVCn90pDeJfeaw== - dependencies: - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/querystring-builder@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.329.0.tgz#c6e6dd03dcd4378d1fbee576ce2a81dd94ac46a6" - integrity sha512-UWgMKkS5trliaDJG4nPv3onu8Y0aBuwRo7RdIgggguOiU8pU6pq1I113nH2FBNWy+Me1bwf+bcviJh0pCo6bEg== - dependencies: - "@aws-sdk/types" "3.329.0" - "@aws-sdk/util-uri-escape" "3.310.0" - tslib "^2.5.0" - -"@aws-sdk/querystring-parser@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.329.0.tgz#dbbf2fd23ff0dfa2e4663fa414de1d5e60814896" - integrity sha512-9mkK+FB7snJ2G7H3CqtprDwYIRhzm6jEezffCwUWrC+lbqHBbErbhE9IeU/MKxILmf0RbC2riXEY1MHGspjRrQ== - dependencies: - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/service-error-classification@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.329.0.tgz#32db59091ff28f14e526cee738bc14e32a6850f6" - integrity sha512-TSNr0flOcCLe71aPp7MjblKNGsmxpTU4xR5772MDX9Cz9GUTNZCPFtvrcqd+wzEPP/AC7XwNXe8KjoXooZImUQ== - -"@aws-sdk/shared-ini-file-loader@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.329.0.tgz#190eb922860d49b4259b20ca6df4d20769544802" - integrity sha512-e0hyd75fbjMd4aCoRwpP2/HR+0oScwogErVArIkq3F42c/hyNCQP3sph4JImuXIjuo6HNnpKpf20CEPPhNna8A== - dependencies: - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/signature-v4@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.329.0.tgz#8d40683189678f49504169c923e8342247b1da70" - integrity sha512-9EnLoyOD5nFtCRAp+QRllDgQASCfY7jLHVhwht7jzwE80wE65Z9Ym5Z/mwTd4IyTz/xXfCvcE2VwClsBt0Ybdw== - dependencies: - "@aws-sdk/is-array-buffer" "3.310.0" - "@aws-sdk/types" "3.329.0" - "@aws-sdk/util-hex-encoding" "3.310.0" - "@aws-sdk/util-middleware" "3.329.0" - "@aws-sdk/util-uri-escape" "3.310.0" - "@aws-sdk/util-utf8" "3.310.0" - tslib "^2.5.0" - -"@aws-sdk/smithy-client@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.329.0.tgz#54705963939855c87ae6e6c88196d23e819d728e" - integrity sha512-7E0fGpBKxwFqHHAOqNbgNsHSEmCZLuvmU9yvG9DXKVzrS4P48O/PfOro123WpcFZs3STyOVgH8wjUPftHAVKmg== - dependencies: - "@aws-sdk/middleware-stack" "3.329.0" - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/token-providers@3.332.0": - version "3.332.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.332.0.tgz#d014556ad93c0e43bb20237a3c5e85e9eed612a2" - integrity sha512-fccbg6OSl0l658pxl2p1MoU9gEePo5B361+JNaN0zfRMu7c5HBXCpdl4djlFxAHjltrX9f1+BKqfGHYgI3h8SQ== +"@aws-sdk/middleware-endpoint-discovery@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.470.0.tgz#7bc25fac1a334b93f6bdba62c740bf0501837422" + integrity sha512-pN+3Y7W3Xvs6pE2RlkXmO7ugOGLXsGR3zJI/fiGOLoCOGESuM3fq3CXdasOl76wch0L9iB1lPmoHMabkxKugGQ== dependencies: - "@aws-sdk/client-sso-oidc" "3.332.0" - "@aws-sdk/property-provider" "3.329.0" - "@aws-sdk/shared-ini-file-loader" "3.329.0" - "@aws-sdk/types" "3.329.0" + "@aws-sdk/endpoint-cache" "3.465.0" + "@aws-sdk/types" "3.468.0" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/protocol-http" "^3.0.11" + "@smithy/types" "^2.7.0" tslib "^2.5.0" -"@aws-sdk/types@3.329.0", "@aws-sdk/types@^3.222.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.329.0.tgz#bc20659abfcd666954196c3a24ad47785db80dd3" - integrity sha512-wFBW4yciDfzQBSFmWNaEvHShnSGLMxSu9Lls6EUf6xDMavxSB36bsrVRX6CyAo/W0NeIIyEOW1LclGPgJV1okg== +"@aws-sdk/middleware-host-header@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.468.0.tgz#6da7b19032e9afccea54fbf8aa10cccd2f817bcf" + integrity sha512-gwQ+/QhX+lhof304r6zbZ/V5l5cjhGRxLL3CjH1uJPMcOAbw9wUlMdl+ibr8UwBZ5elfKFGiB1cdW/0uMchw0w== dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/protocol-http" "^3.0.11" + "@smithy/types" "^2.7.0" tslib "^2.5.0" -"@aws-sdk/url-parser@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.329.0.tgz#a2862834a832ec1d379791f5233e378b75fc63ad" - integrity sha512-/VcfL7vNJKJGSjYYHVQF3bYCDFs4fSzB7j5qeVDwRdWr870gE7O1Dar+sLWBRKFF3AX+4VzplqzUfpu9t44JVA== +"@aws-sdk/middleware-logger@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.468.0.tgz#a1883fb7ad8e156444d30689de4ab897357ef1d8" + integrity sha512-X5XHKV7DHRXI3f29SAhJPe/OxWRFgDWDMMCALfzhmJfCi6Jfh0M14cJKoC+nl+dk9lB+36+jKjhjETZaL2bPlA== dependencies: - "@aws-sdk/querystring-parser" "3.329.0" - "@aws-sdk/types" "3.329.0" + "@aws-sdk/types" "3.468.0" + "@smithy/types" "^2.7.0" tslib "^2.5.0" -"@aws-sdk/util-base64@3.310.0": - version "3.310.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64/-/util-base64-3.310.0.tgz#d0fd49aff358c5a6e771d0001c63b1f97acbe34c" - integrity sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg== +"@aws-sdk/middleware-recursion-detection@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.468.0.tgz#85b05636a5c2638bf9e15c8b6be17654757e1bf4" + integrity sha512-vch9IQib2Ng9ucSyRW2eKNQXHUPb5jUPCLA5otTW/8nGjcOU37LxQG4WrxO7uaJ9Oe8hjHO+hViE3P0KISUhtA== dependencies: - "@aws-sdk/util-buffer-from" "3.310.0" + "@aws-sdk/types" "3.468.0" + "@smithy/protocol-http" "^3.0.11" + "@smithy/types" "^2.7.0" tslib "^2.5.0" -"@aws-sdk/util-body-length-browser@3.310.0": - version "3.310.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.310.0.tgz#3fca9d2f73c058edf1907e4a1d99a392fdd23eca" - integrity sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g== +"@aws-sdk/middleware-sdk-sts@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.468.0.tgz#773ed9f7087b184461c9cda0b442e58cb15c6a5b" + integrity sha512-xRy8NKfHbmafHwdbotdWgHBvRs0YZgk20GrhFJKp43bkqVbJ5bNlh3nQXf1DeFY9fARR84Bfotya4fwCUHWgZg== dependencies: + "@aws-sdk/middleware-signing" "3.468.0" + "@aws-sdk/types" "3.468.0" + "@smithy/types" "^2.7.0" tslib "^2.5.0" -"@aws-sdk/util-body-length-node@3.310.0": - version "3.310.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-3.310.0.tgz#4846ae72834ab0636f29f89fc1878520f6543fed" - integrity sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ== - dependencies: +"@aws-sdk/middleware-signing@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.468.0.tgz#d1b5a92c395f55063cfa72ee95e4921b16f4c515" + integrity sha512-s+7fSB1gdnnTj5O0aCCarX3z5Vppop8kazbNSZADdkfHIDWCN80IH4ZNjY3OWqaAz0HmR4LNNrovdR304ojb4Q== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/protocol-http" "^3.0.11" + "@smithy/signature-v4" "^2.0.0" + "@smithy/types" "^2.7.0" + "@smithy/util-middleware" "^2.0.8" tslib "^2.5.0" -"@aws-sdk/util-buffer-from@3.310.0": - version "3.310.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz#7a72cb965984d3c6a7e256ae6cf1621f52e54a57" - integrity sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw== +"@aws-sdk/middleware-user-agent@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.470.0.tgz#6cbb09fc8359acdb45c41f6fe5d6612c81f5ad92" + integrity sha512-s0YRGgf4fT5KwwTefpoNUQfB5JghzXyvmPfY1QuFEMeVQNxv0OPuydzo3rY2oXPkZjkulKDtpm5jzIHwut75hA== dependencies: - "@aws-sdk/is-array-buffer" "3.310.0" + "@aws-sdk/types" "3.468.0" + "@aws-sdk/util-endpoints" "3.470.0" + "@smithy/protocol-http" "^3.0.11" + "@smithy/types" "^2.7.0" tslib "^2.5.0" -"@aws-sdk/util-config-provider@3.310.0": - version "3.310.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.310.0.tgz#ff21f73d4774cfd7bd16ae56f905828600dda95f" - integrity sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg== +"@aws-sdk/region-config-resolver@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz#74e5c5f7a5633ad8c482503bf940a9330bd1cd09" + integrity sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ== dependencies: + "@smithy/node-config-provider" "^2.1.8" + "@smithy/types" "^2.7.0" + "@smithy/util-config-provider" "^2.0.0" + "@smithy/util-middleware" "^2.0.8" tslib "^2.5.0" -"@aws-sdk/util-defaults-mode-browser@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.329.0.tgz#49fc6836e85968ff86917c56c82fc9ef595c0565" - integrity sha512-2iSiy/pzX3OXMhtSxtAzOiEFr3viQEFnYOTeZuiheuyS+cea2L79F6SlZ1110b/nOIU/UOrxxtz83HVad8YFMQ== +"@aws-sdk/token-providers@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.470.0.tgz#635fa5db3f10919868a9f94be43241fbce206ede" + integrity sha512-rzxnJxEUJiV69Cxsf0AHXTqJqTACITwcSH/PL4lWP4uvtzdrzSi3KA3u2aWHWpOcdE6+JFvdICscsbBSo3/TOg== dependencies: - "@aws-sdk/property-provider" "3.329.0" - "@aws-sdk/types" "3.329.0" - bowser "^2.11.0" + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/middleware-host-header" "3.468.0" + "@aws-sdk/middleware-logger" "3.468.0" + "@aws-sdk/middleware-recursion-detection" "3.468.0" + "@aws-sdk/middleware-user-agent" "3.470.0" + "@aws-sdk/region-config-resolver" "3.470.0" + "@aws-sdk/types" "3.468.0" + "@aws-sdk/util-endpoints" "3.470.0" + "@aws-sdk/util-user-agent-browser" "3.468.0" + "@aws-sdk/util-user-agent-node" "3.470.0" + "@smithy/config-resolver" "^2.0.21" + "@smithy/fetch-http-handler" "^2.3.1" + "@smithy/hash-node" "^2.0.17" + "@smithy/invalid-dependency" "^2.0.15" + "@smithy/middleware-content-length" "^2.0.17" + "@smithy/middleware-endpoint" "^2.2.3" + "@smithy/middleware-retry" "^2.0.24" + "@smithy/middleware-serde" "^2.0.15" + "@smithy/middleware-stack" "^2.0.9" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/node-http-handler" "^2.2.1" + "@smithy/property-provider" "^2.0.0" + "@smithy/protocol-http" "^3.0.11" + "@smithy/shared-ini-file-loader" "^2.0.6" + "@smithy/smithy-client" "^2.1.18" + "@smithy/types" "^2.7.0" + "@smithy/url-parser" "^2.0.15" + "@smithy/util-base64" "^2.0.1" + "@smithy/util-body-length-browser" "^2.0.1" + "@smithy/util-body-length-node" "^2.1.0" + "@smithy/util-defaults-mode-browser" "^2.0.22" + "@smithy/util-defaults-mode-node" "^2.0.29" + "@smithy/util-endpoints" "^1.0.7" + "@smithy/util-retry" "^2.0.8" + "@smithy/util-utf8" "^2.0.2" tslib "^2.5.0" -"@aws-sdk/util-defaults-mode-node@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.329.0.tgz#2296652bcacd56c6abe159194aae283738a796b2" - integrity sha512-7A6C7YKjkZtmKtH29isYEtOCbhd7IcXPP8lftN8WAWlLOiZE4gV7PHveagUj7QserJzgRKGwwTQbBj53n18HYg== +"@aws-sdk/types@3.468.0", "@aws-sdk/types@^3.222.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.468.0.tgz#f97b34fc92a800d1d8b866f47693ae8f3d46517b" + integrity sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA== dependencies: - "@aws-sdk/config-resolver" "3.329.0" - "@aws-sdk/credential-provider-imds" "3.329.0" - "@aws-sdk/node-config-provider" "3.329.0" - "@aws-sdk/property-provider" "3.329.0" - "@aws-sdk/types" "3.329.0" + "@smithy/types" "^2.7.0" tslib "^2.5.0" "@aws-sdk/util-dynamodb@^3.332.0": @@ -659,19 +443,13 @@ dependencies: tslib "^2.5.0" -"@aws-sdk/util-endpoints@3.332.0": - version "3.332.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.332.0.tgz#e360f65d240c97661988e20f15bb5bca160f773a" - integrity sha512-nQx7AiOroMU2hj6h+umWOSZ+WECwxupaxFUK/PPKGW6NY/VdQE6LluYnXOtF5awlr8w1nPksT0Lq05PZutMDLA== - dependencies: - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/util-hex-encoding@3.310.0": - version "3.310.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz#19294c78986c90ae33f04491487863dc1d33bd87" - integrity sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA== +"@aws-sdk/util-endpoints@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.470.0.tgz#94338991804f24e0225636abd4215b3bb4338c15" + integrity sha512-6N6VvPCmu+89p5Ez/+gLf+X620iQ9JpIs8p8ECZiCodirzFOe8NC1O2S7eov7YiG9IHSuodqn/0qNq+v+oLe0A== dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/util-endpoints" "^1.0.7" tslib "^2.5.0" "@aws-sdk/util-locate-window@^3.0.0": @@ -681,44 +459,24 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-middleware@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.329.0.tgz#0d4056c8479d80760778928e807ff74c57fcead3" - integrity sha512-RhBOBaxzkTUghi4MSqr8S5qeeBCjgJ0XPJ6jIYkVkj1saCmqkuZCgl3zFaYdyhdxxPV6nflkFer+1HUoqT+Fqw== - dependencies: - tslib "^2.5.0" - -"@aws-sdk/util-retry@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-retry/-/util-retry-3.329.0.tgz#20b71504dd907e70a457cd56dcd131d08d6de39c" - integrity sha512-+3VQ9HZLinysnmryUs9Xjt1YVh4TYYHLt30ilu4iUnIHFQoamdzIbRCWseSVFPCxGroen9M9qmAleAsytHEKuA== - dependencies: - "@aws-sdk/service-error-classification" "3.329.0" - tslib "^2.5.0" - -"@aws-sdk/util-uri-escape@3.310.0": - version "3.310.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz#9f942f09a715d8278875013a416295746b6085ba" - integrity sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q== +"@aws-sdk/util-user-agent-browser@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.468.0.tgz#095caecb3fd75104ee38ae81ed78821de0f58e28" + integrity sha512-OJyhWWsDEizR3L+dCgMXSUmaCywkiZ7HSbnQytbeKGwokIhD69HTiJcibF/sgcM5gk4k3Mq3puUhGnEZ46GIig== dependencies: - tslib "^2.5.0" - -"@aws-sdk/util-user-agent-browser@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.329.0.tgz#6c3353a68f5d3d420156fabdcfab3bf4160f383b" - integrity sha512-8hLSmMCl8aw2++0Zuba8ELq8FkK6/VNyx470St201IpMn2GMbQMDl/rLolRKiTgji6wc+T3pOTidkJkz8/cIXA== - dependencies: - "@aws-sdk/types" "3.329.0" + "@aws-sdk/types" "3.468.0" + "@smithy/types" "^2.7.0" bowser "^2.11.0" tslib "^2.5.0" -"@aws-sdk/util-user-agent-node@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.329.0.tgz#eb0930a1f3315fa6ea6f72e4007bbfce1202a3e5" - integrity sha512-C50Zaeodc0+psEP+L4WpElrH8epuLWJPVN4hDOTORcM0cSoU2o025Ost9mbcU7UdoHNxF9vitLnzORGN9SHolg== +"@aws-sdk/util-user-agent-node@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.470.0.tgz#b78605f336859d6c3b5f573cff931ce41f83a27d" + integrity sha512-QxsZ9iVHcBB/XRdYvwfM5AMvNp58HfqkIrH88mY0cmxuvtlIGDfWjczdDrZMJk9y0vIq+cuoCHsGXHu7PyiEAQ== dependencies: - "@aws-sdk/node-config-provider" "3.329.0" - "@aws-sdk/types" "3.329.0" + "@aws-sdk/types" "3.468.0" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/types" "^2.7.0" tslib "^2.5.0" "@aws-sdk/util-utf8-browser@^3.0.0": @@ -728,23 +486,6 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-utf8@3.310.0": - version "3.310.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz#4a7b9dcebb88e830d3811aeb21e9a6df4273afb4" - integrity sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA== - dependencies: - "@aws-sdk/util-buffer-from" "3.310.0" - tslib "^2.5.0" - -"@aws-sdk/util-waiter@3.329.0": - version "3.329.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.329.0.tgz#4e0d457548661e210cf716f8b18ff16a4dbd17c7" - integrity sha512-MIGs7snNL0ZV55zo1BDVPlrmbinUGV3260hp6HrW4zUbpYVoeIOGeewtrwAsF6FJ+vpZCxljPBB0X2jYR7Q7ZQ== - dependencies: - "@aws-sdk/abort-controller" "3.329.0" - "@aws-sdk/types" "3.329.0" - tslib "^2.5.0" - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" @@ -752,6 +493,14 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5": version "7.21.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.7.tgz#61caffb60776e49a57ba61a88f02bedd8714f6bc" @@ -804,6 +553,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== + dependencies: + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -870,6 +629,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" @@ -878,6 +642,14 @@ "@babel/template" "^7.20.7" "@babel/types" "^7.21.0" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -885,6 +657,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions@^7.21.5": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz#3b1a009af932e586af77c1030fba9ee0bde396c0" @@ -968,16 +747,33 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-string-parser@^7.21.5": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" @@ -1011,11 +807,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8": +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.8": version "7.21.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" + integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -1780,20 +1590,29 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.20.5", "@babel/traverse@^7.21.5", "@babel/traverse@^7.7.2": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" - integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-environment-visitor" "^7.21.5" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.5" - "@babel/types" "^7.21.5" - debug "^4.1.0" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.20.5", "@babel/traverse@^7.21.5", "@babel/traverse@^7.7.2": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.6.tgz#b53526a2367a0dd6edc423637f3d2d0f2521abc5" + integrity sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.6" + "@babel/types" "^7.23.6" + debug "^4.3.1" globals "^11.1.0" "@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": @@ -1805,6 +1624,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" + integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -2022,19 +1850,19 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.4.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" - integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== -"@eslint/eslintrc@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" - integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.5.2" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -2042,22 +1870,22 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.40.0.tgz#3ba73359e11f5a7bd3e407f70b3528abfae69cec" - integrity sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA== +"@eslint/js@8.55.0": + version "8.55.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.55.0.tgz#b721d52060f369aa259cf97392403cb9ce892ec6" + integrity sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA== "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== +"@humanwhocodes/config-array@^0.11.13": + version "0.11.13" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" + "@humanwhocodes/object-schema" "^2.0.1" debug "^4.1.1" minimatch "^3.0.5" @@ -2066,10 +1894,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== "@iarna/toml@^2.2.5": version "2.2.5" @@ -2776,6 +2604,13 @@ undici "5.20.0" ws "^8.2.2" +"@mongodb-js/saslprep@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz#9a6c2516bc9188672c4d953ec99760ba49970da7" + integrity sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ== + dependencies: + sparse-bitfield "^3.0.3" + "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" @@ -2847,34 +2682,34 @@ resolved "https://registry.yarnpkg.com/@redis/bloom/-/bloom-1.2.0.tgz#d3fd6d3c0af3ef92f26767b56414a370c7b63b71" integrity sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg== -"@redis/client@1.5.7": - version "1.5.7" - resolved "https://registry.yarnpkg.com/@redis/client/-/client-1.5.7.tgz#92cc5c98c76f189e37d24f0e1e17e104c6af17d4" - integrity sha512-gaOBOuJPjK5fGtxSseaKgSvjiZXQCdLlGg9WYQst+/GRUjmXaiB5kVkeQMRtPc7Q2t93XZcJfBMSwzs/XS9UZw== +"@redis/client@1.5.12": + version "1.5.12" + resolved "https://registry.yarnpkg.com/@redis/client/-/client-1.5.12.tgz#4c387727992152aea443b869de0ebb697f899187" + integrity sha512-/ZjE18HRzMd80eXIIUIPcH81UoZpwulbo8FmbElrjPqH0QC0SeIKu1BOU49bO5trM5g895kAjhvalt5h77q+4A== dependencies: cluster-key-slot "1.1.2" generic-pool "3.9.0" yallist "4.0.0" -"@redis/graph@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@redis/graph/-/graph-1.1.0.tgz#cc2b82e5141a29ada2cce7d267a6b74baa6dd519" - integrity sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg== +"@redis/graph@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@redis/graph/-/graph-1.1.1.tgz#8c10df2df7f7d02741866751764031a957a170ea" + integrity sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw== -"@redis/json@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@redis/json/-/json-1.0.4.tgz#f372b5f93324e6ffb7f16aadcbcb4e5c3d39bda1" - integrity sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw== +"@redis/json@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@redis/json/-/json-1.0.6.tgz#b7a7725bbb907765d84c99d55eac3fcf772e180e" + integrity sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw== -"@redis/search@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@redis/search/-/search-1.1.2.tgz#6a8f66ba90812d39c2457420f859ce8fbd8f3838" - integrity sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA== +"@redis/search@1.1.6": + version "1.1.6" + resolved "https://registry.yarnpkg.com/@redis/search/-/search-1.1.6.tgz#33bcdd791d9ed88ab6910243a355d85a7fedf756" + integrity sha512-mZXCxbTYKBQ3M2lZnEddwEAks0Kc7nauire8q20oA0oA/LoA+E/b5Y5KZn232ztPb1FkIGqo12vh3Lf+Vw5iTw== -"@redis/time-series@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@redis/time-series/-/time-series-1.0.4.tgz#af85eb080f6934580e4d3b58046026b6c2b18717" - integrity sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng== +"@redis/time-series@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@redis/time-series/-/time-series-1.0.5.tgz#a6d70ef7a0e71e083ea09b967df0a0ed742bc6ad" + integrity sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg== "@remix-run/react@^2.0.0": version "2.0.0" @@ -2945,6 +2780,13 @@ estree-walker "^1.0.1" picomatch "^2.2.2" +"@shopify/admin-api-client@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@shopify/admin-api-client/-/admin-api-client-0.2.1.tgz#98f10a9732b6d742189af5ccb7bb4dd781485acd" + integrity sha512-Oeh247CRXqSk5ktrEoBRN/BA5AGEliiyKJeTSGaIZpnMYDSXb2FNsmLaZY49/jTklmMouwoqh7FnYE5Vw8ZyQw== + dependencies: + "@shopify/graphql-client" "^0.9.1" + "@shopify/babel-preset@^24.1.4": version "24.1.5" resolved "https://registry.yarnpkg.com/@shopify/babel-preset/-/babel-preset-24.1.5.tgz#76cfef62bb8a4d9769559f3f2505148a55d13488" @@ -3006,6 +2848,11 @@ globby "^11.1.0" typescript "^4.8.3" +"@shopify/graphql-client@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@shopify/graphql-client/-/graphql-client-0.9.1.tgz#0c37a4143c0dd26837e82b8fd13e1b64fabf90dc" + integrity sha512-yx6PIHY8u4O0ijUQccmIpjoyM1JSbe5RkrSyXSbjhsS+nla0WAJDIMw4R01mjx3dFnVIcGONhRX/QrUq97uWig== + "@shopify/loom-cli@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@shopify/loom-cli/-/loom-cli-1.1.0.tgz#e92f423a26f00c33b7c247a65667a8ff9bd1e8f8" @@ -3143,12 +2990,14 @@ jest-matcher-utils "^26.6.2" react-reconciler "^0.28.0" -"@shopify/shopify-api@^8.1.1": - version "8.1.1" - resolved "https://registry.yarnpkg.com/@shopify/shopify-api/-/shopify-api-8.1.1.tgz#d3f400a27d9fe2eaa7647bbd33134b75fe52463a" - integrity sha512-0JO3Mhv9Sb8VKPw/LUdacHJj9wbT/txyByr2TF03yjqoV++G3NxNMUAA1tcpoSvOAv20KlQjwpoFnXqBmPFW7Q== +"@shopify/shopify-api@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@shopify/shopify-api/-/shopify-api-9.0.1.tgz#7f236d94d902b3671c6a11f11f3561f98ddc7422" + integrity sha512-ToqT5zt/YA+VbFcLAoEVr6grs6v+Y9io5kuULy9Zhm5RClFEhkpRLM4U+vrrV5XjWYC6pcxs00WjpSi0onryrw== dependencies: + "@shopify/admin-api-client" "^0.2.1" "@shopify/network" "^3.2.1" + "@shopify/storefront-api-client" "^0.2.1" compare-versions "^5.0.3" isbot "^3.6.10" jose "^4.9.1" @@ -3156,6 +3005,13 @@ tslib "^2.0.3" uuid "^9.0.0" +"@shopify/storefront-api-client@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@shopify/storefront-api-client/-/storefront-api-client-0.2.1.tgz#17f98d34cc218ff3e688bb812421f5c51e3ab451" + integrity sha512-e0yk0rwxGd6Dr7ArBHD1MuDd74RRkW03xb2YS90PZEP3mHcMCVAng2lm733tqooA6iNaooAKsy+O0HTKH2JgUA== + dependencies: + "@shopify/graphql-client" "^0.9.1" + "@shopify/typescript-configs@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@shopify/typescript-configs/-/typescript-configs-5.1.0.tgz#f6e8fdd3291bf0a406578b2c6eb21f8c542d3c0a" @@ -3209,6 +3065,376 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@smithy/abort-controller@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-2.0.15.tgz#fcec9193da8b86eef1eedc3e71139a99c061db32" + integrity sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/config-resolver@^2.0.21": + version "2.0.21" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-2.0.21.tgz#97cb1c71f3c8c453fb01169545f98414b3414d7f" + integrity sha512-rlLIGT+BeqjnA6C2FWumPRJS1UW07iU5ZxDHtFuyam4W65gIaOFMjkB90ofKCIh+0mLVQrQFrl/VLtQT/6FWTA== + dependencies: + "@smithy/node-config-provider" "^2.1.8" + "@smithy/types" "^2.7.0" + "@smithy/util-config-provider" "^2.0.0" + "@smithy/util-middleware" "^2.0.8" + tslib "^2.5.0" + +"@smithy/credential-provider-imds@^2.0.0", "@smithy/credential-provider-imds@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.4.tgz#126adf69eac333f23f8683edbfabdc2b3b2deb15" + integrity sha512-cwPJN1fa1YOQzhBlTXRavABEYRRchci1X79QRwzaNLySnIMJfztyv1Zkst0iZPLMnpn8+CnHu3wOHS11J5Dr3A== + dependencies: + "@smithy/node-config-provider" "^2.1.8" + "@smithy/property-provider" "^2.0.16" + "@smithy/types" "^2.7.0" + "@smithy/url-parser" "^2.0.15" + tslib "^2.5.0" + +"@smithy/eventstream-codec@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-2.0.15.tgz#733e638fd38e7e264bc0429dbda139bab950bd25" + integrity sha512-crjvz3j1gGPwA0us6cwS7+5gAn35CTmqu/oIxVbYJo2Qm/sGAye6zGJnMDk3BKhWZw5kcU1G4MxciTkuBpOZPg== + dependencies: + "@aws-crypto/crc32" "3.0.0" + "@smithy/types" "^2.7.0" + "@smithy/util-hex-encoding" "^2.0.0" + tslib "^2.5.0" + +"@smithy/fetch-http-handler@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.1.tgz#aa055db5bf4d78acec97abe6ef24283fa2c18430" + integrity sha512-6MNk16fqb8EwcYY8O8WxB3ArFkLZ2XppsSNo1h7SQcFdDDwIumiJeO6wRzm7iB68xvsOQzsdQKbdtTieS3hfSQ== + dependencies: + "@smithy/protocol-http" "^3.0.11" + "@smithy/querystring-builder" "^2.0.15" + "@smithy/types" "^2.7.0" + "@smithy/util-base64" "^2.0.1" + tslib "^2.5.0" + +"@smithy/hash-node@^2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-2.0.17.tgz#9ce5e3f137143e3658759d31a16e068ef94a14fc" + integrity sha512-Il6WuBcI1nD+e2DM7tTADMf01wEPGK8PAhz4D+YmDUVaoBqlA+CaH2uDJhiySifmuKBZj748IfygXty81znKhw== + dependencies: + "@smithy/types" "^2.7.0" + "@smithy/util-buffer-from" "^2.0.0" + "@smithy/util-utf8" "^2.0.2" + tslib "^2.5.0" + +"@smithy/invalid-dependency@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-2.0.15.tgz#7653490047bf0ab6042fb812adfbcce857aa2d06" + integrity sha512-dlEKBFFwVfzA5QroHlBS94NpgYjXhwN/bFfun+7w3rgxNvVy79SK0w05iGc7UAeC5t+D7gBxrzdnD6hreZnDVQ== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/is-array-buffer@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz#8fa9b8040651e7ba0b2f6106e636a91354ff7d34" + integrity sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug== + dependencies: + tslib "^2.5.0" + +"@smithy/middleware-content-length@^2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-2.0.17.tgz#13479173a15d1cd4224e3e21071a27c66a74b653" + integrity sha512-OyadvMcKC7lFXTNBa8/foEv7jOaqshQZkjWS9coEXPRZnNnihU/Ls+8ZuJwGNCOrN2WxXZFmDWhegbnM4vak8w== + dependencies: + "@smithy/protocol-http" "^3.0.11" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/middleware-endpoint@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.3.tgz#4069ab6e8d1b485bc0d2384b30f7b37096111ec2" + integrity sha512-nYfxuq0S/xoAjdLbyn1ixeVB6cyH9wYCMtbbOCpcCRYR5u2mMtqUtVjjPAZ/DIdlK3qe0tpB0Q76szFGNuz+kQ== + dependencies: + "@smithy/middleware-serde" "^2.0.15" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/shared-ini-file-loader" "^2.2.7" + "@smithy/types" "^2.7.0" + "@smithy/url-parser" "^2.0.15" + "@smithy/util-middleware" "^2.0.8" + tslib "^2.5.0" + +"@smithy/middleware-retry@^2.0.24": + version "2.0.24" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-2.0.24.tgz#556a39e7d2be32cc61862e020409d3f93e2c5be1" + integrity sha512-q2SvHTYu96N7lYrn3VSuX3vRpxXHR/Cig6MJpGWxd0BWodUQUWlKvXpWQZA+lTaFJU7tUvpKhRd4p4MU3PbeJg== + dependencies: + "@smithy/node-config-provider" "^2.1.8" + "@smithy/protocol-http" "^3.0.11" + "@smithy/service-error-classification" "^2.0.8" + "@smithy/smithy-client" "^2.1.18" + "@smithy/types" "^2.7.0" + "@smithy/util-middleware" "^2.0.8" + "@smithy/util-retry" "^2.0.8" + tslib "^2.5.0" + uuid "^8.3.2" + +"@smithy/middleware-serde@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-2.0.15.tgz#9deac4daad1f2a60d5c4e7097658f9ae2eb0a33f" + integrity sha512-FOZRFk/zN4AT4wzGuBY+39XWe+ZnCFd0gZtyw3f9Okn2CJPixl9GyWe98TIaljeZdqWkgrzGyPre20AcW2UMHQ== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/middleware-stack@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-2.0.9.tgz#60e51697c74258fac087bc739d940f524921a15f" + integrity sha512-bCB5dUtGQ5wh7QNL2ELxmDc6g7ih7jWU3Kx6MYH1h4mZbv9xL3WyhKHojRltThCB1arLPyTUFDi+x6fB/oabtA== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/node-config-provider@^2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-2.1.8.tgz#8cab8f1172c8cd1146e7997292786909abcae763" + integrity sha512-+w26OKakaBUGp+UG+dxYZtFb5fs3tgHg3/QrRrmUZj+rl3cIuw840vFUXX35cVPTUCQIiTqmz7CpVF7+hdINdQ== + dependencies: + "@smithy/property-provider" "^2.0.16" + "@smithy/shared-ini-file-loader" "^2.2.7" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/node-http-handler@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-2.2.1.tgz#23f6540e565edcae8c558a854fffde3d003451c0" + integrity sha512-8iAKQrC8+VFHPAT8pg4/j6hlsTQh+NKOWlctJBrYtQa4ExcxX7aSg3vdQ2XLoYwJotFUurg/NLqFCmZaPRrogw== + dependencies: + "@smithy/abort-controller" "^2.0.15" + "@smithy/protocol-http" "^3.0.11" + "@smithy/querystring-builder" "^2.0.15" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/property-provider@^2.0.0", "@smithy/property-provider@^2.0.16": + version "2.0.16" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-2.0.16.tgz#0c15ea8a3e8c8e7012bf5877c79ce754f7d2c06e" + integrity sha512-28Ky0LlOqtEjwg5CdHmwwaDRHcTWfPRzkT6HrhwOSRS2RryAvuDfJrZpM+BMcrdeCyEg1mbcgIMoqTla+rdL8Q== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/protocol-http@^3.0.11": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-3.0.11.tgz#a9ea712fe7cc3375378ac68d9168a7b6cd0b6f65" + integrity sha512-3ziB8fHuXIRamV/akp/sqiWmNPR6X+9SB8Xxnozzj+Nq7hSpyKdFHd1FLpBkgfGFUTzzcBJQlDZPSyxzmdcx5A== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/querystring-builder@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-2.0.15.tgz#aa8c889bcaef274b8345be4ddabae3bfedf2cf33" + integrity sha512-e1q85aT6HutvouOdN+dMsN0jcdshp50PSCvxDvo6aIM57LqeXimjfONUEgfqQ4IFpYWAtVixptyIRE5frMp/2A== + dependencies: + "@smithy/types" "^2.7.0" + "@smithy/util-uri-escape" "^2.0.0" + tslib "^2.5.0" + +"@smithy/querystring-parser@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-2.0.15.tgz#46c8806a145f46636e4aee2a5d79e7ba68161a4c" + integrity sha512-jbBvoK3cc81Cj1c1TH1qMYxNQKHrYQ2DoTntN9FBbtUWcGhc+T4FP6kCKYwRLXyU4AajwGIZstvNAmIEgUUNTQ== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/service-error-classification@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-2.0.8.tgz#c9e421312a2def84da025c5efe6de06679c5be95" + integrity sha512-jCw9+005im8tsfYvwwSc4TTvd29kXRFkH9peQBg5R/4DD03ieGm6v6Hpv9nIAh98GwgYg1KrztcINC1s4o7/hg== + dependencies: + "@smithy/types" "^2.7.0" + +"@smithy/shared-ini-file-loader@^2.0.6", "@smithy/shared-ini-file-loader@^2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.7.tgz#4a3bd469703d02c3cc8e36dcba2238c06efa12cb" + integrity sha512-0Qt5CuiogIuvQIfK+be7oVHcPsayLgfLJGkPlbgdbl0lD28nUKu4p11L+UG3SAEsqc9UsazO+nErPXw7+IgDpQ== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/signature-v4@^2.0.0": + version "2.0.18" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-2.0.18.tgz#53b78b238edaa84cc8d61faf67d2b3c926cdd698" + integrity sha512-SJRAj9jT/l9ocm8D0GojMbnA1sp7I4JeStOQ4lEXI8A5eHE73vbjlzlqIFB7cLvIgau0oUl4cGVpF9IGCrvjlw== + dependencies: + "@smithy/eventstream-codec" "^2.0.15" + "@smithy/is-array-buffer" "^2.0.0" + "@smithy/types" "^2.7.0" + "@smithy/util-hex-encoding" "^2.0.0" + "@smithy/util-middleware" "^2.0.8" + "@smithy/util-uri-escape" "^2.0.0" + "@smithy/util-utf8" "^2.0.2" + tslib "^2.5.0" + +"@smithy/smithy-client@^2.1.18": + version "2.1.18" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-2.1.18.tgz#f8ce2c0e9614f207256ddcd992403aff40750546" + integrity sha512-7FqdbaJiVaHJDD9IfDhmzhSDbpjyx+ZsfdYuOpDJF09rl8qlIAIlZNoSaflKrQ3cEXZN2YxGPaNWGhbYimyIRQ== + dependencies: + "@smithy/middleware-stack" "^2.0.9" + "@smithy/types" "^2.7.0" + "@smithy/util-stream" "^2.0.23" + tslib "^2.5.0" + +"@smithy/types@^2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.7.0.tgz#6ed9ba5bff7c4d28c980cff967e6d8456840a4f3" + integrity sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw== + dependencies: + tslib "^2.5.0" + +"@smithy/url-parser@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-2.0.15.tgz#878d9b61f9eac8834cb611cf1a8a0e5d9a48038c" + integrity sha512-sADUncUj9rNbOTrdDGm4EXlUs0eQ9dyEo+V74PJoULY4jSQxS+9gwEgsPYyiu8PUOv16JC/MpHonOgqP/IEDZA== + dependencies: + "@smithy/querystring-parser" "^2.0.15" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/util-base64@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-2.0.1.tgz#57f782dafc187eddea7c8a1ff2a7c188ed1a02c4" + integrity sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ== + dependencies: + "@smithy/util-buffer-from" "^2.0.0" + tslib "^2.5.0" + +"@smithy/util-body-length-browser@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz#424485cc81c640d18c17c683e0e6edb57e8e2ab9" + integrity sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ== + dependencies: + tslib "^2.5.0" + +"@smithy/util-body-length-node@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz#313a5f7c5017947baf5fa018bfc22628904bbcfa" + integrity sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw== + dependencies: + tslib "^2.5.0" + +"@smithy/util-buffer-from@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz#7eb75d72288b6b3001bc5f75b48b711513091deb" + integrity sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw== + dependencies: + "@smithy/is-array-buffer" "^2.0.0" + tslib "^2.5.0" + +"@smithy/util-config-provider@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz#4dd6a793605559d94267312fd06d0f58784b4c38" + integrity sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg== + dependencies: + tslib "^2.5.0" + +"@smithy/util-defaults-mode-browser@^2.0.22": + version "2.0.22" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.22.tgz#8ef8c36b8c3c2f98f7a62278c3c684d659134269" + integrity sha512-qcF20IHHH96FlktvBRICDXDhLPtpVmtksHmqNGtotb9B0DYWXsC6jWXrkhrrwF7tH26nj+npVTqh9isiFV1gdA== + dependencies: + "@smithy/property-provider" "^2.0.16" + "@smithy/smithy-client" "^2.1.18" + "@smithy/types" "^2.7.0" + bowser "^2.11.0" + tslib "^2.5.0" + +"@smithy/util-defaults-mode-node@^2.0.29": + version "2.0.29" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.29.tgz#6b210aede145a6bf4bd83d9f465948fb300ca577" + integrity sha512-+uG/15VoUh6JV2fdY9CM++vnSuMQ1VKZ6BdnkUM7R++C/vLjnlg+ToiSR1FqKZbMmKBXmsr8c/TsDWMAYvxbxQ== + dependencies: + "@smithy/config-resolver" "^2.0.21" + "@smithy/credential-provider-imds" "^2.1.4" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/property-provider" "^2.0.16" + "@smithy/smithy-client" "^2.1.18" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/util-endpoints@^1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-1.0.7.tgz#5a258ac7838dea085660060b515cd2d19f19a4bc" + integrity sha512-Q2gEind3jxoLk6hdKWyESMU7LnXz8aamVwM+VeVjOYzYT1PalGlY/ETa48hv2YpV4+YV604y93YngyzzzQ4IIA== + dependencies: + "@smithy/node-config-provider" "^2.1.8" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/util-hex-encoding@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz#0aa3515acd2b005c6d55675e377080a7c513b59e" + integrity sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA== + dependencies: + tslib "^2.5.0" + +"@smithy/util-middleware@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-2.0.8.tgz#2ec1da1190d09b69512ce0248ebd5e819e3c8a92" + integrity sha512-qkvqQjM8fRGGA8P2ydWylMhenCDP8VlkPn8kiNuFEaFz9xnUKC2irfqsBSJrfrOB9Qt6pQsI58r3zvvumhFMkw== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/util-retry@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-2.0.8.tgz#61f8db11e4fe60975cb9fb2eada173f5024a06f3" + integrity sha512-cQTPnVaVFMjjS6cb44WV2yXtHVyXDC5icKyIbejMarJEApYeJWpBU3LINTxHqp/tyLI+MZOUdosr2mZ3sdziNg== + dependencies: + "@smithy/service-error-classification" "^2.0.8" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/util-stream@^2.0.23": + version "2.0.23" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-2.0.23.tgz#468ad29913d091092317cfea2d8ac5b866326a07" + integrity sha512-OJMWq99LAZJUzUwTk+00plyxX3ESktBaGPhqNIEVab+53gLULiWN9B/8bRABLg0K6R6Xg4t80uRdhk3B/LZqMQ== + dependencies: + "@smithy/fetch-http-handler" "^2.3.1" + "@smithy/node-http-handler" "^2.2.1" + "@smithy/types" "^2.7.0" + "@smithy/util-base64" "^2.0.1" + "@smithy/util-buffer-from" "^2.0.0" + "@smithy/util-hex-encoding" "^2.0.0" + "@smithy/util-utf8" "^2.0.2" + tslib "^2.5.0" + +"@smithy/util-uri-escape@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz#19955b1a0f517a87ae77ac729e0e411963dfda95" + integrity sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw== + dependencies: + tslib "^2.5.0" + +"@smithy/util-utf8@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.0.2.tgz#626b3e173ad137208e27ed329d6bea70f4a1a7f7" + integrity sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA== + dependencies: + "@smithy/util-buffer-from" "^2.0.0" + tslib "^2.5.0" + +"@smithy/util-waiter@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-2.0.15.tgz#b02a42bf1b82f07973d1756a0ee10fafa1fbf58e" + integrity sha512-9Y+btzzB7MhLADW7xgD6SjvmoYaRkrb/9SCbNGmNdfO47v38rxb90IGXyDtAK0Shl9bMthTmLgjlfYc+vtz2Qw== + dependencies: + "@smithy/abort-controller" "^2.0.15" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -3392,10 +3618,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/jsonwebtoken@^9.0.2": - version "9.0.2" - resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#9eeb56c76dd555039be2a3972218de5bd3b8d83e" - integrity sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q== +"@types/jsonwebtoken@^9.0.5": + version "9.0.5" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz#0bd9b841c9e6c5a937c17656e2368f65da025588" + integrity sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA== dependencies: "@types/node" "*" @@ -3526,15 +3752,10 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.3.tgz#5798ecf1bec94eaa64db39ee52808ec0693315aa" integrity sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A== -"@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== - -"@types/semver@^7.3.13": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== +"@types/semver@^7.3.12", "@types/semver@^7.5.6": + version "7.5.6" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" + integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== "@types/send@*": version "0.17.1" @@ -3579,12 +3800,11 @@ resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz#2b8e60e33906459219aa587e9d1a612ae994cfe7" integrity sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog== -"@types/whatwg-url@^8.2.1": - version "8.2.2" - resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.2.tgz#749d5b3873e845897ada99be4448041d4cc39e63" - integrity sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA== +"@types/whatwg-url@^11.0.2": + version "11.0.3" + resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.3.tgz#9f584c9a9421f0971029ee504dd62a831cb8f3aa" + integrity sha512-z1ELvMijRL1QmU7QuzDkeYXSF2+dXI0ITKoQsIoVKcNBOiK5RMmWy+pYYxJTHFt8vkpZe7UsvRErQwcxZkjoUw== dependencies: - "@types/node" "*" "@types/webidl-conversions" "*" "@types/yargs-parser@*": @@ -3704,6 +3924,11 @@ "@typescript-eslint/types" "5.59.2" eslint-visitor-keys "^3.3.0" +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + "@web3-storage/multipart-parser@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz#6b69dc2a32a5b207ba43e556c25cc136a56659c4" @@ -3750,11 +3975,16 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.8.0: +acorn@^8.2.4: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.9.0: + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -3779,7 +4009,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.12.4: +ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -4204,10 +4434,10 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -bson@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/bson/-/bson-5.3.0.tgz#37b006df4cd91ed125cb686467c1dd6d4606b514" - integrity sha512-ukmCZMneMlaC5ebPHXIkP8YJzNl5DC41N5MAIvKDqLggdao342t4McltoJBQfQya/nHBWAcSsYRqlXPoQkTJag== +bson@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/bson/-/bson-6.2.0.tgz#4b6acafc266ba18eeee111373c2699304a9ba0a3" + integrity sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q== buffer-equal-constant-time@1.0.1: version "1.0.1" @@ -4326,7 +4556,7 @@ capital-case@^1.0.4: tslib "^2.0.3" upper-case-first "^2.0.2" -chalk@^2.0.0, chalk@^2.1.0: +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -4717,7 +4947,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -5289,10 +5519,10 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -5314,32 +5544,33 @@ eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.38.0, eslint@^8.40.0: - version "8.40.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.40.0.tgz#a564cd0099f38542c4e9a2f630fa45bf33bc42a4" - integrity sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ== +eslint@^8.55.0: + version "8.55.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.55.0.tgz#078cb7b847d66f2c254ea1794fa395bf8e7e03f8" + integrity sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.40.0" - "@humanwhocodes/config-array" "^0.11.8" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.55.0" + "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.5.2" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -5347,30 +5578,27 @@ eslint@^8.38.0, eslint@^8.40.0: find-up "^5.0.0" glob-parent "^6.0.2" globals "^13.19.0" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" - integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" @@ -5581,10 +5809,10 @@ fast-safe-stringify@^2.1.1: resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== -fast-xml-parser@4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz#5a98c18238d28a57bbdfa9fe4cda01211fff8f4a" - integrity sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg== +fast-xml-parser@4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz#a6747a09296a6cb34f2ae634019bf1738f3b421f" + integrity sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g== dependencies: strnum "^1.0.5" @@ -5970,6 +6198,11 @@ grapheme-splitter@^1.0.4: resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" @@ -6140,7 +6373,7 @@ ignore@^5.0.5, ignore@^5.1.1, ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -6463,15 +6696,10 @@ isarray@^2.0.5: resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== -isbot@^3.6.10: - version "3.6.10" - resolved "https://registry.yarnpkg.com/isbot/-/isbot-3.6.10.tgz#7b66334e81794f0461794debb567975cf08eaf2b" - integrity sha512-+I+2998oyP4oW9+OTQD8TS1r9P6wv10yejukj+Ksj3+UR5pUhsZN3f8W7ysq0p1qxpOVNbl5mCuv0bCaF8y5iQ== - -isbot@^3.6.5: - version "3.6.12" - resolved "https://registry.yarnpkg.com/isbot/-/isbot-3.6.12.tgz#db01e46fe669d821a7583f067f2b43356f5c50c2" - integrity sha512-dGc3jRIORywaaqs4G5wj+58i5/l1eoI75q7XNiyW9Sgfoyr3QkyDZUXw+cuB7AOFq/0aruCQrGLrnKJlQarP/g== +isbot@^3.6.10, isbot@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/isbot/-/isbot-3.7.1.tgz#83655e59bfae8cd410d3c63b398c8ad813bf3fdf" + integrity sha512-JfqOaY3O1lcWt2nc+D6Mq231CNpwZrBboLa59Go0J8hjGH+gY/Sy0CA/YLUSIScINmAVwTdJZIsOTk4PfBtRuw== isexe@^2.0.0: version "2.0.0" @@ -7411,11 +7639,6 @@ jose@^4.9.1: resolved "https://registry.yarnpkg.com/jose/-/jose-4.14.4.tgz#59e09204e2670c3164ee24cbfe7115c6f8bff9ca" integrity sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g== -js-sdsl@^4.1.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" - integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -7522,15 +7745,21 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonwebtoken@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" - integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== +jsonwebtoken@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" + integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== dependencies: jws "^3.2.2" - lodash "^4.17.21" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" ms "^2.1.1" - semver "^7.3.8" + semver "^7.5.4" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1, jsx-ast-utils@^3.3.3: version "3.3.3" @@ -7647,6 +7876,36 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -7657,12 +7916,17 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + lodash.startcase@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== -lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -8012,24 +8276,22 @@ mnemonist@0.38.3: dependencies: obliterator "^1.6.1" -mongodb-connection-string-url@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz#57901bf352372abdde812c81be47b75c6b2ec5cf" - integrity sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ== +mongodb-connection-string-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz#b4f87f92fd8593f3b9365f592515a06d304a1e9c" + integrity sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ== dependencies: - "@types/whatwg-url" "^8.2.1" - whatwg-url "^11.0.0" + "@types/whatwg-url" "^11.0.2" + whatwg-url "^13.0.0" -mongodb@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-5.5.0.tgz#5d213ef68f6b48610909d98d537059f2d7f374a1" - integrity sha512-XgrkUgAAdfnZKQfk5AsYL8j7O99WHd4YXPxYxnh8dZxD+ekYWFRA3JktUsBnfg+455Smf75/+asoU/YLwNGoQQ== +mongodb@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.3.0.tgz#ec9993b19f7ed2ea715b903fcac6171c9d1d38ca" + integrity sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA== dependencies: - bson "^5.3.0" - mongodb-connection-string-url "^2.6.0" - socks "^2.7.1" - optionalDependencies: - saslprep "^1.0.3" + "@mongodb-js/saslprep" "^1.1.0" + bson "^6.2.0" + mongodb-connection-string-url "^3.0.0" ms@2.0.0: version "2.0.0" @@ -8329,17 +8591,17 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" os-tmpdir@~1.0.2: version "1.0.2" @@ -8524,10 +8786,10 @@ pg-cloudflare@^1.1.0: resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.0.tgz#833d70870d610d14bf9df7afb40e1cba310c17a0" integrity sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA== -pg-connection-string@^2.5.0, pg-connection-string@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.0.tgz#12a36cc4627df19c25cc1b9b736cc39ee1f73ae8" - integrity sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg== +pg-connection-string@^2.6.0, pg-connection-string@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" + integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== pg-int8@1.0.1: version "1.0.1" @@ -8788,6 +9050,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +punycode@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + pure-rand@^6.0.0: version "6.0.2" resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" @@ -8951,17 +9218,17 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -redis@^4.6.6: - version "4.6.6" - resolved "https://registry.yarnpkg.com/redis/-/redis-4.6.6.tgz#46d4f2d149d1634d6ef53db5747412a0ef7974ec" - integrity sha512-aLs2fuBFV/VJ28oLBqYykfnhGGkFxvx0HdCEBYdJ99FFbSEMZ7c1nVKwR6ZRv+7bb7JnC0mmCzaqu8frgOYhpA== +redis@^4.6.11: + version "4.6.11" + resolved "https://registry.yarnpkg.com/redis/-/redis-4.6.11.tgz#fad85e104545228f212259fd557c3e4f8eafcd3d" + integrity sha512-kg1Lt4NZLYkAjPOj/WcyIGWfZfnyfKo1Wg9YKVSlzhFwxpFIl3LYI8BWy1Ab963LLDsTz2+OwdsesHKljB3WMQ== dependencies: "@redis/bloom" "1.2.0" - "@redis/client" "1.5.7" - "@redis/graph" "1.1.0" - "@redis/json" "1.0.4" - "@redis/search" "1.1.2" - "@redis/time-series" "1.0.4" + "@redis/client" "1.5.12" + "@redis/graph" "1.1.1" + "@redis/json" "1.0.6" + "@redis/search" "1.1.6" + "@redis/time-series" "1.0.5" regenerate-unicode-properties@^10.1.0: version "10.1.0" @@ -9144,13 +9411,6 @@ safe-regex-test@^1.0.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -saslprep@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" - integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== - dependencies: - sparse-bitfield "^3.0.3" - saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" @@ -9189,10 +9449,10 @@ semiver@^1.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.x, semver@^7.0.0, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.1: - version "7.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== +semver@7.x, semver@^7.0.0, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -9201,13 +9461,6 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.5.0: - version "7.5.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.2.tgz#5b851e66d1be07c1cdaf37dfc856f543325a2beb" - integrity sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ== - dependencies: - lru-cache "^6.0.0" - send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -9365,7 +9618,7 @@ socks-proxy-agent@^6.0.0: debug "^4.3.3" socks "^2.6.2" -socks@^2.6.2, socks@^2.7.1: +socks@^2.6.2: version "2.7.1" resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== @@ -9637,7 +9890,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -9800,12 +10053,12 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" -tr46@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" - integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== +tr46@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" + integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== dependencies: - punycode "^2.1.1" + punycode "^2.3.0" tr46@~0.0.3: version "0.0.3" @@ -9846,10 +10099,10 @@ tslib@^1.11.1, tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@^2.0.3, tslib@^2.3.1, tslib@^2.5.0, tslib@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tsutils@^3.21.0: version "3.21.0" @@ -10183,12 +10436,12 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" - integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== +whatwg-url@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-13.0.0.tgz#b7b536aca48306394a34e44bda8e99f332410f8f" + integrity sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig== dependencies: - tr46 "^3.0.0" + tr46 "^4.1.1" webidl-conversions "^7.0.0" whatwg-url@^5.0.0: @@ -10275,10 +10528,10 @@ wide-align@^1.1.2, wide-align@^1.1.5: dependencies: string-width "^1.0.2 || 2 || 3 || 4" -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0"