27 lines
71 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-new-generator">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.3.1">
<title data-rh="true">Create a New Generator | OpenAPI Generator</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://openapi-generator.tech/img/docusaurus.png"><meta data-rh="true" name="twitter:image" content="https://openapi-generator.tech/img/docusaurus.png"><meta data-rh="true" property="og:url" content="https://openapi-generator.tech/docs/new-generator"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Create a New Generator | OpenAPI Generator"><meta data-rh="true" name="description" content="Creating a new generator which will become a part of the officially supported generators in OpenAPI Generator is pretty simple. We&#x27;ve created a helper script to bootstrap the operation. Let&#x27;s look at the files necessary to create a new generator, then an example of bootstrapping a generator using the new.sh script in the root of the repository."><meta data-rh="true" property="og:description" content="Creating a new generator which will become a part of the officially supported generators in OpenAPI Generator is pretty simple. We&#x27;ve created a helper script to bootstrap the operation. Let&#x27;s look at the files necessary to create a new generator, then an example of bootstrapping a generator using the new.sh script in the root of the repository."><link data-rh="true" rel="icon" href="/img/favicon.png"><link data-rh="true" rel="canonical" href="https://openapi-generator.tech/docs/new-generator"><link data-rh="true" rel="alternate" href="https://openapi-generator.tech/docs/new-generator" hreflang="en"><link data-rh="true" rel="alternate" href="https://openapi-generator.tech/docs/new-generator" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://51ITDG8FYN-dsn.algolia.net" crossorigin="anonymous"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="OpenAPI Generator RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="OpenAPI Generator Atom Feed">
<link rel="preconnect" href="https://www.google-analytics.com">
<script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)},ga.l=+new Date,ga("create","UA-132927057-1","auto"),ga("send","pageview")</script>
<script async src="https://www.google-analytics.com/analytics.js"></script>
<link rel="search" type="application/opensearchdescription+xml" title="OpenAPI Generator" href="/opensearch.xml">
<script src="https://buttons.github.io/buttons.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"></script>
<script src="/js/code-block-buttons.js"></script><link rel="stylesheet" href="/assets/css/styles.fcd3a3ce.css">
<link rel="preload" href="/assets/js/runtime~main.27a6ef31.js" as="script">
<link rel="preload" href="/assets/js/main.7f449d5a.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/mono-logo.svg" alt="OpenAPI Tools logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/img/mono-logo.svg" alt="OpenAPI Tools logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">OpenAPI Generator</b></a><a class="navbar__item navbar__link" href="/docs/installation">Getting Started</a><a class="navbar__item navbar__link" href="/docs/generators">Generators</a><a class="navbar__item navbar__link" href="/docs/roadmap">Roadmap</a><a class="navbar__item navbar__link" href="/docs/faq">FAQ</a><a class="navbar__item navbar__link" href="/team">Team</a><a class="navbar__item navbar__link" href="/blog">Blog</a><a href="https://api.openapi-generator.tech" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">API</a></div><div class="navbar__items navbar__items--right"><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/installation">Getting Started</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/templating">Extending</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" aria-expanded="true" href="/docs/contributing">Contributing</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/contributing">Guidelines</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/code-of-conduct">Code of Conduct</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/contribute-building">Building the code</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/new-generator">Create a New Generator</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/roadmap">About</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/release-summary">Releases</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/generators">API</a></div></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">Contributing</span><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">Create a New Generator</span><meta itemprop="position" content="2"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Create a New Generator</h1></header><p>Creating a new generator which will become a part of the officially supported generators in OpenAPI Generator is pretty simple. We&#x27;ve created a helper script to bootstrap the operation. Let&#x27;s look at the files necessary to create a new generator, then an example of bootstrapping a generator using the <code>new.sh</code> script in the root of the repository.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="required-files">Required Files<a href="#required-files" class="hash-link" aria-label="Direct link to Required Files" title="Direct link to Required Files"></a></h2><p>The minimum set of files required to create a new generator are:</p><ul><li>A &quot;Codegen&quot; file<ul><li>exists under <code>modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/</code></li><li>defines language options</li><li>defines framework options</li><li>determines OpenAPI feature set</li><li>extends the generation workflow</li></ul></li><li>SPI registration<ul><li>Above class must be referenced in <code>modules/openapi-generator/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig</code></li><li>Tells the generator that this class exists</li><li>Allows for classpath extension (addition) of generators</li></ul></li><li>A minimal template<ul><li>Should include a README explaining usage</li><li>Must include an <code>api.mustache</code></li><li>Exists under <code>modules/openapi-generator/src/main/resources/</code> (plus <code>embeddedTemplate</code> dir value, see below)</li></ul></li><li>Config file under <code>./bin/configs</code><ul><li>Gives users a &quot;real life&quot; example of generated output</li><li>Samples are used by CI to verify generators and test for regressions in some cases</li></ul></li></ul><p>Now, let&#x27;s generate an example generator and then walk through the pieces. At the end, we&#x27;ll touch on some known sticking points for new generator authors and provide some suggestions.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="newsh">new.sh<a href="#newsh" class="hash-link" aria-label="Direct link to new.sh" title="Direct link to new.sh"></a></h2><p>The <code>new.sh</code> script in the root of the project is meant to simplify this process. Run <code>./new.sh --help</code>.</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Stubs out files for new generators</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Usage:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">./new.sh [options]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> Options:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> -n Required. Specify generator name, should be kebab-cased.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> -c Create a client generator</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> -s Create a server generator</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> -d Create a documentation generator</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> -H Create a schema generator</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> -f Create a config generator</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> -t When specified, creates test file(s) for the generator.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> -h Display help.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Examples:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> Create a server generator for ktor:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ./new.sh -n kotlin -s</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> Creates:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinServerCodegen.java</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/kotlin-server/README.mustache</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/kotlin-server/model.mustache</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/kotlin-server/api.mustache</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> bin/configs/kotlin-server-petstore-new.yaml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> Create a generic C# server generator:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> ./new.sh -n csharp -s -t</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> Creates:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CsharpServerCodegen.java</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/csharp-server/README.mustache</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/csharp-server/model.mustache</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/csharp-server/api.mustache</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> bin/configs/csharp-server-petstore-new.yaml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CsharpServerCodegenTest.java</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CsharpServerCodegenModelTest.java</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CsharpServerCodegenOptionsTest.java</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/test/java/org/openapitools/codegen/options/CsharpServerCodegenOptionsProvider.java</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This script allows us to define a client, server, schema, or documentation generator. We&#x27;ll focus on the simplest generator (documentation). The other generator types may require heavy extension of the &quot;Config&quot; base class, and these docs could very quickly become outdated. When creating a new generator, please review existing generators as a guideline for implementation.</p><p>Create a new Markdown generator, specifying CommonMark as the name to avoid conflicting with the built-in Markdown generator.</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">./new.sh -n common-mark -d</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You should see output similar to the following:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Creating modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CommonMarkDocumentationCodegen.java</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Creating modules/openapi-generator/src/main/resources/common-mark-documentation/README.mustache</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Creating modules/openapi-generator/src/main/resources/common-mark-documentation/model.mustache</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Creating modules/openapi-generator/src/main/resources/common-mark-documentation/api.mustache</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Creating bin/configs/common-mark-documentation-petstore-new.yaml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Finished.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="review-generated-config">Review Generated Config<a href="#review-generated-config" class="hash-link" aria-label="Direct link to Review Generated Config" title="Direct link to Review Generated Config"></a></h3><p>Beginning with the &quot;Codegen&quot; file (<code>CommonMarkDocumentationCodegen.java</code>), the constructor was created:</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"> public CommonMarkDocumentationCodegen() {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> super();</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> outputFolder = &quot;generated-code&quot; + File.separator + &quot;common-mark&quot;;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modelTemplateFiles.put(&quot;model.mustache&quot;, &quot;.zz&quot;);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> apiTemplateFiles.put(&quot;api.mustache&quot;, &quot;.zz&quot;);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> embeddedTemplateDir = templateDir = &quot;common-mark-documentation&quot;;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> apiPackage = File.separator + &quot;Apis&quot;;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modelPackage = File.separator + &quot;Models&quot;;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> supportingFiles.add(new SupportingFile(&quot;README.mustache&quot;, &quot;&quot;, &quot;README.md&quot;));</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> // TODO: Fill this out.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> }</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>These options are some defaults which may require updating. Let&#x27;s look line-by-line at the config.</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">outputFolder = &quot;generated-code&quot; + File.separator + &quot;common-mark&quot;;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This is the default output location. This will be <code>generated-code/common-mark</code> on non-Windows machines and <code>generated-code\common-mark</code> on Windows. You may change this to any value you&#x27;d like, but a user will almost always provide an output directory.</p><blockquote><p>When joining paths, always use <code>File.separator</code></p></blockquote><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"> modelTemplateFiles.put(&quot;model.mustache&quot;, &quot;.zz&quot;);</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The <code>model.mustache</code> file is registered as the template for model generation. The <code>new.sh</code> script doesn&#x27;t have a way to know your intended file extension, so we default to a <code>.zz</code> extension. This <em>must</em> be changed (unless your generator&#x27;s target extension is <code>.zz</code>). For this example, you&#x27;d change <code>.zz</code> to <code>.md</code> or <code>.markdown</code>, depending on your preference.</p><p>This model template registration will use <code>model.mustache</code> to generate a new file for every model defined in your API&#x27;s specification document.</p><p>The path is considered relative to <code>embeddedTemplateDir</code>, <code>templateDir</code>, or a library subdirectory (refer to the Java client generator implementation for a prime example).</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">apiTemplateFiles.put(&quot;api.mustache&quot;, &quot;.zz&quot;);</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This is the template used for generating API related files. Similar to the above model template, you&#x27;ll want to change <code>.zz</code> to <code>.md</code> or <code>.markdown</code>.</p><p>The path is considered relative to <code>embeddedTemplateDir</code>, <code>templateDir</code>, or a library subdirectory (refer to the Java client generator implementation for a prime example).</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">embeddedTemplateDir = templateDir = &quot;common-mark-documentation&quot;;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This line sets the embedded and template directories to <code>common-mark-documentation</code>. The <code>embeddedTemplateDir</code> refers to the directory which will exist under <code>modules/openapi-generator/src/main/resources</code> and will be published with every release in which your new generator is present.</p><p>The <code>templateDir</code> variable refers to the &quot;current&quot; template directory setting, as defined by the user. That is, the user may invoke with <code>-t</code> or <code>--template-directory</code> (or plugin option variants), and override this directory.</p><p>Both of these variables exist because the generator will fallback to files under <code>embeddedTemplateDir</code> if they are not defined in the user&#x27;s custom template directory.</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">apiPackage = &quot;Apis&quot;;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This sets the &quot;package&quot; location for anything considered an API document. You might want to change this setting if, for instance, your language doesn&#x27;t support uppercase letters in the path. We don&#x27;t need to worry about that here.</p><p>Every templated output from <code>api.mustache</code> (registered via <code>apiTemplateFiles</code> above) will end up in the directory defined by <code>apiPackage</code> here.</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">modelPackage = &quot;Models&quot;;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Similarly, this sets the package for <code>Models</code>.</p><p>Every templated output from <code>model.mustache</code> (registered via <code>modelTemplateFiles</code> above) will end up in the directory defined by <code>modelPackage</code> here.</p><div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">supportingFiles.add(new SupportingFile(&quot;README.mustache&quot;, &quot;&quot;, &quot;README.md&quot;));</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>A &quot;supporting file&quot; is an extra file which isn&#x27;t created once for every operation or model defined in your specification document. It is a single file which may or may not be templated (determined by the extension of the filename).</p><p>A supporting file only passes through the Mustache template processor if the filename ends in <code>.mustache</code>.</p><p>The path is considered relative to <code>embeddedTemplateDir</code>, <code>templateDir</code>, or a library subdirectory (refer to the Java client generator implementation for a prime example).</p><blockquote><p>If you want your readme to be generic (not templated), just rename the file to README.md and change <code>README.mustache</code> to <code>README.md</code> above.</p></blockquote><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-templates">Create templates<a href="#create-templates" class="hash-link" aria-label="Direct link to Create templates" title="Direct link to Create templates"></a></h3><p>The <code>new.sh</code> created our three required files. Let&#x27;s start filling out each of these files.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="readmemustache">README.mustache<a href="#readmemustache" class="hash-link" aria-label="Direct link to README.mustache" title="Direct link to README.mustache"></a></h4><div class="language-mustache codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-mustache codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Documentation for {{appName}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#generateApiDocs}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;a id=&quot;documentation-for-api-endpoints&quot;&gt;&lt;/a&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">## Documentation for API Endpoints</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">All URIs are relative to *{{{basePath}}}*</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Class | Method | HTTP request | Description</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">------------ | ------------- | ------------- | -------------</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}*{{classname}}* | [**{{operationId}}**](Apis/{{apiDocPath}}{{classname}}.md#{{operationIdLowerCase}}) | **{{httpMethod}}** {{path}} | {{#summary}}{{{summary}}}{{/summary}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/generateApiDocs}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#generateModelDocs}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;a id=&quot;documentation-for-models&quot;&gt;&lt;/a&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">## Documentation for Models</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#modelPackage}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#models}}{{#model}} - [{{{modelPackage}}}.{{{classname}}}](Models/{{modelDocPath}}{{{classname}}}.md)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/model}}{{/models}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/modelPackage}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{^modelPackage}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">No model defined in this package</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/modelPackage}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/generateModelDocs}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;a id=&quot;documentation-for-authorization&quot;&gt;&lt;/a&gt;{{! TODO: optional documentation for authorization? }}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">## Documentation for Authorization</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{^authMethods}}Endpoints do not require authorization.{{/authMethods}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#hasAuthMethods}}Authentication schemes defined for the API:{{/hasAuthMethods}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#authMethods}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;a id=&quot;{{name}}&quot;&gt;&lt;/a&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">### {{name}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#isApiKey}}- **Type**: API key</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- **API key parameter name**: {{keyParamName}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- **Location**: {{#isKeyInQuery}}URL query string{{/isKeyInQuery}}{{#isKeyInHeader}}HTTP header{{/isKeyInHeader}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/isApiKey}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#isBasicBasic}}- **Type**: HTTP basic authentication</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/isBasicBasic}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#isBasicBearer}}- **Type**: HTTP Bearer Token authentication{{#bearerFormat}} ({{{.}}}){{/bearerFormat}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/isBasicBearer}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#isHttpSignature}}- **Type**: HTTP signature authentication</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/isHttpSignature}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#isOAuth}}- **Type**: OAuth</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- **Flow**: {{flow}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- **Authorization URL**: {{authorizationUrl}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- **Scopes**: {{^scopes}}N/A{{/scopes}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#scopes}} - {{scope}}: {{description}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/scopes}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/isOAuth}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#isOpenId}}- **Type**: OpenIDConnect</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- **Connect URL**: {{{openIdConnectUrl}}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">- **Bearer Format**: {{{bearerFormat}}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/isOpenId}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/authMethods}}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Let&#x27;s not focus too much on the contents of this file. You may refer to <a href="/docs/templating">templating</a> for more details on the variables bound to these files and to <a href="/docs/debugging">debugging</a> how to debug the structures. Of note here is that we&#x27;re generating structures in markdown as defined by the objects constructed by our new &quot;Config&quot; class.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="apimustache">api.mustache<a href="#apimustache" class="hash-link" aria-label="Direct link to api.mustache" title="Direct link to api.mustache"></a></h4><p>The API documentation might look like this:</p><div class="language-mustache codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-mustache codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># {{classname}}{{#description}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{description}}{{/description}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">All URIs are relative to *{{basePath}}*</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Method | HTTP request | Description</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">------------- | ------------- | -------------</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#operations}}{{#operation}}[**{{operationId}}**]({{classname}}.md#{{operationId}}) | **{{httpMethod}}** {{path}} | {{#summary}}{{summary}}{{/summary}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/operation}}{{/operations}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#operations}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#operation}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;a id=&quot;{{operationId}}&quot;&gt;&lt;/a&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># **{{operationId}}**</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">&gt; {{#returnType}}{{returnType}} {{/returnType}}{{operationId}}({{#allParams}}{{{paramName}}}{{^-last}}, {{/-last}}{{/allParams}})</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{summary}}{{#notes}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{notes}}{{/notes}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">### Parameters</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{^allParams}}This endpoint does not need any parameter.{{/allParams}}{{#allParams}}{{#-last}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Name | Type | Description | Notes</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">------------- | ------------- | ------------- | -------------{{/-last}}{{/allParams}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#allParams}} **{{paramName}}** | {{#isPrimitiveType}}**{{dataType}}**{{/isPrimitiveType}}{{^isPrimitiveType}}{{#isFile}}**{{dataType}}**{{/isFile}}{{^isFile}}{{#generateModelDocs}}[**{{dataType}}**]({{baseType}}.md){{/generateModelDocs}}{{^generateModelDocs}}**{{dataType}}**{{/generateModelDocs}}{{/isFile}}{{/isPrimitiveType}}| {{description}} |{{^required}} [optional]{{/required}}{{#defaultValue}} [default to {{defaultValue}}]{{/defaultValue}}{{#allowableValues}} [enum: {{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}]{{/allowableValues}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/allParams}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">### Return type</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#returnType}}{{#returnTypeIsPrimitive}}**{{returnType}}**{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}}{{#generateModelDocs}}[**{{returnType}}**]({{returnBaseType}}.md){{/generateModelDocs}}{{^generateModelDocs}}**{{returnType}}**{{/generateModelDocs}}{{/returnTypeIsPrimitive}}{{/returnType}}{{^returnType}}null (empty response body){{/returnType}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">### Authorization</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{^authMethods}}No authorization required{{/authMethods}}{{#authMethods}}[{{name}}](../README.md#{{name}}){{^-last}}, {{/-last}}{{/authMethods}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">### HTTP request headers</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> - **Content-Type**: {{#consumes}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/consumes}}{{^consumes}}Not defined{{/consumes}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> - **Accept**: {{#produces}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/produces}}{{^produces}}Not defined{{/produces}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/operation}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/operations}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="modelmustache">model.mustache<a href="#modelmustache" class="hash-link" aria-label="Direct link to model.mustache" title="Direct link to model.mustache"></a></h4><p>The models file could resemble the following.</p><div class="language-mustache codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-mustache codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#models}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#model}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># {{{packageName}}}.{{modelPackage}}.{{{classname}}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">## Properties</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Name | Type | Description | Notes</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">------------ | ------------- | ------------- | -------------</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#parent}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#parentVars}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">**{{name}}** | {{#isPrimitiveType}}**{{dataType}}**{{/isPrimitiveType}}{{^isPrimitiveType}}[**{{dataType}}**]({{complexType}}.md){{/isPrimitiveType}} | {{description}} | {{^required}}[optional] {{/required}}{{#readOnly}}[readonly] {{/readOnly}}{{#defaultValue}}[default to {{{.}}}]{{/defaultValue}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/parentVars}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/parent}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{#vars}}**{{name}}** | {{#isPrimitiveType}}**{{dataType}}**{{/isPrimitiveType}}{{^isPrimitiveType}}[**{{dataType}}**]({{complexType}}.md){{/isPrimitiveType}} | {{description}} | {{^required}}[optional] {{/required}}{{#readOnly}}[readonly] {{/readOnly}}{{#defaultValue}}[default to {{{.}}}]{{/defaultValue}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/vars}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/model}}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">{{/models}}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="build-it">Build it<a href="#build-it" class="hash-link" aria-label="Direct link to Build it" title="Direct link to Build it"></a></h3><p>To compile quickly to test this out, you can run <code>mvn clean package -DskipTests</code>.</p><blockquote><p>When implementing a more robust generator, you&#x27;ll want to run all tests as well: <code>mvn clean package</code></p></blockquote><h3 class="anchor anchorWithStickyNavbar_LWe7" id="compile-sample">Compile Sample<a href="#compile-sample" class="hash-link" aria-label="Direct link to Compile Sample" title="Direct link to Compile Sample"></a></h3><p>The <code>new.sh</code> script created the generation config file <code>bin/configs/common-mark-documentation-petstore-new.yaml</code>:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">generatorName: common-mark</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">outputDir: samples/documentation/petstore/common/mark</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">templateDir: modules/openapi-generator/src/main/resources/common-mark</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">additionalProperties:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> hideGenerationTimestamp: </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;true&quot;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This configuration file is passed to the generator&#x27;s CLI tool during continuous integration builds, and many outputs are compiled and tested as a regression test on every build. Contributors are also asked to run <code>./bin/utils/ensure-up-to-date</code> before opening a pull request to regenerate all samples defined under <code>./bin/configs</code>. This allows maintainers to quickly verify whether changes impact other generators.</p><p>Configuration based examples allow us to test the same samples in each tooling option (CLI, Gradle Plugin, Maven Plugin, etc.). </p><p>You can compile your generator by running:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">./bin/generate-samples.sh bin/configs/common-mark-documentation-petstore-new.yaml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This configuration file can be used to demonstrate the default options for generation. A common option in most of these configs is to define the template directory as the generator&#x27;s directory under <code>resources</code>. This allows template maintainers to modify and test out template changes which don&#x27;t require recompilation of the entire project. You&#x27;d still need to recompile the project in full if you add or modify behaviors to the generator (such as adding a <code>CliOption</code>).</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="verify-output">Verify output<a href="#verify-output" class="hash-link" aria-label="Direct link to Verify output" title="Direct link to Verify output"></a></h3><p>Creating a new generator will be an iterative task. Once you&#x27;ve generated the sample, you&#x27;ll want to try it out. For compiled client/server outputs, this would mean running the code or creating a small sample project to consume your artifact just to make sure it works.</p><p>For markdown, you can open in Visual Studio Code or any other editor with a markdown preview. Not all editors support relative links to other markdown documents. To test the output in this guide, install <code>markserv</code>:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> --global markserv</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Now, you can serve the output directory directly and test your links:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">markserv samples/documentation/petstore/common/markdown</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>That&#x27;s it! You&#x27;ve created your first generator!</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/OpenAPITools/openapi-generator/edit/master/website/../docs/new-generator.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_vwxv"><span class="theme-last-updated">Last updated<!-- --> on <b><time datetime="2023-06-01T03:17:11.000Z">Jun 1, 2023</time></b> by <b>Tiffany Marrel</b></span></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/contribute-building"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Building the code</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/roadmap"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Roadmap</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#required-files" class="table-of-contents__link toc-highlight">Required Files</a></li><li><a href="#newsh" class="table-of-contents__link toc-highlight">new.sh</a><ul><li><a href="#review-generated-config" class="table-of-contents__link toc-highlight">Review Generated Config</a></li><li><a href="#create-templates" class="table-of-contents__link toc-highlight">Create templates</a></li><li><a href="#build-it" class="table-of-contents__link toc-highlight">Build it</a></li><li><a href="#compile-sample" class="table-of-contents__link toc-highlight">Compile Sample</a></li><li><a href="#verify-output" class="table-of-contents__link toc-highlight">Verify output</a></li></ul></li></ul></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/customization">Customizing Generators</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/installation">Installation</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/integrations">Workflow Integrations</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/users">User Showcase</a></li><li class="footer__item"><a href="https://stackoverflow.com/questions/tagged/openapi-generator" target="_blank" rel="noopener noreferrer" class="footer__link-item">Stack Overflow<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://join.slack.com/t/openapi-generator/shared_invite/zt-12jxxd7p2-XUeQM~4pzsU9x~eGLQqX2g" target="_blank" rel="noopener noreferrer" class="footer__link-item">Chat Room<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://twitter.com/oas_generator" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/OpenAPITools/openapi-generator" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="margin-bottom--sm"><a href="https://openapi-generator.tech/" rel="noopener noreferrer" class="footerLogoLink_BH7S"><img src="/img/mono-logo.svg" alt="OpenAPI Tools" class="themedImage_ToTc themedImage--light_HNdA footer__logo"><img src="/img/mono-logo.svg" alt="OpenAPI Tools" class="themedImage_ToTc themedImage--dark_i4oU footer__logo"></a></div><div class="footer__copyright">Copyright © 2025 OpenAPI-Generator Contributors (https://openapi-generator.tech)</div></div></div></footer></div>
<script src="/assets/js/runtime~main.27a6ef31.js"></script>
<script src="/assets/js/main.7f449d5a.js"></script>
</body>
</html>