55 lines
64 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="generator" content="Docusaurus">
<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="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>
<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>
<title data-react-helmet="true">Create a New Generator</title>
<meta data-react-helmet="true" http-equiv="x-ua-compatible" content="ie=edge"><meta data-react-helmet="true" property="og:title" content="OpenAPI Generator · Generate clients, servers, and documentation from OpenAPI 2.0/3.x documents"><meta data-react-helmet="true" property="og:image" content="https://openapi-generator.tech/img/docusaurus.png"><meta data-react-helmet="true" property="twitter:image" content="https://openapi-generator.tech/img/docusaurus.png"><meta data-react-helmet="true" name="twitter:image:alt" content="Image for OpenAPI Generator · Generate clients, servers, and documentation from OpenAPI 2.0/3.x documents"><meta data-react-helmet="true" name="twitter:card" content="summary"><meta data-react-helmet="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-react-helmet="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."><meta data-react-helmet="true" property="og:url" content="https://openapi-generator.tech/docs/new-generator">
<link data-react-helmet="true" rel="shortcut icon" href="/img/favicon.png">
<link rel="stylesheet" href="/styles.62ba095c.css">
</head>
<body>
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}function e(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}var n=window.matchMedia("(prefers-color-scheme: dark)");n.addListener((function(n){null===e()&&t(n.matches?"dark":"")}));var a=e();null!==a?t(a):n.matches&&t("dark")}()</script>
<div id="__docusaurus">
<nav class="navbar navbar--light navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><div aria-label="Navigation bar toggle" class="navbar__toggle" role="button" tabindex="0"><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 30 30" role="img" focusable="false"><title>Menu</title><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></div><a aria-current="page" class="navbar__brand active" href="/"><img class="navbar__logo" src="/img/mono-logo.svg" alt="OpenAPI Tools logo"><strong>OpenAPI Generator</strong></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 class="navbar__item navbar__link" activeclassname="navbar__link--active" to="https://api.openapi-generator.tech" href="https://api.openapi-generator.tech">API</a></div><div class="navbar__items navbar__items--right"><div class="react-toggle react-toggle--disabled displayOnlyInLargeViewport_1gtM"><div class="react-toggle-track"><div class="react-toggle-track-check"><span class="toggle_keGJ moon_1gwN"></span></div><div class="react-toggle-track-x"><span class="toggle_keGJ sun_3CPA"></span></div></div><div class="react-toggle-thumb"></div><input type="checkbox" disabled="" aria-label="Dark mode toggle" class="react-toggle-screenreader-only"></div><div class="navbar__search"><span aria-label="expand searchbar" role="button" class="search-icon" tabindex="0"></span><input type="search" id="search_input_react" placeholder="Search" aria-label="Search" class="navbar__search-input search-bar"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div><div class="navbar-sidebar"><div class="navbar-sidebar__brand"><a aria-current="page" class="navbar__brand active" href="/"><img class="navbar__logo" src="/img/mono-logo.svg" alt="OpenAPI Tools logo"><strong>OpenAPI Generator</strong></a></div><div class="navbar-sidebar__items"><div class="menu"><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/installation">Getting Started</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/generators">Generators</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/roadmap">Roadmap</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/faq">FAQ</a></li><li class="menu__list-item"><a class="menu__link" href="/team">Team</a></li><li class="menu__list-item"><a class="menu__link" href="/blog">Blog</a></li><li class="menu__list-item"><a class="menu__link" activeclassname="navbar__link--active" to="https://api.openapi-generator.tech" href="https://api.openapi-generator.tech">API</a></li></ul></div></div></div></nav><div class="main-wrapper"><div class="docPage_1kjD"><div class="docSidebarContainer_1cYp"><div class="sidebar_1kLs"><div class="menu menu--responsive"><button aria-label="Open Menu" class="button button--secondary button--sm menu__button" type="button"><svg class="sidebarMenuIcon_2vk4" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 32 32" role="img" focusable="false"><title>Menu</title><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><ul class="menu__list"><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">Getting Started</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/installation">CLI Installation</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/plugins">Plugins</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/online">Online</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/usage">Usage</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/globals">Global Properties</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/configuration">Configuration Options</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/file-post-processing">File post-processing</a></li></ul></li><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">Extending</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/templating">Using Templates</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/customization">Customization</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/debugging">Debugging</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/integrations">Workflow Integrations</a></li></ul></li><li class="menu__list-item"><a class="menu__link menu__link--sublist menu__link--active" href="#!">Contributing</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/contributing">Guidelines</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/code-of-conduct">Code of Conduct</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/contribute-building">Building the code</a></li><li class="menu__list-item"><a aria-current="page" class="menu__link menu__link--active" href="/docs/new-generator">Create a New Generator</a></li></ul></li><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">About</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/roadmap">Roadmap</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/swagger-codegen-migration">Migrating from Swagger Codegen</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/fork-qna">Swagger Codegen Fork: Q&amp;A</a></li></ul></li><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">Releases</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/release-summary">Release Summary</a></li><li class="menu__list-item"><a class="menu__link" href="/docs/release-3-0-0">Release Notes: 3.0.0</a></li></ul></li><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!">API</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/docs/generators">Generators List</a></li></ul></li></ul></div></div></div><main class="docMainContainer_FFX1"><div class="padding-vert--lg"><div class="container"><div class="row"><div class="col"><div class="docItemContainer_2cwg"><article><header><h1 class="docTitle_1vWb">Create a New Generator</h1></header><div class="markdown"><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><a aria-hidden="true" tabindex="-1" class="anchor" id="required-files"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#required-files" title="Direct link to heading">#</a>Required Files</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><a aria-hidden="true" tabindex="-1" class="anchor" id="newsh"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#newsh" title="Direct link to heading">#</a>new.sh</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><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-text codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Stubs out files for new generators</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Usage:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">./new.sh [options]</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> Options:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -n Required. Specify generator name, should be kebab-cased.</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -c Create a client generator</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -s Create a server generator</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -d Create a documentation generator</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -H Create a schema generator</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -f Create a config generator</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -t When specified, creates test file(s) for the generator.</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> -h Display help.</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Examples:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> Create a server generator for ktor:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> ./new.sh -n kotlin -s</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> Creates:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinServerCodegen.java</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/kotlin-server/README.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/kotlin-server/model.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/kotlin-server/api.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> bin/configs/kotlin-server-petstore-new.yaml</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> Create a generic C# server generator:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> ./new.sh -n csharp -s -t</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> Creates:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CsharpServerCodegen.java</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/csharp-server/README.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/csharp-server/model.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/main/resources/csharp-server/api.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> bin/configs/csharp-server-petstore-new.yaml</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CsharpServerCodegenTest.java</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CsharpServerCodegenModelTest.java</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/test/java/org/openapitools/codegen/csharp/CsharpServerCodegenOptionsTest.java</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modules/openapi-generator/src/test/java/org/openapitools/codegen/options/CsharpServerCodegenOptionsProvider.java</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><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><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-bash codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">./new.sh -n common-mark -d</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>You should see output similar to the following:</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-bash codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Creating modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CommonMarkDocumentationCodegen.java</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Creating modules/openapi-generator/src/main/resources/common-mark-documentation/README.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Creating modules/openapi-generator/src/main/resources/common-mark-documentation/model.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Creating modules/openapi-generator/src/main/resources/common-mark-documentation/api.mustache</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Creating bin/configs/common-mark-documentation-petstore-new.yaml</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Finished.</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><h3><a aria-hidden="true" tabindex="-1" class="anchor" id="review-generated-config"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#review-generated-config" title="Direct link to heading">#</a>Review Generated Config</h3><p>Beginning with the &quot;Codegen&quot; file (<code>CommonMarkDocumentationCodegen.java</code>), the constructor was created:</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token class-name">CommonMarkDocumentationCodegen</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">super</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> outputFolder </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;generated-code&quot;</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token class-name">File</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">separator </span><span class="token operator">+</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;common-mark&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modelTemplateFiles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;model.mustache&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;.zz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> apiTemplateFiles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;api.mustache&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;.zz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> embeddedTemplateDir </span><span class="token operator">=</span><span class="token plain"> templateDir </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;common-mark-documentation&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> apiPackage </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">File</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">separator </span><span class="token operator">+</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Apis&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> modelPackage </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">File</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">separator </span><span class="token operator">+</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Models&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> supportingFiles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">SupportingFile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;README.mustache&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;README.md&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// TODO: Fill this out.</span><span class="token plain"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>These options are some defaults which may require updating. Let&#x27;s look line-by-line at the config.</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">outputFolder </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;generated-code&quot;</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token class-name">File</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">separator </span><span class="token operator">+</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;common-mark&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><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.seperator</code></p></blockquote><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">modelTemplateFiles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;model.mustache&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;.zz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><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><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">apiTemplateFiles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;api.mustache&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;.zz&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><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><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">embeddedTemplateDir </span><span class="token operator">=</span><span class="token plain"> templateDir </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;common-mark-documentation&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><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><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">apiPackage </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Apis&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><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><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">modelPackage </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;Models&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><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><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-java codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">supportingFiles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">SupportingFile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">&quot;README.mustache&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;README.md&quot;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><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><a aria-hidden="true" tabindex="-1" class="anchor" id="create-templates"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#create-templates" title="Direct link to heading">#</a>Create templates</h3><p>The <code>new.sh</code> created our three required files. Let&#x27;s start filling out each of these files.</p><h4><a aria-hidden="true" tabindex="-1" class="anchor" id="readmemustache"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#readmemustache" title="Direct link to heading">#</a>README.mustache</h4><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-mustache codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Documentation for {{appName}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#generateApiDocs}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;a name=&quot;documentation-for-api-endpoints&quot;&gt;&lt;/a&gt;</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">## Documentation for API Endpoints</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">All URIs are relative to *{{{basePath}}}*</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Class | Method | HTTP request | Description</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">------------ | ------------- | ------------- | -------------</span></div><div 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></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/generateApiDocs}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#generateModelDocs}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;a name=&quot;documentation-for-models&quot;&gt;&lt;/a&gt;</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">## Documentation for Models</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#modelPackage}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#models}}{{#model}} - [{{{modelPackage}}}.{{{classname}}}](Models/{{modelDocPath}}{{{classname}}}.md)</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/model}}{{/models}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/modelPackage}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{^modelPackage}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">No model defined in this package</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/modelPackage}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/generateModelDocs}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;a name=&quot;documentation-for-authorization&quot;&gt;&lt;/a&gt;{{! TODO: optional documentation for authorization? }}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">## Documentation for Authorization</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{^authMethods}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">All endpoints do not require authorization.</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/authMethods}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#authMethods}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#last}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Authentication schemes defined for the API:</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/last}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/authMethods}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#authMethods}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;a name=&quot;{{name}}&quot;&gt;&lt;/a&gt;</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">### {{name}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#isApiKey}}- **Type**: API key</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">- **API key parameter name**: {{keyParamName}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">- **Location**: {{#isKeyInQuery}}URL query string{{/isKeyInQuery}}{{#isKeyInHeader}}HTTP header{{/isKeyInHeader}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/isApiKey}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#isBasic}}- **Type**: HTTP basic authentication</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/isBasic}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#isOAuth}}- **Type**: OAuth</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">- **Flow**: {{flow}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">- **Authorization URL**: {{authorizationUrl}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">- **Scopes**: {{^scopes}}N/A{{/scopes}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#scopes}} - {{scope}}: {{description}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/scopes}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/isOAuth}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/authMethods}}</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><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><a aria-hidden="true" tabindex="-1" class="anchor" id="apimustache"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#apimustache" title="Direct link to heading">#</a>api.mustache</h4><p>The API documentation might look like this:</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-mustache codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain"># {{classname}}{{#description}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{description}}{{/description}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">All URIs are relative to *{{basePath}}*</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Method | HTTP request | Description</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">------------- | ------------- | -------------</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#operations}}{{#operation}}[**{{operationId}}**]({{classname}}.md#{{operationId}}) | **{{httpMethod}}** {{path}} | {{#summary}}{{summary}}{{/summary}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/operation}}{{/operations}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#operations}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#operation}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&lt;a name=&quot;{{operationId}}&quot;&gt;&lt;/a&gt;</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># **{{operationId}}**</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">&gt; {{#returnType}}{{returnType}} {{/returnType}}{{operationId}}({{#allParams}}{{{paramName}}}{{^-last}}, {{/-last}}{{/allParams}})</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{summary}}{{#notes}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{notes}}{{/notes}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">### Parameters</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{^allParams}}This endpoint does not need any parameter.{{/allParams}}{{#allParams}}{{#-last}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Name | Type | Description | Notes</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">------------- | ------------- | ------------- | -------------{{/-last}}{{/allParams}}</span></div><div 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></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/allParams}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">### Return type</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div 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></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">### Authorization</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{^authMethods}}No authorization required{{/authMethods}}{{#authMethods}}[{{name}}](../README.md#{{name}}){{^-last}}, {{/-last}}{{/authMethods}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">### HTTP request headers</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> - **Content-Type**: {{#consumes}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/consumes}}{{^consumes}}Not defined{{/consumes}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> - **Accept**: {{#produces}}{{{mediaType}}}{{^-last}}, {{/-last}}{{/produces}}{{^produces}}Not defined{{/produces}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/operation}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/operations}}</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><h4><a aria-hidden="true" tabindex="-1" class="anchor" id="modelmustache"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#modelmustache" title="Direct link to heading">#</a>model.mustache</h4><p>The models file could resemble the following.</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-mustache codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#models}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#model}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># {{{packageName}}}.{{modelPackage}}.{{{classname}}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">## Properties</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Name | Type | Description | Notes</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">------------ | ------------- | ------------- | -------------</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#parent}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{#parentVars}}</span></div><div 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></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/parentVars}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/parent}}</span></div><div 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></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/vars}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div 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></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/model}}</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">{{/models}}</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><h3><a aria-hidden="true" tabindex="-1" class="anchor" id="build-it"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#build-it" title="Direct link to heading">#</a>Build it</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><a aria-hidden="true" tabindex="-1" class="anchor" id="compile-sample"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#compile-sample" title="Direct link to heading">#</a>Compile Sample</h3><p>The <code>new.sh</code> script created the generation config file <code>bin/configs/common-mark-documentation-petstore-new.yaml</code>:</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-bash codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">generatorName: common-mark</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">outputDir: samples/documentation/petstore/common/mark</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">templateDir: modules/openapi-generator/src/main/resources/common-mark</span></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">additionalProperties:</span></div><div 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></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><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><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-bash codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">./bin/generate-samples.sh bin/configs/common-mark-documentation-petstore-new.yaml</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><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><a aria-hidden="true" tabindex="-1" class="anchor" id="verify-output"></a><a aria-hidden="true" tabindex="-1" class="hash-link" href="#verify-output" title="Direct link to heading">#</a>Verify output</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><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-bash codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div 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></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>Now, you can serve the output directory directly and test your links:</p><pre class="mdxCodeBlock_iHAB"><div class="codeBlockWrapper_2QGZ"><pre class="prism-code language-bash codeBlock_19pQ" style="color:#F8F8F2;background-color:#282A36"><div class="token-line" style="color:#F8F8F2"><span class="token plain">markserv samples/documentation/petstore/common/markdown</span></div></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button></div></pre><p>That&#x27;s it! You&#x27;ve created your first generator!</p></div></article><div class="margin-vert--xl"><div class="row"><div class="col"><a href="https://github.com/OpenAPITools/openapi-generator/edit/master/website/../docs/new-generator.md" target="_blank" rel="noreferrer noopener"><svg fill="currentColor" height="1.2em" width="1.2em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 40 40" style="margin-right:0.3em;vertical-align:sub"><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 text--right"><em><small>Last updated on <time datetime="2021-02-23T16:31:43.000Z" class="docLastUpdatedAt_1sqk">2/23/2021</time> by <strong>William Cheng</strong></small></em></div></div></div><div class="margin-vert--lg"><nav class="pagination-nav"><div class="pagination-nav__item"><a class="pagination-nav__link" href="/docs/contribute-building"><h5 class="pagination-nav__link--sublabel">Previous</h5><h4 class="pagination-nav__link--label">« Building the code</h4></a></div><div class="pagination-nav__item pagination-nav__item--next"><a class="pagination-nav__link" href="/docs/roadmap"><h5 class="pagination-nav__link--sublabel">Next</h5><h4 class="pagination-nav__link--label">Roadmap »</h4></a></div></nav></div></div></div><div class="col col--3"><div class="tableOfContents_TbNY"><ul class="contents contents__left-border"><li><a href="#required-files" class="contents__link">Required Files</a></li><li><a href="#newsh" class="contents__link">new.sh</a><ul><li><a href="#review-generated-config" class="contents__link">Review Generated Config</a></li><li><a href="#create-templates" class="contents__link">Create templates</a></li><li><a href="#build-it" class="contents__link">Build it</a></li><li><a href="#compile-sample" class="contents__link">Compile Sample</a></li><li><a href="#verify-output" class="contents__link">Verify output</a></li></ul></li></ul></div></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container"><div class="row footer__links"><div class="col footer__col"><h4 class="footer__title">Docs</h4><ul class="footer__items"><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"><h4 class="footer__title">Community</h4><ul class="footer__items"><li class="footer__item"><a class="footer__link-item" href="/users">User Showcase</a></li><li class="footer__item"><a class="footer__link-item" target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/tagged/openapi-generator">Stack Overflow</a></li><li class="footer__item"><a class="footer__link-item" target="_blank" rel="noopener noreferrer" href="https://join.slack.com/t/openapi-generator/shared_invite/enQtNzAyNDMyOTU0OTE1LTY5ZDBiNDI5NzI5ZjQ1Y2E5OWVjMjZkYzY1ZGM2MWQ4YWFjMzcyNDY5MGI4NjQxNDBiMTlmZTc5NjY2ZTQ5MGM">Chat Room</a></li><li class="footer__item"><a class="footer__link-item" target="_blank" rel="noopener noreferrer" href="https://twitter.com/oas_generator">Twitter</a></li></ul></div><div class="col footer__col"><h4 class="footer__title">More</h4><ul class="footer__items"><li class="footer__item"><a class="footer__link-item" href="/blog">Blog</a></li><li class="footer__item"><a class="footer__link-item" target="_blank" rel="noopener noreferrer" href="https://github.com/OpenAPITools/openapi-generator">GitHub</a></li></ul></div></div><div class="text--center"><div class="margin-bottom--sm"><a href="https://openapi-generator.tech/" target="_blank" rel="noopener noreferrer" class="footerLogoLink_1Wg7"><img class="footer__logo" alt="OpenAPI Tools" src="/img/mono-logo.svg"></a></div>Copyright © 2021 OpenAPI-Generator Contributors (https://openapi-generator.tech)</div></div></footer>
</div>
<script src="/styles.376d7561.js"></script>
<script src="/runtime~main.b6330a72.js"></script>
<script src="/main.e67007e6.js"></script>
<script src="/1.e3f0ae73.js"></script>
<script src="/2.2314cd3c.js"></script>
<script src="/3.07edd713.js"></script>
<script src="/1be78505.1826e09b.js"></script>
<script src="/20ac7829.73c16132.js"></script>
<script src="/17896441.e7e6966c.js"></script>
<script src="/10211c0a.4008a6c1.js"></script>
</body>
</html>