<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yamashou</title>
    <description>The latest articles on DEV Community by Yamashou (@yamashou).</description>
    <link>https://dev.to/yamashou</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F45213%2Fae6df705-6a20-4dd2-b4ac-02c8a62642a8.png</url>
      <title>DEV Community: Yamashou</title>
      <link>https://dev.to/yamashou</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yamashou"/>
    <language>en</language>
    <item>
      <title>rgql: AST-Aware GraphQL Refactoring That AI Agents Can Trust</title>
      <dc:creator>Yamashou</dc:creator>
      <pubDate>Thu, 26 Mar 2026 05:12:54 +0000</pubDate>
      <link>https://dev.to/yamashou/rgql-ast-aware-graphql-refactoring-that-ai-agents-can-trust-4aib</link>
      <guid>https://dev.to/yamashou/rgql-ast-aware-graphql-refactoring-that-ai-agents-can-trust-4aib</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — &lt;code&gt;rgql&lt;/code&gt; is a CLI tool that renames GraphQL types, fields, and fragments across schema files and embedded TypeScript queries using full AST analysis. Because it's type-safe and deterministic, it's ideal for AI coding agents like Claude Code and Codex — they can invoke a single command instead of performing fragile find-and-replace across dozens of files.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Renaming in GraphQL Is Surprisingly Hard
&lt;/h2&gt;

&lt;p&gt;Imagine you have a &lt;code&gt;User&lt;/code&gt; type with a &lt;code&gt;firstName&lt;/code&gt; field, and a &lt;code&gt;Product&lt;/code&gt; type that also has a &lt;code&gt;firstName&lt;/code&gt; field. You want to rename &lt;code&gt;User.firstName&lt;/code&gt; to &lt;code&gt;User.fullName&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A naive find-and-replace would touch both. Even a regex-aware approach struggles when the same field name appears in nested selections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GetDashboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;# ← should be renamed&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;firstName&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# ← should NOT be renamed&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now multiply this across &lt;code&gt;.graphql&lt;/code&gt; schema files and &lt;code&gt;graphql&lt;/code&gt; tagged templates embedded in &lt;code&gt;.ts&lt;/code&gt;/&lt;code&gt;.tsx&lt;/code&gt; files. Manual refactoring is tedious and error-prone. IDE support for GraphQL refactoring is limited — most editors treat GraphQL strings as opaque text.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: AST-Aware, Type-Safe Refactoring
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;rgql&lt;/code&gt; solves this with two key GraphQL-js primitives: &lt;strong&gt;&lt;code&gt;TypeInfo&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;visitWithTypeInfo&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When renaming &lt;code&gt;User.firstName → User.fullName&lt;/code&gt;, rgql:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parses your schema to build a full type graph&lt;/li&gt;
&lt;li&gt;Walks every query/mutation/fragment using &lt;code&gt;visitWithTypeInfo&lt;/code&gt;, which tracks the &lt;strong&gt;parent type&lt;/strong&gt; at each field node&lt;/li&gt;
&lt;li&gt;Only renames a &lt;code&gt;firstName&lt;/code&gt; field when &lt;code&gt;typeInfo.getParentType()&lt;/code&gt; resolves to &lt;code&gt;User&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This means &lt;code&gt;Product.firstName&lt;/code&gt; is never touched — not because of text heuristics, but because the tool &lt;em&gt;understands the schema semantics&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dry run — preview changes without modifying files&lt;/span&gt;
rgql rename field User.firstName User.fullName

&lt;span class="c"&gt;# Apply&lt;/span&gt;
rgql rename field User.firstName User.fullName &lt;span class="nt"&gt;--write&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Changes:
  schema/user.graphql:12  firstName → fullName  [schema]
  src/components/UserCard.tsx:34  firstName → fullName  (graphql`...`)  [document]

2 files, 2 occurrences
Dry run. Use --write to apply.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why This Matters for AI Agents
&lt;/h2&gt;

&lt;p&gt;Here's the angle I'm most excited about: &lt;strong&gt;rgql is designed to be used by AI coding agents&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you ask Claude Code or Codex to rename a GraphQL field, the agent typically has to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the schema definition&lt;/li&gt;
&lt;li&gt;Find all query files referencing that field&lt;/li&gt;
&lt;li&gt;Determine which &lt;code&gt;firstName&lt;/code&gt; belongs to which type&lt;/li&gt;
&lt;li&gt;Apply changes to each file individually&lt;/li&gt;
&lt;li&gt;Hope it didn't miss anything or break something&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This consumes &lt;strong&gt;a lot of context window&lt;/strong&gt; — the agent needs to read and reason about every file. And even smart agents can miss edge cases like inline fragments or interface implementations.&lt;/p&gt;

&lt;p&gt;With rgql, the agent just runs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rgql rename field User.firstName User.fullName &lt;span class="nt"&gt;--write&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;One command. Zero context consumed. Guaranteed correctness.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent doesn't need to read any GraphQL files. It doesn't need to understand query nesting. The AST does the work. This is the same philosophy behind tools like &lt;code&gt;gopls rename&lt;/code&gt; or &lt;code&gt;ts-morph&lt;/code&gt; — give agents &lt;strong&gt;safe, atomic refactoring primitives&lt;/strong&gt; instead of asking them to do text surgery.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interface Safety — Even Agents Can't Break This
&lt;/h3&gt;

&lt;p&gt;When renaming a field that's defined on an interface, rgql detects the impact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⚠️  Breaking change detected:
    'firstName' is defined on interface 'Node'
    The following types implement this interface:

    - User.firstName
    - Admin.firstName

Rename all of the above together? [y/n/q]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without &lt;code&gt;--force&lt;/code&gt;, it &lt;strong&gt;refuses to apply a partial rename&lt;/strong&gt; that would break your schema. This guardrail protects both humans and AI agents from introducing silent inconsistencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture: Pure Core / Impure Shell
&lt;/h2&gt;

&lt;p&gt;rgql follows a &lt;strong&gt;Functional Domain Modeling&lt;/strong&gt; architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── core/           # Pure functions — no IO, no side effects
│   ├── pipeline.ts       # computeRenamePlan() → RenameOutcome
│   ├── validate.ts       # Type/field existence, collision checks
│   ├── rename-schema.ts  # AST rename in .graphql files
│   └── rename-document.ts # AST rename in queries (standalone + embedded)
├── shell/          # IO boundary — the only place with side effects
│   ├── cli.ts            # handleOutcome() — console output, file writes
│   ├── config.ts         # graphql-config loading
│   └── file-system.ts    # File I/O
└── types/
    ├── domain.ts         # Branded types, discriminated unions
    └── result.ts         # Result&amp;lt;T, E&amp;gt; instead of exceptions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The entire rename pipeline is a &lt;strong&gt;pure function&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RenameCommand + Schema + Documents → RenameOutcome
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;RenameOutcome&lt;/code&gt; is a discriminated union with 7 variants — &lt;code&gt;dry-run&lt;/code&gt;, &lt;code&gt;written&lt;/code&gt;, &lt;code&gt;no-changes&lt;/code&gt;, &lt;code&gt;validation-error&lt;/code&gt;, &lt;code&gt;interface-skipped&lt;/code&gt;, &lt;code&gt;interface-aborted&lt;/code&gt;, &lt;code&gt;interactive-complete&lt;/code&gt;. The shell layer pattern-matches on the variant and performs the appropriate IO.&lt;/p&gt;

&lt;p&gt;This makes the core logic trivially testable and predictable — which is exactly what you want when an AI agent is deciding whether to call your tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Branded Types Prevent Mixing
&lt;/h3&gt;

&lt;p&gt;TypeScript lets you accidentally pass a type name where a field name is expected — they're both &lt;code&gt;string&lt;/code&gt;. rgql prevents this at compile time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;TypeName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="na"&gt;__brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TypeName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;FieldName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="na"&gt;__brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;FieldName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toTypeName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;TypeName&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;TypeName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No runtime cost. Full compile-time safety.&lt;/p&gt;

&lt;h3&gt;
  
  
  Result Over Exceptions
&lt;/h3&gt;

&lt;p&gt;Instead of &lt;code&gt;throw&lt;/code&gt;, every function returns a &lt;code&gt;Result&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;E&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;E&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes error paths explicit and composable with &lt;code&gt;mapResult&lt;/code&gt; / &lt;code&gt;flatMapResult&lt;/code&gt;. No hidden control flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embedded Query Detection
&lt;/h2&gt;

&lt;p&gt;rgql doesn't just handle standalone &lt;code&gt;.graphql&lt;/code&gt; files. It uses &lt;strong&gt;ts-morph&lt;/strong&gt; (TypeScript AST) to find &lt;code&gt;graphql&lt;/code&gt; and &lt;code&gt;gql&lt;/code&gt; tagged template literals inside &lt;code&gt;.ts&lt;/code&gt; and &lt;code&gt;.tsx&lt;/code&gt; files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// rgql finds and correctly renames inside this:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;GET_USER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;graphql&lt;/span&gt;&lt;span class="s2"&gt;`
  query GetUser {
    user {
      firstName  # ← renamed to fullName
    }
  }
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The offset arithmetic is handled internally — GraphQL AST positions are relative to the query string, but rgql translates them to absolute file positions for precise text replacement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install (requires Bun)&lt;/span&gt;
bun &lt;span class="nb"&gt;install
&lt;/span&gt;bun run build    &lt;span class="c"&gt;# produces ./rgql single binary&lt;/span&gt;

&lt;span class="c"&gt;# Configuration — uses standard graphql-config&lt;/span&gt;
&lt;span class="c"&gt;# graphql.config.yml&lt;/span&gt;
schema: ./schema/&lt;span class="k"&gt;**&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.graphql
documents: ./src/&lt;span class="k"&gt;**&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.&lt;span class="o"&gt;{&lt;/span&gt;ts,tsx&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three rename commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rgql rename &lt;span class="nb"&gt;type &lt;/span&gt;User Account          &lt;span class="c"&gt;# Rename a type&lt;/span&gt;
rgql rename field User.firstName User.fullName  &lt;span class="c"&gt;# Rename a field&lt;/span&gt;
rgql rename fragment UserBasic UserSummary      &lt;span class="c"&gt;# Rename a fragment&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flags:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--write&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Apply changes (default: dry run)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interactive — confirm each change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--force&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Allow interface cascade renames&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Explicit config file path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--project&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Project name for monorepo configs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Support &lt;code&gt;/* GraphQL */&lt;/code&gt; and &lt;code&gt;# graphql&lt;/code&gt; comment-tagged queries&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rename enum-value&lt;/code&gt; command&lt;/li&gt;
&lt;li&gt;Watch mode for continuous refactoring&lt;/li&gt;
&lt;li&gt;npm / Homebrew distribution&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Yamashou/rgql" rel="noopener noreferrer"&gt;https://github.com/Yamashou/rgql&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're using GraphQL with TypeScript and tired of manual renames — or if you're building AI agent workflows that need safe refactoring primitives — give rgql a try.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Bun, graphql-js, ts-morph, and Commander.js.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>ast</category>
      <category>ts</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to use addFirebase of the Firebase Management API</title>
      <dc:creator>Yamashou</dc:creator>
      <pubDate>Thu, 30 Jul 2020 17:42:28 +0000</pubDate>
      <link>https://dev.to/yamashou/how-to-use-addfirebase-of-the-firebase-management-api-1d2g</link>
      <guid>https://dev.to/yamashou/how-to-use-addfirebase-of-the-firebase-management-api-1d2g</guid>
      <description>&lt;p&gt;I want to call addFirebase of Firebase Management API. This api can add firebase for a project of GCP. I try &lt;a href="https://firebase.google.com/docs/projects/api/workflow_set-up-and-manage-project" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But, I get only an error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  error: {
    code: 403,
    message: 'The caller does not have permission',
    status: 'PERMISSION_DENIED'
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;my service account have owner role. &lt;br&gt;
If the Owner can't call, who on earth can call? I don't have an idea.&lt;/p&gt;

&lt;p&gt;I watch people who have same issue in stackoverflow. But,&lt;br&gt;
There was no answer I was looking for.&lt;/p&gt;

&lt;p&gt;So, I write now here!!!!!&lt;/p&gt;

&lt;p&gt;Please tell me there!&lt;/p&gt;

&lt;h2&gt;
  
  
  Documents
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://firebase.google.com/docs/projects/api/reference/rest" rel="noopener noreferrer"&gt;https://firebase.google.com/docs/projects/api/reference/rest&lt;/a&gt;&lt;br&gt;
&lt;a href="https://firebase.google.com/docs/projects/api/workflow_set-up-and-manage-project" rel="noopener noreferrer"&gt;https://firebase.google.com/docs/projects/api/workflow_set-up-and-manage-project&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/55757947/403-the-caller-does-not-have-permission-for-firebase-management-api-addfirebase" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/55757947/403-the-caller-does-not-have-permission-for-firebase-management-api-addfirebase&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/54773388/firebase-management-api-projects-addfirebase-permission-denied" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/54773388/firebase-management-api-projects-addfirebase-permission-denied&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/58955308/403-when-using-firebase-api-to-create-a-project-as-an-owner-user-not-a-service" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/58955308/403-when-using-firebase-api-to-create-a-project-as-an-owner-user-not-a-service&lt;/a&gt;&lt;/p&gt;

</description>
      <category>firebase</category>
      <category>gcp</category>
    </item>
    <item>
      <title>Generate GraphQL Client Code With Go</title>
      <dc:creator>Yamashou</dc:creator>
      <pubDate>Tue, 07 Jul 2020 07:01:45 +0000</pubDate>
      <link>https://dev.to/yamashou/generate-graphql-client-code-with-go-5gnd</link>
      <guid>https://dev.to/yamashou/generate-graphql-client-code-with-go-5gnd</guid>
      <description>&lt;p&gt;Hi! I’m a Japanese software engineer with Go and Typescript.I develop applications every day when work and play. These days I use GraphQL a lot with them. And I use &lt;a href="https://www.apollographql.com/" rel="noopener noreferrer"&gt;Apollo&lt;/a&gt;, &lt;a href="https://graphql-code-generator.com/" rel="noopener noreferrer"&gt;GraphQL Code Generator&lt;/a&gt; and &lt;a href="https://gqlgen.com/" rel="noopener noreferrer"&gt;gqlgen&lt;/a&gt; for that. They are my favorite projects. They have in common that generate code.&lt;br&gt;
So, I want to generate client for Go.&lt;br&gt;
There are client for Go:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/shurcooL/graphql" rel="noopener noreferrer"&gt;github.com/shurcooL/graphql&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/machinebox/graphql" rel="noopener noreferrer"&gt;github.com/machinebox/graphql&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These libraries are very simple and easy to handle and used by &lt;a href="https://gqlgen.com/" rel="noopener noreferrer"&gt;gqlgen&lt;/a&gt;. But these don’t generate code. I want to generate code by response of introspection query from server. The &lt;a href="https://graphql-code-generator.com/" rel="noopener noreferrer"&gt;GraphQL Code Generator&lt;/a&gt; have it. This user will have a comfortable development life.&lt;/p&gt;

&lt;p&gt;So I give gopher and myself the same experience as a web client engineer.&lt;br&gt;
I prepared for that.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gqlgo" rel="noopener noreferrer"&gt;
        gqlgo
      &lt;/a&gt; / &lt;a href="https://github.com/gqlgo/gqlgenc" rel="noopener noreferrer"&gt;
        gqlgenc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      This is Go library for building GraphQL client with gqlgen
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;gqlgenc&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What is gqlgenc ?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This is Go library for building GraphQL client with &lt;a href="https://github.com/99designs/gqlgen" rel="noopener noreferrer"&gt;gqlgen&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Motivation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Now, if you build GraphQL api client for Go, have choice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/shurcooL/graphql" rel="noopener noreferrer"&gt;github.com/shurcooL/graphql&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/machinebox/graphql" rel="noopener noreferrer"&gt;github.com/machinebox/graphql&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These libraries are very simple and easy to handle.
However, as I work with &lt;a href="https://github.com/99designs/gqlgen" rel="noopener noreferrer"&gt;gqlgen&lt;/a&gt; and &lt;a href="https://graphql-code-generator.com/" rel="nofollow noopener noreferrer"&gt;graphql-code-generator&lt;/a&gt; every day, I find out the beauty of automatic generation.
So I want to automatically generate types.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;go get -u github.com/gqlgo/gqlgenc&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How to use&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Client Codes Only&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;gqlgenc base is gqlgen with &lt;a href="https://gqlgen.com/reference/plugins/" rel="nofollow noopener noreferrer"&gt;plugins&lt;/a&gt;. So the setting is yaml in each format.
gqlgenc can be configured using a &lt;code&gt;.gqlgenc.yml&lt;/code&gt; file&lt;/p&gt;
&lt;p&gt;Load a schema from a remote server:&lt;/p&gt;
&lt;div class="highlight highlight-source-yaml notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-ent"&gt;model&lt;/span&gt;
  &lt;span class="pl-ent"&gt;package&lt;/span&gt;: &lt;span class="pl-s"&gt;generated&lt;/span&gt;
  &lt;span class="pl-ent"&gt;filename&lt;/span&gt;: &lt;span class="pl-s"&gt;./models_gen.go &lt;/span&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; https://github.com/99designs/gqlgen/tree/master/plugin/modelgen&lt;/span&gt;
&lt;span class="pl-ent"&gt;client&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;package&lt;/span&gt;: &lt;span class="pl-s"&gt;generated&lt;/span&gt;
  &lt;span class="pl-ent"&gt;filename&lt;/span&gt;: &lt;span class="pl-s"&gt;./client.go &lt;/span&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Where should any generated client go?&lt;/span&gt;
&lt;span class="pl-ent"&gt;models&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;Int&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;model&lt;/span&gt;: &lt;span class="pl-s"&gt;github.com/99designs/gqlgen/graphql.Int64&lt;/span&gt;
  &lt;span class="pl-ent"&gt;Date&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;model&lt;/span&gt;: &lt;span class="pl-s"&gt;github.com/99designs/gqlgen/graphql.Time&lt;/span&gt;
&lt;span class="pl-ent"&gt;federation&lt;/span&gt;: &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Add this if your schema includes&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/gqlgo/gqlgenc" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go get &lt;span class="nt"&gt;-u&lt;/span&gt; github.com/Yamashou/gqlgenc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to use
&lt;/h2&gt;

&lt;p&gt;This is a client generator based on the gqlgen plugin. If you use it, choice CLI or a plugin. I will explain how to use it using the Github API. If you don’t read this sentence, read here.&lt;/p&gt;

&lt;h3&gt;
  
  
  First, You create .gqlgenc.yaml in your project root.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./gen/models_gen.go&lt;/span&gt;
&lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./gen/client.go&lt;/span&gt;
&lt;span class="na"&gt;models&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.com/99designs/gqlgen/graphql.Time&lt;/span&gt;
&lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://api.github.com/graphql&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;${GITHUB_TOKEN}"&lt;/span&gt; &lt;span class="c1"&gt;# public access token&lt;/span&gt;
&lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  
   &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./query/*.graphql"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you don’t have a github token, you see here&lt;/p&gt;

&lt;h3&gt;
  
  
  Next, You create query.graphql in /query.
&lt;/h3&gt;

&lt;p&gt;This query get your repositories.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;fragment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LanguageFragment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Language&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GetUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$repositoryFirst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;!,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$languageFirst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;!)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;viewer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;repositories&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$repositoryFirst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CREATED_AT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$languageFirst&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="n"&gt;LanguageFragment&lt;/span&gt;&lt;span class="w"&gt;
                    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Finally, You exec a command in your project root.
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gqlgenc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your client code is generated in /gen.&lt;br&gt;
Then, run this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"context"&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/Yamashou/gqlgenc/client"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/Yamashou/gqlgenc/example/github/gen"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;
    &lt;span class="s"&gt;"os"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// This example only read public repository. You don't need to select scopes.&lt;/span&gt;
    &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"GITHUB_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;authHeader&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Header&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Bearer %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;githubClient&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DefaultClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"https://api.github.com/graphql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;authHeader&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;githubClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"error: %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;getUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Viewer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Viewer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Repositories&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nodes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;getUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Viewer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Repositories&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nodes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Languages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nodes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/Yamashou/gqlgenc/blob/master/example/github/main.go" rel="noopener noreferrer"&gt;https://github.com/Yamashou/gqlgenc/blob/master/example/github/main.go&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To understand the example, you read this code, readme and &lt;a href="https://gqlgen.com/" rel="noopener noreferrer"&gt;gqlgen&lt;/a&gt; document. If you understand Japanese, read here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Afterword
&lt;/h2&gt;

&lt;p&gt;This article is my first post with English. You may have a sentence that don’t understand, but I’m very happy to have this challenge. Thank you for reading this to the end.&lt;/p&gt;

</description>
      <category>go</category>
      <category>graphql</category>
      <category>gqlgen</category>
    </item>
  </channel>
</rss>
