Repository: graphql-markdown/graphql-markdown
Pull request #944 (2023-08-14 09:37:32)

:sparkles:  move custom directives helpers to @graphql-markdown/helpers
# Description

Move helpers provided for customized directives feature into a separate package `@graphql-markdown/helpers` since they are fully optional.

For backward compatibility, users will have to upgrade their setup:

1. Install the new package `npm i @graphql-markdown/helpers`
2. Update the imports for `directiveDescriptor` and `directiveTag`, now provided by `@graphql-markdown/helpers` 

This will reduce the complexity of the package `@graphql-markdown/utils` that should only includes reusable code for other 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]: 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=944)

[![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=944&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=944&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944) No Coverage information  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=944&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=944&metric=new_duplicated_lines_density&view=list)


codesee-maps[bot]: <details open>
<summary><b>👇 <a href="https://app.codesee.io/r/reviews?pr=944&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/944/984bf6b3/78056d280149e1ffaf2ac907e56a398bdc558cdf.svg)](https://app.codesee.io/r/reviews?pr=944&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>
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=944)

[![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=944&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=944&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944) No Coverage information  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=944&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944)

[![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=944&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=944&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944) No Coverage information  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=944&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944)

[![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=944&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=944&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944) No Coverage information  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=944&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944)

[![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=944&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=944&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944&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=944&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=graphql-markdown_graphql-markdown&pullRequest=944&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=944) No Coverage information  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=944&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=graphql-markdown_graphql-markdown&pullRequest=944&metric=new_duplicated_lines_density&view=list)



Patch:
diff --git a/.github/workflows/mutation.yml b/.github/workflows/mutation.yml
index 59e28bfb..329d78ef 100644
--- a/.github/workflows/mutation.yml
+++ b/.github/workflows/mutation.yml
@@ -26,7 +26,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        package: ["core", "diff", "docusaurus", "printer-legacy", "utils"]
+        package: ["core", "diff", "docusaurus", "printer-legacy", "utils", "helpers"]
 
     steps:
       - name: Checkout Code Base
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 114e2a1f..2921189a 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -67,4 +67,8 @@
   "eslint.workingDirectories": ["./config"],
   "jest.rootPath": ".",
   "jest.jestCommandLine": "npm run test:ci --",
+  "sonarlint.connectedMode.project": {
+    "connectionId": "graphql-markdown",
+    "projectKey": "graphql-markdown_graphql-markdown"
+  }
 }
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8afa3191..7b4bca3e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -129,22 +129,26 @@ The quickest way to understand the code structure is to look at the folder struc
 
 - `packages` contains packages sources
   - `docusaurus` contains Docusaurus plugin 📦 [`@graphql-markdown/docusaurus`](https://github.com/graphql-markdown/graphql-markdown/tree/main/docusaurus)
-    - `src` contains all JS files used by the package.
+    - `src` contains all TS files used by the package.
     - `tests` folder contains all tests needed (see [tests](#tests) section).
     - `scripts` contains scripts used for running smoke tests.
   - `core` contains core logic 📦 [`@graphql-markdown/core`](https://github.com/graphql-markdown/graphql-markdown/tree/main/packages/core)
     - `assets` folder contains assets used by the plugin, e.g. the default homepage `generated.md`.
-    - `src` contains all JS files used by the package.
+    - `src` contains all TS files used by the package.
     - `tests` folder contains all tests needed (see [tests](#tests) section).
   - `utils` contains shared libraries 📦 [`@graphql-markdown/utils`](https://github.com/graphql-markdown/graphql-markdown/tree/main/packages/utils)
-    - `src` contains all JS files used by the package.
+    - `src` contains all TS files used by the package.
     - `tests` folder contains all tests needed (see [tests](#tests) section).
   - `printer-legacy` contains legacy code for exporting markdown 📦 [`@graphql-markdown/printer-legacy`](https://github.com/graphql-markdown/graphql-markdown/tree/main/packages/printer-legacy)
-    - `src` contains all JS files used by the package.
+    - `src` contains all TS files used by the package.
     - `tests` folder contains all tests needed (see [tests](#tests) section).
   - `diff` contains diff methods (optional) 📦 [`@graphql-markdown/diff`](https://github.com/graphql-markdown/graphql-markdown/tree/main/packages/diff)
-    - `src` contains all JS files used by the package.
+    - `src` contains all TS files used by the package.
     - `tests` folder contains all tests needed (see [tests](#tests) section).
+  - `helpers` contains helpers for customized directives feature (optional) 📦 [`@graphql-markdown/helpers`](https://github.com/graphql-markdown/graphql-markdown/tree/main/packages/helpers)
+    - `src` contains all TS files used by the package.
+    - `tests` folder contains all tests needed (see [tests](#tests) section).
+- `config` folder configuration files for development tools.
 - `config` folder configuration files for development tools.
 - `docs` folder contains online documentation.
 - `scripts` folder contains scripts for monorepo (eg. packages version check).
diff --git a/Earthfile b/Earthfile
index c48e3f16..f1c4f941 100644
--- a/Earthfile
+++ b/Earthfile
@@ -63,7 +63,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 printer-legacy diff core docusaurus
+  FOR package IN types utils helpers 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 598422cc..f52d24b5 100644
--- a/config/jest.config.js
+++ b/config/jest.config.js
@@ -30,6 +30,7 @@ module.exports = {
     projectConfig("core"),
     projectConfig("printer-legacy"),
     projectConfig("diff"),
+    projectConfig("helpers"),
     projectConfig("docusaurus"),
   ],
 };
diff --git a/docs/advanced/custom-directive.md b/docs/advanced/custom-directive.md
index 81c47027..7c61deec 100644
--- a/docs/advanced/custom-directive.md
+++ b/docs/advanced/custom-directive.md
@@ -102,7 +102,7 @@ plugins: [
 You can use **`"*"` as wildcard** for the directive name. This will allow all directives not declared with their name under `customDirective` to be handled by the wildcard `descriptor` and/or `tag`.
 
 ```js {11-14}
-const { helper } = require("@graphql-markdown/utils");
+const { directiveDescriptor, tagDescriptor } = require("@graphql-markdown/helpers");
 
 //...//
 
@@ -113,8 +113,8 @@ plugins: [
       // ... other options
       customDirective: {
         "*": {
-          descriptor: helper.directiveDescriptor,
-          tag: helper.tagDescriptor,
+          descriptor: directiveDescriptor,
+          tag: tagDescriptor,
         },
         // ... optionally specific custom directive options
       },
@@ -125,29 +125,28 @@ plugins: [
 
 ## Helpers
 
-The package `@graphql-markdown/utils` provides few helper functions to quick start:
+The packages `@graphql-markdown/helpers` and `@graphql-markdown/utils` provide few helper functions to quick start:
 
 ```ts
+import { directiveDescriptor, tagDescriptor } from "@graphql-markdown/helpers";
 import {
-  directiveDescriptor,
   getTypeDirectiveArgValue,
   getTypeDirectiveValues,
-  tagDescriptor,
 } from "@graphql-markdown/utils";
 ```
 
-### `directiveDescriptor`
+### `@graphql-markdown/helpers` | `directiveDescriptor`
 
-[`helper.directiveDescriptor(directive: GraphQLDirective, type?: unknown, template?: string): string`](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/helper.js) interpolates a template-like string using a directive arguments values. It returns the directive description, if `template` is `undefined`.
+[`directiveDescriptor(directive: GraphQLDirective, type?: unknown, template?: string): string`](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/helpers/src/directives/descriptor.ts) interpolates a template-like string using a directive arguments values. It returns the directive description, if `template` is `undefined`.
 
-### `tagDescriptor`
+### `@graphql-markdown/helpers` | `tagDescriptor`
 
-[`helper.tagDescriptor(directive: GraphQLDirective, type?: unknown, classname?: string): Badge`](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/utils/src/helper.js) returns the directive badge, with `classname` defaulted to `badge--secondary`.
+[`tagDescriptor(directive: GraphQLDirective, type?: unknown, classname?: string): Badge`](https://github.com/graphql-markdown/graphql-markdown/blob/main/packages/helpers/src/directives/tag.ts) returns the directive badge, with `classname` defaulted to `badge--secondary`.
 
-### `getTypeDirectiveArgValue`
+### `@graphql-markdown/utils` | `getTypeDirectiveArgValue`
 
 `graphql.getTypeDirectiveArgValue(directive: GraphQLDirective, node: unknown, argName: string): Record<string, unknown> | undefined` returns the value of a specific directive argument by name.
 
-### `getTypeDirectiveValues`
+### `@graphql-markdown/utils` | `getTypeDirectiveValues`
 
 `graphql.getTypeDirectiveValues(directive: GraphQLDirective, node: unknown): Record<string, unknown> | undefined` returns a map of directive arguments and their values.
diff --git a/package-lock.json b/package-lock.json
index c60eeb90..3b333140 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,6 +15,7 @@
         "@graphql-markdown/core": "file:packages/core",
         "@graphql-markdown/diff": "file:packages/diff",
         "@graphql-markdown/docusaurus": "file:packages/docusaurus",
+        "@graphql-markdown/helpers": "file:packages/helpers",
         "@graphql-markdown/printer-legacy": "file:packages/printer-legacy",
         "@graphql-markdown/tools-config": "file:config",
         "@graphql-markdown/types": "file:packages/types",
@@ -1684,6 +1685,10 @@
       "resolved": "packages/docusaurus",
       "link": true
     },
+    "node_modules/@graphql-markdown/helpers": {
+      "resolved": "packages/helpers",
+      "link": true
+    },
     "node_modules/@graphql-markdown/printer-legacy": {
       "resolved": "packages/printer-legacy",
       "link": true
@@ -15066,6 +15071,7 @@
       },
       "peerDependencies": {
         "@graphql-markdown/diff": "^1.0.14",
+        "@graphql-markdown/helpers": "^1.0.0",
         "@graphql-markdown/printer-legacy": "^1.4.3",
         "graphql-config": "^5.0.2"
       },
@@ -15073,6 +15079,9 @@
         "@graphql-markdown/diff": {
           "optional": true
         },
+        "@graphql-markdown/helpers": {
+          "optional": true
+        },
         "@graphql-markdown/printer-legacy": {
           "optional": true
         },
@@ -15117,6 +15126,20 @@
         "@docusaurus/logger": "*"
       }
     },
+    "packages/helpers": {
+      "name": "@graphql-markdown/helpers",
+      "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/printer-legacy": {
       "name": "@graphql-markdown/printer-legacy",
       "version": "1.4.3",
diff --git a/package.json b/package.json
index e7e02977..d8b8992d 100644
--- a/package.json
+++ b/package.json
@@ -190,6 +190,7 @@
     "@graphql-markdown/core": "file:packages/core",
     "@graphql-markdown/diff": "file:packages/diff",
     "@graphql-markdown/docusaurus": "file:packages/docusaurus",
+    "@graphql-markdown/helpers": "file:packages/helpers",
     "@graphql-markdown/printer-legacy": "file:packages/printer-legacy",
     "@graphql-markdown/tools-config": "file:config",
     "@graphql-markdown/types": "file:packages/types",
diff --git a/packages/core/package.json b/packages/core/package.json
index deef8ccf..a2dc9ce5 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -66,6 +66,7 @@
   },
   "peerDependencies": {
     "@graphql-markdown/diff": "^1.0.14",
+    "@graphql-markdown/helpers": "^1.0.0",
     "@graphql-markdown/printer-legacy": "^1.4.3",
     "graphql-config": "^5.0.2"
   },
@@ -79,6 +80,9 @@
     "@graphql-markdown/diff": {
       "optional": true
     },
+    "@graphql-markdown/helpers": {
+      "optional": true
+    },
     "graphql-config": {
       "optional": true
     }
diff --git a/packages/docusaurus/scripts/config-plugin.js b/packages/docusaurus/scripts/config-plugin.js
index 0e67a3f6..920e8b0b 100644
--- a/packages/docusaurus/scripts/config-plugin.js
+++ b/packages/docusaurus/scripts/config-plugin.js
@@ -6,7 +6,6 @@ const pluginGroupConfigFilename =
 const pluginGraphqlrcConfigFilename =
   "docusaurus2-graphql-doc-generator-tweets.graphqlrc.js";
 
-// eslint-disable-next-line node/no-missing-require
 const docusaurusConfigFilepath = require.resolve("./docusaurus.config.js");
 
 const config = {
@@ -63,7 +62,6 @@ const config = {
           sidebarPath: "sidebars.js",
         },
         theme: {
-          // eslint-disable-next-line node/no-missing-require
           customCss: require.resolve("./src/css/custom.css"),
         },
       },
diff --git a/packages/helpers/.npmignore b/packages/helpers/.npmignore
new file mode 100644
index 00000000..4c19bdf2
--- /dev/null
+++ b/packages/helpers/.npmignore
@@ -0,0 +1,16 @@
+scripts
+tests
+output
+reports
+coverage
+build
+.nyc_output
+
+.dccache
+
+jest.config.js
+jest.setup.js
+nyc.config.js
+stryker.conf.js
+.eslintrc.js   
+.prettierrc.js
diff --git a/packages/helpers/LICENSE b/packages/helpers/LICENSE
new file mode 100644
index 00000000..acd4380d
--- /dev/null
+++ b/packages/helpers/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/helpers/README.md b/packages/helpers/README.md
new file mode 100644
index 00000000..8448e0cd
--- /dev/null
+++ b/packages/helpers/README.md
@@ -0,0 +1,4 @@
+# @graphql-markdown/helpers
+
+[![Latest Version](https://img.shields.io/npm/v/@graphql-markdown/helpers?style=flat-square)](https://www.npmjs.com/package/@graphql-markdown/helpers)
+[![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/helpers/package.json b/packages/helpers/package.json
new file mode 100644
index 00000000..de15e2d2
--- /dev/null
+++ b/packages/helpers/package.json
@@ -0,0 +1,79 @@
+{
+  "name": "@graphql-markdown/helpers",
+  "homepage": "https://graphql-markdown.github.io",
+  "description": "GraphQL-Markdown customization helpers.",
+  "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/helpers"
+  },
+  "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"
+      }
+    },
+    "./directives/*": {
+      "require": {
+        "types": "./dist/directives/**.d.ts",
+        "default": "./dist/directives/**.js"
+      },
+      "import": {
+        "types": "./dist/directives/**.d.ts",
+        "default": "./dist/directives/**.js"
+      },
+      "default": {
+        "types": "./dist/directives/**.d.ts",
+        "default": "./dist/directives/**.js"
+      }
+    },
+    "./package.json": "./package.json"
+  },
+  "scripts": {
+    "prepack": "pinst --disable",
+    "postpack": "pinst --enable",
+    "stryker": "stryker run",
+    "clean": "rm -rf ./dist"
+  },
+  "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/helpers/src/directives/descriptor.ts b/packages/helpers/src/directives/descriptor.ts
new file mode 100644
index 00000000..099b4734
--- /dev/null
+++ b/packages/helpers/src/directives/descriptor.ts
@@ -0,0 +1,15 @@
+import type { GraphQLDirective } from "@graphql-markdown/types";
+
+import { getTypeDirectiveValues, interpolate } from "@graphql-markdown/utils";
+
+export function directiveDescriptor(
+  directive: GraphQLDirective,
+  type?: unknown,
+  descriptionTemplate?: string,
+): string {
+  const values = getTypeDirectiveValues(directive, type);
+  if (typeof descriptionTemplate !== "string") {
+    return interpolate(directive.description ?? "", values);
+  }
+  return interpolate(descriptionTemplate, values);
+}
diff --git a/packages/helpers/src/directives/tag.ts b/packages/helpers/src/directives/tag.ts
new file mode 100644
index 00000000..26ca347f
--- /dev/null
+++ b/packages/helpers/src/directives/tag.ts
@@ -0,0 +1,12 @@
+import type { Badge, GraphQLDirective } from "@graphql-markdown/types";
+
+export function directiveTag(
+  directive: GraphQLDirective,
+  type?: unknown,
+  classname: string = "badge--secondary",
+): Badge {
+  return {
+    text: `@${directive.name}`,
+    classname: classname,
+  };
+}
diff --git a/packages/helpers/src/index.ts b/packages/helpers/src/index.ts
new file mode 100644
index 00000000..38c02aad
--- /dev/null
+++ b/packages/helpers/src/index.ts
@@ -0,0 +1,2 @@
+export * from "./directives/descriptor";
+export * from "./directives/tag";
diff --git a/packages/helpers/stryker.conf.js b/packages/helpers/stryker.conf.js
new file mode 100644
index 00000000..af2dbea6
--- /dev/null
+++ b/packages/helpers/stryker.conf.js
@@ -0,0 +1,8 @@
+// @ts-check
+/**
+ * @type {import('@stryker-mutator/api/core').PartialStrykerOptions}
+ */
+
+const config = require("@graphql-markdown/tools-config").stryker;
+
+module.exports = { ...config, dashboard: { module: "helpers" } };
diff --git a/packages/helpers/tsconfig.json b/packages/helpers/tsconfig.json
new file mode 100644
index 00000000..e6d4f122
--- /dev/null
+++ b/packages/helpers/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/utils/src/helper.ts b/packages/utils/src/helper.ts
deleted file mode 100644
index fefe9e65..00000000
--- a/packages/utils/src/helper.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import type { Badge, GraphQLDirective } from "@graphql-markdown/types";
-
-import { getTypeDirectiveValues } from "./graphql";
-import { interpolate } from "./string";
-
-export function directiveDescriptor(
-  directive: GraphQLDirective,
-  type?: unknown,
-  descriptionTemplate?: string,
-): string {
-  const values = getTypeDirectiveValues(directive, type);
-  if (typeof descriptionTemplate !== "string") {
-    return interpolate(directive.description ?? "", values);
-  }
-  return interpolate(descriptionTemplate, values);
-}
-
-export function directiveTag(
-  directive: GraphQLDirective,
-  type?: unknown,
-  classname: string = "badge--secondary",
-): Badge {
-  return {
-    text: `@${directive.name}`,
-    classname: classname,
-  };
-}
diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts
index bc21edd5..4b63903b 100644
--- a/packages/utils/src/index.ts
+++ b/packages/utils/src/index.ts
@@ -7,5 +7,4 @@ export * from "./url";
 export * from "./graphql";
 export * from "./group";
 export * from "./directive";
-export * from "./helper";
 export * from "./logger";
diff --git a/tsconfig.json b/tsconfig.json
index ddeb6035..e368022e 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -5,6 +5,7 @@
     { "path": "packages/utils" },
     { "path": "packages/core" },
     { "path": "packages/diff" },
+    { "path": "packages/helpers" },
     { "path": "packages/printer-legacy" },
     { "path": "packages/docusaurus" }
   ]


Test patch:
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 5dbd6a5d..ebbe9c4b 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -19,7 +19,8 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        package: ["docusaurus", "core", "diff", "printer-legacy", "utils"]
+        package:
+          ["docusaurus", "core", "diff", "printer-legacy", "utils", "helpers"]
 
     steps:
       - name: Checkout Code Base
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 23f0535d..9028770b 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,9 +1,9 @@
 /* eslint-disable @typescript-eslint/no-var-requires */
+const { getTypeDirectiveValues } = require("@graphql-markdown/utils");
 const {
-  getTypeDirectiveValues,
   directiveDescriptor,
   directiveTag,
-} = require("@graphql-markdown/utils");
+} = require("@graphql-markdown/helpers");
 
 module.exports = {
   id: "schema_with_grouping",
diff --git a/packages/helpers/tests/__mocks__/.gitkeep b/packages/helpers/tests/__mocks__/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/packages/utils/tests/unit/helper.test.ts b/packages/helpers/tests/unit/directives/descriptor.test.ts
similarity index 64%
rename from packages/utils/tests/unit/helper.test.ts
rename to packages/helpers/tests/unit/directives/descriptor.test.ts
index 588174e4..8fc4ce16 100644
--- a/packages/utils/tests/unit/helper.test.ts
+++ b/packages/helpers/tests/unit/directives/descriptor.test.ts
@@ -10,9 +10,9 @@ jest.mock("graphql", () => {
 import graphql from "graphql";
 import type { GraphQLDirective, GraphQLNamedType } from "graphql";
 
-import { directiveDescriptor, directiveTag } from "../../src/helper";
+import { directiveDescriptor } from "../../../src";
 
-describe("helper", () => {
+describe("directives", () => {
   describe("directiveDescriptor", () => {
     test("returns a templated description of a directive", () => {
       expect.hasAssertions();
@@ -58,34 +58,4 @@ describe("helper", () => {
       ).toBe("");
     });
   });
-  describe("directiveTag", () => {
-    test("returns a tag object for the directive with custom classname", () => {
-      expect.hasAssertions();
-
-      expect(
-        directiveTag(
-          { name: "dummy" } as unknown as GraphQLDirective,
-          {} as unknown as GraphQLNamedType,
-          "warning",
-        ),
-      ).toStrictEqual({
-        text: "@dummy",
-        classname: "warning",
-      });
-    });
-
-    test("returns a tag object for the directive with default classname", () => {
-      expect.hasAssertions();
-
-      expect(
-        directiveTag(
-          { name: "dummy" } as unknown as GraphQLDirective,
-          {} as unknown as GraphQLNamedType,
-        ),
-      ).toStrictEqual({
-        text: "@dummy",
-        classname: "badge--secondary",
-      });
-    });
-  });
 });
diff --git a/packages/helpers/tests/unit/directives/tag.test.ts b/packages/helpers/tests/unit/directives/tag.test.ts
new file mode 100644
index 00000000..bbe56830
--- /dev/null
+++ b/packages/helpers/tests/unit/directives/tag.test.ts
@@ -0,0 +1,36 @@
+import type { GraphQLDirective, GraphQLNamedType } from "graphql";
+
+import { directiveTag } from "../../../src";
+
+describe("directives", () => {
+  describe("directiveTag", () => {
+    test("returns a tag object for the directive with custom classname", () => {
+      expect.hasAssertions();
+
+      expect(
+        directiveTag(
+          { name: "dummy" } as unknown as GraphQLDirective,
+          {} as unknown as GraphQLNamedType,
+          "warning",
+        ),
+      ).toStrictEqual({
+        text: "@dummy",
+        classname: "warning",
+      });
+    });
+
+    test("returns a tag object for the directive with default classname", () => {
+      expect.hasAssertions();
+
+      expect(
+        directiveTag(
+          { name: "dummy" } as unknown as GraphQLDirective,
+          {} as unknown as GraphQLNamedType,
+        ),
+      ).toStrictEqual({
+        text: "@dummy",
+        classname: "badge--secondary",
+      });
+    });
+  });
+});
diff --git a/packages/helpers/tsconfig.test.json b/packages/helpers/tsconfig.test.json
new file mode 100644
index 00000000..4af739cc
--- /dev/null
+++ b/packages/helpers/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"]
+}