Repository: graphql-hive/console
Pull request #6574: feat(sdk): specify the usage target endpoint for organization access tokens
Author: login: n1ru4l
Created: 2025-03-04T03:18:43Z | Merged: 2025-03-06T02:47:59Z

### Background

With the new organization access tokens, we need to specify the endpoint of the target. Previously we could read the target from the target access token.

https://linear.app/the-guild/issue/CONSOLE-1055/support-organization-access-tokens-within-the-hive-sdks

### Description

Adds support for specifying the target endpoint introduced within https://github.com/graphql-hive/console/pull/6538.

### Checklist

<!---
We are following the OWASP Secure Coding Practices for develpoing Hive. You can find the complete guide here:
https://owasp.org/www-pdf-archive/OWASP_SCP_Quick_Reference_Guide_v2.pdf

Please use this checklist to ensure your PR quality before proceeding.
You may remove unnecessary checks from this list, if it's not relevant to your changes.
--->

- [x] Testing



Diff:
diff --git a/.changeset/five-stingrays-search.md b/.changeset/five-stingrays-search.md
new file mode 100644
index 00000000000..f2f1ed7bf4f
--- /dev/null
+++ b/.changeset/five-stingrays-search.md
@@ -0,0 +1,19 @@
+---
+'@graphql-hive/envelop': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format `$organizationSlug/$projectSlug/$targetSlug` (e.g `the-guild/graphql-hive/staging`)
+or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
+
+```ts
+import { useHive } from '@graphql-hive/envelop';
+
+const hivePlugin = useHive({
+  enabled: true,
+  token: "ORGANIZATION_ACCESS_TOKEN",
+  usage: {
+    target: "my-org/my-project/my-target"
+  }
+})
+```
diff --git a/.changeset/good-rocks-appear.md b/.changeset/good-rocks-appear.md
new file mode 100644
index 00000000000..86e22d7889e
--- /dev/null
+++ b/.changeset/good-rocks-appear.md
@@ -0,0 +1,19 @@
+---
+'@graphql-hive/core': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format `$organizationSlug/$projectSlug/$targetSlug` (e.g `the-guild/graphql-hive/staging`)
+or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
+
+```ts
+import { createHive } from '@graphql-hive/core';
+
+const hive = createHive({
+  enabled: true,
+  token: "ORGANIZATION_ACCESS_TOKEN",
+  usage: {
+    target: "my-org/my-project/my-target"
+  }
+})
+```
diff --git a/.changeset/rotten-hairs-pay.md b/.changeset/rotten-hairs-pay.md
new file mode 100644
index 00000000000..b7419867c2a
--- /dev/null
+++ b/.changeset/rotten-hairs-pay.md
@@ -0,0 +1,19 @@
+---
+'@graphql-hive/yoga': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format `$organizationSlug/$projectSlug/$targetSlug` (e.g `the-guild/graphql-hive/staging`)
+or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
+
+```ts
+import { useHive } from '@graphql-hive/yoga';
+
+const hivePlugin = useHive({
+  enabled: true,
+  token: "ORGANIZATION_ACCESS_TOKEN",
+  usage: {
+    target: "my-org/my-project/my-target"
+  }
+})
+```
diff --git a/.changeset/tame-paws-float.md b/.changeset/tame-paws-float.md
new file mode 100644
index 00000000000..d84fe7c62ba
--- /dev/null
+++ b/.changeset/tame-paws-float.md
@@ -0,0 +1,19 @@
+---
+'@graphql-hive/apollo': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format `$organizationSlug/$projectSlug/$targetSlug` (e.g `the-guild/graphql-hive/staging`)
+or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
+
+```ts
+import { useHive } from '@graphql-hive/apollo'
+
+const hivePlugin = useHive({
+  enabled: true,
+  token: "ORGANIZATION_ACCESS_TOKEN",
+  usage: {
+    target: "my-org/my-project/my-target"
+  }
+})
+```
diff --git a/deployment/services/graphql.ts b/deployment/services/graphql.ts
index dfb4abaec84..29a08390dbc 100644
--- a/deployment/services/graphql.ts
+++ b/deployment/services/graphql.ts
@@ -118,7 +118,7 @@ export function deployGraphQL({
           ...environment.envVars,
           ...apiEnv,
           SENTRY: sentry.enabled ? '1' : '0',
-          REQUEST_LOGGING: '0', // disabled
+          REQUEST_LOGGING: '1', // disabled
           COMMERCE_ENDPOINT: serviceLocalEndpoint(commerce.service),
           TOKENS_ENDPOINT: serviceLocalEndpoint(tokens.service),
           WEBHOOKS_ENDPOINT: serviceLocalEndpoint(webhooks.service),
diff --git a/packages/libraries/core/src/client/types.ts b/packages/libraries/core/src/client/types.ts
index 1158dd3bf59..8bb92efdc47 100644
--- a/packages/libraries/core/src/client/types.ts
+++ b/packages/libraries/core/src/client/types.ts
@@ -73,6 +73,12 @@ export interface Logger {
 }
 
 export interface HiveUsagePluginOptions {
+  /**
+   * The target to which the usage data should be reported to.
+   * This can either be a slug following the format `$organizationSlug/$projectSlug/$targetSlug` (e.g `the-guild/graphql-hive/staging`)
+   * or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`).
+   */
+  target?: string;
   /**
    * Custom endpoint to collect schema usage
    *
diff --git a/packages/libraries/core/src/client/usage.ts b/packages/libraries/core/src/client/usage.ts
index 4d4454b60a7..ebe25580775 100644
--- a/packages/libraries/core/src/client/usage.ts
+++ b/packages/libraries/core/src/client/usage.ts
@@ -75,16 +75,18 @@ export function createUsage(pluginOptions: HivePluginOptions): UsageCollector {
   const collector = memo(createCollector, arg => arg.schema);
   const excludeSet = new Set(options.exclude ?? []);
 
+  const baseEndpoint =
+    selfHostingOptions?.usageEndpoint ?? options.endpoint ?? 'https://app.graphql-hive.com/usage';
+
+  const endpoint = baseEndpoint + (options?.target ? `/${options.target}` : '');
+
   const agent = createAgent<AgentAction>(
     {
       ...(pluginOptions.agent ?? {
         maxSize: 1500,
       }),
       logger,
-      endpoint:
-        selfHostingOptions?.usageEndpoint ??
-        options.endpoint ??
-        'https://app.graphql-hive.com/usage',
+      endpoint,
       token: pluginOptions.token,
       enabled: pluginOptions.enabled,
       debug: pluginOptions.debug,
diff --git a/packages/libraries/core/tests/usage.spec.ts b/packages/libraries/core/tests/usage.spec.ts
index 4bbac7edb00..a4a35470194 100644
--- a/packages/libraries/core/tests/usage.spec.ts
+++ b/packages/libraries/core/tests/usage.spec.ts
@@ -747,3 +747,49 @@ test('retry on non-200', async () => {
     [INF] [hive][usage] Disposing
   `);
 });
+
+test('constructs URL with usage.target', async ({ expect }) => {
+  const logger = createHiveTestingLogger();
+  const token = 'Token';
+  const dUrl = Promise.withResolvers<string>();
+
+  const hive = createHive({
+    enabled: true,
+    debug: true,
+    agent: {
+      timeout: 500,
+      maxRetries: 0,
+      sendInterval: 1,
+      maxSize: 1,
+      async fetch(url) {
+        dUrl.resolve(url.toString());
+        return new Response('', {
+          status: 200,
+        });
+      },
+      logger,
+    },
+    token,
+    selfHosting: {
+      graphqlEndpoint: 'http://localhost:2/graphql',
+      applicationUrl: 'http://localhost:1',
+      usageEndpoint: 'http://localhost',
+    },
+    usage: {
+      target: 'the-guild/graphql-hive/staging',
+    },
+  });
+
+  await hive.collectUsage()(
+    {
+      schema,
+      document: op,
+      operationName: 'asd',
+    },
+    {},
+  );
+
+  const url = await dUrl.promise;
+  expect(url).toEqual('http://localhost/the-guild/graphql-hive/staging');
+  await hive.dispose();
+});


Reviews:
user: login: dotansimha
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-04T07:34:24Z
user: login: dotansimha
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-04T07:34:45Z
user: login: dotansimha
state: APPROVED
author_association: MEMBER
submitted_at: 2025-03-04T07:35:09Z
user: login: dotansimha
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-04T07:35:29Z
user: login: jdolle
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-04T23:20:22Z
user: login: n1ru4l
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-05T02:21:18Z
user: login: n1ru4l
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-05T02:22:02Z
user: login: n1ru4l
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-05T02:22:10Z
user: login: n1ru4l
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-05T02:22:24Z
user: login: n1ru4l
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-05T02:22:35Z
user: login: n1ru4l
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-05T02:22:47Z
user: login: n1ru4l
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-05T02:22:55Z
user: login: n1ru4l
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-05T02:23:08Z
user: login: n1ru4l
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-05T02:23:15Z
user: login: n1ru4l
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-05T02:23:38Z
user: login: github-advanced-security[bot]
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-05T02:41:28Z
user: login: n1ru4l
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T01:44:07Z
user: login: n1ru4l
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T01:45:56Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>🧹 Nitpick comments (4)</summary><blockquote>

<details>
<summary>.changeset/good-rocks-appear.md (1)</summary><blockquote>

`1-20`: **LGTM! Documentation clearly explains the new functionality**

The changeset properly documents the new feature for specifying targets in usage reporting and provides a helpful code example.



Small grammar correction needed:
```diff
-or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
+or a UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[misspelling] ~7-~7: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ....g `the-guild/graphql-hive/staging`) or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31...

(EN_A_VS_AN)

</details>

</details>

</blockquote></details>
<details>
<summary>packages/libraries/core/src/client/types.ts (1)</summary><blockquote>

`75-81`: **Great addition that enhances the API for organization access tokens**

The new `target` property is well-documented and properly integrated into the existing interface.



Small grammar correction needed in the JSDoc:
```diff
-   * or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`).
+   * or a UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`).
```

</blockquote></details>
<details>
<summary>.changeset/five-stingrays-search.md (1)</summary><blockquote>

`1-20`: **LGTM! Documentation consistently explains the feature across packages**

The changeset properly documents the same functionality for the @graphql-hive/envelop package and provides a matching code example.



Small grammar correction needed:
```diff
-or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
+or a UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[misspelling] ~7-~7: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ....g `the-guild/graphql-hive/staging`) or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31...

(EN_A_VS_AN)

</details>

</details>

</blockquote></details>
<details>
<summary>.changeset/rotten-hairs-pay.md (1)</summary><blockquote>

`7-7`: **Grammar correction needed**

Use "a UUID" instead of "an UUID" since UUID is pronounced with a consonant sound at the beginning (like "you-you-eye-dee").

```diff
-or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
+or a UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[misspelling] ~7-~7: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ....g `the-guild/graphql-hive/staging`) or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31...

(EN_A_VS_AN)

</details>

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 8c3413a207344c22317c4e0b46b0c4977ad483ca and daf6b2ea95d9ed3a4daae69339c2bce8527c7947.

</details>

<details>
<summary>📒 Files selected for processing (8)</summary>

* `.changeset/five-stingrays-search.md` (1 hunks)
* `.changeset/good-rocks-appear.md` (1 hunks)
* `.changeset/rotten-hairs-pay.md` (1 hunks)
* `.changeset/tame-paws-float.md` (1 hunks)
* `deployment/services/graphql.ts` (1 hunks)
* `packages/libraries/core/src/client/types.ts` (1 hunks)
* `packages/libraries/core/src/client/usage.ts` (1 hunks)
* `packages/libraries/core/tests/usage.spec.ts` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Path-based instructions (3)</summary>

<details>
<summary>`.changeset/**`: A special folder with the files created/man...</summary>

> `.changeset/**`: A special folder with the files created/managed by Changesets tool. 
> In PRs that already includes this file, please make sure that the content of the markdown file includes:
> - Full description of the change
> - A link to the relevant GitHub issues (if any) 
> - Example with before/after 
> - If the change is of type `major`, please ensure that the content have content about migration with before/after. 

- `.changeset/good-rocks-appear.md`
- `.changeset/five-stingrays-search.md`
- `.changeset/tame-paws-float.md`
- `.changeset/rotten-hairs-pay.md`

</details>
<details>
<summary>`deployment/**`: infrastructure-as-code written in TypeScrip...</summary>

> `deployment/**`: infrastructure-as-code written in TypeScript using Pulumi. Deploys resources to CloudFlare, Azure, AWS. 

- `deployment/services/graphql.ts`

</details>
<details>
<summary>`packages/libraries/**`: Most of the dirs here are NPM packa...</summary>

> `packages/libraries/**`: Most of the dirs here are NPM packages that provides our customers an integration library, in order to get/fetch data from Hive Console API or Hive CDN.  

- `packages/libraries/core/tests/usage.spec.ts`
- `packages/libraries/core/src/client/types.ts`
- `packages/libraries/core/src/client/usage.ts`

</details>

</details><details>
<summary>🪛 LanguageTool</summary>

<details>
<summary>.changeset/good-rocks-appear.md</summary>

[misspelling] ~7-~7: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ....g `the-guild/graphql-hive/staging`) or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31...

(EN_A_VS_AN)

</details>
<details>
<summary>.changeset/five-stingrays-search.md</summary>

[misspelling] ~7-~7: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ....g `the-guild/graphql-hive/staging`) or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31...

(EN_A_VS_AN)

</details>
<details>
<summary>.changeset/tame-paws-float.md</summary>

[misspelling] ~7-~7: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ....g `the-guild/graphql-hive/staging`) or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31...

(EN_A_VS_AN)

</details>
<details>
<summary>.changeset/rotten-hairs-pay.md</summary>

[misspelling] ~7-~7: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ....g `the-guild/graphql-hive/staging`) or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31...

(EN_A_VS_AN)

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (10)</summary>

* GitHub Check: alpha / npm / snapshot
* GitHub Check: alpha / cli-artifacts
* GitHub Check: typescript / typecheck
* GitHub Check: static-analysis / analyze (typescript)
* GitHub Check: static-analysis / analyze (javascript)
* GitHub Check: test / unit
* GitHub Check: build / dockerize (linux/arm64)
* GitHub Check: code-style / eslint-and-prettier
* GitHub Check: build / dockerize (linux/amd64)
* GitHub Check: Mend Security Check

</details>

<details>
<summary>🔇 Additional comments (8)</summary><blockquote>

<details>
<summary>.changeset/rotten-hairs-pay.md (2)</summary>

`5-7`: **The usage target documentation looks good**

This changeset clearly explains the new feature for specifying a target for usage reporting with organization access tokens and provides good examples of the supported formats.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[misspelling] ~7-~7: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ....g `the-guild/graphql-hive/staging`) or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31...

(EN_A_VS_AN)

</details>

</details>

---

`9-19`: **Example looks good**

The code example clearly demonstrates how to use the new target property within the usage configuration object.

</details>
<details>
<summary>.changeset/tame-paws-float.md (3)</summary>

`5-7`: **The usage target documentation looks good**

This changeset clearly explains the new feature for specifying a target for usage reporting with organization access tokens and provides good examples of the supported formats.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[misspelling] ~7-~7: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ....g `the-guild/graphql-hive/staging`) or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31...

(EN_A_VS_AN)

</details>

</details>

---

`7-7`: **Grammar correction needed**

Use "a UUID" instead of "an UUID" since UUID is pronounced with a consonant sound at the beginning (like "you-you-eye-dee").


```diff
-or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
+or a UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[misspelling] ~7-~7: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ....g `the-guild/graphql-hive/staging`) or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31...

(EN_A_VS_AN)

</details>

</details>

---

`9-19`: **Example looks good**

The code example clearly demonstrates how to use the new target property within the usage configuration object.

</details>
<details>
<summary>packages/libraries/core/tests/usage.spec.ts (1)</summary>

`751-795`: **Test coverage for the new feature looks good**

This test correctly verifies that the URL is properly constructed when a `usage.target` is specified. It ensures that the implementation correctly appends the target to the base URL.

</details>
<details>
<summary>packages/libraries/core/src/client/usage.ts (2)</summary>

`78-82`: **Clean implementation of endpoint construction**

The refactoring of the endpoint URL construction is well done. It separates the base endpoint determination from the target appending logic, making the code more readable and maintainable.

---

`89-89`: **Proper usage of the constructed endpoint**

The constructed endpoint is correctly used in the agent creation.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T01:55:16Z

Review comments:
diff_hunk: @@ -0,0 +1,19 @@
+---
+'@graphql-hive/envelop': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format "$organizationSlug/$projectSlug/$targetSlug" (e.g "the-guild/graphql-hive/staging")
path: .changeset/five-stingrays-search.md
user: login: dotansimha
body: nit: format with `code` instead of "code". 

created_at: 2025-03-04T07:34:24Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,19 @@
+---
+'@graphql-hive/envelop': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format "$organizationSlug/$projectSlug/$targetSlug" (e.g "the-guild/graphql-hive/staging")
+or an UUID (e.g. "a0f4c605-6541-4350-8cfe-b31f21a4bf80")
path: .changeset/five-stingrays-search.md
user: login: dotansimha
body: I think at the moment we do not show this ID to the user, should we create a followup PR to add that somewhere in the dashboard? 
created_at: 2025-03-04T07:34:45Z
author_association: MEMBER
diff_hunk: @@ -75,16 +75,18 @@ export function createUsage(pluginOptions: HivePluginOptions): UsageCollector {
   const collector = memo(createCollector, arg => arg.schema);
   const excludeSet = new Set(options.exclude ?? []);
 
+  const baseEndpoint =
path: packages/libraries/core/src/client/usage.ts
user: login: dotansimha
body: this needs tests? 
created_at: 2025-03-04T07:35:29Z
author_association: MEMBER
diff_hunk: @@ -75,16 +75,18 @@ export function createUsage(pluginOptions: HivePluginOptions): UsageCollector {
   const collector = memo(createCollector, arg => arg.schema);
   const excludeSet = new Set(options.exclude ?? []);
 
+  const baseEndpoint =
+    selfHostingOptions?.usageEndpoint ?? options.endpoint ?? 'https://app.graphql-hive.com/usage';
path: packages/libraries/core/src/client/usage.ts
user: login: jdolle
body: Is it possible for someone to enter an endpoint with a `/` at the end? Should we attempt cleaning up the path before appending?
created_at: 2025-03-04T23:20:22Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,19 @@
+---
+'@graphql-hive/envelop': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format "$organizationSlug/$projectSlug/$targetSlug" (e.g "the-guild/graphql-hive/staging")
+or an UUID (e.g. "a0f4c605-6541-4350-8cfe-b31f21a4bf80")
path: .changeset/five-stingrays-search.md
user: login: n1ru4l
body: we already have it https://github.com/graphql-hive/console/issues/6466
created_at: 2025-03-05T02:21:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,19 @@
+---
+'@graphql-hive/envelop': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format "$organizationSlug/$projectSlug/$targetSlug" (e.g "the-guild/graphql-hive/staging")
path: .changeset/five-stingrays-search.md
user: login: n1ru4l
body: ```suggestion
This can either be a slug following the format `$organizationSlug/$projectSlug/$targetSlug` (e.g `the-guild/graphql-hive/staging`)
```
created_at: 2025-03-05T02:22:01Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,19 @@
+---
+'@graphql-hive/envelop': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format "$organizationSlug/$projectSlug/$targetSlug" (e.g "the-guild/graphql-hive/staging")
+or an UUID (e.g. "a0f4c605-6541-4350-8cfe-b31f21a4bf80")
path: .changeset/five-stingrays-search.md
user: login: n1ru4l
body: ```suggestion
or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
```
created_at: 2025-03-05T02:22:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,19 @@
+---
+'@graphql-hive/core': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format "$organizationSlug/$projectSlug/$targetSlug" (e.g "the-guild/graphql-hive/staging")
path: .changeset/good-rocks-appear.md
user: login: n1ru4l
body: ```suggestion
This can either be a slug following the format `$organizationSlug/$projectSlug/$targetSlug` (e.g `the-guild/graphql-hive/staging`)
```
created_at: 2025-03-05T02:22:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,19 @@
+---
+'@graphql-hive/core': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format "$organizationSlug/$projectSlug/$targetSlug" (e.g "the-guild/graphql-hive/staging")
+or an UUID (e.g. "a0f4c605-6541-4350-8cfe-b31f21a4bf80")
path: .changeset/good-rocks-appear.md
user: login: n1ru4l
body: ```suggestion
or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
```
created_at: 2025-03-05T02:22:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,19 @@
+---
+'@graphql-hive/yoga': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format "$organizationSlug/$projectSlug/$targetSlug" (e.g "the-guild/graphql-hive/staging")
path: .changeset/rotten-hairs-pay.md
user: login: n1ru4l
body: ```suggestion
This can either be a slug following the format `$organizationSlug/$projectSlug/$targetSlug` (e.g `the-guild/graphql-hive/staging`)
```
created_at: 2025-03-05T02:22:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,19 @@
+---
+'@graphql-hive/yoga': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format "$organizationSlug/$projectSlug/$targetSlug" (e.g "the-guild/graphql-hive/staging")
+or an UUID (e.g. "a0f4c605-6541-4350-8cfe-b31f21a4bf80")
path: .changeset/rotten-hairs-pay.md
user: login: n1ru4l
body: ```suggestion
or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
```
created_at: 2025-03-05T02:22:55Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,19 @@
+---
+'@graphql-hive/apollo': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format "$organizationSlug/$projectSlug/$targetSlug" (e.g "the-guild/graphql-hive/staging")
path: .changeset/tame-paws-float.md
user: login: n1ru4l
body: ```suggestion
This can either be a slug following the format `$organizationSlug/$projectSlug/$targetSlug` (e.g `the-guild/graphql-hive/staging`)
```
created_at: 2025-03-05T02:23:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,19 @@
+---
+'@graphql-hive/apollo': minor
+---
+
+Add support for providing a target for usage reporting with organization access tokens.
+This can either be a slug following the format "$organizationSlug/$projectSlug/$targetSlug" (e.g "the-guild/graphql-hive/staging")
+or an UUID (e.g. "a0f4c605-6541-4350-8cfe-b31f21a4bf80")
path: .changeset/tame-paws-float.md
user: login: n1ru4l
body: ```suggestion
or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`)
```
created_at: 2025-03-05T02:23:15Z
author_association: CONTRIBUTOR
diff_hunk: @@ -73,6 +73,12 @@ export interface Logger {
 }
 
 export interface HiveUsagePluginOptions {
+  /**
+   * The target to which the usage data should be reported to.
+   * This can either be a slug following the format "$organizationSlug/$projectSlug/$targetSlug" (e.g "the-guild/graphql-hive/staging")
+   * or an UUID (e.g. "a0f4c605-6541-4350-8cfe-b31f21a4bf80").
path: packages/libraries/core/src/client/types.ts
user: login: n1ru4l
body: ```suggestion
   * This can either be a slug following the format `$organizationSlug/$projectSlug/$targetSlug` (e.g `the-guild/graphql-hive/staging`)
   * or an UUID (e.g. `a0f4c605-6541-4350-8cfe-b31f21a4bf80`).
```
created_at: 2025-03-05T02:23:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -747,3 +747,49 @@
     [INF] [hive][usage] Disposing
   `);
 });
+
+test('constructs URL with usage.target', async ({ expect }) => {
+  const logger = createHiveTestingLogger();
+  const token = 'Token';
path: packages/libraries/core/tests/usage.spec.ts
user: login: github-advanced-security[bot]
body: ## Hard-coded credentials

The hard-coded value "Token" is used as [authorization header](1).

[Show more details](https://github.com/graphql-hive/console/security/code-scanning/224)
created_at: 2025-03-05T02:41:27Z
author_association: NONE
diff_hunk: @@ -75,16 +75,18 @@ export function createUsage(pluginOptions: HivePluginOptions): UsageCollector {
   const collector = memo(createCollector, arg => arg.schema);
   const excludeSet = new Set(options.exclude ?? []);
 
+  const baseEndpoint =
path: packages/libraries/core/src/client/usage.ts
user: login: n1ru4l
body: done!
created_at: 2025-03-06T01:44:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -75,16 +75,18 @@ export function createUsage(pluginOptions: HivePluginOptions): UsageCollector {
   const collector = memo(createCollector, arg => arg.schema);
   const excludeSet = new Set(options.exclude ?? []);
 
+  const baseEndpoint =
+    selfHostingOptions?.usageEndpoint ?? options.endpoint ?? 'https://app.graphql-hive.com/usage';
path: packages/libraries/core/src/client/usage.ts
user: login: n1ru4l
body: Hmm, I would treat this as a user error and not be to smart about trying to auto-fix it. Thinking more about it self-hosters could have their usage behind a custom proxy that requires a trailing `/` at the end (not a big argument tho).
created_at: 2025-03-06T01:45:56Z
author_association: CONTRIBUTOR
diff_hunk: @@ -118,7 +118,7 @@ export function deployGraphQL({
           ...environment.envVars,
           ...apiEnv,
           SENTRY: sentry.enabled ? '1' : '0',
-          REQUEST_LOGGING: '0', // disabled
+          REQUEST_LOGGING: '1', // disabled
path: deployment/services/graphql.ts
user: login: coderabbitai[bot]
body: _💡 Verification agent_

<details>
<summary>🧩 Analysis chain</summary>

**Code comment does not match actual configuration**

The `REQUEST_LOGGING` is set to `'1'` which typically enables logging, but the comment says "disabled". This inconsistency might lead to confusion.

---

🏁 Script executed:

```shell
#!/bin/bash
# Check if there's any documentation or other instances of REQUEST_LOGGING to understand the intended behavior

rg -A 1 -B 1 "REQUEST_LOGGING" --no-filename
```

Length of output: 7534

---



</details>

**Update Inline Comment for REQUEST_LOGGING**

- The inline comment on line 121 currently reads “disabled,” but as defined throughout the code and documented in the configuration details, a value of `'1'` means request logging is enabled.
- Please update the comment to either correctly state “enabled” (i.e., `REQUEST_LOGGING: '1', // enabled`) or remove it if it’s no longer necessary to avoid confusion.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-06T01:55:16Z
author_association: CONTRIBUTOR

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-03-04T03:18:50Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

<details>
<summary>📝 Walkthrough</summary>

## Summary by CodeRabbit

- **New Features**
  - Enhanced usage reporting across integrations: you can now specify a target identifier (using a formatted slug or UUID) to gather more granular metrics.
  - Enabled request logging in GraphQL deployments to improve tracking of API activity.
## Walkthrough
This pull request adds support for specifying a target when reporting usage in several GraphQL Hive packages. The changes allow configuration of a target using either a slug (formatted as `$organizationSlug/$projectSlug/$targetSlug`) or a UUID. Updates include modifications to usage configuration in the `@graphql-hive/envelop`, `@graphql-hive/core`, `@graphql-hive/yoga`, and `@graphql-hive/apollo` packages, as well as refactoring how the endpoint URL is constructed to incorporate the target setting. An additional test verifies URL construction, and the deployment configuration now sets `REQUEST_LOGGING` to `'1'`.

## Changes

| File(s) | Change Summary |
|---------|----------------|
| `.changeset/five-stingrays-search.md`<br>`.changeset/good-rocks-appear.md`<br>`.changeset/rotten-hairs-pay.md`<br>`.changeset/tame-paws-float.md` | Added support for usage reporting with target specification in various packages, enabling target configuration via a slug or UUID through the usage configuration. |
| `deployment/.../graphql.ts` | Updated the `REQUEST_LOGGING` environment variable from `'0'` to `'1'`, altering the logging behavior in the GraphQL deployment. |
| `packages/libraries/.../client/types.ts` | Added a new optional `target?: string;` property to the `HiveUsagePluginOptions` interface to support target specification. |
| `packages/libraries/.../client/usage.ts` | Refactored the `createUsage` function to construct the endpoint URL by first determining a base endpoint and then appending the target if provided. |
| `packages/libraries/.../tests/usage.spec.ts` | Introduced a new test case to verify that URLs are correctly constructed when `usage.target` is specified. |

## Sequence Diagram(s)
```mermaid
sequenceDiagram
    participant Dev as Developer
    participant Config as Usage Config
    participant Usage as Usage Module
    participant Agent as Usage Agent

    Dev->>Config: Initialize usage reporting with target (slug/UUID)
    Config->>Usage: Provide configuration (including target)
    Usage->>Usage: Determine baseEndpoint (selfHostingOptions or default)
    Usage->>Usage: Append target to baseEndpoint if provided
    Usage->>Agent: Call createAgent(endpoint)
    Agent-->>Usage: Acknowledge usage reporting setup
```

## Possibly related PRs
- **graphql-hive/console#6463**: Introduced a `--target` flag for various commands in the `@graphql-hive/cli` package, which aligns with the target usage reporting enhancements implemented in this PR.

</details>

<!-- walkthrough_end -->

<!-- This is an auto-generated comment: resource warnings by coderabbit.ai -->

> [!WARNING]
> ## Review ran into problems
> 
> <details>
> <summary>🔥 Problems</summary>
> 
> Errors were encountered while retrieving linked issues.
> 
> <details>
> <summary>Errors (1)</summary>
> 
> * CONSOLE-1055: Authentication required, not authenticated - You need to authenticate to access this operation.
> 
> </details>
> 
> </details>

<!-- end of auto-generated comment: resource warnings by coderabbit.ai -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=graphql-hive/console&utm_content=6574):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-03-04T03:21:05Z
body: <!-- changesetsSnapshotPrCommentKey -->
### 🚀 Snapshot Release (`alpha`)

The latest changes of this PR are available as `alpha` on npm (based on the declared `changesets`):
| Package | Version | Info |
|------|---------|----|
| `@graphql-hive/apollo` | `0.38.0-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a` | [npm ↗︎](https://www.npmjs.com/package/@graphql-hive/apollo/v/0.38.0-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a) [unpkg ↗︎](https://unpkg.com/browse/@graphql-hive/apollo@0.38.0-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a/) |
| `@graphql-hive/cli` | `0.48.4-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a` | [npm ↗︎](https://www.npmjs.com/package/@graphql-hive/cli/v/0.48.4-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a) [unpkg ↗︎](https://unpkg.com/browse/@graphql-hive/cli@0.48.4-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a/) |
| `@graphql-hive/core` | `0.10.0-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a` | [npm ↗︎](https://www.npmjs.com/package/@graphql-hive/core/v/0.10.0-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a) [unpkg ↗︎](https://unpkg.com/browse/@graphql-hive/core@0.10.0-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a/) |
| `@graphql-hive/envelop` | `0.35.0-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a` | [npm ↗︎](https://www.npmjs.com/package/@graphql-hive/envelop/v/0.35.0-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a) [unpkg ↗︎](https://unpkg.com/browse/@graphql-hive/envelop@0.35.0-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a/) |
| `@graphql-hive/yoga` | `0.41.0-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a` | [npm ↗︎](https://www.npmjs.com/package/@graphql-hive/yoga/v/0.41.0-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a) [unpkg ↗︎](https://unpkg.com/browse/@graphql-hive/yoga@0.41.0-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a/) |
| `hive` | `5.1.3-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a` | [npm ↗︎](https://www.npmjs.com/package/hive/v/5.1.3-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a) [unpkg ↗︎](https://unpkg.com/browse/hive@5.1.3-alpha-20250306021754-4a9f179e950a5f847a331ed7cd563c66f942a23a/) |
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-03-04T03:27:19Z
body: 🐋 This PR was built and pushed to the following [Docker images](https://github.com/graphql-hive?ecosystem=container&tab=packages&visibility=public):

**Targets**: `build`

**Platforms**: `linux/amd64`

**Image Tag**: `4a9f179e950a5f847a331ed7cd563c66f942a23a`

<details>
  <summary>Docker Bake metadata</summary>
  
  ```json
  {
  "app": {
    "buildx.build.provenance": {
      "buildType": "https://mobyproject.org/buildkit@v1",
      "materials": [
        {
          "uri": "pkg:docker/node@22.13.0-slim?platform=linux%2Famd64",
          "digest": {
            "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
          }
        }
      ],
      "invocation": {
        "configSource": {
          "entryPoint": "services.dockerfile"
        },
        "parameters": {
          "frontend": "dockerfile.v0",
          "args": {
            "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/api/health",
            "build-arg:IMAGE_DESCRIPTION": "The app of the GraphQL Hive project.",
            "build-arg:IMAGE_TITLE": "graphql-hive/app",
            "build-arg:PORT": "3000",
            "build-arg:RELEASE": "4a9f179e950a5f847a331ed7cd563c66f942a23a",
            "build-arg:SERVICE_DIR_NAME": "@hive/app",
            "context:dist": "local:dist",
            "context:shared": "local:shared",
            "frontend.caps": "moby.buildkit.frontend.contexts+forward",
            "local-sessionid:context": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:dockerfile": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:shared": "lk85shawxdo7sybtk5y4ieuxp"
          },
          "locals": [
            {
              "name": "context"
            },
            {
              "name": "dist"
            },
            {
              "name": "dockerfile"
            },
            {
              "name": "shared"
            }
          ]
        },
        "environment": {
          "platform": "linux/amd64"
        }
      }
    },
    "buildx.build.ref": "builder-da02ba2f-266f-489b-b194-94669de13417/builder-da02ba2f-266f-489b-b194-94669de134170/okdajzpewaheawnyzgdzwdi1u",
    "containerimage.config.digest": "sha256:4edb5a5bafddfc8ebe3464ce1e3b31f4432cb65900eb2153c8438de47d931fe6",
    "containerimage.descriptor": {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "digest": "sha256:89618675f37b7c129ec3216b6fd9ab21e10408c463546c4d592198a32299d634",
      "size": 2075,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    "containerimage.digest": "sha256:89618675f37b7c129ec3216b6fd9ab21e10408c463546c4d592198a32299d634",
    "image.name": "ghcr.io/graphql-hive/app:4a9f179e950a5f847a331ed7cd563c66f942a23a-amd64,ghcr.io/graphql-hive/app:feat_usage_reporting_sdk_support-amd64"
  },
  "buildx.build.warnings": [
    {
      "vertex": "sha256:43e5c4ab6923dc00e1d8ed4a4d608be3f9c124ba7146672952613efae0a94a15",
      "level": 1,
      "short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDEwKQ==",
      "detail": [
        "TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
      "sourceInfo": {
        "filename": "migrations.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBjYS1jZXJ0aWZpY2F0ZXMKCldPUktESVIgL3Vzci9zcmMvYXBwCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgTk9ERV9FTlYgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQoKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmxpY2Vuc2VzPU1JVApMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKCkVOVFJZUE9JTlQgWyAiL2VudHJ5cG9pbnQuc2giIF0K",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 10
          },
          "end": {
            "line": 10
          }
        }
      ]
    },
    {
      "vertex": "sha256:43e5c4ab6923dc00e1d8ed4a4d608be3f9c124ba7146672952613efae0a94a15",
      "level": 1,
      "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRJTUFHRV9USVRMRScgKGxpbmUgMTUp",
      "detail": [
        "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
      "sourceInfo": {
        "filename": "migrations.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBjYS1jZXJ0aWZpY2F0ZXMKCldPUktESVIgL3Vzci9zcmMvYXBwCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgTk9ERV9FTlYgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQoKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmxpY2Vuc2VzPU1JVApMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKCkVOVFJZUE9JTlQgWyAiL2VudHJ5cG9pbnQuc2giIF0K",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 15
          },
          "end": {
            "line": 15
          }
        }
      ]
    },
    {
      "vertex": "sha256:43e5c4ab6923dc00e1d8ed4a4d608be3f9c124ba7146672952613efae0a94a15",
      "level": 1,
      "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRJTUFHRV9ERVNDUklQVElPTicgKGxpbmUgMTcp",
      "detail": [
        "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
      "sourceInfo": {
        "filename": "migrations.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBjYS1jZXJ0aWZpY2F0ZXMKCldPUktESVIgL3Vzci9zcmMvYXBwCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgTk9ERV9FTlYgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQoKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmxpY2Vuc2VzPU1JVApMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKCkVOVFJZUE9JTlQgWyAiL2VudHJ5cG9pbnQuc2giIF0K",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 17
          },
          "end": {
            "line": 17
          }
        }
      ]
    },
    {
      "vertex": "sha256:3be62f0c162767057efbca7b03c55174f4e4ebfb5fefac342685c5ebc90b9c16",
      "level": 1,
      "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRJTUFHRV9USVRMRScgKGxpbmUgMTIp",
      "detail": [
        "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
      "sourceInfo": {
        "filename": "services.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 12
          },
          "end": {
            "line": 12
          }
        }
      ]
    },
    {
      "vertex": "sha256:3be62f0c162767057efbca7b03c55174f4e4ebfb5fefac342685c5ebc90b9c16",
      "level": 1,
      "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRSRUxFQVNFJyAobGluZSAyMSk=",
      "detail": [
        "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
      "sourceInfo": {
        "filename": "services.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 21
          },
          "end": {
            "line": 21
          }
        }
      ]
    },
    {
      "vertex": "sha256:43e5c4ab6923dc00e1d8ed4a4d608be3f9c124ba7146672952613efae0a94a15",
      "level": 1,
      "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRSRUxFQVNFJyAobGluZSAxMik=",
      "detail": [
        "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
      "sourceInfo": {
        "filename": "migrations.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBjYS1jZXJ0aWZpY2F0ZXMKCldPUktESVIgL3Vzci9zcmMvYXBwCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgTk9ERV9FTlYgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQoKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmxpY2Vuc2VzPU1JVApMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKCkVOVFJZUE9JTlQgWyAiL2VudHJ5cG9pbnQuc2giIF0K",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 12
          },
          "end": {
            "line": 12
          }
        }
      ]
    },
    {
      "vertex": "sha256:3be62f0c162767057efbca7b03c55174f4e4ebfb5fefac342685c5ebc90b9c16",
      "level": 1,
      "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRQT1JUJyAobGluZSAyMik=",
      "detail": [
        "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
      "sourceInfo": {
        "filename": "services.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 22
          },
          "end": {
            "line": 22
          }
        }
      ]
    },
    {
      "vertex": "sha256:3be62f0c162767057efbca7b03c55174f4e4ebfb5fefac342685c5ebc90b9c16",
      "level": 1,
      "short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDIyKQ==",
      "detail": [
        "TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
      "sourceInfo": {
        "filename": "services.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 22
          },
          "end": {
            "line": 22
          }
        }
      ]
    },
    {
      "vertex": "sha256:43e5c4ab6923dc00e1d8ed4a4d608be3f9c124ba7146672952613efae0a94a15",
      "level": 1,
      "short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDExKQ==",
      "detail": [
        "TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
      "sourceInfo": {
        "filename": "migrations.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBjYS1jZXJ0aWZpY2F0ZXMKCldPUktESVIgL3Vzci9zcmMvYXBwCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgTk9ERV9FTlYgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQoKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmxpY2Vuc2VzPU1JVApMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKCkVOVFJZUE9JTlQgWyAiL2VudHJ5cG9pbnQuc2giIF0K",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 11
          },
          "end": {
            "line": 11
          }
        }
      ]
    },
    {
      "vertex": "sha256:3be62f0c162767057efbca7b03c55174f4e4ebfb5fefac342685c5ebc90b9c16",
      "level": 1,
      "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRSRUxFQVNFJyAobGluZSAxMyk=",
      "detail": [
        "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
      "sourceInfo": {
        "filename": "services.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 13
          },
          "end": {
            "line": 13
          }
        }
      ]
    },
    {
      "vertex": "sha256:3be62f0c162767057efbca7b03c55174f4e4ebfb5fefac342685c5ebc90b9c16",
      "level": 1,
      "short": "VW5kZWZpbmVkVmFyOiBVc2FnZSBvZiB1bmRlZmluZWQgdmFyaWFibGUgJyRJTUFHRV9ERVNDUklQVElPTicgKGxpbmUgMTQp",
      "detail": [
        "VmFyaWFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGJlZm9yZSB0aGVpciB1c2U="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/undefined-var/",
      "sourceInfo": {
        "filename": "services.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 14
          },
          "end": {
            "line": 14
          }
        }
      ]
    },
    {
      "vertex": "sha256:3be62f0c162767057efbca7b03c55174f4e4ebfb5fefac342685c5ebc90b9c16",
      "level": 1,
      "short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDIxKQ==",
      "detail": [
        "TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
      "sourceInfo": {
        "filename": "services.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 21
          },
          "end": {
            "line": 21
          }
        }
      ]
    },
    {
      "vertex": "sha256:3be62f0c162767057efbca7b03c55174f4e4ebfb5fefac342685c5ebc90b9c16",
      "level": 1,
      "short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDIwKQ==",
      "detail": [
        "TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
      "sourceInfo": {
        "filename": "services.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSB3Z2V0IGNhLWNlcnRpZmljYXRlcyAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyoKCkFSRyBTRVJWSUNFX0RJUl9OQU1FCldPUktESVIgL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLyRTRVJWSUNFX0RJUl9OQU1FLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UubGljZW5zZXM9TUlUCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS50aXRsZT0kSU1BR0VfVElUTEUKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlcnNpb249JFJFTEVBU0UKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmRlc2NyaXB0aW9uPSRJTUFHRV9ERVNDUklQVElPTgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UuYXV0aG9ycz0iVGhlIEd1aWxkIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVuZG9yPSJLYW1pbCBLaXNpZWxhIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudXJsPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgpMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2Uuc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC1oaXZlL3BsYXRmb3JtIgoKRU5WIEVOVklST05NRU5UIHByb2R1Y3Rpb24KRU5WIFJFTEVBU0UgJFJFTEVBU0UKRU5WIFBPUlQgJFBPUlQKCkhFQUxUSENIRUNLIC0taW50ZXJ2YWw9NXMgXAogIC0tdGltZW91dD01cyBcCiAgLS1zdGFydC1wZXJpb2Q9NXMgXAogIC0tcmV0cmllcz02IFwKICBDTUQgJEhFQUxUSENIRUNLX0NNRAoKRU5UUllQT0lOVCBbICIvZW50cnlwb2ludC5zaCIgXQo=",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 20
          },
          "end": {
            "line": 20
          }
        }
      ]
    },
    {
      "vertex": "sha256:43e5c4ab6923dc00e1d8ed4a4d608be3f9c124ba7146672952613efae0a94a15",
      "level": 1,
      "short": "TGVnYWN5S2V5VmFsdWVGb3JtYXQ6ICJFTlYga2V5PXZhbHVlIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGxlZ2FjeSAiRU5WIGtleSB2YWx1ZSIgZm9ybWF0IChsaW5lIDEyKQ==",
      "detail": [
        "TGVnYWN5IGtleS92YWx1ZSBmb3JtYXQgd2l0aCB3aGl0ZXNwYWNlIHNlcGFyYXRvciBzaG91bGQgbm90IGJlIHVzZWQ="
      ],
      "url": "https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/",
      "sourceInfo": {
        "filename": "migrations.dockerfile",
        "data": "RlJPTSBub2RlOjIyLjEzLjAtc2xpbQoKUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBjYS1jZXJ0aWZpY2F0ZXMKCldPUktESVIgL3Vzci9zcmMvYXBwCgpDT1BZIC0tZnJvbT1kaXN0IC4gL3Vzci9zcmMvYXBwLwpDT1BZIC0tZnJvbT1zaGFyZWQgLiAvCgpFTlYgRU5WSVJPTk1FTlQgcHJvZHVjdGlvbgpFTlYgTk9ERV9FTlYgcHJvZHVjdGlvbgpFTlYgUkVMRUFTRSAkUkVMRUFTRQoKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmxpY2Vuc2VzPU1JVApMQUJFTCBvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudGl0bGU9JElNQUdFX1RJVExFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS52ZXJzaW9uPSRSRUxFQVNFCkxBQkVMIG9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5kZXNjcmlwdGlvbj0kSU1BR0VfREVTQ1JJUFRJT04KTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLmF1dGhvcnM9IlRoZSBHdWlsZCIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnZlbmRvcj0iS2FtaWwgS2lzaWVsYSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnVybD0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKTEFCRUwgb3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2dyYXBocWwtaGl2ZS9wbGF0Zm9ybSIKCkVOVFJZUE9JTlQgWyAiL2VudHJ5cG9pbnQuc2giIF0K",
        "language": "Dockerfile"
      },
      "range": [
        {
          "start": {
            "line": 12
          },
          "end": {
            "line": 12
          }
        }
      ]
    }
  ],
  "commerce": {
    "buildx.build.provenance": {
      "buildType": "https://mobyproject.org/buildkit@v1",
      "materials": [
        {
          "uri": "pkg:docker/node@22.13.0-slim?platform=linux%2Famd64",
          "digest": {
            "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
          }
        }
      ],
      "invocation": {
        "configSource": {
          "entryPoint": "services.dockerfile"
        },
        "parameters": {
          "frontend": "dockerfile.v0",
          "args": {
            "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
            "build-arg:IMAGE_DESCRIPTION": "The commerce service of the GraphQL Hive project.",
            "build-arg:IMAGE_TITLE": "graphql-hive/commerce",
            "build-arg:PORT": "3010",
            "build-arg:RELEASE": "4a9f179e950a5f847a331ed7cd563c66f942a23a",
            "build-arg:SERVICE_DIR_NAME": "@hive/commerce",
            "context:dist": "local:dist",
            "context:shared": "local:shared",
            "frontend.caps": "moby.buildkit.frontend.contexts+forward",
            "local-sessionid:context": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:dockerfile": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:shared": "lk85shawxdo7sybtk5y4ieuxp"
          },
          "locals": [
            {
              "name": "context"
            },
            {
              "name": "dist"
            },
            {
              "name": "dockerfile"
            },
            {
              "name": "shared"
            }
          ]
        },
        "environment": {
          "platform": "linux/amd64"
        }
      }
    },
    "buildx.build.ref": "builder-da02ba2f-266f-489b-b194-94669de13417/builder-da02ba2f-266f-489b-b194-94669de134170/fdssz038ushbvo25ui19q6fic",
    "containerimage.config.digest": "sha256:b7b8bdef1633117b608fef2be0aefd03eb643c17e82f742ae61ec19ddd75b18b",
    "containerimage.descriptor": {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "digest": "sha256:8684ff34b095e2cf54983a8fa57870f5d8f77b6897f2de05f8e736c82d0ac6f9",
      "size": 2075,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    "containerimage.digest": "sha256:8684ff34b095e2cf54983a8fa57870f5d8f77b6897f2de05f8e736c82d0ac6f9",
    "image.name": "ghcr.io/graphql-hive/commerce:4a9f179e950a5f847a331ed7cd563c66f942a23a-amd64,ghcr.io/graphql-hive/commerce:feat_usage_reporting_sdk_support-amd64"
  },
  "composition-federation-2": {
    "buildx.build.provenance": {
      "buildType": "https://mobyproject.org/buildkit@v1",
      "materials": [
        {
          "uri": "pkg:docker/node@22.13.0-slim?platform=linux%2Famd64",
          "digest": {
            "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
          }
        }
      ],
      "invocation": {
        "configSource": {
          "entryPoint": "services.dockerfile"
        },
        "parameters": {
          "frontend": "dockerfile.v0",
          "args": {
            "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
            "build-arg:IMAGE_DESCRIPTION": "Federation 2 Composition Service for GraphQL Hive.",
            "build-arg:IMAGE_TITLE": "graphql-hive/composition-federation-2",
            "build-arg:PORT": "3069",
            "build-arg:RELEASE": "4a9f179e950a5f847a331ed7cd563c66f942a23a",
            "build-arg:SERVICE_DIR_NAME": "@hive/external-composition",
            "context:dist": "local:dist",
            "context:shared": "local:shared",
            "frontend.caps": "moby.buildkit.frontend.contexts+forward",
            "local-sessionid:context": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:dockerfile": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:shared": "lk85shawxdo7sybtk5y4ieuxp"
          },
          "locals": [
            {
              "name": "context"
            },
            {
              "name": "dist"
            },
            {
              "name": "dockerfile"
            },
            {
              "name": "shared"
            }
          ]
        },
        "environment": {
          "platform": "linux/amd64"
        }
      }
    },
    "buildx.build.ref": "builder-da02ba2f-266f-489b-b194-94669de13417/builder-da02ba2f-266f-489b-b194-94669de134170/inoscivbkarzvl027bun0eo4h",
    "containerimage.config.digest": "sha256:2b188047751be296f15d0aa18e1dec3b8f2aa08bf6af9a3f9f42039b4e6db588",
    "containerimage.descriptor": {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "digest": "sha256:bcddbbf3f879816585e8f250c5a9a98d7a1e8623f15dcca7cfb59d178ef2a017",
      "size": 2075,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    "containerimage.digest": "sha256:bcddbbf3f879816585e8f250c5a9a98d7a1e8623f15dcca7cfb59d178ef2a017",
    "image.name": "ghcr.io/graphql-hive/composition-federation-2:4a9f179e950a5f847a331ed7cd563c66f942a23a-amd64,ghcr.io/graphql-hive/composition-federation-2:feat_usage_reporting_sdk_support-amd64"
  },
  "emails": {
    "buildx.build.provenance": {
      "buildType": "https://mobyproject.org/buildkit@v1",
      "materials": [
        {
          "uri": "pkg:docker/node@22.13.0-slim?platform=linux%2Famd64",
          "digest": {
            "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
          }
        }
      ],
      "invocation": {
        "configSource": {
          "entryPoint": "services.dockerfile"
        },
        "parameters": {
          "frontend": "dockerfile.v0",
          "args": {
            "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
            "build-arg:IMAGE_DESCRIPTION": "The emails service of the GraphQL Hive project.",
            "build-arg:IMAGE_TITLE": "graphql-hive/emails",
            "build-arg:PORT": "3006",
            "build-arg:RELEASE": "4a9f179e950a5f847a331ed7cd563c66f942a23a",
            "build-arg:SERVICE_DIR_NAME": "@hive/emails",
            "context:dist": "local:dist",
            "context:shared": "local:shared",
            "frontend.caps": "moby.buildkit.frontend.contexts+forward",
            "local-sessionid:context": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:dockerfile": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:shared": "lk85shawxdo7sybtk5y4ieuxp"
          },
          "locals": [
            {
              "name": "context"
            },
            {
              "name": "dist"
            },
            {
              "name": "dockerfile"
            },
            {
              "name": "shared"
            }
          ]
        },
        "environment": {
          "platform": "linux/amd64"
        }
      }
    },
    "buildx.build.ref": "builder-da02ba2f-266f-489b-b194-94669de13417/builder-da02ba2f-266f-489b-b194-94669de134170/x4q9ryjd4w30mueqv0c7to8o2",
    "containerimage.config.digest": "sha256:0761bc8d8180586c6d197e07b154c4dd3741039e59165a75565b4a69c12d042f",
    "containerimage.descriptor": {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "digest": "sha256:3b7457995ec78e401d29e064b1539817793b4022fae8aa958b3a166f2dbdab4f",
      "size": 2075,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    "containerimage.digest": "sha256:3b7457995ec78e401d29e064b1539817793b4022fae8aa958b3a166f2dbdab4f",
    "image.name": "ghcr.io/graphql-hive/emails:4a9f179e950a5f847a331ed7cd563c66f942a23a-amd64,ghcr.io/graphql-hive/emails:feat_usage_reporting_sdk_support-amd64"
  },
  "policy": {
    "buildx.build.provenance": {
      "buildType": "https://mobyproject.org/buildkit@v1",
      "materials": [
        {
          "uri": "pkg:docker/node@22.13.0-slim?platform=linux%2Famd64",
          "digest": {
            "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
          }
        }
      ],
      "invocation": {
        "configSource": {
          "entryPoint": "services.dockerfile"
        },
        "parameters": {
          "frontend": "dockerfile.v0",
          "args": {
            "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
            "build-arg:IMAGE_DESCRIPTION": "The policy service of the GraphQL Hive project.",
            "build-arg:IMAGE_TITLE": "graphql-hive/policy",
            "build-arg:PORT": "3012",
            "build-arg:RELEASE": "4a9f179e950a5f847a331ed7cd563c66f942a23a",
            "build-arg:SERVICE_DIR_NAME": "@hive/policy",
            "context:dist": "local:dist",
            "context:shared": "local:shared",
            "frontend.caps": "moby.buildkit.frontend.contexts+forward",
            "local-sessionid:context": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:dockerfile": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:shared": "lk85shawxdo7sybtk5y4ieuxp"
          },
          "locals": [
            {
              "name": "context"
            },
            {
              "name": "dist"
            },
            {
              "name": "dockerfile"
            },
            {
              "name": "shared"
            }
          ]
        },
        "environment": {
          "platform": "linux/amd64"
        }
      }
    },
    "buildx.build.ref": "builder-da02ba2f-266f-489b-b194-94669de13417/builder-da02ba2f-266f-489b-b194-94669de134170/u5e47r6tfxk6fflcwin53up2l",
    "containerimage.config.digest": "sha256:ad1a0426bdc033412e95f745a3b0d78671c7806d6349e11ed7bd2ac56d367e0d",
    "containerimage.descriptor": {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "digest": "sha256:6b8c31a956b2bb929f68b017f97dde3d87353bac8a75e319ae6c671363b5dcb1",
      "size": 2075,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    "containerimage.digest": "sha256:6b8c31a956b2bb929f68b017f97dde3d87353bac8a75e319ae6c671363b5dcb1",
    "image.name": "ghcr.io/graphql-hive/policy:4a9f179e950a5f847a331ed7cd563c66f942a23a-amd64,ghcr.io/graphql-hive/policy:feat_usage_reporting_sdk_support-amd64"
  },
  "schema": {
    "buildx.build.provenance": {
      "buildType": "https://mobyproject.org/buildkit@v1",
      "materials": [
        {
          "uri": "pkg:docker/node@22.13.0-slim?platform=linux%2Famd64",
          "digest": {
            "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
          }
        }
      ],
      "invocation": {
        "configSource": {
          "entryPoint": "services.dockerfile"
        },
        "parameters": {
          "frontend": "dockerfile.v0",
          "args": {
            "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
            "build-arg:IMAGE_DESCRIPTION": "The schema service of the GraphQL Hive project.",
            "build-arg:IMAGE_TITLE": "graphql-hive/schema",
            "build-arg:PORT": "3002",
            "build-arg:RELEASE": "4a9f179e950a5f847a331ed7cd563c66f942a23a",
            "build-arg:SERVICE_DIR_NAME": "@hive/schema",
            "context:dist": "local:dist",
            "context:shared": "local:shared",
            "frontend.caps": "moby.buildkit.frontend.contexts+forward",
            "local-sessionid:context": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:dockerfile": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:shared": "lk85shawxdo7sybtk5y4ieuxp"
          },
          "locals": [
            {
              "name": "context"
            },
            {
              "name": "dist"
            },
            {
              "name": "dockerfile"
            },
            {
              "name": "shared"
            }
          ]
        },
        "environment": {
          "platform": "linux/amd64"
        }
      }
    },
    "buildx.build.ref": "builder-da02ba2f-266f-489b-b194-94669de13417/builder-da02ba2f-266f-489b-b194-94669de134170/m677ogaez59m0hscufkmi1tmi",
    "containerimage.config.digest": "sha256:e186d2ead46b5c79e2ff627e2c9fe36f1bbc343553a173e450a2103ba5bf15f7",
    "containerimage.descriptor": {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "digest": "sha256:d7c8bb2d05b04f544b4652d36dac45703e67c26bebe02805938bf147ab9ef1cf",
      "size": 2075,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    "containerimage.digest": "sha256:d7c8bb2d05b04f544b4652d36dac45703e67c26bebe02805938bf147ab9ef1cf",
    "image.name": "ghcr.io/graphql-hive/schema:4a9f179e950a5f847a331ed7cd563c66f942a23a-amd64,ghcr.io/graphql-hive/schema:feat_usage_reporting_sdk_support-amd64"
  },
  "server": {
    "buildx.build.provenance": {
      "buildType": "https://mobyproject.org/buildkit@v1",
      "materials": [
        {
          "uri": "pkg:docker/node@22.13.0-slim?platform=linux%2Famd64",
          "digest": {
            "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
          }
        }
      ],
      "invocation": {
        "configSource": {
          "entryPoint": "services.dockerfile"
        },
        "parameters": {
          "frontend": "dockerfile.v0",
          "args": {
            "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
            "build-arg:IMAGE_DESCRIPTION": "The server service of the GraphQL Hive project.",
            "build-arg:IMAGE_TITLE": "graphql-hive/server",
            "build-arg:PORT": "3001",
            "build-arg:RELEASE": "4a9f179e950a5f847a331ed7cd563c66f942a23a",
            "build-arg:SERVICE_DIR_NAME": "@hive/server",
            "context:dist": "local:dist",
            "context:shared": "local:shared",
            "frontend.caps": "moby.buildkit.frontend.contexts+forward",
            "local-sessionid:context": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:dockerfile": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:shared": "lk85shawxdo7sybtk5y4ieuxp"
          },
          "locals": [
            {
              "name": "context"
            },
            {
              "name": "dist"
            },
            {
              "name": "dockerfile"
            },
            {
              "name": "shared"
            }
          ]
        },
        "environment": {
          "platform": "linux/amd64"
        }
      }
    },
    "buildx.build.ref": "builder-da02ba2f-266f-489b-b194-94669de13417/builder-da02ba2f-266f-489b-b194-94669de134170/yhzujjk4v4wpb4x94rflvqcrj",
    "containerimage.config.digest": "sha256:08bd70abdde94ca59b92c2d7cbc29439b5711b26dc80f6c07ff754f93e01d09a",
    "containerimage.descriptor": {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "digest": "sha256:63c6d08fa34a3b0de74a4ab36b5e6f03d8b221beeb3e03acaba965a15ee3aa77",
      "size": 2076,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    "containerimage.digest": "sha256:63c6d08fa34a3b0de74a4ab36b5e6f03d8b221beeb3e03acaba965a15ee3aa77",
    "image.name": "ghcr.io/graphql-hive/server:4a9f179e950a5f847a331ed7cd563c66f942a23a-amd64,ghcr.io/graphql-hive/server:feat_usage_reporting_sdk_support-amd64"
  },
  "storage": {
    "buildx.build.provenance": {
      "buildType": "https://mobyproject.org/buildkit@v1",
      "materials": [
        {
          "uri": "pkg:docker/node@22.13.0-slim?platform=linux%2Famd64",
          "digest": {
            "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
          }
        }
      ],
      "invocation": {
        "configSource": {
          "entryPoint": "migrations.dockerfile"
        },
        "parameters": {
          "frontend": "dockerfile.v0",
          "args": {
            "build-arg:IMAGE_DESCRIPTION": "The migrations service of the GraphQL Hive project.",
            "build-arg:IMAGE_TITLE": "graphql-hive/storage",
            "build-arg:RELEASE": "4a9f179e950a5f847a331ed7cd563c66f942a23a",
            "context:dist": "local:dist",
            "context:shared": "local:shared",
            "frontend.caps": "moby.buildkit.frontend.contexts+forward",
            "local-sessionid:context": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:dockerfile": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:shared": "lk85shawxdo7sybtk5y4ieuxp"
          },
          "locals": [
            {
              "name": "context"
            },
            {
              "name": "dist"
            },
            {
              "name": "dockerfile"
            },
            {
              "name": "shared"
            }
          ]
        },
        "environment": {
          "platform": "linux/amd64"
        }
      }
    },
    "buildx.build.ref": "builder-da02ba2f-266f-489b-b194-94669de13417/builder-da02ba2f-266f-489b-b194-94669de134170/z35vuokeipwp7jelk6qfazpo8",
    "containerimage.config.digest": "sha256:a2e713db8c301c275d7df84641cd2a7f95cdee29e72fb0d69b5c674bec000d91",
    "containerimage.descriptor": {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "digest": "sha256:57fce55a4503c9bfb0d02eee4f388fc6a9ab0e929ebdf3f15ec101dcf7b1f9ae",
      "size": 2075,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    "containerimage.digest": "sha256:57fce55a4503c9bfb0d02eee4f388fc6a9ab0e929ebdf3f15ec101dcf7b1f9ae",
    "image.name": "ghcr.io/graphql-hive/storage:4a9f179e950a5f847a331ed7cd563c66f942a23a-amd64,ghcr.io/graphql-hive/storage:feat_usage_reporting_sdk_support-amd64"
  },
  "tokens": {
    "buildx.build.provenance": {
      "buildType": "https://mobyproject.org/buildkit@v1",
      "materials": [
        {
          "uri": "pkg:docker/node@22.13.0-slim?platform=linux%2Famd64",
          "digest": {
            "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
          }
        }
      ],
      "invocation": {
        "configSource": {
          "entryPoint": "services.dockerfile"
        },
        "parameters": {
          "frontend": "dockerfile.v0",
          "args": {
            "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
            "build-arg:IMAGE_DESCRIPTION": "The tokens service of the GraphQL Hive project.",
            "build-arg:IMAGE_TITLE": "graphql-hive/tokens",
            "build-arg:PORT": "3003",
            "build-arg:RELEASE": "4a9f179e950a5f847a331ed7cd563c66f942a23a",
            "build-arg:SERVICE_DIR_NAME": "@hive/tokens",
            "context:dist": "local:dist",
            "context:shared": "local:shared",
            "frontend.caps": "moby.buildkit.frontend.contexts+forward",
            "local-sessionid:context": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:dockerfile": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:shared": "lk85shawxdo7sybtk5y4ieuxp"
          },
          "locals": [
            {
              "name": "context"
            },
            {
              "name": "dist"
            },
            {
              "name": "dockerfile"
            },
            {
              "name": "shared"
            }
          ]
        },
        "environment": {
          "platform": "linux/amd64"
        }
      }
    },
    "buildx.build.ref": "builder-da02ba2f-266f-489b-b194-94669de13417/builder-da02ba2f-266f-489b-b194-94669de134170/i1xvhvpzun2ed0vieywslglnf",
    "containerimage.config.digest": "sha256:b7ff719f8282a6d2acad2f0a143de0e7c1f2e5a4f6f9648203ee217c282b175f",
    "containerimage.descriptor": {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "digest": "sha256:4b902a0c15514b5cad81c6b56a602ffb2cc073a5b9c12c18efaa05e4c05055a5",
      "size": 2075,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    "containerimage.digest": "sha256:4b902a0c15514b5cad81c6b56a602ffb2cc073a5b9c12c18efaa05e4c05055a5",
    "image.name": "ghcr.io/graphql-hive/tokens:4a9f179e950a5f847a331ed7cd563c66f942a23a-amd64,ghcr.io/graphql-hive/tokens:feat_usage_reporting_sdk_support-amd64"
  },
  "usage": {
    "buildx.build.provenance": {
      "buildType": "https://mobyproject.org/buildkit@v1",
      "materials": [
        {
          "uri": "pkg:docker/node@22.13.0-slim?platform=linux%2Famd64",
          "digest": {
            "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
          }
        }
      ],
      "invocation": {
        "configSource": {
          "entryPoint": "services.dockerfile"
        },
        "parameters": {
          "frontend": "dockerfile.v0",
          "args": {
            "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
            "build-arg:IMAGE_DESCRIPTION": "The usage ingestor service of the GraphQL Hive project.",
            "build-arg:IMAGE_TITLE": "graphql-hive/usage",
            "build-arg:PORT": "3006",
            "build-arg:RELEASE": "4a9f179e950a5f847a331ed7cd563c66f942a23a",
            "build-arg:SERVICE_DIR_NAME": "@hive/usage",
            "context:dist": "local:dist",
            "context:shared": "local:shared",
            "frontend.caps": "moby.buildkit.frontend.contexts+forward",
            "local-sessionid:context": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:dockerfile": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:shared": "lk85shawxdo7sybtk5y4ieuxp"
          },
          "locals": [
            {
              "name": "context"
            },
            {
              "name": "dist"
            },
            {
              "name": "dockerfile"
            },
            {
              "name": "shared"
            }
          ]
        },
        "environment": {
          "platform": "linux/amd64"
        }
      }
    },
    "buildx.build.ref": "builder-da02ba2f-266f-489b-b194-94669de13417/builder-da02ba2f-266f-489b-b194-94669de134170/x406gplnamcjyil3k77ifqkrd",
    "containerimage.config.digest": "sha256:12140d08c68375d8b9950825cdd537d5346a8d7f7f958dc9acecd98dac52ed38",
    "containerimage.descriptor": {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "digest": "sha256:8fc237ef96f5ed8f89f630034affdd9f24f208f0e47ff35a4a160ccc0e57ba6e",
      "size": 2075,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    "containerimage.digest": "sha256:8fc237ef96f5ed8f89f630034affdd9f24f208f0e47ff35a4a160ccc0e57ba6e",
    "image.name": "ghcr.io/graphql-hive/usage:4a9f179e950a5f847a331ed7cd563c66f942a23a-amd64,ghcr.io/graphql-hive/usage:feat_usage_reporting_sdk_support-amd64"
  },
  "usage-ingestor": {
    "buildx.build.provenance": {
      "buildType": "https://mobyproject.org/buildkit@v1",
      "materials": [
        {
          "uri": "pkg:docker/node@22.13.0-slim?platform=linux%2Famd64",
          "digest": {
            "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
          }
        }
      ],
      "invocation": {
        "configSource": {
          "entryPoint": "services.dockerfile"
        },
        "parameters": {
          "frontend": "dockerfile.v0",
          "args": {
            "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
            "build-arg:IMAGE_DESCRIPTION": "The usage ingestor service of the GraphQL Hive project.",
            "build-arg:IMAGE_TITLE": "graphql-hive/usage-ingestor",
            "build-arg:PORT": "3007",
            "build-arg:RELEASE": "4a9f179e950a5f847a331ed7cd563c66f942a23a",
            "build-arg:SERVICE_DIR_NAME": "@hive/usage-ingestor",
            "context:dist": "local:dist",
            "context:shared": "local:shared",
            "frontend.caps": "moby.buildkit.frontend.contexts+forward",
            "local-sessionid:context": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:dockerfile": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:shared": "lk85shawxdo7sybtk5y4ieuxp"
          },
          "locals": [
            {
              "name": "context"
            },
            {
              "name": "dist"
            },
            {
              "name": "dockerfile"
            },
            {
              "name": "shared"
            }
          ]
        },
        "environment": {
          "platform": "linux/amd64"
        }
      }
    },
    "buildx.build.ref": "builder-da02ba2f-266f-489b-b194-94669de13417/builder-da02ba2f-266f-489b-b194-94669de134170/zjidi4yrmpsssci053r18860t",
    "containerimage.config.digest": "sha256:419b48c95d73ef9e7f4bcddecea8d834d8c952a20292156166dd099fb4b94c83",
    "containerimage.descriptor": {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "digest": "sha256:51826d12ae3a16a0634b5020991da6b75e6ad0f2d27006065bd96d1cac7c50d4",
      "size": 2075,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    "containerimage.digest": "sha256:51826d12ae3a16a0634b5020991da6b75e6ad0f2d27006065bd96d1cac7c50d4",
    "image.name": "ghcr.io/graphql-hive/usage-ingestor:4a9f179e950a5f847a331ed7cd563c66f942a23a-amd64,ghcr.io/graphql-hive/usage-ingestor:feat_usage_reporting_sdk_support-amd64"
  },
  "webhooks": {
    "buildx.build.provenance": {
      "buildType": "https://mobyproject.org/buildkit@v1",
      "materials": [
        {
          "uri": "pkg:docker/node@22.13.0-slim?platform=linux%2Famd64",
          "digest": {
            "sha256": "f5a0871ab03b035c58bdb3007c3d177b001c2145c18e81817b71624dcf7d8bff"
          }
        }
      ],
      "invocation": {
        "configSource": {
          "entryPoint": "services.dockerfile"
        },
        "parameters": {
          "frontend": "dockerfile.v0",
          "args": {
            "build-arg:HEALTHCHECK_CMD": "wget --spider -q http://127.0.0.1:${PORT}/_readiness",
            "build-arg:IMAGE_DESCRIPTION": "The webhooks ingestor service of the GraphQL Hive project.",
            "build-arg:IMAGE_TITLE": "graphql-hive/webhooks",
            "build-arg:PORT": "3005",
            "build-arg:RELEASE": "4a9f179e950a5f847a331ed7cd563c66f942a23a",
            "build-arg:SERVICE_DIR_NAME": "@hive/webhooks",
            "context:dist": "local:dist",
            "context:shared": "local:shared",
            "frontend.caps": "moby.buildkit.frontend.contexts+forward",
            "local-sessionid:context": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:dockerfile": "lk85shawxdo7sybtk5y4ieuxp",
            "local-sessionid:shared": "lk85shawxdo7sybtk5y4ieuxp"
          },
          "locals": [
            {
              "name": "context"
            },
            {
              "name": "dist"
            },
            {
              "name": "dockerfile"
            },
            {
              "name": "shared"
            }
          ]
        },
        "environment": {
          "platform": "linux/amd64"
        }
      }
    },
    "buildx.build.ref": "builder-da02ba2f-266f-489b-b194-94669de13417/builder-da02ba2f-266f-489b-b194-94669de134170/npbm38wkt284dl65x6zdep963",
    "containerimage.config.digest": "sha256:29fde9b30d898429307de7880de702e6594645af6f2b854e92d8d726901e8c3b",
    "containerimage.descriptor": {
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "digest": "sha256:f548bfae9579b424915560c18fc31ea640772637ebd5ef1ca002bd072e2be254",
      "size": 2075,
      "platform": {
        "architecture": "amd64",
        "os": "linux"
      }
    },
    "containerimage.digest": "sha256:f548bfae9579b424915560c18fc31ea640772637ebd5ef1ca002bd072e2be254",
    "image.name": "ghcr.io/graphql-hive/webhooks:4a9f179e950a5f847a331ed7cd563c66f942a23a-amd64,ghcr.io/graphql-hive/webhooks:feat_usage_reporting_sdk_support-amd64"
  }
}
  ```
</details>
<!-- Sticky Pull Request Commentpr -->
author_association: CONTRIBUTOR