<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: otho</title>
    <description>The latest articles on DEV Community by otho (@othomation).</description>
    <link>https://dev.to/othomation</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F603001%2Fece218a4-7ccf-413b-8b78-c0de004ca3a7.jpeg</url>
      <title>DEV Community: otho</title>
      <link>https://dev.to/othomation</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/othomation"/>
    <language>en</language>
    <item>
      <title>How to make use of a simple scaffolding tool</title>
      <dc:creator>otho</dc:creator>
      <pubDate>Fri, 09 Apr 2021 15:34:02 +0000</pubDate>
      <link>https://dev.to/othomation/how-to-make-use-of-a-simple-scaffolding-tool-1bnl</link>
      <guid>https://dev.to/othomation/how-to-make-use-of-a-simple-scaffolding-tool-1bnl</guid>
      <description>&lt;p&gt;If you've already worked with a popular framework like Angular or Vue, you probably used their wonderful scaffolding tooling.&lt;/p&gt;

&lt;p&gt;Just go with a &lt;code&gt;ng generate component my-component&lt;/code&gt; and there you go, it creates for you a directory and a bunch of files inside.&lt;/p&gt;

&lt;p&gt;What's nice with that is obviously the time saving you've got. So you can focus on your features and business logic, not boring configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Perks :
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Time savy&lt;/li&gt;
&lt;li&gt;Less error prone (Make sure you always have a nice and proper base structure for your component)&lt;/li&gt;
&lt;li&gt;Dry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's dive in.&lt;/p&gt;

&lt;p&gt;I've found a wonderful github repo called &lt;a href="https://github.com/codeBelt/generate-template-files" rel="noopener noreferrer"&gt;generate-template-files&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/codeBelt" rel="noopener noreferrer"&gt;
        codeBelt
      &lt;/a&gt; / &lt;a href="https://github.com/codeBelt/generate-template-files" rel="noopener noreferrer"&gt;
        generate-template-files
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A simple generator to create custom template files for any application
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;It's pretty &lt;strong&gt;straight-forward&lt;/strong&gt;. The guy also made an &lt;a href="https://medium.com/@robertsavian/generate-template-files-with-ease-19b320615359" rel="noopener noreferrer"&gt;article&lt;/a&gt; about its package. But I wanted to talk about it!&lt;/p&gt;

&lt;h1&gt;
  
  
  So !
&lt;/h1&gt;

&lt;p&gt;You &lt;strong&gt;need&lt;/strong&gt; to have &lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;node and npm&lt;/a&gt;  installed.&lt;/p&gt;

&lt;p&gt;First, install the package as a dev dependency.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; generate-template-files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then, create a file (filename is your choice!) where we'll put our scaffolding logic.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;tools/scaffold
&lt;span class="nb"&gt;touch &lt;/span&gt;tools/scaffold/generate.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Add a little helper script in your &lt;code&gt;package.json&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;./package.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"generate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node tools/generate.js"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Open it in your favorite editor and put the base content in :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* ./tools/generate.js */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;generateTemplateFiles&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;generate-template-files&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;generateTemplateFiles&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Basically, when you fire the tool, it give you choices. Each choices is simply an object here. &lt;/p&gt;

&lt;p&gt;The tool will search your choice by iterating through that array (as a function parameter) and pick it.&lt;/p&gt;

&lt;p&gt;We can create a first choice.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* ./tools/generate.js */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;generateTemplateFiles&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;generate-template-files&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;create_component_basic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;option&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Create a basic component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;defaultCase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;(pascalCase)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;folderPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./tools/templates/components/basic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;stringReplacers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;question&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Insert component name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;__name__&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;question&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Insert id css selector&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;slot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;__idSelector__&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./dist/components/__name__&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;pathAndFileNameDefaultCase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;(pascalCase)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;overwrite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;onComplete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;generateTemplateFiles&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;create_component_basic&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  So, let's break it down.
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;option&lt;/code&gt; : It's the name of the choice as shown in the CLI when using it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;defaultCase&lt;/code&gt; : let you specify the type of case you want. You can use for example pascalCase or camelCase etc... default is (noCase) : it doesn't touch your input.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;entry&lt;/code&gt;: Basically where it need to get the templates (you can have as many template files for one choice)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;stringReplacers&lt;/code&gt; : This is important. It's the prompts where the tool ask you for the specifics data of your generated component. You choose a string to search for (like &lt;code&gt;__name__&lt;/code&gt; but it could be anything that can be unique like &lt;code&gt;%%|name|%%&lt;/code&gt; if you want) and will replace all its occurrence by what your tell it to replace.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;output&lt;/code&gt; : Where it need to output the files. You can also specify a custom file name using those strings replacers. In my example, it will create a folder with the &lt;code&gt;__name__&lt;/code&gt; given value and then throw all generated files inside it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;onComplete&lt;/code&gt;: a simple function to execute when task finished. I just console log the result.&lt;/p&gt;
&lt;h2&gt;
  
  
  Now, let's create our template files.
&lt;/h2&gt;

&lt;p&gt;I prefer to create a folder named 'templates', then one folder by type, then one by type instance.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;tools/templates/components/basic
&lt;span class="nb"&gt;touch &lt;/span&gt;tools/template/components/basic/&lt;span class="o"&gt;{&lt;/span&gt;__name__.component.html,__name__.css&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- ./tools/template/components/basic/__name__.component.html --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"__idSelector__"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hello I'm the __name__&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"./__name__.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* ./tools/template/components/basic/__name__.css */&lt;/span&gt;
&lt;span class="nf"&gt;#__idSelector__&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Perfect
&lt;/h2&gt;

&lt;p&gt;Now, if we &lt;strong&gt;start&lt;/strong&gt; the tool :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run generate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It &lt;strong&gt;should&lt;/strong&gt; prompt:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo87rd28um44k0qgo4r7w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo87rd28um44k0qgo4r7w.png" alt="Screenshot from 2021-04-09 17-42-36"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if we look at the generated files :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- ./dist/components/Header/Header.component.html --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"HeaderMain"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hello I'm the Header&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"./Header.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* ./dist/components/Header/Header.css */&lt;/span&gt;
&lt;span class="nf"&gt;#HeaderMain&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Note how the &lt;code&gt;#Header&lt;/code&gt; in the &lt;code&gt;css&lt;/code&gt; file is now capitalized. It's because of the &lt;code&gt;(pascalCase)&lt;/code&gt; setting we've put.&lt;/p&gt;

&lt;p&gt;That's it.&lt;br&gt;
You've got the basics of this tools.&lt;/p&gt;

&lt;p&gt;If you check the &lt;code&gt;*.d.ts&lt;/code&gt; files of the project, you'll have plenty of useful documentation for each of you cases !&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;br&gt;
Don't forget to star the &lt;a href="https://github.com/codeBelt/generate-template-files" rel="noopener noreferrer"&gt;repo&lt;/a&gt; if you find the project useful. &lt;/p&gt;

&lt;p&gt;Find codeBelt here :&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__560761"&gt;
    &lt;a href="/codebelt" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F560761%2F5eecc14d-4100-4113-9abb-5d6b245dd1b3.jpeg" alt="codebelt image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/codebelt"&gt;Robert S.&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/codebelt"&gt;I like React, Next.j, MobX and TypeScript.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>cli</category>
      <category>scaffold</category>
      <category>generate</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
