<?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: Drash Land</title>
    <description>The latest articles on DEV Community by Drash Land (@drash_land).</description>
    <link>https://dev.to/drash_land</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%2F421570%2F2a064ae7-1d81-44d6-9429-0a166765d1af.jpg</url>
      <title>DEV Community: Drash Land</title>
      <link>https://dev.to/drash_land</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/drash_land"/>
    <language>en</language>
    <item>
      <title>Ohhhhh. It's been a while. Rhum 2.1.0.rc-1 tho. It's Node compatible btw!</title>
      <dc:creator>Drash Land</dc:creator>
      <pubDate>Wed, 05 Oct 2022 05:21:55 +0000</pubDate>
      <link>https://dev.to/drash_land/ohhhhh-its-been-a-while-rhum-210rc-1-tho-its-node-compatible-btw-38c6</link>
      <guid>https://dev.to/drash_land/ohhhhh-its-been-a-while-rhum-210rc-1-tho-its-node-compatible-btw-38c6</guid>
      <description>&lt;p&gt;Back in April we wrote about the Rhum v2 release. Since then, we've been working on some pretty cool updates! One of them being the "Spy" test double. The bigger one being Node compatibility!&lt;/p&gt;

&lt;p&gt;Now that Rhum is dependency free, you can use Rhum in Deno, Node, Bun (cause it's a thing now), and (for whatever reason) the browser. As always, we got your back with full documentation (see it at &lt;a href="https://drash.land/rhum"&gt;https://drash.land/rhum&lt;/a&gt;) -- showing you how to use the test doubles and their definitions. Example code blocks were improved to include Deno, Node - TypeScript (ESM syntax), Node - JavaScript (ESM syntax), and Node - CommonJS.&lt;/p&gt;

&lt;p&gt;The Spy/Node stuff is still in release candidate mode. We don't expect to introduce breaking changes, but if any issues surface or any issues are posted on Rhum's repo, then we might have to think things through. Other than that, enjoy the Spy test double and using Rhum in Node :). Here's some convenience commands for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add --dev @drashland/rhum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev @drashland/rhum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://drash.land/rhum/v2.x/getting-started/introduction"&gt;Rhum v2.x Full Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/drashland/rhum/releases/tag/v2.1.0-rc.1"&gt;GitHub Release&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Rhum v2.0.0 Released!</title>
      <dc:creator>Drash Land</dc:creator>
      <pubDate>Sun, 17 Apr 2022 15:46:51 +0000</pubDate>
      <link>https://dev.to/drash_land/rhum-v200-released-54a2</link>
      <guid>https://dev.to/drash_land/rhum-v200-released-54a2</guid>
      <description>&lt;p&gt;Title says it all! We released Rhum v2.0.0 yesterday 🙂. Need test doubles? Rhum got you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Release Summary&lt;/li&gt;
&lt;li&gt;
New Concepts

&lt;ul&gt;
&lt;li&gt;Why the Test Double Definitions&lt;/li&gt;
&lt;li&gt;Our Experiences From Other Testing Libraries and Our Solution&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
Rhum's Future

&lt;ul&gt;
&lt;li&gt;History: A Year in the Making&lt;/li&gt;
&lt;li&gt;Looking Forward&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Release Summary
&lt;/h2&gt;

&lt;p&gt;Basically, two things happened since v1:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We removed the test runner (no more &lt;code&gt;testPlan&lt;/code&gt;, &lt;code&gt;testSuite&lt;/code&gt;, &lt;code&gt;testCase&lt;/code&gt;, and hooks). I know... we're sad about it too. However, Deno's test runner has improved and has features that Rhum sought to add when Deno lacked them.&lt;/li&gt;
&lt;li&gt;We improved the mock and stub test double APIs and introduced two others: fakes and dummies. The spy test double is currently in the works and will be included in a future minor release.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This being said, Rhum is strictly a test double library. For those currently using Rhum and want to continue using Rhum (for test doubles), we have a &lt;a href="https://drash.land/rhum/v2.x/getting-started/migration-guide-to-v2"&gt;Migration Guide to v2&lt;/a&gt; page that you can use to ease the migration process.&lt;/p&gt;

&lt;p&gt;Rhum has zero dependencies -- not even Deno Standard Modules, which means it can be released to the Node.js ecosystem (yes, we plan to do exactly this 🙂).&lt;/p&gt;

&lt;p&gt;You can view the full documentation at &lt;a href="https://drash.land/rhum/v2.x"&gt;Drash Land - Rhum&lt;/a&gt; and the actual release at &lt;a href="https://github.com/drashland/rhum/releases/tag/v2.0.0"&gt;Releases - drashland/rhum&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  New Concepts
&lt;/h2&gt;

&lt;p&gt;Concepts from v1 to v2 have drastically changed. Rhum v1 had one goal: to provide pretty test result outputs (&lt;a href="https://dev.to/crookse_/why-we-created-rhum-for-testing-deno-projects-33mf"&gt;discussed here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Now, Rhum only provides test doubles and they follow specific definitions (stated below).&lt;/p&gt;

&lt;h3&gt;
  
  
  Why the Test Double Definitions
&lt;/h3&gt;

&lt;p&gt;Rhum's test doubles follow the &lt;a href="https://martinfowler.com/bliki/TestDouble.html"&gt;test double definitions&lt;/a&gt; from Gerard Meszaros (as stated by Martin Fowler). We made it this way to prevent confusion on what test double to use during a system under test (SUT) and to make it easier to ask yourself questions like the following when writing tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Should this be a fake?&lt;/li&gt;
&lt;li&gt;Should I pass in a mock to this constructor?&lt;/li&gt;
&lt;li&gt;Do I need to create an expectation on this service that I am testing?&lt;/li&gt;
&lt;li&gt;Does this need to be stubbed?&lt;/li&gt;
&lt;li&gt;Are we verifying behavior or state?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Our Experiences From Other Testing Libraries and Our Solution
&lt;/h3&gt;

&lt;p&gt;We found that other testing libraries can create some overlap between test doubles. This makes it kind of difficult to know what test double to use, why to use it, and what you are verifying in tests. For example, some testing libraries only have the concept of mocking instead of spying, faking, or creating dummies. Furthermore, some testing libraries have mocks that can also be stubs using (&lt;a href="https://martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks Aren't Stubs&lt;/a&gt;). This can lead you to not testing anything if you're just stubbing everything in your tests.&lt;/p&gt;

&lt;p&gt;From our experiences and knowing the test double definitions written on Martin Fowler's website (shoutout to &lt;a href="https://github.com/Guergeiro"&gt;Breno&lt;/a&gt; for showing us this along with more information from research on the differences!), we sought out to provide a solution for creating test doubles. &lt;a href="https://drash.land/rhum/v2.x/getting-started/about-rhum#our-experiences-from-other-testing-libraries-and-our-solution"&gt;Here&lt;/a&gt; we provide the problem and our solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rhum's Future
&lt;/h2&gt;

&lt;h3&gt;
  
  
  History: A Year in the Making
&lt;/h3&gt;

&lt;p&gt;It's been a little over a year since we &lt;a href="https://dev.to/drash_land/rhum-v2-coming-at-ya-2og4"&gt;last posted about Rhum v2&lt;/a&gt;. Since then, we had many internal discussions, thought about &lt;a href="https://github.com/denoland/deno/discussions/10771"&gt;EOL'ing Rhum completely after the introduction of test groups/hooks in Deno&lt;/a&gt;, thought about making it agnostic to the runtime using it, thought about making a new test runner, started development, stopped development, wrote new plans and goals, etc. We couldn't really decide what to do with Rhum... and a year went by (time really flies)! Rhum has been the unit/integration testing backbone for all Drash Land modules and we didn't want to just throw it away. It wasn't until about a little over a week ago that &lt;a href="https://github.com/ebebbington"&gt;Ed&lt;/a&gt; said he was going to write the Rhum v2 docs in our &lt;a href="https://discord.gg/pM5ateyA"&gt;Discord&lt;/a&gt;. I didn't think he was serious, but I was game for it. Shortly after, we introduced the test doubles and prepped for release without looking back -- stopping development yet again. Now we're here... v2... and SUPER STOKED about it!&lt;/p&gt;

&lt;h3&gt;
  
  
  Looking Forward
&lt;/h3&gt;

&lt;p&gt;As for Rhum's future, we will continue to develop it as a test double library. Soon, it will be officially available in the Node.js ecosystem with documentation that covers the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CJS&lt;/li&gt;
&lt;li&gt;ESM (TypeScript)&lt;/li&gt;
&lt;li&gt;ESM (JavaScript)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay tuned for that! We're pretty excited to spill Rhum into the Node.js ecosystem.&lt;/p&gt;




&lt;p&gt;Thanks for reading and happy testing!&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://github.com/crookse"&gt;Eric&lt;/a&gt;&lt;/p&gt;

</description>
      <category>deno</category>
      <category>node</category>
      <category>testing</category>
    </item>
    <item>
      <title>Now supporting Deno v1.8.3</title>
      <dc:creator>Drash Land</dc:creator>
      <pubDate>Sat, 03 Apr 2021 15:30:25 +0000</pubDate>
      <link>https://dev.to/drash_land/new-versions-released-14d9</link>
      <guid>https://dev.to/drash_land/new-versions-released-14d9</guid>
      <description>&lt;p&gt;Hi y'all! It's been a while. So we noticed a flaw in our development workflow. Basically, whenever Deno updated its versions, we felt we didn't need to keep up to date with them as our modules "just worked" without issues. It wasn't until we noticed that you could be using the latest Deno version and have our modules import older versions of the Deno Std library (yeah... you can see where this could be prone to issues). This being said, we're now keeping up to date with Deno. As a result, every time Deno updates, we update.&lt;/p&gt;

&lt;p&gt;All Drash Land modules now support Deno v1.8.3 and use Deno Std 0.92.0.&lt;/p&gt;

&lt;p&gt;Get them while they're hot at &lt;a href="https://drash.land"&gt;https://drash.land&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;-Eric&lt;/p&gt;

</description>
      <category>deno</category>
      <category>drash</category>
      <category>rhum</category>
    </item>
    <item>
      <title>Drash v1.3.0 Release Notes</title>
      <dc:creator>Drash Land</dc:creator>
      <pubDate>Thu, 05 Nov 2020 14:33:29 +0000</pubDate>
      <link>https://dev.to/drash_land/drash-v1-3-0-release-notes-bf5</link>
      <guid>https://dev.to/drash_land/drash-v1-3-0-release-notes-bf5</guid>
      <description>&lt;p&gt;Drash v1.3.0 was released! This release contains a few new features, performance improvements, and bug fixes. Here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New Features

&lt;ul&gt;
&lt;li&gt;Front-end TypeScript Support&lt;/li&gt;
&lt;li&gt;Create React Apps&lt;/li&gt;
&lt;li&gt;Improved Templating System&lt;/li&gt;
&lt;li&gt;Virtual Paths&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Performance Improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  New Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Front-end TypeScript Support
&lt;/h3&gt;

&lt;p&gt;With the help of Drash's &lt;a href="https://github.com/drashland/deno-drash-middleware/tree/v0.6.0/serve_typescript"&gt;ServeTypeScript&lt;/a&gt; middleware, you can write front-end TypeScript. Yup, you read that correctly! Front-end TypeScript.&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You give this middleware TypeScript files to compile when your Drash application starts up.&lt;/li&gt;
&lt;li&gt;When your application is starting up, the middleware compiles the files into JavaScript and saves the JavaScript in memory -- ready to be used when your application is running.&lt;/li&gt;
&lt;li&gt;When a request is made to a TypeScript file from your front-end, the middleware sends back the compiled JavaScript -- allowing your browser to execute it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since the TypeScript files are compiled and cached when your application starts up, your application stays quick to respond to requests.&lt;/p&gt;

&lt;p&gt;Want to scale your front-end using TypeScript with a single tool? Check out the ServeTypeScript &lt;a href="https://github.com/drashland/deno-drash-middleware/tree/v0.6.0/serve_typescript"&gt;tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create React Apps
&lt;/h3&gt;

&lt;p&gt;Drash comes with a basic tool to help you quickly create a Drash application with everything working out of the box. In the past, we only supported one front-end framework: Vue. Now, you can create both Vue and React apps.&lt;/p&gt;

&lt;p&gt;Want to build a Drash + React app? Get started with Drash's Create App script &lt;a href="https://drash.land/drash/#/tutorials/cli/create-app"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Improved Templating System
&lt;/h3&gt;

&lt;p&gt;Drash has been reworked to support template engine middleware. Specifically, its very own Tengine middleware. This piece of software allows your Drash application to render HTML pages with the template engine of YOUR choice. If you don't have a preference, it also comes with a default template engine called Jae and it's super easy to use.&lt;/p&gt;

&lt;p&gt;Want to render HTML in an easy, scalable fashion? Check out the Tengine &lt;a href="https://github.com/drashland/deno-drash-middleware/tree/v0.6.0/tengine"&gt;tutorials&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Virtual Paths
&lt;/h3&gt;

&lt;p&gt;Virtual paths allow a project's file structure to be more flexible. It also helps prevent you from having to give users access to parts of your system just so you can serve static assets such as CSS and JS files. We want you to keep your application secure, so we have added virtual paths -- allowing you to control what URLs map to what folders in your project(s).&lt;/p&gt;

&lt;p&gt;Want to add virtual paths to your Drash application? Check out the &lt;a href="https://drash.land/drash/#/tutorials/servers/serving-virtual-paths"&gt;tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Improvements
&lt;/h2&gt;

&lt;p&gt;We realized during our time hammering on Drash that it slowed down when the number of resources (similar to controllers in the &lt;a href="https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"&gt;MVC&lt;/a&gt; pattern) increased. Each resource increased the size of the cache used for resource lookups. This also increased the time it took Drash to match a resource with a given request. We figured out where Drash's performance decreased and restructured the way it looks for resources. Now, Drash keeps its performance up when loaded with 1 resource or even 10,000 resources. For more information about this performance issue, you can check out the discussions on the &lt;a href="https://github.com/drashland/deno-drash/pull/393"&gt;GitHub pull request&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;View the Drash project &lt;a href="https://github.com/drashland/deno-drash"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More information on this release can be found at &lt;a href="https://github.com/drashland/deno-drash/releases/tag/v1.3.0"&gt;https://github.com/drashland/deno-drash/releases/tag/v1.3.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Want to contribute to the Drash Land projects? View our "Good First Issues" &lt;a href="https://github.com/orgs/drashland/projects/1?card_filter_query=label%3A%22Good+First+Issue%22"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>deno</category>
      <category>drash</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Drash Middleware v0.6.0 Release Notes</title>
      <dc:creator>Drash Land</dc:creator>
      <pubDate>Thu, 05 Nov 2020 14:30:49 +0000</pubDate>
      <link>https://dev.to/drash_land/drash-middleware-v0-6-0-release-notes-58k5</link>
      <guid>https://dev.to/drash_land/drash-middleware-v0-6-0-release-notes-58k5</guid>
      <description>&lt;p&gt;Drash Middleware v0.6.0 was released! This release comes with two new tools for your Drash application. Here's what we've added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Front-end TypeScript Support&lt;/li&gt;
&lt;li&gt;Improved Templating System Support&lt;/li&gt;
&lt;li&gt;Cookie Support For CSRF&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Front-end TypeScript Support
&lt;/h2&gt;

&lt;p&gt;Want to write your front-end using TypeScript? Now you can with &lt;a href="https://github.com/drashland/deno-drash-middleware/tree/v0.6.0/serve_typescript"&gt;ServeTypeScript&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;ServeTypeScript is middleware that allows you to write front-end TypeScript. How does it work? Here's the workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You give this middleware TypeScript files to compile when your Drash application starts up.&lt;/li&gt;
&lt;li&gt;When your application is starting up, the middleware compiles the files into JavaScript and saves the JavaScript in memory -- ready to be used when your application is running.&lt;/li&gt;
&lt;li&gt;When a request is made to a TypeScript file from your front-end, the middleware sends back the compiled JavaScript -- allowing your browser to execute it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since the TypeScript files are compiled and cached when your application starts up, your application stays quick to respond to requests.&lt;/p&gt;

&lt;p&gt;Want to scale your front-end using TypeScript with a single tool? Check out the ServeTypeScript &lt;a href="https://github.com/drashland/deno-drash-middleware/tree/v0.6.0/serve_typescript"&gt;tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Improved Templating System Support
&lt;/h2&gt;

&lt;p&gt;Want to power your Drash application with the template engine of your choice? Now you can with &lt;a href="https://github.com/drashland/deno-drash-middleware/tree/v0.6.0/tengine"&gt;Tengine&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Tengine is middleware that allows you to tell your Drash application how it should render HTML; and you can use the template engine of YOUR choice. This means you can use it with Eta, Dinja, dejs, or any other Deno template engine framework that you love.&lt;/p&gt;

&lt;p&gt;Don't have a template engine in mind to use? That's okay too! Tengine comes with a default template engine called Jae and getting started with it is super easy. At Drash Land, we're very documentation-driven, so we've written some &lt;a href="https://github.com/drashland/deno-drash-middleware/tree/v0.6.0/tengine"&gt;tutorials&lt;/a&gt; for you to get started quickly.&lt;/p&gt;

&lt;p&gt;Want to render HTML in an easy, scalable fashion? Check out the Tengine &lt;a href="https://github.com/drashland/deno-drash-middleware/tree/v0.6.0/tengine"&gt;tutorials&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cookie Support For CSRF
&lt;/h2&gt;

&lt;p&gt;Protect your application with this middleware. Learn more about Drash's CSRF middleware &lt;a href="https://github.com/drashland/deno-drash-middleware/tree/v0.6.0/csrf"&gt;here&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;View the Drash Middleware project &lt;a href="https://github.com/drashland/deno-drash-middleware"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More information on this release can be found at &lt;a href="https://github.com/drashland/deno-drash-middleware/releases/tag/v0.6.0"&gt;https://github.com/drashland/deno-drash-middleware/releases/tag/v0.6.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to contribute to the Drash Land projects? View our "Good First Issues" &lt;a href="https://github.com/orgs/drashland/projects/1?card_filter_query=label%3A%22Good+First+Issue%22"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>deno</category>
      <category>drashmiddleware</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>dmm v1.2.0 Release Notes</title>
      <dc:creator>Drash Land</dc:creator>
      <pubDate>Thu, 05 Nov 2020 14:29:15 +0000</pubDate>
      <link>https://dev.to/drash_land/dmm-v1-2-0-release-notes-4191</link>
      <guid>https://dev.to/drash_land/dmm-v1-2-0-release-notes-4191</guid>
      <description>&lt;p&gt;dmm v1.2.0 was released! This release contains improvements to the CLI. Here are some highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added support for nest.land modules&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;info&lt;/code&gt; command can now fetch info on multiple modules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't know what dmm is? Find out more at &lt;a href="https://drash.land/dmm"&gt;https://drash.land/dmm&lt;/a&gt; or read &lt;a href="https://dev.to/drash_land/dmm-a-deno-module-manager-3dd8"&gt;this&lt;/a&gt; short article.&lt;/p&gt;




&lt;p&gt;View the dmm project &lt;a href="https://github.com/drashland/dmm"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More information on this release can be found at &lt;a href="https://github.com/drashland/dmm/releases/tag/v1.2.0"&gt;https://github.com/drashland/dmm/releases/tag/v1.2.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Want to contribute to the Drash Land projects? View our "Good First Issues" &lt;a href="https://github.com/orgs/drashland/projects/1?card_filter_query=label%3A%22Good+First+Issue%22"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>deno</category>
      <category>dmm</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>dmm - A Deno Module Manager</title>
      <dc:creator>Drash Land</dc:creator>
      <pubDate>Wed, 04 Nov 2020 02:03:46 +0000</pubDate>
      <link>https://dev.to/drash_land/dmm-a-deno-module-manager-3dd8</link>
      <guid>https://dev.to/drash_land/dmm-a-deno-module-manager-3dd8</guid>
      <description>&lt;p&gt;dmm (pronounced "dim") is a Deno module manager. It can update your &lt;code&gt;deps.ts&lt;/code&gt; file, check if any of your dependencies are out of date, and give you information about any module in the Deno world. Managing your dependencies hasn't been easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;dmm reads the &lt;code&gt;deps.ts&lt;/code&gt; file at the current working directory -- checking versioned &lt;code&gt;import&lt;/code&gt; and &lt;code&gt;export&lt;/code&gt; statements and checking to see if they can be updated. If any dependency can be updated, it lets you know which ones can be updated. If you want to update them, dmm will rewrite your &lt;code&gt;deps.ts&lt;/code&gt; file so that your dependencies reflect their latest versions in just one simple command.&lt;/p&gt;

&lt;p&gt;Want to manage your Deno dependencies in a simpler manner? Check out &lt;a href="https://drash.land/dmm"&gt;dmm&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>deno</category>
      <category>dmm</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Drash's Performance Improvements</title>
      <dc:creator>Drash Land</dc:creator>
      <pubDate>Sat, 31 Oct 2020 06:29:49 +0000</pubDate>
      <link>https://dev.to/drash_land/drash-s-perfomance-improvements-2ejn</link>
      <guid>https://dev.to/drash_land/drash-s-perfomance-improvements-2ejn</guid>
      <description>&lt;p&gt;Soon, Drash will perform faster than ever. Although this is still a work in progress, Drash's codebase is being reworked to handle the workload of a VERY LARGE application. As a result, your Drash apps will perform faster than they currently do.&lt;/p&gt;

&lt;p&gt;What this means is, for a Drash server with thousands of resources, it can handle up to ~284k requests in 10 seconds (or ~28.4k req/sec). For example, if up to ~28.4k people visited a website powered by Drash at the same exact time, they would all see the website load within 1 second. Due to this, it shows Drash is more than capable of handling the load for small and VERY LARGE web applications, whilst maintaining great performance. You can follow the progress of Drash's performance improvements at &lt;a href="https://github.com/drashland/deno-drash/pull/393"&gt;https://github.com/drashland/deno-drash/pull/393&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Machine Details:&lt;/p&gt;

&lt;p&gt;MacBook Pro (Mid 2015), 2.5 GHz Quad-Core Intel Core i7, 16 GB 1600 MHz DDR3&lt;/p&gt;

&lt;p&gt;As always, keep developing with confidence, friends!&lt;/p&gt;

&lt;p&gt;(Join the community at &lt;a href="https://discord.gg/6XkVDE"&gt;https://discord.gg/6XkVDE&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>deno</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>drash</category>
    </item>
    <item>
      <title>Rhum v2 Coming At Ya!</title>
      <dc:creator>Drash Land</dc:creator>
      <pubDate>Thu, 29 Oct 2020 12:57:37 +0000</pubDate>
      <link>https://dev.to/drash_land/rhum-v2-coming-at-ya-2og4</link>
      <guid>https://dev.to/drash_land/rhum-v2-coming-at-ya-2og4</guid>
      <description>&lt;p&gt;&lt;em&gt;(Edit 2021-04-04: Release date changed to July 1, 2021)&lt;/em&gt;&lt;br&gt;
&lt;em&gt;(Edit 2022-04-17: Rhum v2 was released, but it's not what we state in this post. Read more about Rhum v2 &lt;a href="https://dev.to/drash_land/rhum-v200-released-54a2"&gt;here&lt;/a&gt;.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Rhum is coming out with its very own CLI in its v2 release!&lt;/p&gt;
&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Why&lt;/li&gt;
&lt;li&gt;Findings&lt;/li&gt;
&lt;li&gt;Current CLI State&lt;/li&gt;
&lt;li&gt;When&lt;/li&gt;
&lt;li&gt;Follow&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Why
&lt;/h2&gt;

&lt;p&gt;During our time developing Rhum v1.x, we realized that maintaining &lt;code&gt;Deno.test()&lt;/code&gt; under the hood was a bit difficult. It also convoluted the codebase when it came to managing hooks and outputting test results. Basically, it was not flexible and easy to maintain. With that in mind, we decided a Rhum CLI was the best way to move forward.&lt;/p&gt;
&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;p&gt;After a couple days of developing a prototype, we found that it was super flexible and the codebase was a lot cleaner than having &lt;code&gt;Deno.test()&lt;/code&gt; under the hood. We were able to add subcommand options easily in the CLI such as ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--filter-test-case="someTestCaseName"
--filter-test-suite="someTestSuiteName"
--ignore="dir|file"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;... and output prettier test results:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CdyNiCK0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/12766301/96877911-3ab3e100-1448-11eb-8172-29d2841d7b30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CdyNiCK0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/12766301/96877911-3ab3e100-1448-11eb-8172-29d2841d7b30.png" width="880" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you look closely at the above screenshot, you will see that the Actual/Diff output shows exactly what file threw the assertion error and on what line. This makes debugging faster than sifting through an error stack trace message. Needless to say, we like this feature a lot :).&lt;/p&gt;

&lt;h2&gt;
  
  
  Current CLI State
&lt;/h2&gt;

&lt;p&gt;The current state of the CLI can be seen by its current help menu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rhum v2.0.0 - A lightweight testing framework for Deno.

USAGE

    rhum [subcommand] [options] [directory|file]

SUBCOMMANDS

    make [file]
        Make a test file.

    test [options] [directory|file]
        Run tests by specifying a test directory or test file.

    help, --help
        Display the help menu.

    version, --version
        Display Rhum version.


OPTIONS

    Options are categorized by subcommand.

    test
        --filter-test-case
            Execute the matching test case in the file(s) being tested. This
            option cannot be used with --filter-test-suite.
        --filter-test-suite
            Execute the matching test suite in the file(s) being tested. This
            option cannot be used with --filter-test-case.
        --ignore
            Ignore a set of directories or files.


EXAMPLE USAGE

    Execute the matching test case in the file(s) being tested.
        rhum test --filter-test-case="my test case" test_file.ts
        rhum test --filter-test-case="my test case" some_dir/

    Execute the matching test case in the file(s) being tested.
        rhum test --filter-test-suite="my test suite" test_file.ts
        rhum test --filter-test-suite="my test suite" some_dir/

    Execute all tests, but ignore directories/files.
        rhum test --ignore=./tests/data tests/
        rhum test --ignore=./tests/data,./tests/ignore tests/
        rhum test --ignore=./tests/test_1.ts tests/
        rhum test --ignore=./tests/test_1.ts,./tests/test_2.ts tests/

    Make a test file at /my/project/tests/my_test.ts
        rhum make /my/project/tests/my_test.ts

    Display the help menu.
        rhum help

    Display the Rhum version.
        rhum version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When
&lt;/h2&gt;

&lt;p&gt;Rhum v2 is set to be released on January 1, 2021. We figured this date gives us enough time to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;add more validation features such as &lt;code&gt;.lastCalledWith()&lt;/code&gt; and &lt;code&gt;.lastReturned()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;make the CLI feature-rich and user-friendly;&lt;/li&gt;
&lt;li&gt;document new features;&lt;/li&gt;
&lt;li&gt;write tutorials; and&lt;/li&gt;
&lt;li&gt;write extensive tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Follow
&lt;/h2&gt;

&lt;p&gt;Want to keep up to date with the latest Rhum v2 progress? Join the Drash Land discord at &lt;a href="https://discord.gg/6XkVDE"&gt;https://discord.gg/6XkVDE&lt;/a&gt;, or simply follow the pinned GitHub issue below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/drashland/rhum/issues/75"&gt;https://github.com/drashland/rhum/issues/75&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading and keep developing with confidence, friends.&lt;/p&gt;

</description>
      <category>deno</category>
      <category>rhum</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Drash - A Unique Framework</title>
      <dc:creator>Drash Land</dc:creator>
      <pubDate>Tue, 14 Jul 2020 17:26:13 +0000</pubDate>
      <link>https://dev.to/drash_land/what-makes-drash-different-idd</link>
      <guid>https://dev.to/drash_land/what-makes-drash-different-idd</guid>
      <description>&lt;p&gt;Hey, my name is Edward Bebbington. I am one of the maintainers for Drash Land and all of its projects. Here, I am going to talk about what makes Drash different and how it stands out when compared to other frameworks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
What Makes Drash Different?

&lt;ul&gt;
&lt;li&gt;Syntax&lt;/li&gt;
&lt;li&gt;Resources&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
Drash Compared To Other Frameworks

&lt;ul&gt;
&lt;li&gt;Deno Frameworks&lt;/li&gt;
&lt;li&gt;Node Frameworks&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Drash's Goals&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Makes Drash Different?
&lt;/h2&gt;

&lt;p&gt;With so many frameworks already released in the Deno community, it can be hard to differentiate all of them. There are many that resemble popular frameworks like &lt;a href="https://expressjs.com/"&gt;ExpressJS&lt;/a&gt; and &lt;a href="https://koajs.com"&gt;Koa&lt;/a&gt;. Drash, on the other hand, is different. It doesn't resemble any of the &lt;a href="http://nodeframework.com/"&gt;Node frameworks&lt;/a&gt; and some might say it's the complete opposite of Express.&lt;/p&gt;

&lt;p&gt;Deno was built to &lt;a href="https://www.youtube.com/watch?v=M3BM9TB-8yA&amp;amp;t=1310s"&gt;fix design mistakes&lt;/a&gt; and avoid certain things that Node used. One of those things is &lt;a href="https://www.npmjs.com/"&gt;NPM&lt;/a&gt;. With this in mind, Drash sought to be different as well through its syntax and use of HTTP resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Syntax
&lt;/h3&gt;

&lt;p&gt;You may notice Drash's syntax to be different than what you're used to using and seeing. Drash is very different than Node and Deno frameworks in terms of its syntax. Where Deno is different than Node, Drash aims to be different than Express or Koa. Unlike other frameworks, Drash utilizes resources and a full class-based system. This means it doesn't use &lt;code&gt;app.get((req, res))&lt;/code&gt;. Instead, it uses &lt;code&gt;this.request&lt;/code&gt; and &lt;code&gt;this.response&lt;/code&gt; inside of the resource class, which is where your "routes" (aka paths) are also defined. As a result, this follows the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web"&gt;MDN specs of HTTP Resources&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Furthermore, Drash takes a &lt;code&gt;namespace&lt;/code&gt; approach with all of its data members being exposed under the &lt;code&gt;Drash&lt;/code&gt; namespace. This is very different in terms of how a web application might be built inside of Node and Deno. Drash is a true object-oriented framework with the MDN as a backbone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;If you are familiar with Express, &lt;a href="https://laravel.com/"&gt;Laravel&lt;/a&gt;, or generally the MVC architecture, you might be familiar to routes and controllers. In Drash, a resource defines both in the same class. The resource is a class that handles requests for the HTTP verbs (e.g., &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;) with each verb being its own request handler inside of the class. On top of this, the paths (or routes if it's easier) that a resource should handle are defined in that same class. An example of a resource is below:&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="c1"&gt;// File: users_resource.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Drash&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;https://deno.land/x/drash/mod.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;UsersResource&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Drash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Resource&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/user:id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;GET&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;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getUrlQueryParam&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&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;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Return all users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And plugging the resource into your server is super simple:&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Drash&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;https://deno.land/x/drash/mod.ts&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;UsersResource&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;./users_resource.ts&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;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Drash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;UserResource&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// The UsersResource will now be registered in the server&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;localhost&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1667&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Drash Compared To Other Frameworks
&lt;/h2&gt;

&lt;p&gt;You've probably figured out by now that Drash isn't like existing Node and Deno frameworks. So what truly makes Drash stand out from Express, &lt;a href="https://oakserver.github.io/oak/"&gt;Oak&lt;/a&gt;, &lt;a href="https://mandarineframework.gitbook.io/mandarine-ts/"&gt;MandarineTS&lt;/a&gt;, or any other framework listed under Deno's &lt;a href="https://deno.land/x"&gt;Third Party Modules&lt;/a&gt; (search for "framework" when looking at the Third Party Modules)?&lt;/p&gt;

&lt;p&gt;Well, let's compare Drash to Node and Deno frameworks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deno Frameworks
&lt;/h3&gt;

&lt;p&gt;Some well-known frameworks in the Deno community are Oak (similar to Express), MandarineTS (decorator framework), and &lt;a href="https://github.com/asos-craigmorten/opine"&gt;Opine&lt;/a&gt; (similar to Express).&lt;/p&gt;

&lt;p&gt;There are plenty of frameworks that are similar (or close to being an exact port) to Express. It can feel a little overwhelming. What makes Drash stand out is Drash isn't like Express. Drash is unique. Like I mentioned above, Drash has reasons for certain implementations. The problem with Deno frameworks is that most of them are similar -- taking Express and Koa as inspiration. Whilst it's good to have a variety of frameworks, it's also good that each one is different to cater to different people's preferences.&lt;/p&gt;

&lt;h3&gt;
  
  
  Node Frameworks
&lt;/h3&gt;

&lt;p&gt;Drash isn't like any Node framework. It's something new and unique.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drash's Goals
&lt;/h2&gt;

&lt;p&gt;Drash aims to be different and unique -- helping people develop software with confidence through a clean and easy-to-use syntax. There were many problems for Drash in the early stages of its development (around 2018-2019). This was due to it trying to be similar to Express. What Drash has become has solved these problems and was introduced as a unique alternative to the Deno community.&lt;/p&gt;




&lt;p&gt;I hope this was insightful. With there being many frameworks for Deno, it can be hard to differentiate all of them in a quick and clear way. Although this article doesn't go into detail about other frameworks, I hope this article helps you understand Drash more.&lt;/p&gt;

&lt;p&gt;-- Edward&lt;/p&gt;




&lt;p&gt;Want to start developing using Drash? Check out its documentation pages &lt;a href="https://drash.land/drash"&gt;here&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Want to know why Drash was built? One of the founders of Drash wrote an article about it &lt;a href="https://dev.to/drash_land/why-was-drash-built-4bob"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>deno</category>
      <category>drash</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why We Built Drash</title>
      <dc:creator>Drash Land</dc:creator>
      <pubDate>Sat, 11 Jul 2020 12:50:15 +0000</pubDate>
      <link>https://dev.to/drash_land/why-was-drash-built-4bob</link>
      <guid>https://dev.to/drash_land/why-was-drash-built-4bob</guid>
      <description>&lt;p&gt;Hi, my name is Eric Crooks. I'm one of the founders of Drash. In this article, I talk about what Drash is and why I decided to build it with one of my colleagues. Before diving into this article, know that all statements made are by me and all opinions are my own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What is Drash?&lt;/li&gt;
&lt;li&gt;
Why was Drash built?

&lt;ul&gt;
&lt;li&gt;Problem 1: Syntax&lt;/li&gt;
&lt;li&gt;Problem 2: Debugging&lt;/li&gt;
&lt;li&gt;Solutions to the problems&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Drash?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://drash.land/drash"&gt;Drash&lt;/a&gt; is a REST microframework for Deno's HTTP server. It has zero dependencies outside of Deno's Standard Modules. It is designed to help you build your projects quickly -- APIs, SPAs, etc. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why was Drash built?
&lt;/h2&gt;

&lt;p&gt;Before Deno, I used Node and Express. Express was great, but I found issues with the development experience. Mainly, I had issues with the syntax and the time it took to debug issues. More code meant an exponential increase in duplicated code and debugging time. I wasn't a fan of that fact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem 1: Syntax
&lt;/h3&gt;

&lt;p&gt;Take a look at the code below. You might be familiar with the syntax.&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET request received&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST request received&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PUT request received&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DELETE request received&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This syntax is great for small applications. It's not so great for larger applications. I found that a large Express application comes at cost. That cost is the degradation of the developer's experience when writing code. The above code looks great, is easy to write, and helps you get started quickly. However, look at how much code is duplicated.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;req&lt;/code&gt; and &lt;code&gt;res&lt;/code&gt; objects are passed in multiple times for each route you define&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;/&lt;/code&gt; route is defined multiple times&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;app&lt;/code&gt; object is used multiple times&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This led me to ask myself the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why can't the callback function that is passed into the route handler have the &lt;code&gt;req&lt;/code&gt; and &lt;code&gt;res&lt;/code&gt; objects readily available using &lt;code&gt;this.req&lt;/code&gt; and &lt;code&gt;this.res&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Why do I have to keep using &lt;code&gt;app.&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Why do I have to define the &lt;code&gt;/&lt;/code&gt; route one time for each HTTP method?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm lazy and don't want to have to write something multiple times if I don't have to. What I wanted was something like this:&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&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="kd"&gt;get&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="k"&gt;this&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="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET request received&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&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="k"&gt;this&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="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST request received&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;put&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="k"&gt;this&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="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PUT request received&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="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&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="k"&gt;this&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="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DELETE request received&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That syntax looks much better in my opinion and it's easy to write. You take the &lt;code&gt;app&lt;/code&gt; object, define a route, and define the allowed HTTP methods for that route.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem 2: Debugging
&lt;/h3&gt;

&lt;p&gt;In a larger Express application, your filesystem might be split up so that your front-end and back-end are organized in a way to help you identify where code lives. For example, your filesystem might look like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/
|-- assets/
|   |-- js/
|       |-- api.js
|       |-- another-js-file.js
|
|-- views/
|   |-- index.html
|   |-- another-view-file.html
|
|-- src/
|   |-- controllers/
|   |   |-- home-controller.js
|   |   |-- user-controller.js
|   |   |-- order-controller.js
|   |
|   |-- services/
|   |   |-- user-service.js
|   |   |-- order-service.js
|   |
|   |-- routes.js
|
|-- app.js
|-- package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's take the above example code and see why debugging is an issue with it. Inside of &lt;code&gt;api.js&lt;/code&gt;, we see the following code and there's an issue with it:&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="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users/1&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="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&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="c1"&gt;// code to handle the response&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&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="c1"&gt;// code to handle the error&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For some reason, the back-end isn't returning what's expected. So let's take a look at the back-end. All we know is &lt;code&gt;/users/1&lt;/code&gt; is the route we need to start with. So let's go to our &lt;code&gt;routes.js&lt;/code&gt; file and see what controller is mapped to the route. We see the following:&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/users/:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;UserControllerGet&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/users/:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;UserControllerPost&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/users/:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;UserControllerPut&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/users/:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;UserControllerDelete&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok, now we know that the &lt;code&gt;UserControllerGet&lt;/code&gt; function is mapped to the &lt;code&gt;GET /users/:id&lt;/code&gt; route. This looks promising because &lt;code&gt;/users/:id&lt;/code&gt; matches the front-end's API call to &lt;code&gt;/users/1&lt;/code&gt;. Let's go to the &lt;code&gt;UserControllerGet&lt;/code&gt;:&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="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;UserControllerGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getUserDetails&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&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;Now we're at the &lt;code&gt;UserControllerGet&lt;/code&gt; function and see that the response being created comes from &lt;code&gt;userService.getUserDetails()&lt;/code&gt;. So let's go to that file. Actually, let's not. This is too much sifting through code just to figure out where issues are occurring.&lt;/p&gt;

&lt;p&gt;This debugging process led me to ask myself the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do I have to go through this process every time I debug something? I have to look at the front-end API call, match the route to one of the routes defined in the routes file, and then go from there?&lt;/li&gt;
&lt;li&gt;Why can't I just assume &lt;code&gt;/users/*&lt;/code&gt; maps to a single &lt;code&gt;UserController&lt;/code&gt; file and look in that file?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I wanted was to remove the routes file completely and have:&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;// File: user-controller.js&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users/:id&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="kd"&gt;get&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="k"&gt;this&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="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getUserDetails&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&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="nx"&gt;post&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="c1"&gt;// POST code&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;put&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="c1"&gt;// PUT code&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&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="c1"&gt;// DELETE code&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again, you take the &lt;code&gt;app&lt;/code&gt; object, define a route, and define the allowed HTTP methods for that route -- all in a single file.&lt;/p&gt;

&lt;p&gt;So, how would I solve the syntax issues? How would I solve the debugging issues? Should I rewrite my code to make it work the way I want to? I mean, Express is unopinionated, so I could do that, but why not just create something that makes more sense? Why go with controllers? Why can't we go with &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web"&gt;resource&lt;/a&gt;-based logic? Some frameworks (e.g., Laravel) use resources and they kind of make sense. I had so many questions and in the end I decided to plan out a new framework with my colleague: Drash.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution to the problems
&lt;/h3&gt;

&lt;p&gt;Instead of having &lt;code&gt;app.get()&lt;/code&gt;, I figured it'd make sense to have a class with HTTP verbs ...&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;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;MyController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;GET&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="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;POST&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="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;PUT&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="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;DELETE&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;... and then you'd plug this into your application in some way. I wasn't sure at the time, but I figured it'd look something like:&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MyController&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;/path/to/my_controller.ts&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;controllers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;MyController&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;What about the route definitions? Where do those go? I figured it'd be best to have the controller be in charge of the routes clients can use to target the controller. Like so:&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;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;MyController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/my-controller&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/my-controller/:some_param&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;GET&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="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;POST&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="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;PUT&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="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;DELETE&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With "resources" in the back of my mind and its definition, I figured the controller should just be named a resource. This is how they do it in Tonic (the PHP microframework). Everything in Tonic is a resource. Resources are PHP classes; and resources define their own paths. So now we have something like this:&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;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;MyResource&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/my-resource&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/my-resource/:some_param&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;GET&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="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;POST&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="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;PUT&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="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;DELETE&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This looks great! Also, it solves the debugging issue. If I had a front-end that called &lt;code&gt;/my-resource/something&lt;/code&gt;, I would already know to go &lt;code&gt;MyResource&lt;/code&gt; because the URI should be mapped to a &lt;code&gt;MyResource&lt;/code&gt; resource. Same thing goes for a &lt;code&gt;/users&lt;/code&gt; API call. &lt;code&gt;/users&lt;/code&gt; should map to a &lt;code&gt;UsersResource&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What about the &lt;code&gt;req&lt;/code&gt; and &lt;code&gt;res&lt;/code&gt; objects? I figured it'd be best to instantiate a resource class and pass in the &lt;code&gt;req&lt;/code&gt; and &lt;code&gt;res&lt;/code&gt; objects in its constructor. That would give all of the resource class' methods access to the &lt;code&gt;req&lt;/code&gt; and &lt;code&gt;res&lt;/code&gt; objects without having to pass them in like in Express. This would also mean a &lt;code&gt;BaseResource&lt;/code&gt; class would need to be used so that the resource classes that developers define wouldn't require the constructor. So, now we have something like this:&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="c1"&gt;// File: base_resource.ts&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;BaseResource&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// File: my_resource.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BaseResource&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;/path/to/base_resource.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;MyResource&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;BaseResource&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/my-resource&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/my-resource/:some_param&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;POST&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="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;PUT&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="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;DELETE&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You might notice the change of the &lt;code&gt;req&lt;/code&gt; and &lt;code&gt;res&lt;/code&gt; names to &lt;code&gt;request&lt;/code&gt; and &lt;code&gt;response&lt;/code&gt;. I believe we should be explicit in our code so that newcomers don't question things like variable names.&lt;/p&gt;

&lt;p&gt;After a few months of developing around the definition of &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web"&gt;resources&lt;/a&gt; with the syntax being the first thing considered (for a better developer experience), Drash was born. Originally, it was developed with an Express-like syntax, but maintaining that was a nightmare. This was especially true when trying to handle &lt;code&gt;this.request&lt;/code&gt; and &lt;code&gt;this.response&lt;/code&gt; in chained functions. So, Drash was forced to be different, and I think that's ok because most of its logic is backed by definitions in the MDN.&lt;/p&gt;

&lt;p&gt;Hope you enjoyed reading this! I figured it'd be nice to give some insight into Drash.&lt;/p&gt;

&lt;p&gt;-- Eric&lt;/p&gt;

</description>
      <category>deno</category>
      <category>drash</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>New Drash Tutorial Videos!</title>
      <dc:creator>Drash Land</dc:creator>
      <pubDate>Sat, 11 Jul 2020 01:55:48 +0000</pubDate>
      <link>https://dev.to/drash_land/new-drash-tutorial-videos-1c58</link>
      <guid>https://dev.to/drash_land/new-drash-tutorial-videos-1c58</guid>
      <description>&lt;p&gt;Today, Edward and Eric made videos on serving static paths and handling application/x-www-form-urlencoded request bodies in Drash. Have a look!&lt;/p&gt;

&lt;p&gt;Don't know what Drash is? Drash is a REST microframework for Deno's HTTP server. Start your journey here: &lt;a href="https://drash.land"&gt;https://drash.land&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Serving Static Paths
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/oTH8WZbRC8w"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling URL Encoded Bodies
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/bsvEy5uEo1I"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>deno</category>
      <category>drash</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
