<?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>Forem: filoscoder</title>
    <description>The latest articles on Forem by filoscoder (@filoscoder).</description>
    <link>https://forem.com/filoscoder</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%2F438380%2Fed6e191d-335f-4ae4-ae25-ccf0aac14dd3.jpeg</url>
      <title>Forem: filoscoder</title>
      <link>https://forem.com/filoscoder</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/filoscoder"/>
    <language>en</language>
    <item>
      <title>TEN Stack: Typescript-Express-Node template (Updated 2022)</title>
      <dc:creator>filoscoder</dc:creator>
      <pubDate>Sun, 07 Aug 2022 18:16:00 +0000</pubDate>
      <link>https://forem.com/filoscoder/ten-stack-typescript-express-node-template-updated-2022-56oa</link>
      <guid>https://forem.com/filoscoder/ten-stack-typescript-express-node-template-updated-2022-56oa</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TEN stack&lt;/strong&gt; is a &lt;code&gt;Typescript&lt;/code&gt; + &lt;code&gt;Express&lt;/code&gt; + &lt;code&gt;Node&lt;/code&gt; starter kit to develop &lt;code&gt;REST API&lt;/code&gt; server app.&lt;br&gt;
Nothing new under the sun, just a straight forward combo to make server development a little bit faster. This template is perfect for anyone who is starting on the server-side world based on Node.js&lt;/p&gt;

&lt;p&gt;This template comes with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Class-based OOP architecture with DI &amp;amp; DAO (scalable)&lt;/li&gt;
&lt;li&gt;Equipped for TDD with &lt;a href="https://jestjs.io/docs/getting-started"&gt;Jest&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Everything strictly typed with &lt;a href="https://www.typescriptlang.org/"&gt;Typescript&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://babeljs.io/learn-es2015/"&gt;ES6&lt;/a&gt; features/modules&lt;/li&gt;
&lt;li&gt;ES7 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function"&gt;async&lt;/a&gt; / &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await"&gt;await&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Global error handling architecture with templates (ApiError, TimeOutError, ValidationError, etc)&lt;/li&gt;
&lt;li&gt;Request validation as custom middleware with &lt;a href="https://express-validator.github.io/docs/"&gt;Express-validator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Blazing fast logging with &lt;a href="https://github.com/pinojs/express-pino-logger"&gt;Express-Pinno-Logger&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Run with &lt;a href="https://nodemon.io/"&gt;Nodemon&lt;/a&gt; for automatic reload &amp;amp; watch&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://eslint.org/"&gt;ESLint&lt;/a&gt; for code linting&lt;/li&gt;
&lt;li&gt;Code formatting using &lt;a href="https://www.npmjs.com/package/prettier"&gt;Prettier&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Configuration management using &lt;a href="https://www.npmjs.com/package/dotenv"&gt;dotenv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Improved commits with &lt;a href="https://typicode.github.io/husky"&gt;Husky&lt;/a&gt;(v8) - pre-commit &amp;amp; pre-push&lt;/li&gt;
&lt;li&gt;Manage production app process with &lt;a href="https://pm2.keymetrics.io/"&gt;PM2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CI/CD workflows with &lt;a href="https://github.com/features/actions"&gt;Github Actions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Editable Github Pull requests &amp;amp; Issue templates&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org"&gt;Node.js&lt;/a&gt; (&lt;code&gt;&amp;gt;= 16.x&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://yarnpkg.com/en/docs/install"&gt;Yarn&lt;/a&gt; or &lt;a href="https://docs.npmjs.com/getting-started/installing-node"&gt;NPM&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fork or Use &lt;a href="https://github.com/filoscoder/tenstack-starter/generate"&gt;this&lt;/a&gt; template repository.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/git-guides/git-clone"&gt;Clone&lt;/a&gt; the forked repository.&lt;/li&gt;
&lt;li&gt;Install the dependencies with &lt;a href="https://yarnpkg.com/getting-started/usage"&gt;yarn&lt;/a&gt; or &lt;a href="https://docs.npmjs.com/cli/v7/commands/npm-install"&gt;npm&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Make sure you already have &lt;a href="https://github.com/filoscoder/tenstack-starter#prerequisites"&gt;&lt;code&gt;node.js&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/filoscoder/tenstack-starter#prerequisites"&gt;&lt;code&gt;npm&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://github.com/filoscoder/tenstack-starter#prerequisites"&gt;&lt;code&gt;yarn&lt;/code&gt;&lt;/a&gt; installed in your system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Set your &lt;code&gt;git remote add origin&lt;/code&gt; path
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; git remote add origin &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;forked&lt;/span&gt;&lt;span class="p"&gt;-and-cloned-path&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.github.com/en/get-started/getting-started-with-git/managing-remote-repositories#changing-a-remote-repositorys-url"&gt;Update the url&lt;/a&gt; if you already have an &lt;code&gt;origin&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Config
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Copy &lt;code&gt;.env.example&lt;/code&gt; a file at the root of the application.&lt;/li&gt;
&lt;li&gt;Add or modify specific variables and update it according to your need.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; &lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Check the &lt;code&gt;config&lt;/code&gt; folder to customize your settings (&lt;code&gt;/src/config&lt;/code&gt;)&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Alias @
&lt;/h2&gt;

&lt;p&gt;To make paths clean and ease to access &lt;code&gt;@&lt;/code&gt; is setup up for &lt;code&gt;/src&lt;/code&gt; path&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="c1"&gt;// BEFORE&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./routes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// NOW&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/routes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;You can customize this setup:&lt;br&gt;
&lt;code&gt;/tsconfig.json&lt;/code&gt; &amp;gt; compilerOptions.baseUrl &amp;amp; compilerOptions.paths&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Local Development
&lt;/h2&gt;

&lt;p&gt;Run the server locally. It will be run with Nodemon and ready to serve on port &lt;code&gt;8080&lt;/code&gt; (unless you specify it on your &lt;code&gt;.env&lt;/code&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; yarn start &lt;span class="c"&gt;# or npm start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Check &lt;a href="https://github.com/filoscoder/tenstack-starter/blob/master/package.json"&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/a&gt; to see more "scripts"&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Continuous Integration &amp;amp; Continuous Deploy (CI/CD)
&lt;/h2&gt;

&lt;p&gt;The workflows are under the &lt;code&gt;.github&lt;/code&gt; folder&lt;br&gt;
CI will be triggered on every PR update&lt;br&gt;
CD will be triggered when specified branches got pushed (ex. &lt;code&gt;main&lt;/code&gt; , &lt;code&gt;develop&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;If need more info about the setting, check &lt;a href="https://medium.com/atant/ci-with-github-actions-feat-slack-notification-dd7e89a1d80a"&gt;this&lt;/a&gt; article&lt;/p&gt;
&lt;h2&gt;
  
  
  Production
&lt;/h2&gt;

&lt;p&gt;First, build the application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; yarn build &lt;span class="c"&gt;# or npm run build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, use &lt;a href="https://github.com/Unitech/pm2"&gt;&lt;code&gt;pm2&lt;/code&gt;&lt;/a&gt; to start the application as a service.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; yarn service:start &lt;span class="c"&gt;# or npm run service:start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  Contribution
&lt;/h2&gt;

&lt;p&gt;Check the source &lt;a href="https://github.com/filoscoder/tenstack-starter"&gt;here&lt;/a&gt;&lt;br&gt;
Please feel free to open an &lt;code&gt;issue&lt;/code&gt; or a &lt;code&gt;pull request&lt;/code&gt; to suggest changes or additions.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>express</category>
      <category>node</category>
    </item>
    <item>
      <title>TEN Stack: Typescript-Express-Node template (Updated 2022)</title>
      <dc:creator>filoscoder</dc:creator>
      <pubDate>Tue, 17 Aug 2021 11:13:00 +0000</pubDate>
      <link>https://forem.com/filoscoder/ten-stack-typescrip-express-node-template-2gng</link>
      <guid>https://forem.com/filoscoder/ten-stack-typescrip-express-node-template-2gng</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TEN stack&lt;/strong&gt; is a &lt;code&gt;Typescript&lt;/code&gt; + &lt;code&gt;Express&lt;/code&gt; + &lt;code&gt;Node&lt;/code&gt; starter kit to develop &lt;code&gt;REST API&lt;/code&gt; server apps.&lt;br&gt;
Nothing new under the sun, just a straight forward combo to make server development a little bit faster. This template is perfect for anyone who is starting on the server-side world based on Node.js&lt;/p&gt;

&lt;p&gt;This template comes with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Class-based OOP architecture with DI &amp;amp; DAO (scalable)&lt;/li&gt;
&lt;li&gt;Equipped for TDD with &lt;a href="https://jestjs.io/docs/getting-started"&gt;Jest&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Everything strictly typed with &lt;a href="https://www.typescriptlang.org/"&gt;Typescript&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://babeljs.io/learn-es2015/"&gt;ES6&lt;/a&gt; features/modules&lt;/li&gt;
&lt;li&gt;ES7 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function"&gt;async&lt;/a&gt; / &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await"&gt;await&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Global error handling architecture with templates (ApiError, TimeOutError, ValidationError, etc)&lt;/li&gt;
&lt;li&gt;Request validation as custom middleware with &lt;a href="https://express-validator.github.io/docs/"&gt;Express-validator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Blazing fast logging with &lt;a href="https://github.com/pinojs/express-pino-logger"&gt;Express-Pinno-Logger&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Run with &lt;a href="https://nodemon.io/"&gt;Nodemon&lt;/a&gt; for automatic reload &amp;amp; watch&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://eslint.org/"&gt;ESLint&lt;/a&gt; for code linting&lt;/li&gt;
&lt;li&gt;Code formatting using &lt;a href="https://www.npmjs.com/package/prettier"&gt;Prettier&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Configuration management using &lt;a href="https://www.npmjs.com/package/dotenv"&gt;dotenv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Improved commits with &lt;a href="https://typicode.github.io/husky"&gt;Husky&lt;/a&gt;(v8) - pre-commit &amp;amp; pre-push&lt;/li&gt;
&lt;li&gt;Manage production app process with &lt;a href="https://pm2.keymetrics.io/"&gt;PM2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CI/CD workflows with &lt;a href="https://github.com/features/actions"&gt;Github Actions&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org"&gt;Node.js&lt;/a&gt; (&lt;code&gt;&amp;gt;= 16.0.0&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://yarnpkg.com/en/docs/install"&gt;Yarn&lt;/a&gt; or &lt;a href="https://docs.npmjs.com/getting-started/installing-node"&gt;NPM&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fork or Use &lt;a href="https://github.com/filoscoder/tenstack-starter/generate"&gt;this&lt;/a&gt; template repository.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/git-guides/git-clone"&gt;Clone&lt;/a&gt; the forked repository.&lt;/li&gt;
&lt;li&gt;Install the dependencies with &lt;a href="https://yarnpkg.com/getting-started/usage"&gt;yarn&lt;/a&gt; or &lt;a href="https://docs.npmjs.com/cli/v7/commands/npm-install"&gt;npm&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Make sure you already have &lt;a href="https://github.com/filoscoder/tenstack-starter#prerequisites"&gt;&lt;code&gt;node.js&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/filoscoder/tenstack-starter#prerequisites"&gt;&lt;code&gt;npm&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://github.com/filoscoder/tenstack-starter#prerequisites"&gt;&lt;code&gt;yarn&lt;/code&gt;&lt;/a&gt; installed in your system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Set your &lt;code&gt;git remote add origin&lt;/code&gt; path
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; git remote add origin &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;forked&lt;/span&gt;&lt;span class="p"&gt;-and-cloned-path&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.github.com/en/get-started/getting-started-with-git/managing-remote-repositories#changing-a-remote-repositorys-url"&gt;Update the url&lt;/a&gt; if you already have an &lt;code&gt;origin&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Config
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Copy &lt;code&gt;.env.example&lt;/code&gt; a file at the root of the application.&lt;/li&gt;
&lt;li&gt;Add or modify specific variables and update it according to your need.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; &lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Check the &lt;code&gt;config&lt;/code&gt; folder to customize your settings (&lt;code&gt;/src/config&lt;/code&gt;)&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Alias @
&lt;/h2&gt;

&lt;p&gt;To make paths clean and ease to access &lt;code&gt;@&lt;/code&gt; is setup up for &lt;code&gt;/src&lt;/code&gt; path&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="c1"&gt;// BEFORE&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./routes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// NOW&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/routes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;You can customize this setup:&lt;br&gt;
&lt;code&gt;/tsconfig.json&lt;/code&gt; &amp;gt; compilerOptions.baseUrl &amp;amp; compilerOptions.paths&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Local Development
&lt;/h2&gt;

&lt;p&gt;Run the server locally. It will be run with Nodemon and ready to serve on port &lt;code&gt;8080&lt;/code&gt; (unless you specify it on your &lt;code&gt;.env&lt;/code&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; yarn start &lt;span class="c"&gt;# or npm start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Check &lt;a href="https://github.com/filoscoder/tenstack-starter/blob/master/package.json"&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/a&gt; to see more "scripts"&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Continuous Integration &amp;amp; Continuous Deploy (CI/CD)
&lt;/h2&gt;

&lt;p&gt;The workflows are under the &lt;code&gt;.github&lt;/code&gt; folder&lt;br&gt;
CI will be triggered on every PR update&lt;br&gt;
CD will be triggered when specified branches got pushed (ex. &lt;code&gt;main&lt;/code&gt; , &lt;code&gt;develop&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;If need more info about the setting, check &lt;a href="https://medium.com/atant/ci-with-github-actions-feat-slack-notification-dd7e89a1d80a"&gt;this&lt;/a&gt; article&lt;/p&gt;
&lt;h2&gt;
  
  
  Production
&lt;/h2&gt;

&lt;p&gt;First, build the application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; yarn build &lt;span class="c"&gt;# or npm run build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, use &lt;a href="https://github.com/Unitech/pm2"&gt;&lt;code&gt;pm2&lt;/code&gt;&lt;/a&gt; to start the application as a service.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; yarn service:start &lt;span class="c"&gt;# or npm run service:start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  Contribution
&lt;/h2&gt;

&lt;p&gt;Check the source &lt;a href="https://github.com/filoscoder/tenstack-starter"&gt;here&lt;/a&gt;&lt;br&gt;
Please feel free to open an &lt;code&gt;issue&lt;/code&gt; or a &lt;code&gt;pull request&lt;/code&gt; to suggest changes or additions.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🅳🆁🆈-🅾🅽-🆁🅴🅰🅲🆃 🎉</title>
      <dc:creator>filoscoder</dc:creator>
      <pubDate>Fri, 11 Jun 2021 09:39:11 +0000</pubDate>
      <link>https://forem.com/filoscoder/-4e7i</link>
      <guid>https://forem.com/filoscoder/-4e7i</guid>
      <description>&lt;p&gt;🅳🆁🆈-🅾🅽-🆁🅴🅰🅲🆃 🎉&lt;/p&gt;

&lt;p&gt;Hi, I've just opened a public space to build up a useful collection of helper functions for ordinary and concurrent daily problems.&lt;/p&gt;

&lt;p&gt;I'm a freelance Software Engineer, my stack is &lt;code&gt;Javascript&lt;/code&gt; &amp;amp; &lt;code&gt;React&lt;/code&gt;. After some time working on different projects, I found myself facing the same problems and solving them with the same pattern. This is a repository for saving valuable time and stay as DRY as possible while working.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This open-source has his goal on stay as 🄳🅁🅈 (Don't Repeat Yourself) as possible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Example 1: phoneMask
&lt;/h2&gt;

&lt;p&gt;How many times do I have to write a function to mask/format a mobile phone number input????&lt;/p&gt;

&lt;p&gt;This is how I implemented 👇&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="c1"&gt;// Parameter&amp;gt; $inputValue: string&lt;/span&gt;
&lt;span class="c1"&gt;// Output&amp;gt; "xxx-xxxx-xxxx"&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;phoneMask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&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;inputValue&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\D&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&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="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(\d{1,3})(\d{1,4})?(\d{1,4})?&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&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;
  
  
  Example 2: useInputs
&lt;/h2&gt;

&lt;p&gt;How do you handle user input changes on React? Still using the obvious useState?&lt;br&gt;
I write a custom hook to handle user input changes trying to be clean on implement and effective at the same time.&lt;/p&gt;

&lt;p&gt;This is how I implemented it👇 (Typescript + React hooks)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useReducer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;DefaultValues&lt;/span&gt; &lt;span class="o"&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;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UseInputsAction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;reducer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UseInputsAction&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&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;initialState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useInputs&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;defaultValues&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DefaultValues&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&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;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useReducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;defaultValues&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;onChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ChangeEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;HTMLTextAreaElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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="p"&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;onReset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onReset&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;onReset&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/*

# Usage
import { useInputs } from "./dry";

.
.
.
// React component
const [form, onChange] = useInputs&amp;lt;MyFormType&amp;gt;({
    email: '',
    password: '',
});
.
.
.
// Render =&amp;gt; Form JSX
&amp;lt;form&amp;gt;
  &amp;lt;input 
    type="email"
    name="email"
    value={form.email}
    onChange={onChange}
  /&amp;gt;
  &amp;lt;input
    type="password"
    name="password"
    value={form.password}
    onChange={onChange}
  /&amp;gt;
&amp;lt;/form&amp;gt;

*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  SAME CODE to solve SAME PROBLEMS?
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Contribute your grain of code👇
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://github.com/filoscoder/dry-on-react" rel="noopener noreferrer"&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%2Fjthtj9no2b1vhfrsl4p1.png" alt="DRY-001"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>dry</category>
    </item>
  </channel>
</rss>
