Repository: graphql-markdown/graphql-markdown
Pull request #956 (2023-08-19 17:26:35)

:recycle:  extract module utils/graphql to @graphql-markdown/graphql
# Description

Last step of separating concerns between packages.

# Checklist

- [x] My changes follow the [contributing guidelines](https://github.com/graphql-markdown/graphql-markdown/blob/main/CONTRIBUTING.md) of this project.
- [x] I have performed a self-review of my code.
- [x] I have made corresponding changes to the documentation.
- [x] I have added tests that prove my fix is effective or that my changes work.
- [x] New and existing unit tests pass locally with my changes.


sonarcloud[bot]: SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=graphql-markdown_graphql-markdown&pullRequest=956)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL) [3 Code Smells](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956) No Coverage information  
[![1.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.1%')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956&metric=new_duplicated_lines_density&view=list) [1.1% Duplication](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956&metric=new_duplicated_lines_density&view=list)



![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)
codesee-maps[bot]: <details open>
<summary><b>👇 <a href="https://app.codesee.io/r/reviews?pr=956&src=https%3A%2F%2Fgithub.com%2Fgraphql-markdown%2Fgraphql-markdown">Click on the image</a> for a new way to code review</b>
</summary>

####

[![Review these changes using an interactive CodeSee Map](https://s3.us-east-2.amazonaws.com/maps.codesee.io/images/github/graphql-markdown/graphql-markdown/956/b6e2416c/50fa63611d7d82ebde2cd041f44f66a5fc8c1f5c.svg)](https://app.codesee.io/r/reviews?pr=956&src=https%3A%2F%2Fgithub.com%2Fgraphql-markdown%2Fgraphql-markdown)

#### Legend
<img src="https://app.codesee.io/Legend_v3.png" alt="CodeSee Map legend" width="220" height="156">
</details>
github-actions[bot]: 
<!--
  0 failure: 
  1 warning:  This PR modified ...
  
  
  DangerID: danger-id-Danger;
-->


<table>
  <thead>
    <tr>
      <th width="50"></th>
      <th width="100%" data-danger-table="true">Warnings</th>
    </tr>
  </thead>
  <tbody><tr>
      <td>:warning:</td>
      <td>

  This PR modified some Jest snapshot file/s:
 - packages/graphql/tests/unit/__snapshots__/introspection.test.ts.snap
 - packages/graphql/tests/unit/__snapshots__/relation.test.ts.snap
  </td>
    </tr>
  </tbody>
</table>



<p align="right">
  Generated by :no_entry_sign: <a href="https://danger.systems/js">dangerJS</a> against 50fa63611d7d82ebde2cd041f44f66a5fc8c1f5c
</p>

coveralls: 
[![Coverage Status](https://coveralls.io/builds/62093195/badge)](https://coveralls.io/builds/62093195)

coverage: 87.209% (-6.9%) from 94.124% when pulling **50fa63611d7d82ebde2cd041f44f66a5fc8c1f5c on chore/package-graphql** into **93b736847787717c350e300d85b76efafe6892ee on main**.

sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=graphql-markdown_graphql-markdown&pullRequest=956)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL) [1 Code Smell](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956) No Coverage information  
[![1.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.1%')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956&metric=new_duplicated_lines_density&view=list) [1.1% Duplication](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=graphql-markdown_graphql-markdown&pullRequest=956)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956) No Coverage information  
[![1.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.1%')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956&metric=new_duplicated_lines_density&view=list) [1.1% Duplication](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=graphql-markdown_graphql-markdown&pullRequest=956)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956) No Coverage information  
[![1.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.1%')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956&metric=new_duplicated_lines_density&view=list) [1.1% Duplication](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=graphql-markdown_graphql-markdown&pullRequest=956)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956) No Coverage information  
[![1.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.1%')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956&metric=new_duplicated_lines_density&view=list) [1.1% Duplication](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=graphql-markdown_graphql-markdown&pullRequest=956)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=956&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956) No Coverage information  
[![1.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '1.1%')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956&metric=new_duplicated_lines_density&view=list) [1.1% Duplication](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=956&metric=new_duplicated_lines_density&view=list)



Patch:
diff --git a/.github/workflows/mutation.yml b/.github/workflows/mutation.yml
index d00207d2..10d1d0ae 100644
--- a/.github/workflows/mutation.yml
+++ b/.github/workflows/mutation.yml
@@ -27,7 +27,7 @@ jobs:
       fail-fast: false
       matrix:
         package:
-          ["core", "diff", "docusaurus", "printer-legacy", "utils", "helpers", "logger"]
+          ["core", "diff", "docusaurus", "printer-legacy", "utils", "helpers", "logger", "graphql"]
 
     steps:
       - name: Checkout Code Base
diff --git a/Earthfile b/Earthfile
index b70eb465..88d55ee9 100644
--- a/Earthfile
+++ b/Earthfile
@@ -58,7 +58,7 @@ smoke-init:
   FROM +build-docusaurus
   WORKDIR /docusaurus2
   RUN npm install graphql @graphql-tools/url-loader @graphql-tools/graphql-file-loader
-  FOR package IN types utils helpers logger printer-legacy diff core docusaurus
+  FOR package IN types utils graphql helpers logger printer-legacy diff core docusaurus
     COPY (+build-package/graphql-markdown-${package}.tgz --package=${package}) ./
     RUN npm install ./graphql-markdown-${package}.tgz
   END
diff --git a/config/jest.config.js b/config/jest.config.js
index 0c87f8b0..8262c03b 100644
--- a/config/jest.config.js
+++ b/config/jest.config.js
@@ -29,6 +29,7 @@ module.exports = {
     projectConfig("core"),
     projectConfig("diff"),
     projectConfig("docusaurus"),
+    projectConfig("graphql"),
     projectConfig("helpers"),
     projectConfig("logger"),
     projectConfig("printer-legacy"),
diff --git a/docs/advanced/custom-directive.md b/docs/advanced/custom-directive.md
index 02b1d7fe..ec4aa5bc 100644
--- a/docs/advanced/custom-directive.md
+++ b/docs/advanced/custom-directive.md
@@ -125,14 +125,14 @@ plugins: [
 
 ## Helpers
 
-The packages `@graphql-markdown/helpers` and `@graphql-markdown/utils` provide few helper functions to quick start:
+The packages `@graphql-markdown/helpers` and `@graphql-markdown/graphql` provide few helper functions to quick start:
 
 ```ts
 import { directiveDescriptor, tagDescriptor } from "@graphql-markdown/helpers";
 import {
   getTypeDirectiveArgValue,
   getTypeDirectiveValues,
-} from "@graphql-markdown/utils";
+} from "@graphql-markdown/graphql";
 ```
 
 :::info
@@ -150,7 +150,7 @@ npm i @graphql-markdown/helpers
 
 - <code><b>tagDescriptor</b>(directive: GraphQLDirective, type?: unknown, classname?: string): Badge</code> returns the directive badge, with `classname` defaulted to `badge--secondary`.
 
-### `@graphql-markdown/utils`
+### `@graphql-markdown/graphql`
 
 - <code><b>getTypeDirectiveArgValue</b>(directive: GraphQLDirective, node: unknown, argName: string): Record&lt;string, unknown&gt; | undefined</code> returns the value of a specific directive argument by name.
 
diff --git a/package-lock.json b/package-lock.json
index d7f96572..77f24764 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,7 +15,9 @@
         "@graphql-markdown/core": "file:packages/core",
         "@graphql-markdown/diff": "file:packages/diff",
         "@graphql-markdown/docusaurus": "file:packages/docusaurus",
+        "@graphql-markdown/graphql": "file:packages/graphql",
         "@graphql-markdown/helpers": "file:packages/helpers",
+        "@graphql-markdown/logger": "file:packages/logger",
         "@graphql-markdown/printer-legacy": "file:packages/printer-legacy",
         "@graphql-markdown/types": "file:packages/types",
         "@graphql-markdown/utils": "file:packages/utils",
@@ -1691,6 +1693,10 @@
       "resolved": "packages/docusaurus",
       "link": true
     },
+    "node_modules/@graphql-markdown/graphql": {
+      "resolved": "packages/graphql",
+      "link": true
+    },
     "node_modules/@graphql-markdown/helpers": {
       "resolved": "packages/helpers",
       "link": true
@@ -15231,6 +15237,7 @@
       "version": "1.6.4",
       "license": "MIT",
       "dependencies": {
+        "@graphql-markdown/graphql": "^1.0.0",
         "@graphql-markdown/logger": "^1.0.0",
         "@graphql-markdown/utils": "^1.5.1"
       },
@@ -15267,6 +15274,7 @@
       "license": "MIT",
       "dependencies": {
         "@graphql-inspector/core": "^5.0.0",
+        "@graphql-markdown/graphql": "^1.0.0",
         "@graphql-markdown/utils": "^1.5.1",
         "@graphql-tools/graphql-file-loader": "^8.0.0",
         "@graphql-tools/load": "^8.0.0"
@@ -15298,12 +15306,26 @@
         "@docusaurus/logger": "*"
       }
     },
+    "packages/graphql": {
+      "name": "@graphql-markdown/graphql",
+      "version": "1.0.0",
+      "license": "MIT",
+      "dependencies": {
+        "@graphql-markdown/utils": "^1.5.1"
+      },
+      "devDependencies": {
+        "@graphql-markdown/types": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=16.14"
+      }
+    },
     "packages/helpers": {
       "name": "@graphql-markdown/helpers",
       "version": "1.0.0",
       "license": "MIT",
       "dependencies": {
-        "@graphql-markdown/utils": "^1.5.1"
+        "@graphql-markdown/graphql": "^1.0.0"
       },
       "devDependencies": {
         "@graphql-markdown/types": "^1.0.0"
@@ -15313,6 +15335,7 @@
       }
     },
     "packages/logger": {
+      "name": "@graphql-markdown/logger",
       "version": "1.0.0",
       "license": "MIT",
       "devDependencies": {
@@ -15327,6 +15350,7 @@
       "version": "1.4.3",
       "license": "MIT",
       "dependencies": {
+        "@graphql-markdown/graphql": "^1.0.0",
         "@graphql-markdown/utils": "^1.5.1"
       },
       "devDependencies": {
diff --git a/package.json b/package.json
index a403d1a8..4ec77dad 100644
--- a/package.json
+++ b/package.json
@@ -198,6 +198,7 @@
     "@graphql-markdown/core": "file:packages/core",
     "@graphql-markdown/diff": "file:packages/diff",
     "@graphql-markdown/docusaurus": "file:packages/docusaurus",
+    "@graphql-markdown/graphql": "file:packages/graphql",
     "@graphql-markdown/helpers": "file:packages/helpers",
     "@graphql-markdown/logger": "file:packages/logger",
     "@graphql-markdown/printer-legacy": "file:packages/printer-legacy",
diff --git a/packages/core/package.json b/packages/core/package.json
index 0703c668..9f814f2c 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -62,8 +62,9 @@
     "clean": "rm -rf ./dist"
   },
   "dependencies": {
-    "@graphql-markdown/utils": "^1.5.1",
-    "@graphql-markdown/logger": "^1.0.0"
+    "@graphql-markdown/graphql": "^1.0.0",
+    "@graphql-markdown/logger": "^1.0.0",
+    "@graphql-markdown/utils": "^1.5.1"
   },
   "peerDependencies": {
     "@graphql-markdown/diff": "^1.0.14",
diff --git a/packages/core/src/generator.ts b/packages/core/src/generator.ts
index fc45e870..bff32a2d 100644
--- a/packages/core/src/generator.ts
+++ b/packages/core/src/generator.ts
@@ -12,7 +12,7 @@ import {
   getGroups,
   getSchemaMap,
   loadSchema,
-} from "@graphql-markdown/utils";
+} from "@graphql-markdown/graphql";
 
 import { Renderer } from "./renderer";
 import { hasChanges } from "./diff";
diff --git a/packages/core/src/renderer.ts b/packages/core/src/renderer.ts
index c4a2167b..34d7a267 100644
--- a/packages/core/src/renderer.ts
+++ b/packages/core/src/renderer.ts
@@ -12,11 +12,12 @@ import type {
 
 import { basename, join, relative, normalize } from "node:path";
 
+import { isDeprecated } from "@graphql-markdown/graphql";
+
 import {
   copyFile,
   ensureDir,
   fileExists,
-  isDeprecated,
   pathUrl,
   prettifyJavascript,
   prettifyMarkdown,
diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json
index 4a15b948..db0895db 100644
--- a/packages/core/tsconfig.json
+++ b/packages/core/tsconfig.json
@@ -14,6 +14,7 @@
   "references": [
     { "path": "../utils" }, 
     { "path": "../logger" },
+    { "path": "../graphql" },
     { "path": "../printer-legacy" } // needed for mutation tests only
   ]
 }
diff --git a/packages/diff/package.json b/packages/diff/package.json
index cd74a707..7822fe46 100644
--- a/packages/diff/package.json
+++ b/packages/diff/package.json
@@ -56,6 +56,7 @@
   },
   "dependencies": {
     "@graphql-inspector/core": "^5.0.0",
+    "@graphql-markdown/graphql": "^1.0.0",
     "@graphql-markdown/utils": "^1.5.1",
     "@graphql-tools/graphql-file-loader": "^8.0.0",
     "@graphql-tools/load": "^8.0.0"
diff --git a/packages/diff/src/index.ts b/packages/diff/src/index.ts
index 66c0269a..c3d7acce 100644
--- a/packages/diff/src/index.ts
+++ b/packages/diff/src/index.ts
@@ -11,12 +11,9 @@ import type {
   GraphQLSchema,
 } from "@graphql-markdown/types";
 
-import {
-  fileExists,
-  readFile,
-  saveFile,
-  printSchema,
-} from "@graphql-markdown/utils";
+import { printSchema } from "@graphql-markdown/graphql";
+
+import { fileExists, readFile, saveFile } from "@graphql-markdown/utils";
 
 export const SCHEMA_HASH_FILE = ".schema" as const;
 export const SCHEMA_REF = "schema.graphql" as const;
diff --git a/packages/diff/tsconfig.json b/packages/diff/tsconfig.json
index e6d4f122..67b09584 100644
--- a/packages/diff/tsconfig.json
+++ b/packages/diff/tsconfig.json
@@ -11,5 +11,5 @@
     }
   },
 
-  "references": [{ "path": "../utils" }]
+  "references": [{ "path": "../graphql" }, { "path": "../utils" }]
 }
diff --git a/packages/graphql/LICENSE b/packages/graphql/LICENSE
new file mode 100644
index 00000000..acd4380d
--- /dev/null
+++ b/packages/graphql/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Grégory Heitz
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packages/graphql/README.md b/packages/graphql/README.md
new file mode 100644
index 00000000..d93b2bc7
--- /dev/null
+++ b/packages/graphql/README.md
@@ -0,0 +1,5 @@
+# @graphql-markdown/graphql
+
+[![Latest Version](https://img.shields.io/npm/v/@graphql-markdown/graphql?style=flat-square)](https://www.npmjs.com/package/@graphql-markdown/graphql)
+[![GitHub License](https://img.shields.io/github/license/graphql-markdown/graphql-markdown?style=flat-square)](https://raw.githubusercontent.com/graphql-markdown/graphql-markdown/main/LICENSE)
+
diff --git a/packages/utils/docs/graphql_directive.md b/packages/graphql/docs/directive.md
similarity index 82%
rename from packages/utils/docs/graphql_directive.md
rename to packages/graphql/docs/directive.md
index cc810245..39fa15f0 100644
--- a/packages/utils/docs/graphql_directive.md
+++ b/packages/graphql/docs/directive.md
@@ -1,4 +1,4 @@
-# Module: graphql/directive
+# Module: directive
 
 Library supporting `customDirective` for directive based customization.
 
@@ -16,11 +16,11 @@ const WILDCARD_DIRECTIVE: ""
 
 Wildcard `*` character for matching any directive name.
 
-See [getCustomDirectiveOptions](graphql_directive.md#getcustomdirectiveoptions), [isCustomDirective](graphql_directive.md#iscustomdirective)
+See [getCustomDirectiveOptions](directive.md#getcustomdirectiveoptions), [isCustomDirective](directive.md#iscustomdirective)
 
 #### Defined In
 
-[packages/utils/src/graphql/directive.ts:27](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/directive.ts#L27)
+[packages/graphql/src/directive.ts:28](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/directive.ts#L28)
 
 ## Functions
 
@@ -37,7 +37,7 @@ Returns a map of custom directives for a schema entity.
 | Parameter | Type | Description |
 | :------ | :------ | :------ |
 | `entity` | `unknown` | a GraphQL schema entity. |
-| `customDirectiveMap` | `Maybe`\< `CustomDirectiveMap` \> | a custom directive map (see [getCustomDirectives](graphql_directive.md#getcustomdirectives)). |
+| `customDirectiveMap` | `Maybe`\< `CustomDirectiveMap` \> | a custom directive map (see [getCustomDirectives](directive.md#getcustomdirectives)). |
 
 #### Returns
 
@@ -96,7 +96,7 @@ const map = getConstDirectiveMap(schema.getType("Test"), customDirectives);
 
 #### Defined In
 
-[packages/utils/src/graphql/directive.ts:246](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/directive.ts#L246)
+[packages/graphql/src/directive.ts:247](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/directive.ts#L247)
 
 ***
 
@@ -142,7 +142,7 @@ const customDirectives = getCustomDirectiveOptions("testB", customDirectiveOptio
 
 #### Defined In
 
-[packages/utils/src/graphql/directive.ts:156](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/directive.ts#L156)
+[packages/graphql/src/directive.ts:157](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/directive.ts#L157)
 
 ***
 
@@ -158,7 +158,7 @@ Returns a custom directives map with custom handlers from `customDirective`.
 
 | Parameter | Type | Description |
 | :------ | :------ | :------ |
-| `schemaMap` | `Pick`\< `SchemaMap`, `"directives"` \> | the GraphQL schema map returned by [getSchemaMap](graphql_introspection.md#getschemamap) |
+| `schemaMap` | `Pick`\< `SchemaMap`, `"directives"` \> | the GraphQL schema map returned by [getSchemaMap](introspection.md#getschemamap) |
 | `customDirectiveOptions`? | `CustomDirective` | the `customDirective` option. |
 
 #### Returns
@@ -220,7 +220,7 @@ const customDirectives = getCustomDirectives(schemaMap, customDirectiveOptions);
 
 #### Defined In
 
-[packages/utils/src/graphql/directive.ts:88](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/directive.ts#L88)
+[packages/graphql/src/directive.ts:89](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/directive.ts#L89)
 
 ***
 
@@ -247,4 +247,4 @@ Checks if a directive name is referenced in `customDirective` option.
 
 #### Defined In
 
-[packages/utils/src/graphql/directive.ts:180](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/directive.ts#L180)
+[packages/graphql/src/directive.ts:181](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/directive.ts#L181)
diff --git a/packages/utils/docs/graphql_formatter.md b/packages/graphql/docs/formatter.md
similarity index 79%
rename from packages/utils/docs/graphql_formatter.md
rename to packages/graphql/docs/formatter.md
index ff3d1768..65f8381c 100644
--- a/packages/utils/docs/graphql_formatter.md
+++ b/packages/graphql/docs/formatter.md
@@ -1,4 +1,4 @@
-# Module: graphql/formatter
+# Module: formatter
 
 Internal library of helpers for formatting GraphQL values.
 
@@ -35,4 +35,4 @@ a printable formatted value.
 
 #### Defined In
 
-[packages/utils/src/graphql/formatter.ts:32](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/formatter.ts#L32)
+[packages/graphql/src/formatter.ts:32](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/formatter.ts#L32)
diff --git a/packages/utils/docs/graphql_group.md b/packages/graphql/docs/group.md
similarity index 89%
rename from packages/utils/docs/graphql_group.md
rename to packages/graphql/docs/group.md
index ecd7ec50..86584019 100644
--- a/packages/utils/docs/graphql_group.md
+++ b/packages/graphql/docs/group.md
@@ -1,4 +1,4 @@
-# Module: graphql/group
+# Module: group
 
 Library supporting `groupByDirective` for grouping GraphQL schema entities.
 
@@ -70,7 +70,7 @@ getGroupName(schema.getType("Unicorn"), groupOptions); // Expected result: "comm
 
 #### Defined In
 
-[packages/utils/src/graphql/group.ts:158](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/group.ts#L158)
+[packages/graphql/src/group.ts:158](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/group.ts#L158)
 
 ***
 
@@ -86,7 +86,7 @@ Parses a GraphQL schema to build a map of entities with matching `groupByDirecti
 
 | Parameter | Type | Description |
 | :------ | :------ | :------ |
-| `schemaMap` | `SchemaMap` | the GraphQL schema map returned by [getSchemaMap](graphql_introspection.md#getschemamap) |
+| `schemaMap` | `SchemaMap` | the GraphQL schema map returned by [getSchemaMap](introspection.md#getschemamap) |
 | `groupByDirective` | `Maybe`\< `GroupByDirectiveOptions` \> | the `groupByDirective` option. |
 
 #### Returns
@@ -153,4 +153,4 @@ const groupsMap = getGroups(schemaMap, groupOptions);
 
 #### Defined In
 
-[packages/utils/src/graphql/group.ts:84](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/group.ts#L84)
+[packages/graphql/src/group.ts:84](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/group.ts#L84)
diff --git a/packages/utils/docs/graphql_guard.md b/packages/graphql/docs/guard.md
similarity index 74%
rename from packages/utils/docs/graphql_guard.md
rename to packages/graphql/docs/guard.md
index f1ecbe72..4bc31d18 100644
--- a/packages/utils/docs/graphql_guard.md
+++ b/packages/graphql/docs/guard.md
@@ -1,4 +1,4 @@
-# Module: graphql/guard
+# Module: guard
 
 Custom GraphQL type guards and property guards.
 
@@ -31,7 +31,7 @@ Checks if a GraphQL named type is of generic type `T`.
 
 #### Defined In
 
-[packages/utils/src/graphql/guard.ts:52](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/guard.ts#L52)
+[packages/graphql/src/guard.ts:52](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/guard.ts#L52)
 
 ***
 
@@ -61,7 +61,7 @@ Checks if a GraphQL named type is deprecated.
 
 #### Defined In
 
-[packages/utils/src/graphql/guard.ts:70](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/guard.ts#L70)
+[packages/graphql/src/guard.ts:70](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/guard.ts#L70)
 
 ***
 
@@ -85,7 +85,7 @@ Checks if a GraphQL named type is of type `GraphQLField`.
 
 #### Defined In
 
-[packages/utils/src/graphql/guard.ts:33](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/guard.ts#L33)
+[packages/graphql/src/guard.ts:33](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/guard.ts#L33)
 
 ***
 
@@ -109,4 +109,4 @@ Checks if a GraphQL type a GraphQL operation (query, mutation, subscription).
 
 #### Defined In
 
-[packages/utils/src/graphql/guard.ts:85](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/guard.ts#L85)
+[packages/graphql/src/guard.ts:85](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/guard.ts#L85)
diff --git a/packages/utils/docs/graphql_introspection.md b/packages/graphql/docs/introspection.md
similarity index 76%
rename from packages/utils/docs/graphql_introspection.md
rename to packages/graphql/docs/introspection.md
index c0a3cf87..d617cfcf 100644
--- a/packages/utils/docs/graphql_introspection.md
+++ b/packages/graphql/docs/introspection.md
@@ -1,4 +1,4 @@
-# Module: graphql/introspection
+# Module: introspection
 
 ## Functions
 
@@ -13,7 +13,7 @@ __getFields<T, V>(
 
 Returns the fields from a GraphQL schema type.
 
-see [getOperation](graphql_introspection.md#getoperation), [getFields](graphql_introspection.md#getfields)
+see [getOperation](introspection.md#getoperation), [getFields](introspection.md#getfields)
 
 #### Type parameters
 
@@ -38,7 +38,7 @@ a map of fields as k/v records, or `fallback` value if no fields available.
 
 #### Defined In
 
-[packages/utils/src/graphql/introspection.ts:233](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/introspection.ts#L233)
+[packages/graphql/src/introspection.ts:234](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/introspection.ts#L234)
 
 ***
 
@@ -65,7 +65,7 @@ a list of GraphQL directives matching the set, else `false`.
 
 #### Defined In
 
-[packages/utils/src/graphql/introspection.ts:135](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/introspection.ts#L135)
+[packages/graphql/src/introspection.ts:136](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/introspection.ts#L136)
 
 ***
 
@@ -77,7 +77,7 @@ getFields(type): unknown[]
 
 Returns fields map for a GraphQL schema type.
 
-see [getSchemaMap](graphql_introspection.md#getschemamap)
+see [getSchemaMap](introspection.md#getschemamap)
 
 #### Parameters
 
@@ -93,7 +93,7 @@ a list of fields of type object.
 
 #### Defined In
 
-[packages/utils/src/graphql/introspection.ts:298](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/introspection.ts#L298)
+[packages/graphql/src/introspection.ts:299](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/introspection.ts#L299)
 
 ***
 
@@ -105,7 +105,7 @@ getOperation(operationType?): Record< string, GraphQLOperationType >
 
 Returns fields map for a GraphQL operation type (query, mutation, subscription...).
 
-see [getSchemaMap](graphql_introspection.md#getschemamap)
+see [getSchemaMap](introspection.md#getschemamap)
 
 #### Parameters
 
@@ -121,7 +121,7 @@ a map of fields as k/v records.
 
 #### Defined In
 
-[packages/utils/src/graphql/introspection.ts:274](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/introspection.ts#L274)
+[packages/graphql/src/introspection.ts:275](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/introspection.ts#L275)
 
 ***
 
@@ -208,7 +208,7 @@ const schemaTypeMap = getSchemaMap(schema);
 
 #### Defined In
 
-[packages/utils/src/graphql/introspection.ts:403](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/introspection.ts#L403)
+[packages/graphql/src/introspection.ts:404](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/introspection.ts#L404)
 
 ***
 
@@ -222,7 +222,7 @@ getTypeDirectiveArgValue(
 ```
 
 Returns one directive's argument's value linked to a GraphQL schema type.
-It calls [getTypeDirectiveValues](graphql_introspection.md#gettypedirectivevalues) and returns a matching record.
+It calls [getTypeDirectiveValues](introspection.md#gettypedirectivevalues) and returns a matching record.
 
 #### Parameters
 
@@ -240,7 +240,7 @@ a record k/v with `argName` as key and the argument's value.
 
 #### Defined In
 
-[packages/utils/src/graphql/introspection.ts:176](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/introspection.ts#L176)
+[packages/graphql/src/introspection.ts:177](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/introspection.ts#L177)
 
 ***
 
@@ -267,7 +267,7 @@ a record k/v with arguments' name as keys and arguments' value.
 
 #### Defined In
 
-[packages/utils/src/graphql/introspection.ts:199](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/introspection.ts#L199)
+[packages/graphql/src/introspection.ts:200](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/introspection.ts#L200)
 
 ***
 
@@ -301,11 +301,11 @@ a map of GraphQL named types for the matching GraphQL type, or undefined if no m
 
 #### See
 
-[getSchemaMap](graphql_introspection.md#getschemamap)
+[getSchemaMap](introspection.md#getschemamap)
 
 #### Defined In
 
-[packages/utils/src/graphql/introspection.ts:50](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/introspection.ts#L50)
+[packages/graphql/src/introspection.ts:51](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/introspection.ts#L51)
 
 ***
 
@@ -332,7 +332,7 @@ the type's name, or `defaultName`.
 
 #### Defined In
 
-[packages/utils/src/graphql/introspection.ts:319](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/introspection.ts#L319)
+[packages/graphql/src/introspection.ts:320](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/introspection.ts#L320)
 
 ***
 
@@ -364,7 +364,7 @@ Type guard for type with an AST node property.
 
 #### Defined In
 
-[packages/utils/src/graphql/introspection.ts:92](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/introspection.ts#L92)
+[packages/graphql/src/introspection.ts:93](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/introspection.ts#L93)
 
 ***
 
@@ -391,4 +391,4 @@ Checks if a schema entity as a directive belonging to a defined set.
 
 #### Defined In
 
-[packages/utils/src/graphql/introspection.ts:105](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/introspection.ts#L105)
+[packages/graphql/src/introspection.ts:106](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/introspection.ts#L106)
diff --git a/packages/utils/docs/graphql_loader.md b/packages/graphql/docs/loader.md
similarity index 83%
rename from packages/utils/docs/graphql_loader.md
rename to packages/graphql/docs/loader.md
index 0443e7ec..dfa9345c 100644
--- a/packages/utils/docs/graphql_loader.md
+++ b/packages/graphql/docs/loader.md
@@ -1,4 +1,4 @@
-# Module: graphql/loader
+# Module: loader
 
 Library for GraphQL schema loading and `loaders` config processing.
 
@@ -10,7 +10,7 @@ Library for GraphQL schema loading and `loaders` config processing.
 getDocumentLoaders(loadersList): Promise< Maybe< LoadSchemaOptions > >
 ```
 
-Asynchronously returns a valid loaders list for [loadSchema](graphql_loader.md#loadschema) based on the plugin config.
+Asynchronously returns a valid loaders list for [loadSchema](loader.md#loadschema) based on the plugin config.
 Import each loader package, and instantiate a loader object.
 
 #### Parameters
@@ -48,7 +48,7 @@ const schema = await loadSchema("schema.graphql", {
 
 #### Defined In
 
-[packages/utils/src/graphql/loader.ts:106](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/loader.ts#L106)
+[packages/graphql/src/loader.ts:106](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/loader.ts#L106)
 
 ***
 
@@ -88,4 +88,4 @@ const schema = await loadSchema("schema.graphql", {
 
 #### Defined In
 
-[packages/utils/src/graphql/loader.ts:41](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/graphql/loader.ts#L41)
+[packages/graphql/src/loader.ts:41](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/graphql/src/loader.ts#L41)
diff --git a/packages/utils/docs/graphql_relation.md b/packages/graphql/docs/relation.md
similarity index 92%
rename from packages/utils/docs/graphql_relation.md
rename to packages/graphql/docs/relation.md
index d1e939b0..bd1932c7 100644
--- a/packages/utils/docs/graphql_relation.md
+++ b/packages/graphql/docs/relation.md
@@ -1,4 +1,4 @@
-# Module: graphql/relation
+# Module: relation
 
 Library supporting `relatedTypeSection` for displaying relations between GraphQL schema entities.
 
@@ -21,7 +21,7 @@ Returns a map of fields and arguments where the GraphQL schema type matches the
 | Parameter | Type | Description |
 | :------ | :------ | :------ |
 | `type` | `unknown` | the GraphQL schema type being processed. |
-| `schemaMap` | `Maybe`\< `SchemaMap` \> | a GraphQL schema map (see [getSchemaMap](graphql_introspection.md#getschemamap)). |
+| `schemaMap` | `Maybe`\< `SchemaMap` \> | a GraphQL schema map (see [getSchemaMap](introspection.md#getschemamap)). |
 
 #### Returns
 
@@ -52,7 +52,7 @@ Returns a map of types (unions or interfaces) where the GraphQL schema type is i
 | Parameter | Type | Description |
 | :------ | :------ | :------ |
 | `type` | `unknown` | the GraphQL schema type being processed. |
-| `schemaMap` | `Maybe`\< `SchemaMap` \> | a GraphQL schema map (see [getSchemaMap](graphql_introspection.md#getschemamap)). |
+| `schemaMap` | `Maybe`\< `SchemaMap` \> | a GraphQL schema map (see [getSchemaMap](introspection.md#getschemamap)). |
 
 #### Returns
 
@@ -83,7 +83,7 @@ Returns a map of interfaces where the GraphQL schema type is extended.
 | Parameter | Type | Description |
 | :------ | :------ | :------ |
 | `type` | `unknown` | the GraphQL schema type being processed. |
-| `schemaMap` | `Maybe`\< `SchemaMap` \> | a GraphQL schema map (see [getSchemaMap](graphql_introspection.md#getschemamap)). |
+| `schemaMap` | `Maybe`\< `SchemaMap` \> | a GraphQL schema map (see [getSchemaMap](introspection.md#getschemamap)). |
 
 #### Returns
 
@@ -114,7 +114,7 @@ Returns a map of operations (queries, mutations, subscriptions) where the GraphQ
 | Parameter | Type | Description |
 | :------ | :------ | :------ |
 | `type` | `unknown` | the GraphQL schema type being processed. |
-| `schemaMap` | `Maybe`\< `SchemaMap` \> | a GraphQL schema map (see [getSchemaMap](graphql_introspection.md#getschemamap)). |
+| `schemaMap` | `Maybe`\< `SchemaMap` \> | a GraphQL schema map (see [getSchemaMap](introspection.md#getschemamap)). |
 
 #### Returns
 
@@ -145,7 +145,7 @@ Returns a map of unions where the GraphQL schema type is part of it.
 | Parameter | Type | Description |
 | :------ | :------ | :------ |
 | `type` | `unknown` | the GraphQL schema type being processed. |
-| `schemaMap` | `Maybe`\< `SchemaMap` \> | a GraphQL schema map (see [getSchemaMap](graphql_introspection.md#getschemamap)). |
+| `schemaMap` | `Maybe`\< `SchemaMap` \> | a GraphQL schema map (see [getSchemaMap](introspection.md#getschemamap)). |
 
 #### Returns
 
diff --git a/packages/graphql/package.json b/packages/graphql/package.json
new file mode 100644
index 00000000..1775fd54
--- /dev/null
+++ b/packages/graphql/package.json
@@ -0,0 +1,80 @@
+{
+  "name": "@graphql-markdown/graphql",
+  "homepage": "https://graphql-markdown.github.io",
+  "description": "GraphQL-Markdown GraphQL utilities.",
+  "bugs": {
+    "url": "https://github.com/graphql-markdown/graphql-markdown/issues"
+  },
+  "version": "1.0.0",
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "graphql-markdown/graphql-markdown",
+    "directory": "packages/graphql"
+  },
+  "author": {
+    "name": "Gregory Heitz"
+  },
+  "main": "dist/index.js",
+  "types": "dist/index.d.ts",
+  "exports": {
+    ".": {
+      "require": {
+        "types": "./dist/index.d.ts",
+        "default": "./dist/index.js"
+      },
+      "import": {
+        "types": "./dist/index.d.ts",
+        "default": "./dist/index.js"
+      },
+      "default": {
+        "types": "./dist/index.d.ts",
+        "default": "./dist/index.js"
+      }
+    },
+    "./*": {
+      "require": {
+        "types": "./dist/*.d.ts",
+        "default": "./dist/*.js"
+      },
+      "import": {
+        "types": "./dist/*.d.ts",
+        "default": "./dist/*.js"
+      },
+      "default": {
+        "types": "./dist/*.d.ts",
+        "default": "./dist/*.js"
+      }
+    },
+    "./package.json": "./package.json"
+  },
+  "scripts": {
+    "prepack": "pinst --disable",
+    "postpack": "pinst --enable",
+    "stryker": "stryker run",
+    "clean": "rm -rf ./dist",
+    "docs": "typedoc"
+  },
+  "dependencies": {
+    "@graphql-markdown/utils": "^1.5.1"
+  },
+  "devDependencies": {
+    "@graphql-markdown/types": "^1.0.0"
+  },
+  "directories": {
+    "test": "tests"
+  },
+  "engines": {
+    "node": ">=16.14"
+  },
+  "publishConfig": {
+    "directory": "dist",
+    "access": "public"
+  },
+  "typescript": {
+    "definition": "dist/index.d.ts"
+  },
+  "files": [
+    "dist"
+  ]
+}
diff --git a/packages/utils/src/graphql/directive.ts b/packages/graphql/src/directive.ts
similarity index 98%
rename from packages/utils/src/graphql/directive.ts
rename to packages/graphql/src/directive.ts
index b34dbaa9..d3bbf3a1 100644
--- a/packages/utils/src/graphql/directive.ts
+++ b/packages/graphql/src/directive.ts
@@ -15,7 +15,8 @@ import type {
   SchemaMap,
 } from "@graphql-markdown/types";
 
-import { isEmpty } from "../object";
+import { isEmpty } from "@graphql-markdown/utils";
+
 import { getDirective } from "./introspection";
 
 /**
@@ -29,7 +30,7 @@ export const WILDCARD_DIRECTIVE = "*" as const;
 /**
  * Returns a custom directives map with custom handlers from `customDirective`.
  *
- * @param schemaMap - the GraphQL schema map returned by {@link graphql/introspection!getSchemaMap}
+ * @param schemaMap - the GraphQL schema map returned by {@link introspection!getSchemaMap}
  * @param customDirectiveOptions - the `customDirective` option.
  *
  * @returns a custom directive map, or undefined if no match.
diff --git a/packages/utils/src/graphql/formatter.ts b/packages/graphql/src/formatter.ts
similarity index 100%
rename from packages/utils/src/graphql/formatter.ts
rename to packages/graphql/src/formatter.ts
diff --git a/packages/utils/src/graphql/group.ts b/packages/graphql/src/group.ts
similarity index 99%
rename from packages/utils/src/graphql/group.ts
rename to packages/graphql/src/group.ts
index 87a4e965..094498d6 100644
--- a/packages/utils/src/graphql/group.ts
+++ b/packages/graphql/src/group.ts
@@ -19,7 +19,7 @@ import { hasAstNode } from "./introspection";
 /**
  * Parses a GraphQL schema to build a map of entities with matching `groupByDirective` option.
  *
- * @param schemaMap - the GraphQL schema map returned by {@link graphql/introspection!getSchemaMap}
+ * @param schemaMap - the GraphQL schema map returned by {@link introspection!getSchemaMap}
  * @param groupByDirective - the `groupByDirective` option.
  *
  * @returns a map of entities with matching group name.
diff --git a/packages/utils/src/graphql/guard.ts b/packages/graphql/src/guard.ts
similarity index 100%
rename from packages/utils/src/graphql/guard.ts
rename to packages/graphql/src/guard.ts
diff --git a/packages/utils/src/graphql/index.ts b/packages/graphql/src/index.ts
similarity index 100%
rename from packages/utils/src/graphql/index.ts
rename to packages/graphql/src/index.ts
diff --git a/packages/utils/src/graphql/introspection.ts b/packages/graphql/src/introspection.ts
similarity index 99%
rename from packages/utils/src/graphql/introspection.ts
rename to packages/graphql/src/introspection.ts
index 82cf7a6b..16c087d9 100644
--- a/packages/utils/src/graphql/introspection.ts
+++ b/packages/graphql/src/introspection.ts
@@ -28,7 +28,8 @@ import type {
   SchemaMap,
 } from "@graphql-markdown/types";
 
-import { convertArrayToMapObject } from "../array";
+import { convertArrayToMapObject } from "@graphql-markdown/utils";
+
 import { instanceOf } from "./guard";
 
 export { getDirectiveValues, getNamedType, printSchema } from "graphql";
diff --git a/packages/utils/src/graphql/loader.ts b/packages/graphql/src/loader.ts
similarity index 100%
rename from packages/utils/src/graphql/loader.ts
rename to packages/graphql/src/loader.ts
diff --git a/packages/utils/src/graphql/relation.ts b/packages/graphql/src/relation.ts
similarity index 93%
rename from packages/utils/src/graphql/relation.ts
rename to packages/graphql/src/relation.ts
index 4ccd0318..8b3a8c2a 100644
--- a/packages/utils/src/graphql/relation.ts
+++ b/packages/graphql/src/relation.ts
@@ -50,7 +50,7 @@ type RelationOfCallbackFunction<T> = (
  *
  * @param type - the GraphQL schema type being processed.
  * @param relations - the map of relations to be returned.
- * @param schemaMap - a GraphQL schema map (see {@link graphql/introspection!getSchemaMap}).
+ * @param schemaMap - a GraphQL schema map (see {@link introspection!getSchemaMap}).
  * @param callback - a function to execute for each entries of the schema map.
  *
  * @returns a record map of type `relations`.
@@ -96,7 +96,7 @@ function mapRelationOf<
  * @typeParam R - the return type of map of relations (see {@link IGetRelation}).
  *
  * @param type - the GraphQL schema type being processed.
- * @param schemaMap - a GraphQL schema map (see {@link graphql/introspection!getSchemaMap}).
+ * @param schemaMap - a GraphQL schema map (see {@link introspection!getSchemaMap}).
  *
  * @returns a record map of operations relations.
  *
@@ -156,7 +156,7 @@ export const getRelationOfReturn: IGetRelation<GraphQLOperationType> = (
  * @typeParam R - the return type of map of relations (see {@link IGetRelation}).
  *
  * @param type - the GraphQL schema type being processed.
- * @param schemaMap - a GraphQL schema map (see {@link graphql/introspection!getSchemaMap}).
+ * @param schemaMap - a GraphQL schema map (see {@link introspection!getSchemaMap}).
  *
  * @returns a record map of fields and arguments relations.
  *
@@ -228,7 +228,7 @@ export const getRelationOfField: IGetRelation<RelationOfField> = <T>(
  * @typeParam R - the return type of map of relations (see {@link IGetRelation}).
  *
  * @param type - the GraphQL schema type being processed.
- * @param schemaMap - a GraphQL schema map (see {@link graphql/introspection!getSchemaMap}).
+ * @param schemaMap - a GraphQL schema map (see {@link introspection!getSchemaMap}).
  *
  * @returns a record map of unions relations.
  *
@@ -281,7 +281,7 @@ export const getRelationOfUnion: IGetRelation<GraphQLUnionType> = <T>(
  * @typeParam R - the return type of map of relations (see {@link IGetRelation}).
  *
  * @param type - the GraphQL schema type being processed.
- * @param schemaMap - a GraphQL schema map (see {@link graphql/introspection!getSchemaMap}).
+ * @param schemaMap - a GraphQL schema map (see {@link introspection!getSchemaMap}).
  *
  * @returns a record map of interfaces relations.
  *
@@ -335,7 +335,7 @@ export const getRelationOfInterface: IGetRelation<RelationOfInterface> = <T>(
  * @typeParam R - the return type of map of relations (see {@link IGetRelation}).
  *
  * @param type - the GraphQL schema type being processed.
- * @param schemaMap - a GraphQL schema map (see {@link graphql/introspection!getSchemaMap}).
+ * @param schemaMap - a GraphQL schema map (see {@link introspection!getSchemaMap}).
  *
  * @returns a record map of unions or interfaces relations.
  *
diff --git a/packages/graphql/stryker.conf.js b/packages/graphql/stryker.conf.js
new file mode 100644
index 00000000..3ceff6e5
--- /dev/null
+++ b/packages/graphql/stryker.conf.js
@@ -0,0 +1,6 @@
+// @ts-check
+/**
+ * @type {import('@stryker-mutator/api/core').PartialStrykerOptions}
+ */
+
+module.exports = require("../../config/stryker.conf");
diff --git a/packages/graphql/tsconfig.json b/packages/graphql/tsconfig.json
new file mode 100644
index 00000000..e6d4f122
--- /dev/null
+++ b/packages/graphql/tsconfig.json
@@ -0,0 +1,15 @@
+{
+  "extends": "../../tsconfig.base.json",
+
+  "compilerOptions": {
+    "rootDir": "src",
+    "outDir": "dist",
+
+    "paths": {
+      "@graphql-markdown/types": ["../types/src/index.d.ts"],
+      "@graphql-markdown/*": ["../*/src/index.ts"]
+    }
+  },
+
+  "references": [{ "path": "../utils" }]
+}
diff --git a/packages/graphql/typedoc.json b/packages/graphql/typedoc.json
new file mode 100644
index 00000000..31345f6d
--- /dev/null
+++ b/packages/graphql/typedoc.json
@@ -0,0 +1,6 @@
+{
+  "extends": ["../../typedoc.base.json"],
+  "entryPoints": ["./src"],
+  "entryPointStrategy": "expand",
+  "out": "./docs"
+}
diff --git a/packages/helpers/package.json b/packages/helpers/package.json
index de15e2d2..3113f984 100644
--- a/packages/helpers/package.json
+++ b/packages/helpers/package.json
@@ -55,7 +55,7 @@
     "clean": "rm -rf ./dist"
   },
   "dependencies": {
-    "@graphql-markdown/utils": "^1.5.1"
+    "@graphql-markdown/graphql": "^1.0.0"
   },
   "devDependencies": {
     "@graphql-markdown/types": "^1.0.0"
diff --git a/packages/helpers/src/directives/descriptor.ts b/packages/helpers/src/directives/descriptor.ts
index 3552e1ec..805449bb 100644
--- a/packages/helpers/src/directives/descriptor.ts
+++ b/packages/helpers/src/directives/descriptor.ts
@@ -1,6 +1,6 @@
 import type { GraphQLDirective } from "@graphql-markdown/types";
 
-import { getTypeDirectiveValues } from "@graphql-markdown/utils";
+import { getTypeDirectiveValues } from "@graphql-markdown/graphql";
 
 import { interpolate } from "../utils/interpolate";
 
diff --git a/packages/helpers/tsconfig.json b/packages/helpers/tsconfig.json
index e6d4f122..b02c1831 100644
--- a/packages/helpers/tsconfig.json
+++ b/packages/helpers/tsconfig.json
@@ -11,5 +11,5 @@
     }
   },
 
-  "references": [{ "path": "../utils" }]
+  "references": [{ "path": "../graphql" }]
 }
diff --git a/packages/printer-legacy/package.json b/packages/printer-legacy/package.json
index aedbabff..2b970c75 100644
--- a/packages/printer-legacy/package.json
+++ b/packages/printer-legacy/package.json
@@ -55,6 +55,7 @@
     "clean": "rm -rf ./dist"
   },
   "dependencies": {
+    "@graphql-markdown/graphql": "^1.0.0",
     "@graphql-markdown/utils": "^1.5.1"
   },
   "devDependencies": {
diff --git a/packages/printer-legacy/src/badge.ts b/packages/printer-legacy/src/badge.ts
index ed0bb200..cb54be29 100644
--- a/packages/printer-legacy/src/badge.ts
+++ b/packages/printer-legacy/src/badge.ts
@@ -8,13 +8,14 @@ import type {
   SchemaEntity,
 } from "@graphql-markdown/types";
 
+import { escapeMDX } from "@graphql-markdown/utils";
+
 import {
-  escapeMDX,
   getNamedType,
   isDeprecated,
   isListType,
   isNonNullType,
-} from "@graphql-markdown/utils";
+} from "@graphql-markdown/graphql";
 
 import { getLinkCategory } from "./link";
 import { getGroup } from "./group";
diff --git a/packages/printer-legacy/src/code.ts b/packages/printer-legacy/src/code.ts
index 42c124b2..04be7855 100644
--- a/packages/printer-legacy/src/code.ts
+++ b/packages/printer-legacy/src/code.ts
@@ -5,7 +5,7 @@ import {
   getTypeName,
   isDeprecated,
   hasDirective,
-} from "@graphql-markdown/utils";
+} from "@graphql-markdown/graphql";
 
 import {
   MARKDOWN_EOL,
diff --git a/packages/printer-legacy/src/common.ts b/packages/printer-legacy/src/common.ts
index fd95da55..29458fbb 100644
--- a/packages/printer-legacy/src/common.ts
+++ b/packages/printer-legacy/src/common.ts
@@ -5,12 +5,9 @@ import type {
   Maybe,
 } from "@graphql-markdown/types";
 
-import {
-  isDeprecated,
-  getConstDirectiveMap,
-  isEmpty,
-  escapeMDX,
-} from "@graphql-markdown/utils";
+import { isEmpty, escapeMDX } from "@graphql-markdown/utils";
+
+import { isDeprecated, getConstDirectiveMap } from "@graphql-markdown/graphql";
 
 import { getCustomDirectiveResolver } from "./directive";
 
diff --git a/packages/printer-legacy/src/directive.ts b/packages/printer-legacy/src/directive.ts
index b3d2a482..f3e83f22 100644
--- a/packages/printer-legacy/src/directive.ts
+++ b/packages/printer-legacy/src/directive.ts
@@ -7,7 +7,7 @@ import type {
   Maybe,
 } from "@graphql-markdown/types";
 
-import { getConstDirectiveMap } from "@graphql-markdown/utils";
+import { getConstDirectiveMap } from "@graphql-markdown/graphql";
 
 import { MARKDOWN_EOL, MARKDOWN_EOP } from "./const/strings";
 import { SectionLevels } from "./const/options";
diff --git a/packages/printer-legacy/src/graphql/directive.ts b/packages/printer-legacy/src/graphql/directive.ts
index 5d1e2e2e..cbf46a1e 100644
--- a/packages/printer-legacy/src/graphql/directive.ts
+++ b/packages/printer-legacy/src/graphql/directive.ts
@@ -5,7 +5,7 @@ import type {
   MDXString,
 } from "@graphql-markdown/types";
 
-import { getTypeName } from "@graphql-markdown/utils";
+import { getTypeName } from "@graphql-markdown/graphql";
 
 import { printMetadataSection } from "../section";
 import { printCodeArguments } from "../code";
diff --git a/packages/printer-legacy/src/graphql/enum.ts b/packages/printer-legacy/src/graphql/enum.ts
index 19630376..f6cc3f77 100644
--- a/packages/printer-legacy/src/graphql/enum.ts
+++ b/packages/printer-legacy/src/graphql/enum.ts
@@ -9,7 +9,7 @@ import {
   getTypeName,
   isDeprecated,
   hasDirective,
-} from "@graphql-markdown/utils";
+} from "@graphql-markdown/graphql";
 
 import { MARKDOWN_EOL, DEPRECATED } from "../const/strings";
 import { printMetadataSection } from "../section";
diff --git a/packages/printer-legacy/src/graphql/object.ts b/packages/printer-legacy/src/graphql/object.ts
index 760822f9..a6d0eaed 100644
--- a/packages/printer-legacy/src/graphql/object.ts
+++ b/packages/printer-legacy/src/graphql/object.ts
@@ -1,6 +1,6 @@
 import type { PrintTypeOptions } from "@graphql-markdown/types";
 
-import { getTypeName, getFields } from "@graphql-markdown/utils";
+import { getTypeName, getFields } from "@graphql-markdown/graphql";
 
 import { printSection, printMetadataSection } from "../section";
 import { printCodeField } from "../code";
diff --git a/packages/printer-legacy/src/graphql/operation.ts b/packages/printer-legacy/src/graphql/operation.ts
index 6ae3e3f0..8be5e98f 100644
--- a/packages/printer-legacy/src/graphql/operation.ts
+++ b/packages/printer-legacy/src/graphql/operation.ts
@@ -1,6 +1,6 @@
 import type { PrintTypeOptions, MDXString } from "@graphql-markdown/types";
 
-import { getTypeName, isOperation } from "@graphql-markdown/utils";
+import { getTypeName, isOperation } from "@graphql-markdown/graphql";
 
 import { printSection, printMetadataSection } from "../section";
 import { printCodeField } from "../code";
diff --git a/packages/printer-legacy/src/graphql/scalar.ts b/packages/printer-legacy/src/graphql/scalar.ts
index 13bb4a82..5adb66c7 100644
--- a/packages/printer-legacy/src/graphql/scalar.ts
+++ b/packages/printer-legacy/src/graphql/scalar.ts
@@ -1,6 +1,6 @@
 import type { PrintTypeOptions, MDXString } from "@graphql-markdown/types";
 
-import { getTypeName } from "@graphql-markdown/utils";
+import { getTypeName } from "@graphql-markdown/graphql";
 
 import { MARKDOWN_EOP } from "../const/strings";
 import { SectionLevels } from "../const/options";
diff --git a/packages/printer-legacy/src/graphql/union.ts b/packages/printer-legacy/src/graphql/union.ts
index e49fd9c1..51aada0b 100644
--- a/packages/printer-legacy/src/graphql/union.ts
+++ b/packages/printer-legacy/src/graphql/union.ts
@@ -5,7 +5,7 @@ import type {
   GraphQLObjectType,
 } from "@graphql-markdown/types";
 
-import { isUnionType, getTypeName } from "@graphql-markdown/utils";
+import { isUnionType, getTypeName } from "@graphql-markdown/graphql";
 
 import { printSection } from "../section";
 
diff --git a/packages/printer-legacy/src/group.ts b/packages/printer-legacy/src/group.ts
index 0d52d216..b9c18616 100644
--- a/packages/printer-legacy/src/group.ts
+++ b/packages/printer-legacy/src/group.ts
@@ -5,7 +5,9 @@ import type {
   Maybe,
 } from "@graphql-markdown/types";
 
-import { slugify, getNamedType } from "@graphql-markdown/utils";
+import { getNamedType } from "@graphql-markdown/graphql";
+
+import { slugify } from "@graphql-markdown/utils";
 
 export const getGroup = (
   type: unknown,
diff --git a/packages/printer-legacy/src/link.ts b/packages/printer-legacy/src/link.ts
index 2f75970f..498f6eb9 100644
--- a/packages/printer-legacy/src/link.ts
+++ b/packages/printer-legacy/src/link.ts
@@ -25,9 +25,9 @@ import {
   isOperation,
   isScalarType,
   isUnionType,
-  slugify,
-  pathUrl,
-} from "@graphql-markdown/utils";
+} from "@graphql-markdown/graphql";
+
+import { slugify, pathUrl } from "@graphql-markdown/utils";
 
 import { getGroup } from "./group";
 import { DEPRECATED, ROOT_TYPE_LOCALE } from "./const/strings";
diff --git a/packages/printer-legacy/src/printer.ts b/packages/printer-legacy/src/printer.ts
index be415e35..a9d2d978 100644
--- a/packages/printer-legacy/src/printer.ts
+++ b/packages/printer-legacy/src/printer.ts
@@ -31,8 +31,9 @@ import {
   isOperation,
   isScalarType,
   isUnionType,
-  pathUrl,
-} from "@graphql-markdown/utils";
+} from "@graphql-markdown/graphql";
+
+import { pathUrl } from "@graphql-markdown/utils";
 
 import { printRelations } from "./relation";
 import { printDescription } from "./common";
diff --git a/packages/printer-legacy/src/relation.ts b/packages/printer-legacy/src/relation.ts
index 9eef4503..d711fd45 100644
--- a/packages/printer-legacy/src/relation.ts
+++ b/packages/printer-legacy/src/relation.ts
@@ -14,7 +14,7 @@ import {
   getSchemaMap,
   isNamedType,
   isOperation,
-} from "@graphql-markdown/utils";
+} from "@graphql-markdown/graphql";
 
 import { getRelationLink } from "./link";
 import { DEFAULT_CSS_CLASSNAME, printBadge } from "./badge";
diff --git a/packages/printer-legacy/src/section.ts b/packages/printer-legacy/src/section.ts
index dd737ea3..50e6b4b8 100644
--- a/packages/printer-legacy/src/section.ts
+++ b/packages/printer-legacy/src/section.ts
@@ -10,7 +10,7 @@ import {
   isGraphQLFieldType,
   hasDirective,
   isDeprecated,
-} from "@graphql-markdown/utils";
+} from "@graphql-markdown/graphql";
 
 import { printDescription } from "./common";
 import { printBadges } from "./badge";
diff --git a/packages/printer-legacy/tsconfig.json b/packages/printer-legacy/tsconfig.json
index 2412ea2a..c4782d21 100644
--- a/packages/printer-legacy/tsconfig.json
+++ b/packages/printer-legacy/tsconfig.json
@@ -13,5 +13,5 @@
     }
   },
 
-  "references": [{ "path": "../utils" }]
+  "references": [{ "path": "../graphql" }, { "path": "../utils" }]
 }
diff --git a/packages/utils/README.md b/packages/utils/README.md
index 4c146a7d..0bc7b84a 100644
--- a/packages/utils/README.md
+++ b/packages/utils/README.md
@@ -7,13 +7,6 @@
 
 - [array](docs/array.md)
 - [fs](docs/fs.md)
-- [graphql/directive](docs/graphql_directive.md)
-- [graphql/formatter](docs/graphql_formatter.md)
-- [graphql/group](docs/graphql_group.md)
-- [graphql/guard](docs/graphql_guard.md)
-- [graphql/introspection](docs/graphql_introspection.md)
-- [graphql/loader](docs/graphql_loader.md)
-- [graphql/relation](docs/graphql_relation.md)
 - [object](docs/object.md)
 - [prettier](docs/prettier.md)
 - [string](docs/string.md)
diff --git a/packages/utils/docs/array.md b/packages/utils/docs/array.md
index 1d7f9f3e..a53c741e 100644
--- a/packages/utils/docs/array.md
+++ b/packages/utils/docs/array.md
@@ -51,7 +51,7 @@ convertArrayToMapObject([
 
 #### Defined In
 
-[packages/utils/src/array.ts:74](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/array.ts#L74)
+[array.ts:74](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/array.ts#L74)
 
 ***
 
@@ -93,4 +93,4 @@ toArray({
 
 #### Defined In
 
-[packages/utils/src/array.ts:34](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/array.ts#L34)
+[array.ts:34](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/array.ts#L34)
diff --git a/packages/utils/docs/fs.md b/packages/utils/docs/fs.md
index 8775dc57..338e4900 100644
--- a/packages/utils/docs/fs.md
+++ b/packages/utils/docs/fs.md
@@ -34,7 +34,7 @@ await ensureDir("./.temp/local")
 
 #### Defined In
 
-[packages/utils/src/fs.ts:30](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/fs.ts#L30)
+[fs.ts:30](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/fs.ts#L30)
 
 ***
 
@@ -70,7 +70,7 @@ await fileExists("./.temp/local")
 
 #### Defined In
 
-[packages/utils/src/fs.ts:54](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/fs.ts#L54)
+[fs.ts:54](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/fs.ts#L54)
 
 ***
 
@@ -113,4 +113,4 @@ await saveFile("./.temp/local.md", "foobar")
 
 #### Defined In
 
-[packages/utils/src/fs.ts:85](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/fs.ts#L85)
+[fs.ts:85](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/fs.ts#L85)
diff --git a/packages/utils/docs/object.md b/packages/utils/docs/object.md
index 22a4c0a6..f358a86d 100644
--- a/packages/utils/docs/object.md
+++ b/packages/utils/docs/object.md
@@ -44,4 +44,4 @@ isEmpty({}); // Returns true
 
 #### Defined In
 
-[packages/utils/src/object.ts:34](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/object.ts#L34)
+[object.ts:34](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/object.ts#L34)
diff --git a/packages/utils/docs/prettier.md b/packages/utils/docs/prettier.md
index b9bb9a69..db8625e0 100644
--- a/packages/utils/docs/prettier.md
+++ b/packages/utils/docs/prettier.md
@@ -35,7 +35,7 @@ https://prettier.io/docs/en/options#parser for the list of parsers.
 
 #### Defined In
 
-[packages/utils/src/prettier.ts:27](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/prettier.ts#L27)
+[prettier.ts:27](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/prettier.ts#L27)
 
 ***
 
@@ -69,7 +69,7 @@ Same as `prettify(content, "babel")`.
 
 #### Defined In
 
-[packages/utils/src/prettier.ts:80](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/prettier.ts#L80)
+[prettier.ts:80](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/prettier.ts#L80)
 
 ***
 
@@ -103,4 +103,4 @@ Same as `prettify(content, "markdown")`.
 
 #### Defined In
 
-[packages/utils/src/prettier.ts:59](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/prettier.ts#L59)
+[prettier.ts:59](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/prettier.ts#L59)
diff --git a/packages/utils/docs/string.md b/packages/utils/docs/string.md
index 8e6aaff9..e84ac4d0 100644
--- a/packages/utils/docs/string.md
+++ b/packages/utils/docs/string.md
@@ -35,7 +35,7 @@ capitalize("the quick Brown Fox");
 
 #### Defined In
 
-[packages/utils/src/string.ts:184](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L184)
+[string.ts:184](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L184)
 
 ***
 
@@ -70,7 +70,7 @@ escapeMDX("{MDX} <special> characters");
 
 #### Defined In
 
-[packages/utils/src/string.ts:140](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L140)
+[string.ts:140](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L140)
 
 ***
 
@@ -105,7 +105,7 @@ firstUppercase("the quick Brown Fox");
 
 #### Defined In
 
-[packages/utils/src/string.ts:160](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L160)
+[string.ts:160](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L160)
 
 ***
 
@@ -140,7 +140,7 @@ kebabCase("The quick brown Fox");
 
 #### Defined In
 
-[packages/utils/src/string.ts:258](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L258)
+[string.ts:258](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L258)
 
 ***
 
@@ -178,7 +178,7 @@ prune(text, "**");
 
 #### Defined In
 
-[packages/utils/src/string.ts:82](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L82)
+[string.ts:82](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L82)
 
 ***
 
@@ -218,7 +218,7 @@ replaceDiacritics("Âéêś"); // Expected result: "Aees"
 
 #### Defined In
 
-[packages/utils/src/string.ts:209](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L209)
+[string.ts:209](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L209)
 
 ***
 
@@ -242,7 +242,7 @@ Alias of [kebabCase](string.md#kebabcase).
 
 #### Defined In
 
-[packages/utils/src/string.ts:258](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L258)
+[string.ts:258](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L258)
 
 ***
 
@@ -277,7 +277,7 @@ startCase("the quick Brown Fox");
 
 #### Defined In
 
-[packages/utils/src/string.ts:234](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L234)
+[string.ts:234](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L234)
 
 ***
 
@@ -325,7 +325,7 @@ stringCaseBuilder(text, transformation, " ");
 
 #### Defined In
 
-[packages/utils/src/string.ts:36](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L36)
+[string.ts:36](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L36)
 
 ***
 
@@ -359,4 +359,4 @@ toHTMLUnicode("%"); // Expected result: "&#x0025;"
 
 #### Defined In
 
-[packages/utils/src/string.ts:114](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L114)
+[string.ts:114](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/string.ts#L114)
diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts
index c0ae13e2..06b9479b 100644
--- a/packages/utils/src/index.ts
+++ b/packages/utils/src/index.ts
@@ -4,4 +4,3 @@ export * from "./array";
 export * from "./object";
 export * from "./string";
 export * as pathUrl from "./url";
-export * from "./graphql";
diff --git a/tsconfig.json b/tsconfig.json
index e6cf6b6b..1a332477 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -5,6 +5,7 @@
     { "path": "packages/core" },
     { "path": "packages/diff" },
     { "path": "packages/docusaurus" },
+    { "path": "packages/graphql" },
     { "path": "packages/helpers" },
     { "path": "packages/logger" },
     { "path": "packages/printer-legacy" },


Test patch:
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index c9e51155..16443af5 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -20,7 +20,7 @@ jobs:
       fail-fast: false
       matrix:
         package:
-          ["docusaurus", "core", "diff", "printer-legacy", "utils", "helpers", "logger"]
+          ["docusaurus", "core", "diff", "printer-legacy", "utils", "helpers", "logger", "graphql"]
 
     steps:
       - name: Checkout Code Base
diff --git a/packages/core/tests/unit/generator.test.ts b/packages/core/tests/unit/generator.test.ts
index 53691fe3..c9b3a5b2 100644
--- a/packages/core/tests/unit/generator.test.ts
+++ b/packages/core/tests/unit/generator.test.ts
@@ -8,8 +8,8 @@ import type {
   SchemaMap,
 } from "@graphql-markdown/types";
 
-import * as Utils from "@graphql-markdown/utils";
-jest.mock("@graphql-markdown/utils", () => {
+import * as GraphQL from "@graphql-markdown/graphql";
+jest.mock("@graphql-markdown/graphql", () => {
   return {
     getCustomDirectives: jest.fn(),
     getDocumentLoaders: jest.fn(),
@@ -77,16 +77,16 @@ describe("generator", () => {
     test("passes options to Printer and Renderer", async () => {
       jest.spyOn(CoreDiff, "hasChanges").mockResolvedValueOnce(true);
       jest
-        .spyOn(Utils, "getDocumentLoaders")
+        .spyOn(GraphQL, "getDocumentLoaders")
         .mockResolvedValueOnce({} as LoadSchemaOptions);
       jest
-        .spyOn(Utils, "loadSchema")
+        .spyOn(GraphQL, "loadSchema")
         .mockResolvedValueOnce({} as GraphQLSchema);
       jest
-        .spyOn(Utils, "getSchemaMap")
+        .spyOn(GraphQL, "getSchemaMap")
         .mockReturnValueOnce({ objects: {} } as SchemaMap);
-      jest.spyOn(Utils, "getGroups").mockReturnValueOnce(undefined);
-      jest.spyOn(Utils, "getCustomDirectives").mockReturnValueOnce(undefined);
+      jest.spyOn(GraphQL, "getGroups").mockReturnValueOnce(undefined);
+      jest.spyOn(GraphQL, "getCustomDirectives").mockReturnValueOnce(undefined);
 
       const getPrinterSpy = jest
         .spyOn(CorePrinter, "getPrinter")
@@ -127,16 +127,16 @@ describe("generator", () => {
 
       jest.spyOn(CoreDiff, "hasChanges").mockResolvedValueOnce(true);
       jest
-        .spyOn(Utils, "getDocumentLoaders")
+        .spyOn(GraphQL, "getDocumentLoaders")
         .mockResolvedValueOnce({} as LoadSchemaOptions);
       jest
-        .spyOn(Utils, "loadSchema")
+        .spyOn(GraphQL, "loadSchema")
         .mockResolvedValueOnce({} as GraphQLSchema);
       jest
-        .spyOn(Utils, "getSchemaMap")
+        .spyOn(GraphQL, "getSchemaMap")
         .mockReturnValueOnce({ objects: {} } as SchemaMap);
-      jest.spyOn(Utils, "getGroups").mockReturnValueOnce(undefined);
-      jest.spyOn(Utils, "getCustomDirectives").mockReturnValueOnce(undefined);
+      jest.spyOn(GraphQL, "getGroups").mockReturnValueOnce(undefined);
+      jest.spyOn(GraphQL, "getCustomDirectives").mockReturnValueOnce(undefined);
       jest
         .spyOn(CorePrinter, "getPrinter")
         .mockResolvedValueOnce({} as unknown as typeof IPrinter);
@@ -164,10 +164,10 @@ describe("generator", () => {
       expect.assertions(3);
 
       const getDocumentLoadersSpy = jest
-        .spyOn(Utils, "getDocumentLoaders")
+        .spyOn(GraphQL, "getDocumentLoaders")
         .mockResolvedValueOnce(undefined);
       const loggerSpy = jest.spyOn(console, "error");
-      const loadSchemaSpy = jest.spyOn(Utils, "loadSchema");
+      const loadSchemaSpy = jest.spyOn(GraphQL, "loadSchema");
 
       await generateDocFromSchema({} as unknown as GeneratorOptions);
 
@@ -182,13 +182,13 @@ describe("generator", () => {
       expect.assertions(2);
 
       jest
-        .spyOn(Utils, "getDocumentLoaders")
+        .spyOn(GraphQL, "getDocumentLoaders")
         .mockResolvedValueOnce({} as LoadSchemaOptions);
       jest
-        .spyOn(Utils, "loadSchema")
+        .spyOn(GraphQL, "loadSchema")
         .mockResolvedValueOnce({} as GraphQLSchema);
       jest
-        .spyOn(Utils, "getSchemaMap")
+        .spyOn(GraphQL, "getSchemaMap")
         .mockReturnValueOnce({ objects: {} } as SchemaMap);
       const loggerSpy = jest.spyOn(console, "info");
       const hasChangesSpy = jest
@@ -207,13 +207,13 @@ describe("generator", () => {
       expect.assertions(1);
 
       jest
-        .spyOn(Utils, "getDocumentLoaders")
+        .spyOn(GraphQL, "getDocumentLoaders")
         .mockResolvedValueOnce({} as LoadSchemaOptions);
       jest
-        .spyOn(Utils, "loadSchema")
+        .spyOn(GraphQL, "loadSchema")
         .mockResolvedValueOnce({} as GraphQLSchema);
       jest
-        .spyOn(Utils, "getSchemaMap")
+        .spyOn(GraphQL, "getSchemaMap")
         .mockReturnValueOnce({ objects: {} } as SchemaMap);
       const hasChangesSpy = jest.spyOn(CoreDiff, "hasChanges");
 
@@ -229,13 +229,13 @@ describe("generator", () => {
       expect.assertions(2);
 
       jest
-        .spyOn(Utils, "getDocumentLoaders")
+        .spyOn(GraphQL, "getDocumentLoaders")
         .mockResolvedValueOnce({} as LoadSchemaOptions);
       jest
-        .spyOn(Utils, "loadSchema")
+        .spyOn(GraphQL, "loadSchema")
         .mockResolvedValueOnce({} as GraphQLSchema);
       jest
-        .spyOn(Utils, "getSchemaMap")
+        .spyOn(GraphQL, "getSchemaMap")
         .mockReturnValueOnce({ objects: {} } as SchemaMap);
       const loggerSpy = jest.spyOn(console, "info");
       const hasChangesSpy = jest
diff --git a/packages/core/tests/unit/renderer.test.ts b/packages/core/tests/unit/renderer.test.ts
index 9a7cd709..dc78ef93 100644
--- a/packages/core/tests/unit/renderer.test.ts
+++ b/packages/core/tests/unit/renderer.test.ts
@@ -33,6 +33,15 @@ jest.mock("@graphql-markdown/utils", () => {
 });
 import * as Utils from "@graphql-markdown/utils";
 
+jest.mock("@graphql-markdown/graphql", () => {
+  return {
+    __esModule: true,
+    ...jest.requireActual("@graphql-markdown/graphql"),
+    isDeprecated: jest.fn(),
+  };
+});
+import * as GraphQL from "@graphql-markdown/graphql";
+
 import { Renderer } from "../../src/renderer";
 import { DEFAULT_OPTIONS } from "../../src/config";
 
@@ -380,7 +389,7 @@ describe("renderer", () => {
         jest.replaceProperty(rendererInstance, "options", {
           deprecated: "group",
         });
-        jest.spyOn(Utils, "isDeprecated").mockReturnValue(true);
+        jest.spyOn(GraphQL, "isDeprecated").mockReturnValue(true);
 
         const dirPath = await rendererInstance.generateCategoryMetafileType(
           type,
@@ -407,7 +416,7 @@ describe("renderer", () => {
         jest.replaceProperty(rendererInstance, "options", {
           deprecated: "group",
         });
-        jest.spyOn(Utils, "isDeprecated").mockReturnValue(false);
+        jest.spyOn(GraphQL, "isDeprecated").mockReturnValue(false);
 
         const dirPath = await rendererInstance.generateCategoryMetafileType(
           type,
@@ -428,7 +437,7 @@ describe("renderer", () => {
         jest.replaceProperty(rendererInstance, "options", {
           deprecated: "default",
         });
-        jest.spyOn(Utils, "isDeprecated").mockReturnValue(false);
+        jest.spyOn(GraphQL, "isDeprecated").mockReturnValue(false);
 
         const dirPath = await rendererInstance.generateCategoryMetafileType(
           type,
@@ -452,7 +461,7 @@ describe("renderer", () => {
         jest.replaceProperty(rendererInstance, "group", {
           [root]: { [name]: group },
         });
-        jest.spyOn(Utils, "isDeprecated").mockReturnValue(true);
+        jest.spyOn(GraphQL, "isDeprecated").mockReturnValue(true);
 
         const dirPath = await rendererInstance.generateCategoryMetafileType(
           type,
diff --git a/packages/docusaurus/tests/__data__/docusaurus2-graphql-doc-generator-groups.config.js b/packages/docusaurus/tests/__data__/docusaurus2-graphql-doc-generator-groups.config.js
index 9028770b..634863c2 100644
--- a/packages/docusaurus/tests/__data__/docusaurus2-graphql-doc-generator-groups.config.js
+++ b/packages/docusaurus/tests/__data__/docusaurus2-graphql-doc-generator-groups.config.js
@@ -1,5 +1,5 @@
 /* eslint-disable @typescript-eslint/no-var-requires */
-const { getTypeDirectiveValues } = require("@graphql-markdown/utils");
+const { getTypeDirectiveValues } = require("@graphql-markdown/graphql");
 const {
   directiveDescriptor,
   directiveTag,
diff --git a/packages/utils/tests/__data__/introspection.json b/packages/graphql/tests/__data__/introspection.json
similarity index 100%
rename from packages/utils/tests/__data__/introspection.json
rename to packages/graphql/tests/__data__/introspection.json
diff --git a/packages/utils/tests/__data__/schema_802.graphql b/packages/graphql/tests/__data__/schema_802.graphql
similarity index 100%
rename from packages/utils/tests/__data__/schema_802.graphql
rename to packages/graphql/tests/__data__/schema_802.graphql
diff --git a/packages/utils/tests/__data__/schema_with_custom_root_types.graphql b/packages/graphql/tests/__data__/schema_with_custom_root_types.graphql
similarity index 100%
rename from packages/utils/tests/__data__/schema_with_custom_root_types.graphql
rename to packages/graphql/tests/__data__/schema_with_custom_root_types.graphql
diff --git a/packages/utils/tests/__data__/tweet.graphql b/packages/graphql/tests/__data__/tweet.graphql
similarity index 100%
rename from packages/utils/tests/__data__/tweet.graphql
rename to packages/graphql/tests/__data__/tweet.graphql
diff --git a/packages/graphql/tests/__mocks__/.gitkeep b/packages/graphql/tests/__mocks__/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/packages/utils/tests/unit/graphql/__snapshots__/introspection.test.ts.snap b/packages/graphql/tests/unit/__snapshots__/introspection.test.ts.snap
similarity index 100%
rename from packages/utils/tests/unit/graphql/__snapshots__/introspection.test.ts.snap
rename to packages/graphql/tests/unit/__snapshots__/introspection.test.ts.snap
diff --git a/packages/utils/tests/unit/graphql/__snapshots__/relation.test.ts.snap b/packages/graphql/tests/unit/__snapshots__/relation.test.ts.snap
similarity index 100%
rename from packages/utils/tests/unit/graphql/__snapshots__/relation.test.ts.snap
rename to packages/graphql/tests/unit/__snapshots__/relation.test.ts.snap
diff --git a/packages/utils/tests/unit/graphql/directive.test.ts b/packages/graphql/tests/unit/directive.test.ts
similarity index 99%
rename from packages/utils/tests/unit/graphql/directive.test.ts
rename to packages/graphql/tests/unit/directive.test.ts
index adab7405..7510897c 100644
--- a/packages/utils/tests/unit/graphql/directive.test.ts
+++ b/packages/graphql/tests/unit/directive.test.ts
@@ -4,7 +4,7 @@ import { buildSchema } from "graphql";
 
 import type { DirectiveName, CustomDirective } from "@graphql-markdown/types";
 
-import * as Directives from "../../../src/graphql/directive";
+import * as Directives from "../../src/directive";
 const {
   getConstDirectiveMap,
   getCustomDirectiveOptions,
diff --git a/packages/utils/tests/unit/graphql/formatter.test.ts b/packages/graphql/tests/unit/formatter.test.ts
similarity index 97%
rename from packages/utils/tests/unit/graphql/formatter.test.ts
rename to packages/graphql/tests/unit/formatter.test.ts
index 51d25342..5756e067 100644
--- a/packages/utils/tests/unit/graphql/formatter.test.ts
+++ b/packages/graphql/tests/unit/formatter.test.ts
@@ -8,7 +8,7 @@ import {
   GraphQLString,
 } from "graphql";
 
-import { getFormattedDefaultValue } from "../../../src/graphql/formatter";
+import { getFormattedDefaultValue } from "../../src/formatter";
 
 describe("formatter", () => {
   describe("getFormattedDefaultValue()", () => {
diff --git a/packages/utils/tests/unit/graphql/group.test.ts b/packages/graphql/tests/unit/group.test.ts
similarity index 98%
rename from packages/utils/tests/unit/graphql/group.test.ts
rename to packages/graphql/tests/unit/group.test.ts
index bcf86428..ae18efd8 100644
--- a/packages/utils/tests/unit/graphql/group.test.ts
+++ b/packages/graphql/tests/unit/group.test.ts
@@ -8,7 +8,7 @@ import type {
   GraphQLOperationType,
 } from "@graphql-markdown/types";
 
-import { getGroups, getGroupName } from "../../../src/graphql/group";
+import { getGroups, getGroupName } from "../../src/group";
 
 describe("group-info", () => {
   const schema = buildSchema(`
diff --git a/packages/utils/tests/unit/graphql/guard.test.ts b/packages/graphql/tests/unit/guard.test.ts
similarity index 92%
rename from packages/utils/tests/unit/graphql/guard.test.ts
rename to packages/graphql/tests/unit/guard.test.ts
index a0c4d2e8..6291041e 100644
--- a/packages/utils/tests/unit/graphql/guard.test.ts
+++ b/packages/graphql/tests/unit/guard.test.ts
@@ -4,17 +4,10 @@ import { GraphQLFileLoader } from "@graphql-tools/graphql-file-loader";
 import type { GraphQLSchema } from "graphql";
 import { buildSchema, GraphQLObjectType } from "graphql";
 
-import {
-  getOperation,
-  getTypeFromSchema,
-} from "../../../src/graphql/introspection";
-import {
-  isDeprecated,
-  isOperation,
-  isGraphQLFieldType,
-} from "../../../src/graphql/guard";
-
-const SCHEMA_FILE = require.resolve("../../__data__/tweet.graphql");
+import { getOperation, getTypeFromSchema } from "../../src/introspection";
+import { isDeprecated, isOperation, isGraphQLFieldType } from "../../src/guard";
+
+const SCHEMA_FILE = require.resolve("../__data__/tweet.graphql");
 
 describe("graphql", () => {
   let schema: GraphQLSchema;
diff --git a/packages/utils/tests/unit/graphql/introspection.test.ts b/packages/graphql/tests/unit/introspection.test.ts
similarity index 97%
rename from packages/utils/tests/unit/graphql/introspection.test.ts
rename to packages/graphql/tests/unit/introspection.test.ts
index 74f29dfe..74f47e4e 100644
--- a/packages/utils/tests/unit/graphql/introspection.test.ts
+++ b/packages/graphql/tests/unit/introspection.test.ts
@@ -32,19 +32,17 @@ import {
   getTypeFromSchema,
   getTypeName,
   hasDirective,
-} from "../../../src/graphql/introspection";
-import { loadSchema } from "../../../src/graphql/loader";
+} from "../../src/introspection";
+import { loadSchema } from "../../src/loader";
 
-const SCHEMA_FILE = require.resolve("../../__data__/tweet.graphql");
+const SCHEMA_FILE = require.resolve("../__data__/tweet.graphql");
 const SCHEMA_CUSTOM_ROOT_FILE = require.resolve(
-  "../../__data__/schema_with_custom_root_types.graphql",
+  "../__data__/schema_with_custom_root_types.graphql",
 );
 const INTROSPECTION_SCHEMA_FILE = require.resolve(
-  "../../__data__/introspection.json",
-);
-const SCHEMA_ISSUE_802_FILE = require.resolve(
-  "../../__data__/schema_802.graphql",
+  "../__data__/introspection.json",
 );
+const SCHEMA_ISSUE_802_FILE = require.resolve("../__data__/schema_802.graphql");
 
 describe("introspection", () => {
   let schema: GraphQLSchema;
diff --git a/packages/utils/tests/unit/graphql/loader.test.ts b/packages/graphql/tests/unit/loader.test.ts
similarity index 93%
rename from packages/utils/tests/unit/graphql/loader.test.ts
rename to packages/graphql/tests/unit/loader.test.ts
index b336e751..35a2c34b 100644
--- a/packages/utils/tests/unit/graphql/loader.test.ts
+++ b/packages/graphql/tests/unit/loader.test.ts
@@ -4,11 +4,11 @@ import type { GraphQLSchema } from "graphql";
 
 import type { LoaderOption } from "@graphql-markdown/types";
 
-import { getDocumentLoaders, loadSchema } from "../../../src/graphql/loader";
+import { getDocumentLoaders, loadSchema } from "../../src/loader";
 
-const SCHEMA_FILE = require.resolve("../../__data__/tweet.graphql");
+const SCHEMA_FILE = require.resolve("../__data__/tweet.graphql");
 const SCHEMA_CUSTOM_ROOT_FILE = require.resolve(
-  "../../__data__/schema_with_custom_root_types.graphql",
+  "../__data__/schema_with_custom_root_types.graphql",
 );
 
 describe("loader", () => {
diff --git a/packages/utils/tests/unit/graphql/relation.test.ts b/packages/graphql/tests/unit/relation.test.ts
similarity index 98%
rename from packages/utils/tests/unit/graphql/relation.test.ts
rename to packages/graphql/tests/unit/relation.test.ts
index 2f95fa95..b7723fa6 100644
--- a/packages/utils/tests/unit/graphql/relation.test.ts
+++ b/packages/graphql/tests/unit/relation.test.ts
@@ -1,6 +1,6 @@
 import { buildSchema } from "graphql";
 
-import { getSchemaMap } from "../../../src/graphql/introspection";
+import { getSchemaMap } from "../../src/introspection";
 
 import {
   getRelationOfField,
@@ -8,7 +8,7 @@ import {
   getRelationOfInterface,
   getRelationOfReturn,
   getRelationOfUnion,
-} from "../../../src/graphql/relation";
+} from "../../src/relation";
 
 describe("relation", () => {
   describe("getRelationOfInterface()", () => {
diff --git a/packages/graphql/tsconfig.test.json b/packages/graphql/tsconfig.test.json
new file mode 100644
index 00000000..4af739cc
--- /dev/null
+++ b/packages/graphql/tsconfig.test.json
@@ -0,0 +1,19 @@
+{
+  "extends": "./tsconfig.json",
+
+  "compilerOptions": {
+    "rootDir": "./",
+
+    "noEmit": true,
+
+    "types": ["node", "@types/jest"],
+
+    "paths": {
+      "@graphql-markdown/types": ["../types/src/index.d.ts"],
+      "@graphql-markdown/*": ["../*/src/index.ts"]
+    }
+  },
+
+  "include": ["tests", "src", "assets"],
+  "exclude": ["**/data", "*.js", "**/dist"]
+}
diff --git a/packages/printer-legacy/tests/unit/badge.test.ts b/packages/printer-legacy/tests/unit/badge.test.ts
index 1dbaf54f..121bd211 100644
--- a/packages/printer-legacy/tests/unit/badge.test.ts
+++ b/packages/printer-legacy/tests/unit/badge.test.ts
@@ -6,6 +6,12 @@ jest.mock("@graphql-markdown/utils", () => {
     escapeMDX: jest.fn((t) => t),
     pathUrl: jest.fn(),
     isEmpty: jest.fn(() => false),
+  };
+});
+import * as Utils from "@graphql-markdown/utils";
+
+jest.mock("@graphql-markdown/graphql", () => {
+  return {
     isNonNullType: jest.fn(),
     isListType: jest.fn(),
     isOperation: jest.fn(),
@@ -21,7 +27,7 @@ jest.mock("@graphql-markdown/utils", () => {
     getConstDirectiveMap: jest.fn(),
   };
 });
-import * as Utils from "@graphql-markdown/utils";
+import * as GraphQL from "@graphql-markdown/graphql";
 
 jest.mock("../../src/link", () => {
   return {
@@ -50,7 +56,7 @@ describe("badge", () => {
     test("returns a MDX string of Badge components", () => {
       expect.assertions(1);
 
-      jest.spyOn(Utils, "isNonNullType").mockReturnValueOnce(true);
+      jest.spyOn(GraphQL, "isNonNullType").mockReturnValueOnce(true);
       jest.spyOn(Utils, "isEmpty").mockReturnValueOnce(true);
 
       const badges = Badge.printBadges(
@@ -100,7 +106,7 @@ describe("badge", () => {
     test("return non-null badge is type is non-null", () => {
       expect.assertions(1);
 
-      jest.spyOn(Utils, "isNonNullType").mockReturnValueOnce(true);
+      jest.spyOn(GraphQL, "isNonNullType").mockReturnValueOnce(true);
 
       const type = {};
 
@@ -114,7 +120,7 @@ describe("badge", () => {
     test("return list badge is type is list", () => {
       expect.assertions(1);
 
-      jest.spyOn(Utils, "isListType").mockReturnValueOnce(true);
+      jest.spyOn(GraphQL, "isListType").mockReturnValueOnce(true);
 
       const type = {};
 
diff --git a/packages/printer-legacy/tests/unit/code.test.ts b/packages/printer-legacy/tests/unit/code.test.ts
index 092e7f80..9430503a 100644
--- a/packages/printer-legacy/tests/unit/code.test.ts
+++ b/packages/printer-legacy/tests/unit/code.test.ts
@@ -5,7 +5,7 @@ import {
   GraphQLString,
 } from "graphql";
 
-jest.mock("@graphql-markdown/utils", () => {
+jest.mock("@graphql-markdown/graphql", () => {
   return {
     getFormattedDefaultValue: jest.fn((type) => type?.defaultValue),
     getTypeName: jest.fn((t) => t.name ?? t.toString()),
diff --git a/packages/printer-legacy/tests/unit/directive.test.ts b/packages/printer-legacy/tests/unit/directive.test.ts
index 9e6d2a1c..a61b0a12 100644
--- a/packages/printer-legacy/tests/unit/directive.test.ts
+++ b/packages/printer-legacy/tests/unit/directive.test.ts
@@ -12,7 +12,7 @@ import { DEFAULT_OPTIONS } from "../../src/const/options";
 
 jest.mock("@graphql-markdown/utils", () => {
   return {
-    ...jest.requireActual("@graphql-markdown/utils"),
+    // ...jest.requireActual("@graphql-markdown/utils"),
     isEmpty: jest.fn(),
     getConstDirectiveMap: jest.fn(),
     escapeMDX: jest.fn(),
@@ -20,6 +20,14 @@ jest.mock("@graphql-markdown/utils", () => {
 });
 import * as Utils from "@graphql-markdown/utils";
 
+jest.mock("@graphql-markdown/graphql", () => {
+  return {
+    ...jest.requireActual("@graphql-markdown/graphql"),
+    getConstDirectiveMap: jest.fn(),
+  };
+});
+import * as GraphQL from "@graphql-markdown/graphql";
+
 jest.mock("../../src/link", () => {
   return {
     printLink: jest.fn(),
@@ -131,7 +139,7 @@ describe("directive", () => {
     test("returns empty string when config is not set", () => {
       expect.assertions(1);
 
-      jest.spyOn(Utils, "getConstDirectiveMap").mockReturnValue(undefined);
+      jest.spyOn(GraphQL, "getConstDirectiveMap").mockReturnValue(undefined);
 
       expect(
         printCustomDirectives(type, {} as unknown as PrintTypeOptions),
@@ -145,7 +153,7 @@ describe("directive", () => {
         testA: options.customDirectives["testA" as DirectiveName],
       };
       jest
-        .spyOn(Utils, "getConstDirectiveMap")
+        .spyOn(GraphQL, "getConstDirectiveMap")
         .mockReturnValue(mockConstDirectiveMap);
       jest
         .spyOn(Link, "printLink")
@@ -169,7 +177,7 @@ describe("directive", () => {
         testA: options.customDirectives["noDescriptor" as DirectiveName],
       };
       jest
-        .spyOn(Utils, "getConstDirectiveMap")
+        .spyOn(GraphQL, "getConstDirectiveMap")
         .mockReturnValue(mockConstDirectiveMap);
       jest
         .spyOn(Link, "printLink")
@@ -198,7 +206,7 @@ describe("directive", () => {
       };
 
       jest
-        .spyOn(Utils, "getConstDirectiveMap")
+        .spyOn(GraphQL, "getConstDirectiveMap")
         .mockReturnValue(mockConstDirectiveMap);
       jest.spyOn(Utils, "isEmpty").mockReturnValue(false);
 
@@ -225,7 +233,7 @@ describe("directive", () => {
         testA: options.customDirectives["testA" as DirectiveName],
       };
       jest
-        .spyOn(Utils, "getConstDirectiveMap")
+        .spyOn(GraphQL, "getConstDirectiveMap")
         .mockReturnValue(mockConstDirectiveMap);
       jest.spyOn(Utils, "isEmpty").mockReturnValue(false);
       jest
diff --git a/packages/printer-legacy/tests/unit/graphql/operation.test.ts b/packages/printer-legacy/tests/unit/graphql/operation.test.ts
index 9347b78d..8cc4c305 100644
--- a/packages/printer-legacy/tests/unit/graphql/operation.test.ts
+++ b/packages/printer-legacy/tests/unit/graphql/operation.test.ts
@@ -1,10 +1,10 @@
 import type { GraphQLSchema } from "graphql";
 import { GraphQLID, GraphQLObjectType, GraphQLString } from "graphql";
 
-jest.mock("@graphql-markdown/utils", () => {
+jest.mock("@graphql-markdown/graphql", () => {
   return {
-    ...jest.requireActual("@graphql-markdown/utils"),
-    isDeprecated: jest.fn((t: any) => "deprecationReason" in t), // eslint-disable-line @typescript-eslint/no-explicit-any
+    ...jest.requireActual("@graphql-markdown/graphql"),
+    isDeprecated: jest.fn((T: any) => "deprecationReason" in T), // eslint-disable-line @typescript-eslint/no-explicit-any
   };
 });
 
diff --git a/packages/printer-legacy/tests/unit/group.test.ts b/packages/printer-legacy/tests/unit/group.test.ts
index 18e697f4..769b9a91 100644
--- a/packages/printer-legacy/tests/unit/group.test.ts
+++ b/packages/printer-legacy/tests/unit/group.test.ts
@@ -1,13 +1,13 @@
 import type { GraphQLNamedType } from "graphql/type/definition";
 
-jest.mock("@graphql-markdown/utils", () => {
+jest.mock("@graphql-markdown/graphql", () => {
   return {
-    ...jest.requireActual("@graphql-markdown/utils"),
+    ...jest.requireActual("@graphql-markdown/graphql"),
     getNamedType: jest.fn(),
   };
 });
 
-import * as Utils from "@graphql-markdown/utils";
+import * as GraphQL from "@graphql-markdown/graphql";
 
 import { getGroup } from "../../src/group";
 
@@ -50,7 +50,7 @@ describe("group", () => {
       "returns group name string if type has group",
       (type) => {
         jest
-          .spyOn(Utils, "getNamedType")
+          .spyOn(GraphQL, "getNamedType")
           .mockReturnValue({ name: "FooBaz" } as unknown as GraphQLNamedType);
 
         const group = getGroup(
@@ -65,7 +65,7 @@ describe("group", () => {
 
     test("returns empty string if type not in group", () => {
       jest
-        .spyOn(Utils, "getNamedType")
+        .spyOn(GraphQL, "getNamedType")
         .mockReturnValue({ name: "FooBar" } as unknown as GraphQLNamedType);
 
       const group = getGroup(
@@ -79,7 +79,7 @@ describe("group", () => {
   });
 
   test("returns empty string if resolved named type is undefined", () => {
-    jest.spyOn(Utils, "getNamedType").mockReturnValue(undefined);
+    jest.spyOn(GraphQL, "getNamedType").mockReturnValue(undefined);
 
     const group = getGroup(
       { name: "FooBar" },
diff --git a/packages/printer-legacy/tests/unit/link.test.ts b/packages/printer-legacy/tests/unit/link.test.ts
index 9950eaeb..09552b86 100644
--- a/packages/printer-legacy/tests/unit/link.test.ts
+++ b/packages/printer-legacy/tests/unit/link.test.ts
@@ -12,6 +12,12 @@ jest.mock("@graphql-markdown/utils", () => {
   return {
     slugify: jest.fn(),
     pathUrl: jest.requireActual("path").posix,
+  };
+});
+import * as Utils from "@graphql-markdown/utils";
+
+jest.mock("@graphql-markdown/graphql", () => {
+  return {
     hasDirective: jest.fn(),
     getTypeName: jest.fn(),
     getNamedType: jest.fn(),
@@ -29,7 +35,7 @@ jest.mock("@graphql-markdown/utils", () => {
     isDeprecated: jest.fn(),
   };
 });
-import * as Utils from "@graphql-markdown/utils";
+import * as GraphQL from "@graphql-markdown/graphql";
 
 import { DEFAULT_OPTIONS } from "../../src/const/options";
 
@@ -98,7 +104,7 @@ describe("link", () => {
     test.each(types)(
       "returns a category object matching the graphLQLNamedType $name",
       ({ guard }) => {
-        jest.spyOn(Utils, guard).mockReturnValueOnce(true);
+        jest.spyOn(GraphQL, guard).mockReturnValueOnce(true);
 
         const category = Link.getLinkCategory(
           {} as unknown as GraphQLNamedType,
@@ -133,9 +139,9 @@ describe("link", () => {
         });
 
         jest
-          .spyOn(Utils, "getNamedType")
+          .spyOn(GraphQL, "getNamedType")
           .mockReturnValue(entityName as unknown as GraphQLNamedType);
-        jest.spyOn(Utils, guard).mockReturnValue(true);
+        jest.spyOn(GraphQL, guard).mockReturnValue(true);
         jest.spyOn(Utils, "slugify").mockReturnValueOnce(slug);
 
         const link = Link.toLink(type, entityName, operation, {
@@ -160,9 +166,9 @@ describe("link", () => {
       );
 
       jest
-        .spyOn(Utils, "getNamedType")
+        .spyOn(GraphQL, "getNamedType")
         .mockReturnValue(entityName as unknown as GraphQLNamedType);
-      jest.spyOn(Utils, "isObjectType").mockReturnValue(true);
+      jest.spyOn(GraphQL, "isObjectType").mockReturnValue(true);
       jest.spyOn(Utils, "slugify").mockReturnValueOnce(slug);
 
       const link = Link.toLink(type, entityName, undefined, {
@@ -208,9 +214,9 @@ describe("link", () => {
       });
 
       jest
-        .spyOn(Utils, "getNamedType")
+        .spyOn(GraphQL, "getNamedType")
         .mockReturnValue(entityName as unknown as GraphQLNamedType);
-      jest.spyOn(Utils, "isDirectiveType").mockReturnValue(true);
+      jest.spyOn(GraphQL, "isDirectiveType").mockReturnValue(true);
       jest.spyOn(Utils, "slugify").mockReturnValueOnce(slug);
       jest.spyOn(Group, "getGroup").mockReturnValueOnce("group");
 
@@ -239,11 +245,11 @@ describe("link", () => {
       });
 
       jest
-        .spyOn(Utils, "getNamedType")
+        .spyOn(GraphQL, "getNamedType")
         .mockReturnValue(entityName as unknown as GraphQLNamedType);
-      jest.spyOn(Utils, "isDirectiveType").mockReturnValue(true);
+      jest.spyOn(GraphQL, "isDirectiveType").mockReturnValue(true);
       jest.spyOn(Utils, "slugify").mockReturnValueOnce(slug);
-      jest.spyOn(Utils, "isDeprecated").mockReturnValue(true);
+      jest.spyOn(GraphQL, "isDeprecated").mockReturnValue(true);
 
       const link = Link.toLink(type, entityName, undefined, {
         ...DEFAULT_OPTIONS,
@@ -284,7 +290,7 @@ describe("link", () => {
     test("calls recursively if not a leaf node", () => {
       expect.hasAssertions();
 
-      jest.spyOn(Utils, "isLeafType").mockReturnValueOnce(false);
+      jest.spyOn(GraphQL, "isLeafType").mockReturnValueOnce(false);
 
       const type = { ofType: "test" };
       const text = "baz";
@@ -297,7 +303,7 @@ describe("link", () => {
     test("returns a format [text] if type is list", () => {
       expect.hasAssertions();
 
-      jest.spyOn(Utils, "isListType").mockReturnValueOnce(true);
+      jest.spyOn(GraphQL, "isListType").mockReturnValueOnce(true);
 
       const type = { ofType: "test" };
       const text = "baz";
@@ -310,7 +316,7 @@ describe("link", () => {
     test("returns a format text! if type is non-null", () => {
       expect.hasAssertions();
 
-      jest.spyOn(Utils, "isNonNullType").mockReturnValueOnce(true);
+      jest.spyOn(GraphQL, "isNonNullType").mockReturnValueOnce(true);
 
       const type = { ofType: "test" };
       const text = "baz";
@@ -484,9 +490,9 @@ describe("link", () => {
       });
 
       jest
-        .spyOn(Utils, "getNamedType")
+        .spyOn(GraphQL, "getNamedType")
         .mockReturnValue(entityName as unknown as GraphQLNamedType);
-      jest.spyOn(Utils, "isScalarType").mockReturnValue(true);
+      jest.spyOn(GraphQL, "isScalarType").mockReturnValue(true);
       jest.spyOn(Utils, "slugify").mockReturnValue(slug);
 
       const link = Link.getRelationLink("foo", type, {
@@ -510,9 +516,9 @@ describe("link", () => {
       });
 
       jest
-        .spyOn(Utils, "getNamedType")
+        .spyOn(GraphQL, "getNamedType")
         .mockReturnValue(entityName as unknown as GraphQLNamedType);
-      jest.spyOn(Utils, "isScalarType").mockReturnValue(true);
+      jest.spyOn(GraphQL, "isScalarType").mockReturnValue(true);
       jest.spyOn(Utils, "slugify").mockReturnValue(slug);
 
       const link = Link.getRelationLink(undefined, type, {
diff --git a/packages/printer-legacy/tests/unit/printer.test.ts b/packages/printer-legacy/tests/unit/printer.test.ts
index 29dcf526..51368eec 100644
--- a/packages/printer-legacy/tests/unit/printer.test.ts
+++ b/packages/printer-legacy/tests/unit/printer.test.ts
@@ -20,6 +20,11 @@ jest.mock("@graphql-markdown/utils", () => {
     escapeMDX: jest.fn(),
     pathUrl: { join: posix.join },
     isEmpty: jest.fn(),
+  };
+});
+
+jest.mock("@graphql-markdown/graphql", () => {
+  return {
     getConstDirectiveMap: jest.fn(),
     getTypeName: jest.fn(),
     hasDirective: jest.fn(),
@@ -33,7 +38,7 @@ jest.mock("@graphql-markdown/utils", () => {
     isUnionType: jest.fn(),
   };
 });
-import * as Utils from "@graphql-markdown/utils";
+import * as GraphQL from "@graphql-markdown/graphql";
 
 jest.mock("../../src/graphql");
 import * as GraphQLPrinter from "../../src/graphql";
@@ -139,7 +144,7 @@ describe("Printer", () => {
   beforeEach(() => {
     Printer.options = undefined;
     jest
-      .spyOn(Utils, "getTypeName")
+      .spyOn(GraphQL, "getTypeName")
       .mockImplementation((value) => value as string);
   });
 
@@ -331,7 +336,7 @@ describe("Printer", () => {
       ({ type, printCode, name, guard }) => {
         expect.hasAssertions();
 
-        jest.spyOn(Utils, guard).mockReturnValue(true);
+        jest.spyOn(GraphQL, guard).mockReturnValue(true);
         jest.spyOn(GraphQLPrinter, printCode).mockReturnValue(name);
 
         const code = Printer.printCode(type, DEFAULT_OPTIONS);
@@ -370,7 +375,7 @@ describe("Printer", () => {
       ({ type, printMeta, name, guard }) => {
         expect.hasAssertions();
 
-        jest.spyOn(Utils, guard).mockReturnValue(true);
+        jest.spyOn(GraphQL, guard).mockReturnValue(true);
         const spy = jest.spyOn(GraphQLPrinter, printMeta).mockReturnValue(name);
 
         Printer.printTypeMetadata(type, DEFAULT_OPTIONS);
@@ -436,7 +441,7 @@ describe("Printer", () => {
 
     test("returns undefined if matches skipDocDirective", () => {
       expect.hasAssertions();
-      jest.spyOn(Utils, "hasDirective").mockReturnValue(true);
+      jest.spyOn(GraphQL, "hasDirective").mockReturnValue(true);
       const printedType = Printer.printType("any", null);
 
       expect(printedType).toBeUndefined();
diff --git a/packages/printer-legacy/tests/unit/relation.test.ts b/packages/printer-legacy/tests/unit/relation.test.ts
index 2aa6d6c4..f8c5cfa0 100644
--- a/packages/printer-legacy/tests/unit/relation.test.ts
+++ b/packages/printer-legacy/tests/unit/relation.test.ts
@@ -10,6 +10,13 @@ import type {
 jest.mock("@graphql-markdown/utils", () => {
   return {
     escapeMDX: jest.fn((s) => s),
+    pathUrl: jest.fn(),
+    slugify: jest.fn(),
+  };
+});
+
+jest.mock("@graphql-markdown/graphql", () => {
+  return {
     getNamedType: jest.fn((t) => t),
     getRelationOfReturn: jest.fn(),
     getSchemaMap: jest.fn(),
@@ -23,11 +30,9 @@ jest.mock("@graphql-markdown/utils", () => {
     isOperation: jest.fn(() => false),
     isScalarType: jest.fn(),
     isUnionType: jest.fn(),
-    pathUrl: jest.fn(),
-    slugify: jest.fn(),
   };
 });
-import * as Utils from "@graphql-markdown/utils";
+import * as GraphQL from "@graphql-markdown/graphql";
 
 import {
   printRelationOf,
@@ -44,12 +49,12 @@ describe("relation", () => {
     test("returns empty string if type is undefined", () => {
       expect.hasAssertions();
 
-      jest.spyOn(Utils, "isNamedType").mockReturnValueOnce(false);
+      jest.spyOn(GraphQL, "isNamedType").mockReturnValueOnce(false);
 
       const relation = printRelationOf(
         undefined,
         "RelationOf",
-        Utils.getRelationOfReturn,
+        GraphQL.getRelationOfReturn,
         DEFAULT_OPTIONS,
       );
 
@@ -64,12 +69,12 @@ describe("relation", () => {
         description: "Lorem Ipsum",
       });
 
-      jest.spyOn(Utils, "isOperation").mockReturnValueOnce(true);
+      jest.spyOn(GraphQL, "isOperation").mockReturnValueOnce(true);
 
       const relation = printRelationOf(
         type,
         "RelationOf",
-        Utils.getRelationOfReturn,
+        GraphQL.getRelationOfReturn,
         DEFAULT_OPTIONS,
       );
 
@@ -118,7 +123,7 @@ describe("relation", () => {
         description: "Lorem Ipsum",
       });
 
-      jest.spyOn(Utils, "isNamedType").mockReturnValueOnce(true);
+      jest.spyOn(GraphQL, "isNamedType").mockReturnValueOnce(true);
 
       const relation = printRelationOf(
         type,
@@ -163,7 +168,7 @@ describe("relation", () => {
         subscriptions: [{ name: "Baz" } as unknown as GraphQLOperationType],
       });
 
-      jest.spyOn(Utils, "isNamedType").mockReturnValue(true);
+      jest.spyOn(GraphQL, "isNamedType").mockReturnValue(true);
 
       const relation = printRelationOf(
         type,