Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hive Gateway landing page: top sections #6461

Merged
merged 25 commits into from
Feb 6, 2025
Merged

Hive Gateway landing page: top sections #6461

merged 25 commits into from
Feb 6, 2025

Conversation

hasparus
Copy link
Collaborator

@hasparus hasparus commented Feb 3, 2025

Background

image

Description

Added the hero and a basic features tab — without the card animations from new design yet, just the old tabs.

The simpler sections and FAQs are coming in next PRs.

@hasparus hasparus force-pushed the hive-gateway-landing branch from 00ade06 to 17b6ebf Compare February 3, 2025 17:10
Copy link
Contributor

coderabbitai bot commented Feb 3, 2025

📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Launched a refreshed gateway landing page featuring a hero section, dynamic tabs showcasing observability, performance, and security features, and a marquee display of useful links.
    • Introduced an integration highlights section to streamline access to key functionalities.
  • Documentation

    • Added a comprehensive FAQ section addressing common questions and improving user guidance.
  • Chores

    • Upgraded dependency versions and updated tooling for enhanced performance and stability.

Summary by CodeRabbit

  • New Features
    • Launched a dedicated Hive Gateway page featuring a dynamic hero section, interactive feature tabs, product cards, an engaging marquee of resource links, and an "Orchestrate Your Way" segment showcasing integration options.
  • Documentation
    • Added a Frequently Asked Questions section addressing common inquiries on migration, subscriptions, performance, tracing integrations, and customization.
  • Chores
    • Upgraded dependencies and streamlined navigation links for a more consistent user experience.

Walkthrough

The changes update dependency versions and package management while introducing new gateway-related features. New components are added for the Hive Gateway, including the feature tabs and marquee rows, along with a dedicated landing page. The primary index page now uses a revised feature-tabs component. Additionally, the FeatureTabs component is refactored to include contextual state management, and related UI components (including the landing page feature tabs) are adjusted accordingly. A legacy Stud component is removed, and its import consolidated. Finally, the layout is updated to designate the '/gateway' route as light-only.

Changes

File(s) Change Summary
packages/web/docs/package.json
package.json
Updated dependency and package manager versions:
- @theguild/components version changed from 9.2.0 to 9.3.2
- Project packageManager updated from [email protected] to [email protected]
packages/web/docs/src/app/gateway/gateway-feature-tabs.tsx
packages/web/docs/src/app/gateway/gateway-marquee-rows.tsx
packages/web/docs/src/app/gateway/page.tsx
packages/web/docs/src/app/layout.tsx
Introduced new gateway components and page:
- Added GatewayFeatureTabs (with new type definitions and SVG icon components)
- Added GatewayMarqueeRows with link shuffling logic
- Created HiveGatewayPage with SEO metadata and a hero section
- Updated layout to include the /gateway route among "light only" pages
packages/web/docs/src/app/page.tsx Replaced the use of the FeatureTabs component with the new LandingPageFeatureTabs component in the main index page
packages/web/docs/src/components/feature-tabs.tsx
packages/web/docs/src/components/info-card.tsx
packages/web/docs/src/components/landing-page-feature-tabs.tsx
packages/web/docs/src/components/stud.tsx
Component updates and refactoring:
- Refactored FeatureTabs to include a new context, updated types/interfaces, and introduced ActiveHighlightImage and related hooks
- Updated info-card.tsx to import Stud from @theguild/components
- Added new LandingPageFeatureTabs with specific feature highlights
- Removed the legacy Stud component

Sequence Diagram(s)

sequenceDiagram
    participant U as User
    participant HP as HiveGatewayPage
    participant LC as LandingPageContainer
    participant H as Hero & Decoration
    participant G as GatewayFeatureTabs
    participant C as Other UI Components

    U->>HP: Request Hive Gateway page
    HP->>LC: Render structured layout
    LC->>H: Render hero section with branding
    HP->>G: Render feature tabs component
    G->>C: Integrate additional UI elements (e.g., call-to-action)
    C-->>U: Display complete page
Loading
sequenceDiagram
    participant U as User
    participant G as GatewayFeatureTabs
    participant Ctx as FeatureTabsContext

    U->>G: Click on a feature tab
    G->>Ctx: Update active highlight state
    Ctx-->>G: Return updated highlight data
    G->>U: Render updated feature details
Loading

Tip

🌐 Web search-backed reviews and chat
  • We have enabled web search-based reviews and chat for all users. This feature allows CodeRabbit to access the latest documentation and information on the web.
  • You can disable this feature by setting web_search: false in the knowledge_base settings.
  • Please share any feedback in the Discord discussion.

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • 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 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 for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🧹 Nitpick comments (6)
packages/web/docs/src/components/feature-tabs.tsx (1)

93-105: Improve readability of documentation link transformation.

The conditional logic that transforms a string into an object could be more concise with a small helper or an inline approach. Keeping it purely functional helps readability.

- if (typeof documentationLink === 'string') {
-   documentationLink = {
-     text: 'Learn more',
-     href: documentationLink,
-   };
- }
+ const linkProps = typeof documentationLink === 'string'
+   ? { text: 'Learn more', href: documentationLink }
+   : documentationLink;
packages/web/docs/src/app/gateway/page.tsx (1)

63-94: Decorative SVG usage is appropriate.

Using DecorationIsolation around SVG icons preserves layering. Make sure to provide alternative text or aria-hidden if these images are decorative only, for better accessibility.

<svg
  className="pointer-events-none -z-50 size-0"
+ aria-hidden="true"
  width="192"
  height="296"
  viewBox="0 0 192 296"
>
…
</svg>
packages/web/docs/src/app/gateway/gateway-marquee-rows.tsx (1)

3-3: Add a link check test as planned.

The TODO comment suggests verifying that none of these links are 404. Adding a link validator test or a CI check would help ensure correctness and avoid broken references.

packages/web/docs/src/app/gateway/gateway-feature-tabs.tsx (2)

5-6: Consider using an enum for tab types.

The string literal type for tabs could be better represented as an enum to ensure type safety and maintainability.

-type Tab = 'Observability & Performance Monitoring' | 'Security & Access Control';
+enum Tab {
+  ObservabilityAndPerformance = 'Observability & Performance Monitoring',
+  SecurityAndAccess = 'Security & Access Control'
+}

80-81: TODO comment needs addressing.

The TODO comment about marquee rows and timeline should be tracked in the issue tracker.

Would you like me to create an issue to track the implementation of draggable marquee rows with a connected timeline?

packages/web/docs/src/components/landing-page-feature-tabs.tsx (1)

138-146: Optimize SVG attributes.

The SVG element has redundant attributes and can be optimized.

 <svg
-  stroke="currentColor"
-  fill="currentColor"
+  fill="currentColor"
   strokeWidth="0"
   viewBox="0 0 256 256"
   height="24"
   width="24"
-  xmlns="http://www.w3.org/2000/svg"
 >
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between f6d2aee and 17b6ebf.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (13)
  • packages/web/docs/package.json (1 hunks)
  • packages/web/docs/src/app/case-studies/(posts)/layout.tsx (1 hunks)
  • packages/web/docs/src/app/case-studies/case-studies-styles.css (1 hunks)
  • packages/web/docs/src/app/gateway/gateway-feature-tabs.tsx (1 hunks)
  • packages/web/docs/src/app/gateway/gateway-marquee-rows.tsx (1 hunks)
  • packages/web/docs/src/app/gateway/orchestrate-your-way.tsx (1 hunks)
  • packages/web/docs/src/app/gateway/page.tsx (1 hunks)
  • packages/web/docs/src/app/layout.tsx (1 hunks)
  • packages/web/docs/src/app/page.tsx (2 hunks)
  • packages/web/docs/src/components/feature-tabs.tsx (5 hunks)
  • packages/web/docs/src/components/info-card.tsx (1 hunks)
  • packages/web/docs/src/components/landing-page-feature-tabs.tsx (1 hunks)
  • packages/web/docs/src/components/stud.tsx (0 hunks)
💤 Files with no reviewable changes (1)
  • packages/web/docs/src/components/stud.tsx
✅ Files skipped from review due to trivial changes (2)
  • packages/web/docs/src/app/case-studies/(posts)/layout.tsx
  • packages/web/docs/src/components/info-card.tsx
🧰 Additional context used
📓 Path-based instructions (10)
packages/web/docs/src/app/layout.tsx (1)

Pattern packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
packages/web/docs/src/app/case-studies/case-studies-styles.css (1)

Pattern packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
packages/web/docs/src/app/gateway/gateway-feature-tabs.tsx (1)

Pattern packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
packages/web/docs/src/app/page.tsx (1)

Pattern packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
packages/web/docs/package.json (1)

Pattern packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
packages/web/docs/src/app/gateway/gateway-marquee-rows.tsx (1)

Pattern packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
packages/web/docs/src/app/gateway/page.tsx (1)

Pattern packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
packages/web/docs/src/components/landing-page-feature-tabs.tsx (1)

Pattern packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
packages/web/docs/src/app/gateway/orchestrate-your-way.tsx (1)

Pattern packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
packages/web/docs/src/components/feature-tabs.tsx (1)

Pattern packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
🪛 Biome (1.9.4)
packages/web/docs/src/app/gateway/gateway-feature-tabs.tsx

[error] 59-59: Missing key property for this element in iterable.

The order of the items may change, and having a key can help React identify which item was moved.
Check the React documentation.

(lint/correctness/useJsxKeyInIterable)


[error] 59-59: Missing key property for this element in iterable.

The order of the items may change, and having a key can help React identify which item was moved.
Check the React documentation.

(lint/correctness/useJsxKeyInIterable)

packages/web/docs/src/components/landing-page-feature-tabs.tsx

[error] 94-94: Missing key property for this element in iterable.

The order of the items may change, and having a key can help React identify which item was moved.
Check the React documentation.

(lint/correctness/useJsxKeyInIterable)


[error] 94-94: Missing key property for this element in iterable.

The order of the items may change, and having a key can help React identify which item was moved.
Check the React documentation.

(lint/correctness/useJsxKeyInIterable)


[error] 94-94: Missing key property for this element in iterable.

The order of the items may change, and having a key can help React identify which item was moved.
Check the React documentation.

(lint/correctness/useJsxKeyInIterable)

🔇 Additional comments (9)
packages/web/docs/src/app/layout.tsx (1)

70-70: LGTM!

The addition of '/gateway' to lightOnlyPages is consistent with other landing pages and aligns with the PR objectives of implementing the Gateway landing page.

packages/web/docs/src/components/feature-tabs.tsx (3)

25-30: Handle empty or invalid highlights arrays.

When highlights is empty or any key maps to an empty array, accessing tabs[0] or highlights[tab][0] can cause runtime errors due to an undefined index. Consider adding fallback logic to ensure the component gracefully handles missing or empty data.


42-45: Styling approach looks consistent.

The utility classes properly handle border, background, and responsiveness. No issues noted here.


276-304: Validate image presence for each highlight.

When multiple highlights lack an image, the current code tries to render placeholders. If you expect some highlights to have no images, a fallback or placeholder could be used, e.g., a default illustration.

packages/web/docs/src/app/gateway/page.tsx (2)

14-27: Metadata configuration is consistent with Next.js SEO practices.

The definition of title, description, alternates, and openGraph keys appears correct. No immediate issues found.


29-61: Structurally well-organized landing page.

The HiveGatewayPage layout is straightforward, with a hero section and integrated feature tabs. The calls to action are clear and accessible. Everything here appears consistent and comprehensible.

packages/web/docs/src/app/gateway/gateway-marquee-rows.tsx (1)

87-96: Fisher–Yates Shuffle logic looks correct.

The in-place shuffle correctly randomizes the array. No improvements needed, but be mindful that this function produces non-deterministic output, which can complicate snapshot testing if used there.

packages/web/docs/src/app/page.tsx (1)

85-85: LGTM!

The replacement of FeatureTabs with LandingPageFeatureTabs is clean and maintains the same styling.

packages/web/docs/package.json (1)

19-19: Confirm the dependency update to an alpha release.
The version of @theguild/components has been updated from a stable release to an alpha build (9.3.1-alpha-20250203132247-81689b6a845e70e06ba48d7ad3c2588bea379e9d). Please verify that this alpha release has been thoroughly tested with the new hero section and feature tabs, and that any potential instability or breaking changes are acceptable for your current release stage.

@hasparus hasparus marked this pull request as draft February 3, 2025 17:17
@@ -1,13 +0,0 @@
import { cn } from '@theguild/components';

export function Stud(props: React.HTMLAttributes<HTMLElement>) {
Copy link
Collaborator Author

@hasparus hasparus Feb 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed it because we already have it in Components, and it had just one use left.

Copy link
Contributor

github-actions bot commented Feb 5, 2025

💻 Website Preview

The latest changes are available as preview in: https://2cf4a167.hive-landing-page.pages.dev

Copy link
Contributor

github-actions bot commented Feb 5, 2025

🐋 This PR was built and pushed to the following Docker images:

Targets: build

Platforms: linux/arm64

Image Tag: 31dc204ebd21ff1d185c6b0561065f04be5a6594

Docker Bake metadata
{
"app": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "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": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/kr36hnnwsue2dednf9594dh2o",
  "containerimage.config.digest": "sha256:3acde47150dd2c0a3fa6150ebf081a92a44d7ca2ce792f5e657383b6d6f8209d",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:67630802bda4abfcda96719a06fa9237e9db0bba33c48b3c243c5d0ef0d0e9c5",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:67630802bda4abfcda96719a06fa9237e9db0bba33c48b3c243c5d0ef0d0e9c5",
  "image.name": "ghcr.io/graphql-hive/app:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/app:hive_gateway_landing-arm64"
},
"buildx.build.warnings": [
  {
    "vertex": "sha256:661b04387688d2c0bce4160fae6f989e91f0ed14c1fea82850c2313b41f43a2a",
    "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:661b04387688d2c0bce4160fae6f989e91f0ed14c1fea82850c2313b41f43a2a",
    "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:1f74f492a5a94be8b52b3e5ea0e8e62a0d7458a55d6c8a91fd2b772e87f1e918",
    "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:1f74f492a5a94be8b52b3e5ea0e8e62a0d7458a55d6c8a91fd2b772e87f1e918",
    "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
        }
      }
    ]
  },
  {
    "vertex": "sha256:661b04387688d2c0bce4160fae6f989e91f0ed14c1fea82850c2313b41f43a2a",
    "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:661b04387688d2c0bce4160fae6f989e91f0ed14c1fea82850c2313b41f43a2a",
    "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:661b04387688d2c0bce4160fae6f989e91f0ed14c1fea82850c2313b41f43a2a",
    "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:1f74f492a5a94be8b52b3e5ea0e8e62a0d7458a55d6c8a91fd2b772e87f1e918",
    "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:661b04387688d2c0bce4160fae6f989e91f0ed14c1fea82850c2313b41f43a2a",
    "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:661b04387688d2c0bce4160fae6f989e91f0ed14c1fea82850c2313b41f43a2a",
    "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:1f74f492a5a94be8b52b3e5ea0e8e62a0d7458a55d6c8a91fd2b772e87f1e918",
    "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:1f74f492a5a94be8b52b3e5ea0e8e62a0d7458a55d6c8a91fd2b772e87f1e918",
    "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:1f74f492a5a94be8b52b3e5ea0e8e62a0d7458a55d6c8a91fd2b772e87f1e918",
    "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:661b04387688d2c0bce4160fae6f989e91f0ed14c1fea82850c2313b41f43a2a",
    "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
        }
      }
    ]
  }
],
"composition-federation-2": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "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": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/zjzzl2wxw8o3x6lnx98ij0jmv",
  "containerimage.config.digest": "sha256:bea9f79f50aca9cd23de2928a3b2613a73e5ebdf998ccb153f002cc3a1faa30d",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:b7ef6c55ee18e3fa0ed84a909a9e632b9f893ee6911a43199a734f4d80c424ed",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:b7ef6c55ee18e3fa0ed84a909a9e632b9f893ee6911a43199a734f4d80c424ed",
  "image.name": "ghcr.io/graphql-hive/composition-federation-2:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/composition-federation-2:hive_gateway_landing-arm64"
},
"emails": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "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": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/t81ko3u16r34y57kiigwid04j",
  "containerimage.config.digest": "sha256:7cd51df984653818310fa8e7401776229d35832db3b48077e13c51cac74cb719",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:22f4b4b4d8404f5cc33c5417ca8a61193b931d183c92b03b59e48507875f005f",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:22f4b4b4d8404f5cc33c5417ca8a61193b931d183c92b03b59e48507875f005f",
  "image.name": "ghcr.io/graphql-hive/emails:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/emails:hive_gateway_landing-arm64"
},
"policy": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "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": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/iir2ej87y129cwjfxwxqqsdyf",
  "containerimage.config.digest": "sha256:81b48f3fd6737aa2418676f7ca6c004e9d86d142ee70f1c9c8148b28a10c5142",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:da8a66adab690fafcbe9c2fa76a051338cfbfa6a925007f2e35e6b66518bc373",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:da8a66adab690fafcbe9c2fa76a051338cfbfa6a925007f2e35e6b66518bc373",
  "image.name": "ghcr.io/graphql-hive/policy:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/policy:hive_gateway_landing-arm64"
},
"rate-limit": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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 rate limit service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/rate-limit",
          "build-arg:PORT": "3009",
          "build-arg:RELEASE": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "build-arg:SERVICE_DIR_NAME": "@hive/rate-limit",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/q1saf9ss9n77vhwrqbi4flqqg",
  "containerimage.config.digest": "sha256:542310987bb5a9c6107633b803115263c0bd3825a64fc2861ddf39ef55d39b87",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:ee9db3ff11924f7515845c7dfa09003abf661b66a10bcacb9d63e8d26532d72a",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:ee9db3ff11924f7515845c7dfa09003abf661b66a10bcacb9d63e8d26532d72a",
  "image.name": "ghcr.io/graphql-hive/rate-limit:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/rate-limit:hive_gateway_landing-arm64"
},
"schema": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "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": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/jbhq98bvz35yihd9fmp5tsn7r",
  "containerimage.config.digest": "sha256:69fd1f1a0e7a61b5487a52c4c1d81a1a1e5488393fc31e352e40f856cf498c58",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:2b1d20e06ec30a44db8cf6dd145e1c51d63f3ae9c65420cee7911274177edcd7",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:2b1d20e06ec30a44db8cf6dd145e1c51d63f3ae9c65420cee7911274177edcd7",
  "image.name": "ghcr.io/graphql-hive/schema:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/schema:hive_gateway_landing-arm64"
},
"server": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "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": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/6ujq9o1bz420unhewige0o32u",
  "containerimage.config.digest": "sha256:78c4cbe4619e148377d11328b9d672190547915eaa92e26a3a3b524b58dd147d",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:df16fbd3a63bae64b3926c28ff70b31bcd999a46518c050ba64bb01d37566a24",
    "size": 2076,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:df16fbd3a63bae64b3926c28ff70b31bcd999a46518c050ba64bb01d37566a24",
  "image.name": "ghcr.io/graphql-hive/server:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/server:hive_gateway_landing-arm64"
},
"storage": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/ab62k4p594x2wfx7hyf2kgb8f",
  "containerimage.config.digest": "sha256:29d04189a0c67bbc6876425c59d33ee8fe8316a3ac993e60e0b5f142af2d73b9",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:c1f1f092adf4813e3a8ebc0a59c83320a62e2efe37e0aa994e6fca26b28ccf24",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:c1f1f092adf4813e3a8ebc0a59c83320a62e2efe37e0aa994e6fca26b28ccf24",
  "image.name": "ghcr.io/graphql-hive/storage:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/storage:hive_gateway_landing-arm64"
},
"stripe-billing": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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 stripe billing service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/stripe-billing",
          "build-arg:PORT": "3010",
          "build-arg:RELEASE": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "build-arg:SERVICE_DIR_NAME": "@hive/stripe-billing",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/tv127dhybbs46y44lq28brwnb",
  "containerimage.config.digest": "sha256:e387e304dc30233c54a39565385ceb1966e3db78a9fee32275bb0ffe4572a9e7",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:c97931b09a7dcacfd810a6d9905de991a88f48c4a2219279c4c2e12cd89dcb67",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:c97931b09a7dcacfd810a6d9905de991a88f48c4a2219279c4c2e12cd89dcb67",
  "image.name": "ghcr.io/graphql-hive/stripe-billing:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/stripe-billing:hive_gateway_landing-arm64"
},
"tokens": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "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": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/q79m4ml8jwkjxsgzc2g9z6fyf",
  "containerimage.config.digest": "sha256:6fc459cc8f6b62cefdccc7ff2bab974734b88776bb61caa1152ce62819f6da4a",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:11fe44eb0e1560d0fce26089749a2a2ee1ebf86076ad608e517843722981c357",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:11fe44eb0e1560d0fce26089749a2a2ee1ebf86076ad608e517843722981c357",
  "image.name": "ghcr.io/graphql-hive/tokens:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/tokens:hive_gateway_landing-arm64"
},
"usage": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "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": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/l54nu8qtc9r3iz44mfwy1iip6",
  "containerimage.config.digest": "sha256:19b34545b345c9a97c98d81906baf7e9d569a8b760a3e58190798d0ba17c66ae",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:c122eca9a7630cb0083444aeb3715ec463a68b9cb650541c4d6dd408a35e6f98",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:c122eca9a7630cb0083444aeb3715ec463a68b9cb650541c4d6dd408a35e6f98",
  "image.name": "ghcr.io/graphql-hive/usage:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/usage:hive_gateway_landing-arm64"
},
"usage-estimator": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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 estimator service of the GraphQL Hive project.",
          "build-arg:IMAGE_TITLE": "graphql-hive/usage-estimator",
          "build-arg:PORT": "3008",
          "build-arg:RELEASE": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "build-arg:SERVICE_DIR_NAME": "@hive/usage-estimator",
          "context:dist": "local:dist",
          "context:shared": "local:shared",
          "frontend.caps": "moby.buildkit.frontend.contexts+forward",
          "local-sessionid:context": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/2dnpr4u66n2x447coyhga7qgo",
  "containerimage.config.digest": "sha256:f943cc1a7347df0a603b8571ae6487c521a6fa523cc1bc357b9e5c53b41a81dc",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:d1989cce7aa7b0ef7aadf31df9b912f08bcb4439700be1033939ed1edc3bce53",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:d1989cce7aa7b0ef7aadf31df9b912f08bcb4439700be1033939ed1edc3bce53",
  "image.name": "ghcr.io/graphql-hive/usage-estimator:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/usage-estimator:hive_gateway_landing-arm64"
},
"usage-ingestor": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "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": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/f6agvrb09nalhb7j11iayq9h5",
  "containerimage.config.digest": "sha256:cd8d2568bd6b16f30d2c38ef9060ab8a7df5cee470712f3a881ea11a1595ea80",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:7ce5f5b89106fa0d5bafaded9c6c0d604bc910616805a274e2ba6f9773043d5f",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:7ce5f5b89106fa0d5bafaded9c6c0d604bc910616805a274e2ba6f9773043d5f",
  "image.name": "ghcr.io/graphql-hive/usage-ingestor:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/usage-ingestor:hive_gateway_landing-arm64"
},
"webhooks": {
  "buildx.build.provenance": {
    "buildType": "https://mobyproject.org/buildkit@v1",
    "materials": [
      {
        "uri": "pkg:docker/[email protected]?platform=linux%2Farm64",
        "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": "31dc204ebd21ff1d185c6b0561065f04be5a6594",
          "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": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:dockerfile": "5n6les50yk8yjeywmh0jncdt0",
          "local-sessionid:shared": "5n6les50yk8yjeywmh0jncdt0"
        },
        "locals": [
          {
            "name": "context"
          },
          {
            "name": "dist"
          },
          {
            "name": "dockerfile"
          },
          {
            "name": "shared"
          }
        ]
      },
      "environment": {
        "platform": "linux/arm64"
      }
    }
  },
  "buildx.build.ref": "builder-c0f670d9-cea0-490d-bbc2-24eec8716c34/builder-c0f670d9-cea0-490d-bbc2-24eec8716c340/ia58502nkg4blz1h9uebt66f5",
  "containerimage.config.digest": "sha256:87058c90ef602f63dd3753348bf522b047bdf052f3c1746bfd723d347b6aee67",
  "containerimage.descriptor": {
    "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
    "digest": "sha256:804f4d27da0dc5213c940011a24b6e6521733708e0c64755b39865316159b204",
    "size": 2075,
    "platform": {
      "architecture": "arm64",
      "os": "linux"
    }
  },
  "containerimage.digest": "sha256:804f4d27da0dc5213c940011a24b6e6521733708e0c64755b39865316159b204",
  "image.name": "ghcr.io/graphql-hive/webhooks:31dc204ebd21ff1d185c6b0561065f04be5a6594-arm64,ghcr.io/graphql-hive/webhooks:hive_gateway_landing-arm64"
}
}

@hasparus hasparus marked this pull request as ready for review February 5, 2025 15:22
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
packages/web/docs/src/app/gateway/orchestrate-your-way.tsx (1)

4-60: LGTM! Consider adding ARIA labels for better accessibility.

The component structure is well-organized with proper responsive design. The layout effectively presents the gateway features and integration options.

Consider adding ARIA labels to improve accessibility:

 <section
   className={cn(
     className,
     'text-green-1000 flex max-w-[1248px] flex-wrap rounded-3xl border border-blue-200 p-4',
   )}
+  aria-label="Orchestrate your way section"
   {...rest}
 >
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 1fad283 and 6497b9f.

📒 Files selected for processing (2)
  • packages/web/docs/src/app/gateway/orchestrate-your-way.tsx (1 hunks)
  • packages/web/docs/src/app/gateway/page.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/web/docs/src/app/gateway/page.tsx
🧰 Additional context used
📓 Path-based instructions (1)
`packages/web/docs/**`: The main landing page and documentat...

packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
  • packages/web/docs/src/app/gateway/orchestrate-your-way.tsx
⏰ Context from checks skipped due to timeout of 90000ms (10)
  • GitHub Check: website-preview / deployment
  • GitHub Check: alpha / cli-artifacts
  • GitHub Check: test / unit
  • GitHub Check: static-analysis / analyze (typescript)
  • GitHub Check: typescript / typecheck
  • GitHub Check: static-analysis / analyze (javascript)
  • GitHub Check: build / dockerize (linux/arm64)
  • GitHub Check: build / dockerize (linux/amd64)
  • GitHub Check: code-style / eslint-and-prettier
  • GitHub Check: SonarCloud
🔇 Additional comments (3)
packages/web/docs/src/app/gateway/orchestrate-your-way.tsx (3)

62-82: LGTM! SVG icons are well-implemented.

The icon components follow SVG best practices with proper viewBox attributes and color inheritance using currentColor.


84-99: LGTM! Clean and reusable card component.

The LinkCard component is well-structured with proper prop types and consistent styling.


101-152: LGTM! Logo components are well-implemented.

The logo components follow SVG best practices with proper viewBox attributes and consistent styling.

Copy link
Member

@saihaj saihaj left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we make this gateway word link to this new page?

CleanShot 2025-02-05 at 16 39 23@2x

Copy link
Member

@saihaj saihaj left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nav should also link to the new gateway page

CleanShot 2025-02-05 at 16 40 21@2x

Copy link
Member

@saihaj saihaj left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these as well

CleanShot 2025-02-05 at 16 41 09@2x

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
packages/web/docs/src/app/gateway/page.tsx (2)

17-30: Consider improving the metadata configuration.

The current metadata configuration uses '.' for both canonical and openGraph URLs, which might not be optimal for SEO. Consider using absolute URLs instead.

 export const metadata: Metadata = {
   title: 'Hive Gateway',
   description:
     'Unify and accelerate your data graph with Hive Gateway, which seamlessly integrates with Apollo Federation.',
   alternates: {
-    // to remove leading slash
-    canonical: '.',
+    canonical: 'https://the-guild.dev/graphql/hive/gateway',
   },
   openGraph: {
     ...rootMetadata.openGraph,
-    // to remove leading slash
-    url: '.',
+    url: 'https://the-guild.dev/graphql/hive/gateway',
   },
 };

72-103: Consider extracting SVG definitions.

The SVG gradient definitions could be moved to a separate file to improve maintainability and reusability.

Consider creating a new file gateway-hero-gradients.tsx:

export const GatewayHeroGradients = () => (
  <svg
    className="pointer-events-none -z-50 size-0"
    width="192"
    height="296"
    viewBox="0 0 192 296"
  >
    <defs>
      <linearGradient id="gateway-hero-gradient" gradientTransform="rotate(139)">
        <stop offset="11.66%" stopColor="rgba(255, 255, 255, 0.1)" />
        <stop offset="74.87%" stopColor="rgba(255, 255, 255, 0.3)" />
      </linearGradient>
      <linearGradient
        id="gateway-hero-gradient-mobile"
        x1="35.3488"
        y1="15.0697"
        x2="224.372"
        y2="229.023"
        gradientUnits="userSpaceOnUse"
      >
        <stop stopColor="white" stopOpacity="0.2" />
        <stop offset="80%" stopColor="white" />
      </linearGradient>
    </defs>
  </svg>
);
packages/web/docs/src/app/gateway/gateway-landing-faq.mdx (1)

17-19: Address grammar and style issues.

Several improvements can be made to enhance readability:

  1. Line 17: Remove excessive exclamation mark
  2. Line 23: Add a comma after "capabilities"
  3. Line 29-30: Fix typo in "accommodate"
  4. Line 45-46: Remove colon after "like" and consider hyphenating compound adjectives
-  Of course! Hive Gateway fully supports federated subscriptions and behaves just like Federation
+  Of course, Hive Gateway fully supports federated subscriptions and behaves just like Federation
   GraphQL subscriptions in Apollo Router.

-  Hive Gateway has extensive monitoring and tracing capabilities allowing you deep insights into its
+  Hive Gateway has extensive monitoring and tracing capabilities, allowing you deep insights into its
   inner workings. Use OpenTelemetry, Prometheus, StatsD and Sentry with simple to use plugins.

-  Changing the supergraph and adjusting it to your needs, either to accomodate extra fields or allow
+  Changing the supergraph and adjusting it to your needs, either to accommodate extra fields or allow
   for gradual migration from non-federated systems

-  like: subscriptions, persisted queries, JWT authentication, query batching, rate limiting and high
+  like subscriptions, persisted queries, JWT authentication, query batching, rate-limiting and high

Also applies to: 23-25, 29-30, 45-46

🧰 Tools
🪛 LanguageTool

[style] ~17-~17: Using many exclamation marks might seem excessive (in this case: 3 exclamation marks for a text that’s 2122 characters long)
Context: ...eway support subscriptions? Of course! Hive Gateway fully supports federated s...

(EN_EXCESSIVE_EXCLAMATION)

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 9a12f6b and b8308df.

📒 Files selected for processing (2)
  • packages/web/docs/src/app/gateway/gateway-landing-faq.mdx (1 hunks)
  • packages/web/docs/src/app/gateway/page.tsx (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
`packages/web/docs/**`: The main landing page and documentat...

packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
  • packages/web/docs/src/app/gateway/gateway-landing-faq.mdx
  • packages/web/docs/src/app/gateway/page.tsx
🪛 LanguageTool
packages/web/docs/src/app/gateway/gateway-landing-faq.mdx

[style] ~17-~17: Using many exclamation marks might seem excessive (in this case: 3 exclamation marks for a text that’s 2122 characters long)
Context: ...eway support subscriptions? Of course! Hive Gateway fully supports federated s...

(EN_EXCESSIVE_EXCLAMATION)


[uncategorized] ~23-~23: Possible missing comma found.
Context: ...ay has extensive monitoring and tracing capabilities allowing you deep insights into its i...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~23-~23: Consider an alternative adjective to strengthen your wording.
Context: ...g and tracing capabilities allowing you deep insights into its inner workings. Use...

(DEEP_PROFOUND)


[typographical] ~45-~45: Do not use a colon (:) before a series that is introduced by a preposition (‘like’). Remove the colon or add a noun or a noun phrase after the preposition.
Context: ...hout licensing restrictions; features like: subscriptions, persisted queries, JWT a...

(RP_COLON)


[uncategorized] ~45-~45: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...es, JWT authentication, query batching, rate limiting and high security, observability and ...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

⏰ Context from checks skipped due to timeout of 90000ms (10)
  • GitHub Check: website-preview / deployment
  • GitHub Check: test / unit
  • GitHub Check: typescript / typecheck
  • GitHub Check: static-analysis / analyze (typescript)
  • GitHub Check: static-analysis / analyze (javascript)
  • GitHub Check: build / dockerize (linux/arm64)
  • GitHub Check: build / dockerize (linux/amd64)
  • GitHub Check: alpha / cli-artifacts
  • GitHub Check: code-style / eslint-and-prettier
  • GitHub Check: SonarCloud
🔇 Additional comments (3)
packages/web/docs/src/app/gateway/page.tsx (2)

44-45: Address TODO comments and implement missing sections.

There are several sections that need attention:

  1. TODO comment about feature cards section design update
  2. Commented-out sections for:
    • Federation-Compatible Gateway Benchmarks
    • Let's get advanced
    • Cloud-Native Nature
    • Big get your API game right section

Would you like me to help implement these sections or create issues to track them?

Also applies to: 57-59, 67-67


32-70: LGTM! Well-structured landing page component.

The component is well-organized with a clear hierarchy of sections including hero, feature tabs, and FAQ. The use of semantic class names and responsive design considerations is commendable.

packages/web/docs/src/app/gateway/gateway-landing-faq.mdx (1)

1-48: LGTM! Comprehensive FAQ section.

The FAQ section effectively covers key aspects of Hive Gateway, including migration, deployment options, features, and performance considerations. Each answer is concise and includes relevant documentation links.

🧰 Tools
🪛 LanguageTool

[style] ~17-~17: Using many exclamation marks might seem excessive (in this case: 3 exclamation marks for a text that’s 2122 characters long)
Context: ...eway support subscriptions? Of course! Hive Gateway fully supports federated s...

(EN_EXCESSIVE_EXCLAMATION)


[uncategorized] ~23-~23: Possible missing comma found.
Context: ...ay has extensive monitoring and tracing capabilities allowing you deep insights into its i...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~23-~23: Consider an alternative adjective to strengthen your wording.
Context: ...g and tracing capabilities allowing you deep insights into its inner workings. Use...

(DEEP_PROFOUND)


[typographical] ~45-~45: Do not use a colon (:) before a series that is introduced by a preposition (‘like’). Remove the colon or add a noun or a noun phrase after the preposition.
Context: ...hout licensing restrictions; features like: subscriptions, persisted queries, JWT a...

(RP_COLON)


[uncategorized] ~45-~45: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...es, JWT authentication, query batching, rate limiting and high security, observability and ...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
packages/web/docs/src/app/gateway/gateway-landing-faq.mdx (3)

3-3: Refactor Question Wording

The question “- What do I need to do migrating from another Federation gateway?” may read more naturally with a slight rewording. Consider clarifying it by inserting a connector. For example:

- - What do I need to do migrating from another Federation gateway?
+ - What do I need to do when migrating from another Federation gateway?
🧰 Tools
🪛 LanguageTool

[uncategorized] ~3-~3: Possible missing comma found.
Context: ...ly Asked Questions - What do I need to do migrating from another Federation gatew...

(AI_HYDRA_LEO_MISSING_COMMA)


21-25: Enhance Tracing Tools Answer for Clarity and Style

The explanation for integrating with tracing tools would benefit from a minor punctuation and wording improvement. Specifically, insert a comma after "capabilities" and consider rephrasing “deep insights” to “detailed insights” for a more professional tone. For example:

-  Hive Gateway has extensive monitoring and tracing capabilities allowing you deep insights into its inner workings. Use OpenTelemetry, Prometheus, StatsD and Sentry with simple to use plugins.
+  Hive Gateway has extensive monitoring and tracing capabilities, allowing you detailed insights into its inner workings. Use OpenTelemetry, Prometheus, StatsD, and Sentry with simple-to-use plugins.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~23-~23: Possible missing comma found.
Context: ...ay has extensive monitoring and tracing capabilities allowing you deep insights into its i...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~23-~23: Consider an alternative adjective to strengthen your wording.
Context: ...g and tracing capabilities allowing you deep insights into its inner workings. Use...

(DEEP_PROFOUND)


41-47: Typographical Correction for Feature List

In the open-source features list, there is a typographical issue on the line starting with “like:”. Remove the colon after “like” to conform with standard usage. For example:

-  like: subscriptions, persisted queries, JWT authentication, query batching, rate-limiting and high
+  like subscriptions, persisted queries, JWT authentication, query batching, rate-limiting and high
🧰 Tools
🪛 LanguageTool

[typographical] ~45-~45: Do not use a colon (:) before a series that is introduced by a preposition (‘like’). Remove the colon or add a noun or a noun phrase after the preposition.
Context: ...hout licensing restrictions; features like: subscriptions, persisted queries, JWT a...

(RP_COLON)

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between b8308df and b0e259b.

📒 Files selected for processing (1)
  • packages/web/docs/src/app/gateway/gateway-landing-faq.mdx (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
`packages/web/docs/**`: The main landing page and documentat...

packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
  • packages/web/docs/src/app/gateway/gateway-landing-faq.mdx
🪛 LanguageTool
packages/web/docs/src/app/gateway/gateway-landing-faq.mdx

[uncategorized] ~3-~3: Possible missing comma found.
Context: ...ly Asked Questions - What do I need to do migrating from another Federation gatew...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~17-~17: Using many exclamation marks might seem excessive (in this case: 3 exclamation marks for a text that’s 2123 characters long)
Context: ...eway support subscriptions? Of course! Hive Gateway fully supports federated s...

(EN_EXCESSIVE_EXCLAMATION)


[uncategorized] ~23-~23: Possible missing comma found.
Context: ...ay has extensive monitoring and tracing capabilities allowing you deep insights into its i...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~23-~23: Consider an alternative adjective to strengthen your wording.
Context: ...g and tracing capabilities allowing you deep insights into its inner workings. Use...

(DEEP_PROFOUND)


[typographical] ~45-~45: Do not use a colon (:) before a series that is introduced by a preposition (‘like’). Remove the colon or add a noun or a noun phrase after the preposition.
Context: ...hout licensing restrictions; features like: subscriptions, persisted queries, JWT a...

(RP_COLON)

⏰ Context from checks skipped due to timeout of 90000ms (10)
  • GitHub Check: test / unit
  • GitHub Check: website-preview / deployment
  • GitHub Check: typescript / typecheck
  • GitHub Check: static-analysis / analyze (typescript)
  • GitHub Check: static-analysis / analyze (javascript)
  • GitHub Check: build / dockerize (linux/arm64)
  • GitHub Check: code-style / eslint-and-prettier
  • GitHub Check: build / dockerize (linux/amd64)
  • GitHub Check: alpha / cli-artifacts
  • GitHub Check: SonarCloud
🔇 Additional comments (7)
packages/web/docs/src/app/gateway/gateway-landing-faq.mdx (7)

1-2: Approved: FAQ Section Title is Clear

The header "## Frequently Asked Questions" properly introduces the section and sets a clear context for users.


5-8: Verify FAQ Answer Consistency

The answer for the migration question is concise and provides a useful link for further reading. No changes are required here, but please ensure consistency in tone with other FAQ items as the landing page evolves.


9-14: Edge Compatibility Answer Approved

The FAQ entry on Hive Gateway’s compatibility with edge environments is clear and includes a helpful link.


15-20: Subscription Support Response is Clear

The answer explaining support for subscriptions uses a friendly tone ("Of course!") that is appropriate in an FAQ context. No immediate changes are needed here.

🧰 Tools
🪛 LanguageTool

[style] ~17-~17: Using many exclamation marks might seem excessive (in this case: 3 exclamation marks for a text that’s 2123 characters long)
Context: ...eway support subscriptions? Of course! Hive Gateway fully supports federated s...

(EN_EXCESSIVE_EXCLAMATION)


27-33: Supergraph Customization Entry is Informative

The answer regarding supergraph customization clearly explains the functionality and includes links to useful resources.


34-40: Performance Optimization Details are Well-Documented

The response about performance optimization is comprehensive and directs users to further documentation. It meets the expected documentation standards.


1-48: General Documentation and Integration Note

The FAQ is well-structured and integrates clear, actionable answers with relevant links to further documentation. As this file is part of the broader update to the Hive Gateway landing page, please ensure that any additional updates (such as enriched documentation content and product updates) are consistently maintained across all related sections.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~3-~3: Possible missing comma found.
Context: ...ly Asked Questions - What do I need to do migrating from another Federation gatew...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~17-~17: Using many exclamation marks might seem excessive (in this case: 3 exclamation marks for a text that’s 2123 characters long)
Context: ...eway support subscriptions? Of course! Hive Gateway fully supports federated s...

(EN_EXCESSIVE_EXCLAMATION)


[uncategorized] ~23-~23: Possible missing comma found.
Context: ...ay has extensive monitoring and tracing capabilities allowing you deep insights into its i...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~23-~23: Consider an alternative adjective to strengthen your wording.
Context: ...g and tracing capabilities allowing you deep insights into its inner workings. Use...

(DEEP_PROFOUND)


[typographical] ~45-~45: Do not use a colon (:) before a series that is introduced by a preposition (‘like’). Remove the colon or add a noun or a noun phrase after the preposition.
Context: ...hout licensing restrictions; features like: subscriptions, persisted queries, JWT a...

(RP_COLON)

@hasparus hasparus enabled auto-merge (squash) February 6, 2025 14:07
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
packages/web/docs/src/app/gateway/page.tsx (1)

17-30: Consider using absolute URLs for canonical and OpenGraph URLs.

Using '.' to remove leading slash might not be the best practice. Consider using absolute URLs for better SEO and social sharing.

-    canonical: '.',
+    canonical: 'https://the-guild.dev/graphql/hive/gateway',
   },
   openGraph: {
     ...rootMetadata.openGraph,
-    url: '.',
+    url: 'https://the-guild.dev/graphql/hive/gateway',
   },
packages/web/docs/src/app/gateway/orchestrate-your-way.tsx (1)

2-2: Remove unused import.

The cn utility is imported but never used.

-import { Anchor, cn, Heading, InfoCard } from '@theguild/components';
+import { Anchor, Heading, InfoCard } from '@theguild/components';
🧰 Tools
🪛 GitHub Check: code-style / eslint-and-prettier

[failure] 2-2:
'cn' is defined but never used. Allowed unused vars must match /^_/u

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between b0e259b and 361eea9.

📒 Files selected for processing (2)
  • packages/web/docs/src/app/gateway/orchestrate-your-way.tsx (1 hunks)
  • packages/web/docs/src/app/gateway/page.tsx (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
`packages/web/docs/**`: The main landing page and documentat...

packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
  • packages/web/docs/src/app/gateway/page.tsx
  • packages/web/docs/src/app/gateway/orchestrate-your-way.tsx
🪛 GitHub Check: code-style / eslint-and-prettier
packages/web/docs/src/app/gateway/orchestrate-your-way.tsx

[failure] 2-2:
'cn' is defined but never used. Allowed unused vars must match /^_/u

⏰ Context from checks skipped due to timeout of 90000ms (6)
  • GitHub Check: website-preview / deployment
  • GitHub Check: typescript / typecheck
  • GitHub Check: static-analysis / analyze (javascript)
  • GitHub Check: build / dockerize (linux/arm64)
  • GitHub Check: build / dockerize (linux/amd64)
  • GitHub Check: alpha / cli-artifacts
🔇 Additional comments (5)
packages/web/docs/src/app/gateway/page.tsx (3)

44-45: Verify the TODO comment about bottom paddings.

The TODO comment indicates that bottom paddings should be removed when feature cards are rewritten. Please ensure this is tracked and addressed when the new design is implemented.


57-60: Verify the implementation plan for commented sections.

The following sections are commented out:

  • Federation-Compatible Gateway Benchmarks
  • Let's get advanced
  • Cloud-Native Nature

Please confirm if these sections will be implemented in subsequent PRs as mentioned in the PR objectives.


72-103: LGTM!

The component is well-structured with proper responsive design and SVG gradient definitions.

packages/web/docs/src/app/gateway/orchestrate-your-way.tsx (2)

83-98: LGTM!

The component is well-structured with proper TypeScript types and effective use of Tailwind CSS classes.


61-151: LGTM!

All icon components are properly defined with correct SVG attributes and well-formatted paths.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
packages/web/docs/src/app/gateway/orchestrate-your-way.tsx (3)

20-39: Consider extracting feature data to a constant.

The feature cards implementation is clean, but extracting the feature data to a constant would improve maintainability and make it easier to add/modify features.

+const FEATURES = [
+  {
+    heading: 'Apollo Federation v1 and v2 Support',
+    icon: <CodeIcon />,
+    description: 'Ensures full compatibility and seamless operation within Apollo Federation setups, simplifying integration with existing GraphQL services.',
+    className: 'flex-1 bg-transparent !pl-0 max-lg:!pr-0 md:pt-0 lg:pb-0'
+  },
+  {
+    heading: 'Plugin System',
+    icon: <EditIcon />,
+    description: 'Extensive customization options, allowing enterprises to tailor the gateway to fit specific architectural needs and workflows.',
+    className: 'flex-1 basis-full border-blue-300 bg-transparent !pr-0 max-lg:border-t max-lg:!pl-0 md:pb-0 lg:basis-0 lg:border-l lg:pt-0'
+  }
+];

 <ul className="flex grow basis-2/5 max-lg:flex-col md:p-12">
-  <InfoCard
-    as="li"
-    heading="Apollo Federation v1 and v2 Support"
-    icon={<CodeIcon />}
-    className="flex-1 bg-transparent !pl-0 max-lg:!pr-0 md:pt-0 lg:pb-0"
-  >
-    Ensures full compatibility and seamless operation within Apollo Federation setups,
-    simplifying integration with existing GraphQL services.
-  </InfoCard>
-  <InfoCard
-    as="li"
-    heading="Plugin System"
-    icon={<EditIcon />}
-    className="flex-1 basis-full border-blue-300 bg-transparent !pr-0 max-lg:border-t max-lg:!pl-0 md:pb-0 lg:basis-0 lg:border-l lg:pt-0"
-  >
-    Extensive customization options, allowing enterprises to tailor the gateway to fit
-    specific architectural needs and workflows.
-  </InfoCard>
+  {FEATURES.map(({ heading, icon, description, className }) => (
+    <InfoCard key={heading} as="li" heading={heading} icon={icon} className={className}>
+      {description}
+    </InfoCard>
+  ))}
 </ul>

40-54: Enhance accessibility and maintainability of link cards.

Consider the following improvements:

  1. Extract link card data to a constant for better maintainability
  2. Add aria-label to links for better accessibility
+const INTEGRATION_TYPES = [
+  {
+    href: '/federation',
+    logo: <ApolloLogo />,
+    text: 'Apollo Federation V1',
+    ariaLabel: 'Learn more about Apollo Federation V1'
+  },
+  {
+    href: '/federation',
+    logo: <ApolloLogo />,
+    text: 'Apollo Federation V2',
+    ariaLabel: 'Learn more about Apollo Federation V2'
+  },
+  {
+    href: '/docs/get-started/first-steps#create-hive-project',
+    logo: <StitchingLogo />,
+    text: 'Schema Stitching',
+    ariaLabel: 'Learn more about Schema Stitching'
+  },
+  {
+    href: '/docs/get-started/schema-stitching',
+    logo: <MonolithLogo />,
+    text: 'Monolith/Single Schema',
+    ariaLabel: 'Learn more about Monolith/Single Schema'
+  }
+];

 <div className="nextra-scrollbar max-w-full basis-full overflow-auto rounded-3xl">
   <ul className="grid w-fit grid-cols-[repeat(4,minmax(240px,1fr))] bg-[#F8F7F6] [background-image:linear-gradient(55deg,#F8F7F6_25%,theme(colors.blue.700/0.25)_70%,#F8F7F6_94%)] [&>:not(:first-child)]:border-l [&>:not(:first-child)]:border-blue-300">
-    <LinkCard href="/federation" logo={<ApolloLogo />} text="Apollo Federation V1" />
-    <LinkCard href="/federation" logo={<ApolloLogo />} text="Apollo Federation V2" />
-    <LinkCard
-      href="/docs/get-started/first-steps#create-hive-project"
-      logo={<StitchingLogo />}
-      text="Schema Stitching"
-    />
-    <LinkCard
-      href="/docs/get-started/schema-stitching"
-      logo={<MonolithLogo />}
-      text="Monolith/Single Schema"
-    />
+    {INTEGRATION_TYPES.map(({ href, logo, text, ariaLabel }) => (
+      <LinkCard key={text} href={href} logo={logo} text={text} ariaLabel={ariaLabel} />
+    ))}
   </ul>
 </div>

And update the LinkCard component:

-function LinkCard({ href, text, logo }: { href: string; text: ReactNode; logo: ReactNode }) {
+function LinkCard({ href, text, logo, ariaLabel }: { href: string; text: ReactNode; logo: ReactNode; ariaLabel?: string }) {
   return (
     <li>
       <Anchor
         href={href}
         className="flex min-w-[220px] flex-col items-center justify-center gap-6 p-16 transition hover:bg-white/40"
+        aria-label={ariaLabel}
       >
         {logo}
         <span className="whitespace-pre rounded-3xl border border-blue-400 px-3 py-1 text-sm">

61-151: Enhance SVG accessibility.

Add title tags and ARIA attributes to SVGs for better accessibility.

Example for CodeIcon (apply similar changes to other icons):

 function CodeIcon() {
   return (
     <svg
       xmlns="http://www.w3.org/2000/svg"
       width="24"
       height="25"
       viewBox="0 0 24 25"
       fill="currentColor"
+      role="img"
+      aria-hidden="true"
     >
+      <title>Code Icon</title>
       <path d="M23 12.9502L15.929 20.0211L14.515 18.6072L20.172 12.9502L14.515 7.29315L15.929 5.87915L23 12.9502ZM3.828 12.9502L9.485 18.6072L8.071 20.0211L1 12.9502L8.071 5.87915L9.485 7.29315L3.828 12.9502Z" />
     </svg>
   );
 }
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 361eea9 and 31dc204.

📒 Files selected for processing (1)
  • packages/web/docs/src/app/gateway/orchestrate-your-way.tsx (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
`packages/web/docs/**`: The main landing page and documentat...

packages/web/docs/**: The main landing page and documentation website. It's built using TypeScript, Tailwind, NextJS and Nextra.

In PRs that adds a new feature to the product, we would like to make sure that the PR includes the following:

  • Up to date documentation in packages/web/docs/src/content
  • A product update in packages/web/docs/src/app/product-updates
  • packages/web/docs/src/app/gateway/orchestrate-your-way.tsx
⏰ Context from checks skipped due to timeout of 90000ms (10)
  • GitHub Check: website-preview / deployment
  • GitHub Check: test / unit
  • GitHub Check: typescript / typecheck
  • GitHub Check: static-analysis / analyze (typescript)
  • GitHub Check: static-analysis / analyze (javascript)
  • GitHub Check: build / dockerize (linux/arm64)
  • GitHub Check: code-style / eslint-and-prettier
  • GitHub Check: build / dockerize (linux/amd64)
  • GitHub Check: alpha / cli-artifacts
  • GitHub Check: SonarCloud
🔇 Additional comments (1)
packages/web/docs/src/app/gateway/orchestrate-your-way.tsx (1)

4-19: LGTM! Well-structured component with proper semantics.

The component follows best practices with semantic HTML, responsive design, and proper prop handling.

@hasparus
Copy link
Collaborator Author

hasparus commented Feb 6, 2025

Actionable comments posted: 0

🧹 Nitpick comments (3)

packages/web/docs/src/app/gateway/orchestrate-your-way.tsx (3)> 20-39: Consider extracting feature data to a constant.

The feature cards implementation is clean, but extracting the feature data to a constant would improve maintainability and make it easier to add/modify features.

+const FEATURES = [
+  {
+    heading: 'Apollo Federation v1 and v2 Support',
+    icon: <CodeIcon />,
+    description: 'Ensures full compatibility and seamless operation within Apollo Federation setups, simplifying integration with existing GraphQL services.',
+    className: 'flex-1 bg-transparent !pl-0 max-lg:!pr-0 md:pt-0 lg:pb-0'
+  },
+  {
+    heading: 'Plugin System',
+    icon: <EditIcon />,
+    description: 'Extensive customization options, allowing enterprises to tailor the gateway to fit specific architectural needs and workflows.',
+    className: 'flex-1 basis-full border-blue-300 bg-transparent !pr-0 max-lg:border-t max-lg:!pl-0 md:pb-0 lg:basis-0 lg:border-l lg:pt-0'
+  }
+];

 <ul className="flex grow basis-2/5 max-lg:flex-col md:p-12">
-  <InfoCard
-    as="li"
-    heading="Apollo Federation v1 and v2 Support"
-    icon={<CodeIcon />}
-    className="flex-1 bg-transparent !pl-0 max-lg:!pr-0 md:pt-0 lg:pb-0"
-  >
-    Ensures full compatibility and seamless operation within Apollo Federation setups,
-    simplifying integration with existing GraphQL services.
-  </InfoCard>
-  <InfoCard
-    as="li"
-    heading="Plugin System"
-    icon={<EditIcon />}
-    className="flex-1 basis-full border-blue-300 bg-transparent !pr-0 max-lg:border-t max-lg:!pl-0 md:pb-0 lg:basis-0 lg:border-l lg:pt-0"
-  >
-    Extensive customization options, allowing enterprises to tailor the gateway to fit
-    specific architectural needs and workflows.
-  </InfoCard>
+  {FEATURES.map(({ heading, icon, description, className }) => (
+    <InfoCard key={heading} as="li" heading={heading} icon={icon} className={className}>
+      {description}
+    </InfoCard>
+  ))}
 </ul>

40-54: Enhance accessibility and maintainability of link cards.
Consider the following improvements:

  1. Extract link card data to a constant for better maintainability
  2. Add aria-label to links for better accessibility
+const INTEGRATION_TYPES = [
+  {
+    href: '/federation',
+    logo: <ApolloLogo />,
+    text: 'Apollo Federation V1',
+    ariaLabel: 'Learn more about Apollo Federation V1'
+  },
+  {
+    href: '/federation',
+    logo: <ApolloLogo />,
+    text: 'Apollo Federation V2',
+    ariaLabel: 'Learn more about Apollo Federation V2'
+  },
+  {
+    href: '/docs/get-started/first-steps#create-hive-project',
+    logo: <StitchingLogo />,
+    text: 'Schema Stitching',
+    ariaLabel: 'Learn more about Schema Stitching'
+  },
+  {
+    href: '/docs/get-started/schema-stitching',
+    logo: <MonolithLogo />,
+    text: 'Monolith/Single Schema',
+    ariaLabel: 'Learn more about Monolith/Single Schema'
+  }
+];

 <div className="nextra-scrollbar max-w-full basis-full overflow-auto rounded-3xl">
   <ul className="grid w-fit grid-cols-[repeat(4,minmax(240px,1fr))] bg-[#F8F7F6] [background-image:linear-gradient(55deg,#F8F7F6_25%,theme(colors.blue.700/0.25)_70%,#F8F7F6_94%)] [&>:not(:first-child)]:border-l [&>:not(:first-child)]:border-blue-300">
-    <LinkCard href="/federation" logo={<ApolloLogo />} text="Apollo Federation V1" />
-    <LinkCard href="/federation" logo={<ApolloLogo />} text="Apollo Federation V2" />
-    <LinkCard
-      href="/docs/get-started/first-steps#create-hive-project"
-      logo={<StitchingLogo />}
-      text="Schema Stitching"
-    />
-    <LinkCard
-      href="/docs/get-started/schema-stitching"
-      logo={<MonolithLogo />}
-      text="Monolith/Single Schema"
-    />
+    {INTEGRATION_TYPES.map(({ href, logo, text, ariaLabel }) => (
+      <LinkCard key={text} href={href} logo={logo} text={text} ariaLabel={ariaLabel} />
+    ))}
   </ul>
 </div>

And update the LinkCard component:

-function LinkCard({ href, text, logo }: { href: string; text: ReactNode; logo: ReactNode }) {
+function LinkCard({ href, text, logo, ariaLabel }: { href: string; text: ReactNode; logo: ReactNode; ariaLabel?: string }) {
   return (
     <li>
       <Anchor
         href={href}
         className="flex min-w-[220px] flex-col items-center justify-center gap-6 p-16 transition hover:bg-white/40"
+        aria-label={ariaLabel}
       >
         {logo}
         <span className="whitespace-pre rounded-3xl border border-blue-400 px-3 py-1 text-sm">

61-151: Enhance SVG accessibility.
Add title tags and ARIA attributes to SVGs for better accessibility.
Example for CodeIcon (apply similar changes to other icons):

 function CodeIcon() {
   return (
     <svg
       xmlns="http://www.w3.org/2000/svg"
       width="24"
       height="25"
       viewBox="0 0 24 25"
       fill="currentColor"
+      role="img"
+      aria-hidden="true"
     >
+      <title>Code Icon</title>
       <path d="M23 12.9502L15.929 20.0211L14.515 18.6072L20.172 12.9502L14.515 7.29315L15.929 5.87915L23 12.9502ZM3.828 12.9502L9.485 18.6072L8.071 20.0211L1 12.9502L8.071 5.87915L9.485 7.29315L3.828 12.9502Z" />
     </svg>
   );
 }

📜 Review details

20-39: Consider extracting feature data to a constant.
The feature cards implementation is clean, but extracting the feature data to a constant would improve maintainability and make it easier to add/modify features.

@coderabbitai This is wrong. You're trying to refactor, but you're moving JSX to a JS object. JSX/XML makes sense for UI, and JSON isn't superior. Putting a className in an object makes it less maintainable, because VSCode Tailwind extension won't support that string.

Copy link
Contributor

coderabbitai bot commented Feb 6, 2025

@hasparus You're absolutely right, I apologize for the incorrect suggestion. Moving JSX to JS objects would indeed reduce maintainability by losing VSCode Tailwind extension support, and JSX is the more appropriate format for UI representation. I'll retract that suggestion and keep only the accessibility improvements for SVG icons.


✏️ Learnings added
Learnt from: hasparus
URL: https://github.com/graphql-hive/console/pull/6461

Timestamp: 2025-02-06T14:22:50.320Z
Learning: Avoid suggesting extraction of JSX into JS/JSON objects, especially when dealing with className strings, as it breaks IDE support for Tailwind CSS and reduces maintainability. JSX/XML is the preferred format for UI representation.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

✅ Actions performed

Comments resolved.

@hasparus hasparus merged commit 280f4d1 into main Feb 6, 2025
30 checks passed
@hasparus hasparus deleted the hive-gateway-landing branch February 6, 2025 14:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

2 participants