Files
website/blog.html
github-actions[bot] 6ba2fc60c6 deploy: 63ba2ac1e0
2024-04-27 18:49:48 +00:00

324 lines
133 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" dir="ltr" class="blog-wrapper blog-list-page plugin-blog plugin-id-default" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.0.0">
<title data-rh="true">Blog | sern - Handlers. Redefined.</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://sern.dev/img/logo.png"><meta data-rh="true" property="og:url" content="https://sern.dev/blog"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="og:title" content="sern - Handlers. Redefined."><meta data-rh="true" name="og:description" content="A modular, customizable, fast Discord.js framework to streamline bot development"><meta data-rh="true" name="og:url" content="https://sern.dev"><meta data-rh="true" name="og:type" content="website"><meta data-rh="true" name="twitter:site" content="@sern-handler"><meta data-rh="true" property="og:image:alt" content="sernlogo"><meta data-rh="true" name="twitter:title" content="sern - Handlers. Redefined."><meta data-rh="true" name="twitter:description" content="A modular, customizable, fast Discord.js framework to streamline bot development"><meta data-rh="true" name="keywords" content="discord, bot, handler, framework, documentation, sern"><meta data-rh="true" name="twitter:image" content="https://sern.dev/img/logo.png"><meta data-rh="true" name="twitter:url" content="https://sern.dev"><meta data-rh="true" property="og:image:height" content="512"><meta data-rh="true" property="og:image:width" content="1024"><meta data-rh="true" name="theme-color" content="#F25186"><meta data-rh="true" property="og:title" content="Blog | sern - Handlers. Redefined."><meta data-rh="true" name="description" content="Blog"><meta data-rh="true" property="og:description" content="Blog"><meta data-rh="true" name="docusaurus_tag" content="blog_posts_list"><meta data-rh="true" name="docsearch:docusaurus_tag" content="blog_posts_list"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://sern.dev/blog"><link data-rh="true" rel="alternate" href="https://sern.dev/blog" hreflang="en"><link data-rh="true" rel="alternate" href="https://sern.dev/blog" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://AA9S5J9NYT-dsn.algolia.net" crossorigin="anonymous"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="sern - Handlers. Redefined. RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="sern - Handlers. Redefined. Atom Feed">
<link rel="search" type="application/opensearchdescription+xml" title="sern - Handlers. Redefined." href="/opensearch.xml">
<link rel="preconnect" href="https://analytics.srizan.dev">
<script async defer="defer" src="https://analytics.srizan.dev/ua.js" data-website-id="e82ff65c-b08f-47b5-8e74-5c31cbcec0ad" data-auto-track data-do-not-track data-cache data-domains="sern.dev"></script><link rel="stylesheet" href="/assets/css/styles.3470ab60.css">
<script src="/assets/js/runtime~main.5923e3ac.js" defer="defer"></script>
<script src="/assets/js/main.b596629f.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/favicon.ico" alt="logo logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/img/favicon.ico" alt="logo logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">Home</b></a><a class="navbar__item navbar__link" href="/docs/intro">Docs &amp; Guide</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/blog">Blog</a><a class="navbar__item navbar__link" href="/sponsors">Sponsor</a><a class="navbar__item navbar__link" href="/plugins">Plugins</a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/sern-handler" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="Blog recent posts navigation"><div class="sidebarItemTitle_pO2u margin-bottom--md">Recent posts</div><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/railway-deploy">Deploying sern with Railway</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/newlogo">New logo!</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/3.0.0">Release 3.0.0</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/2.5.0">Release 2.5.0</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/2.0.0">Release 2.0.0</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/getting-started">How to get started with sern!</a></li><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/1.2.0">Release 1.2.0</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="https://schema.org/Blog"><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="In this guide, I&#x27;ll be showing you how to deploy your sern bot with Railway."><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/railway-deploy">Deploying sern with Railway</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2024-02-23T00:00:00.000Z" itemprop="datePublished">February 23, 2024</time> · <!-- -->2 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/DuroCodes" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/DuroCodes.png" alt="Duro" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/DuroCodes" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Duro</span></a></div><small class="avatar__subtitle" itemprop="description">Developer</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p>In this guide, I&#x27;ll be showing you how to deploy your sern bot with <a href="https://railway.app/" target="_blank" rel="noopener noreferrer">Railway</a>.</p>
<p>This guide assumes you have a sern bot already set up and ready to deploy. If you don&#x27;t, you can follow the <a href="/blog/getting-started">Getting Started</a> guide to set up your bot.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="github-repository">GitHub Repository<a href="#github-repository" class="hash-link" aria-label="Direct link to GitHub Repository" title="Direct link to GitHub Repository"></a></h2>
<p>The first thing you&#x27;ll need to deploy your bot is a GitHub repository for your bot. If you don&#x27;t have one, you can create one by following the <a href="https://docs.github.com/en/get-started/quickstart/create-a-repo" target="_blank" rel="noopener noreferrer">GitHub guide</a>.</p>
<p>Once you have your repository set up, you can push your bot&#x27;s code to the repository, and you&#x27;re ready to deploy using Railway.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="railway-setup">Railway Setup<a href="#railway-setup" class="hash-link" aria-label="Direct link to Railway Setup" title="Direct link to Railway Setup"></a></h2>
<p>After you have your bot&#x27;s code in a GitHub repository, you&#x27;ll need to create an account on Railway. You can sign up using your GitHub account at <a href="https://railway.app/" target="_blank" rel="noopener noreferrer">railway.app</a>.</p>
<p>Once you&#x27;ve created your account, navigate to the <a href="https://railway.app/dashboard" target="_blank" rel="noopener noreferrer">dashboard</a> and click the &quot;New Project&quot; button. Click the &quot;Deploy from GitHub repo&quot; button, and select your bot&#x27;s repository.</p>
<p>Once you&#x27;ve selected your repository, click the &quot;Add Variables&quot; button to add your bot&#x27;s environment variables. You&#x27;ll need your environment variables from your <code>.env</code> file to add to Railway. (You can also add these later if you want.)</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="deploy">Deploy<a href="#deploy" class="hash-link" aria-label="Direct link to Deploy" title="Direct link to Deploy"></a></h2>
<p>Once you&#x27;ve added your environment variables, click the &quot;Deploy&quot; button, and Railway will start deploying your bot. Once the deployment is complete, you&#x27;ll be able to see your bot&#x27;s URL and logs.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Make sure you add your environment variables, and your node start script is correct in your <code>package.json</code> file.</p><p>If you have any issues deploying your bot, you can check the logs for any errors.</p></div></div>
<p>That&#x27;s it! Your bot is now deployed and running on Railway. If you have any issues or questions, feel free to ask in the <a href="https://sern.dev/discord" target="_blank" rel="noopener noreferrer">sern Discord server</a>.</p></div><footer class="row docusaurus-mt-lg"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/guides">guides</a></li></ul></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="Hey everyone! Today we have very special news for you all: We&#x27;re changing our logo!"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/newlogo">New logo!</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2023-07-04T00:00:00.000Z" itemprop="datePublished">July 4, 2023</time> · <!-- -->One min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/sern-handler" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/sernbot.png" alt="sern Team" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/sern-handler" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">sern Team</span></a></div></div></div></div></div></header><div class="markdown" itemprop="articleBody"><p>Hey everyone! Today we have very special news for you all: We&#x27;re changing our logo!</p>
<p>You see, on today&#x27;s standards, having a simple logo is essential. Our logo aligns perfectly with these design principles but it can always be improved.<br>
We were chilling, you know, cooking sern handler v3, sern gui, <code>npm create @sern/bot</code> and serncord when we thought about changing the logo to a sleek design with less colors.<br>
And here we are!</p>
<h1>Who did our new branding?</h1>
<p><a href="https://github.com/Murtatrxx" target="_blank" rel="noopener noreferrer">Ropox</a>!<br>
Bro&#x27;s the GOAT. This website is maintained by him, the domain costs are funded by him and also he started brainstorming how the logo would be on paper:<br>
<img loading="lazy" src="/assets/images/paperprototypes-cd697eaefd7ac467f2385dd119f6d78c.jpg" width="3024" height="4032" class="img_ev3q">
And there it all clicked:<br>
<img loading="lazy" src="/assets/images/paperlogo-41a5e76b2d3249b59105ee88f01f202b.png" width="830" height="455" class="img_ev3q">
seren tried by the way!
<img loading="lazy" src="/assets/images/serentried-2bcee1b2fda9864408e52072821d995f.png" width="908" height="509" class="img_ev3q"></p>
<h1>Anyways, here it is:</h1>
<p><img loading="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAPoCAYAAABNo9TkAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAABYxSURBVHgB7d1NjlxXGYDhc+MgiJi0JRbQO8BZQcwKaK8gyQpwhjgD2wPbYkSyAswKaFaAvQL3EooxstxDEElfqtxGDBmB33vP80itKvW4VFVvfednDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD6qZQBM6u3Fi3UAAP8Xx/C4HmM9HJ9dHz+AD6fnN2N5/en4+9Xdy6fXAxDowLwEOgA0HKPkcPxQfrWO9c93xj9eCXZmJdCBaQl0AMh6eYr1X1w+uhwwEYEOTEugA0DbabK+jPXJ8dnru5e/PQzYuU8GAABA0PGX9PObsRyn6eMvxx/WnwzYORN0YFom6ACwLf+eqN+9fPTHATsk0IFpCXQA2KZjpF8uY/nGsnf2xhJ3AABgU9axXNyM9c27i+dfDtgRgQ4AAGzQcnban/724sXvB+yEJe7AtCxxB4B9WMZ6tYzlgSXvbJ0JOgAAsGnrWO6dTnp/d/HifMCGCXQAAGDzTleyiXS2TqADAAC7INLZOoEOAADshkhnywQ6AACwK7eRvv7p3cXjswEbItABAIDdOR0cdzN+9njAhgh0AABgrx6+vXj+cMBGCHQAAGDPHtuPzlYIdAAAYMeWs3WMPwzYAIEOAADs2jHQ77+7eP7lgDiBDgAA7N46lidOdadOoAMAALt3unrtZvz0NwPCBDoAADCLh6bolAl0AABgEsuZKTplAh0AAJiJe9HJEugAAMBElrO/Xby4PyBIoAMAAFO5M1bL3EkS6AAAwFRu70V3WBw9Ah0AAJjMcvbj8tkXA2IEOgAAMJ1lvbk/IEagAwAAE1ouBsQIdAAAYEbn9qFTI9ABAIAp2YdOjUAHAACmtKzjfECIQAcAACa13hsQItABAIAprcMEnRaBDgAATGkR6MQIdAAAAAgQ6AAAwKzOB4QIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+G+WASHnn3+7DgBgSoc3z3w3Bab2yQAAAAA+OoEOAAAAAQIdAAAAAgQ6AAAABAh0AAAAGB+fQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdAAAAAgQ6AAAABAg0AEAACBAoAMAAECAQAcAAIAAgQ4AAAABAh0AAAACBDoAAAAECHQAAAAIEOgAAAAQINABAAAgQKADAABAgEAHAACAAIEOAAAAAQIdAAAAAgQ6AAAABAh0AAAACBDoAAAAECDQAQAAIECgAwAAQIBABwAAgACBDgAAAAECHQAAAAIEOgAAAAQIdGLWwwAAAJiQQAcAAIAAgU7MchgAAAATEui0rOMwAAAAJiTQiVmuBgAAwIQEOjV/HQAAABMS6MTceTUAAAAmJNBJOVw9vXbVGgAAMCOBTs+6XA4AAIDJCHSCltcDAABgMgKdoNM+9OV6AAAATESgk/N+H/p682oAAABMRKATtXw/AAAAJiLQSTpcPXtlmTsAADATgU7XevPdAAAAmIRAJ+wn35uiAwAAsxDoZH04LM4UHQAAmIJAJ+40RV8PAwAAYOcEOmm3U/TxdAAAAOycQCfvcPX85fHh1QAAANgxgc42rD987cA4AABgzwQ6m3C4+t1hrKul7gAAwG4JdDbjcPXsu7EOp7oDAAC7JNDZmE9PU/SrAQAAsDMCnU25PdX9hweuXgMAAPZGoLM5t/vRf/yVSAcAAPZEoLNJIh0AANgbgc5miXQAAGBPBDqb9p9Id3AcAACwbQKdzTtF+uHNs89dwQYAAGyZQGc3DlfPvhnr+vUYy/UAAADYGIHOrhyunr8c6z+P0/T1cgAAAGyIQGd33i95v3r+4Haa7gA5AABgG5YBO3d+79Hj4yv9q+PL/XwAAFmHN898NwWmZoLO7h2n6U/fn/Ruog4AAIT5lZLpnN/79tfHUL8Yy/LVAAAyTNCB2XkTZFrn9x6ejfHzL25jfdy3BB4APi6BDszOmyB88D7Yl89+Odbl/odYP/0d//fhEQD4nxLoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACz+xe+xzYG5IBdhQAAAA5lWElmTU0AKgAAAAgAAAAAAAAA0lOTAAAAAElFTkSuQmCC" width="1000" height="1000" class="img_ev3q"></p>
<p>Pretty nice!</p>
<p>By the way, we have animations and variations on the way, so make sure to stay updated in the <a href="https://sern.dev/discord" target="_blank" rel="noopener noreferrer">discord server</a>!</p>
<h1>Finally, from the entire sern team, thank you for sticking around ❤️</h1></div><footer class="row docusaurus-mt-lg"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/branding">branding</a></li></ul></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="3.0 Release"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/3.0.0">Release 3.0.0</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2023-06-18T00:00:00.000Z" itemprop="datePublished">June 18, 2023</time> · <!-- -->3 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/jacoobes" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/jacoobes.png" alt="jacoobes" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/jacoobes" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">jacoobes</span></a></div><small class="avatar__subtitle" itemprop="description">Head Dev</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><h2 class="anchor anchorWithStickyNavbar_LWe7" id="30-release">3.0 Release<a href="#30-release" class="hash-link" aria-label="Direct link to 3.0 Release" title="Direct link to 3.0 Release"></a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="join-our-discord-">Join our <a href="https://sern.dev/discord" target="_blank" rel="noopener noreferrer">discord</a> <br><a href="#join-our-discord-" class="hash-link" aria-label="Direct link to join-our-discord-" title="Direct link to join-our-discord-"></a></h3>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features"></a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="dependency-management">Dependency Management<a href="#dependency-management" class="hash-link" aria-label="Direct link to Dependency Management" title="Direct link to Dependency Management"></a></h4>
<ul>
<li><code>Service</code> API (recommended to use this over useContainer hooks)
<ul>
<li>Dependencies type must be globally augmented in order for Services api to function properly</li>
</ul>
</li>
<li>new methods on ModuleManager
<ul>
<li>getPublishableCommands()</li>
</ul>
</li>
<li>Init Hooks
<ul>
<li>implement starting behavior for dependencies</li>
<li>To enforce and type check this, use the <code>Initializable</code> type when making your Dependencies type!</li>
</ul>
</li>
<li>Emitter interface
<ul>
<li>More generic interface to define any event emitter</li>
<li>You can now swap out the SernEmitter with whatever emitter now.</li>
</ul>
</li>
</ul>
<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(17, 17, 17)">DatabaseService</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">implements</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(17, 17, 17)">Init</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">//some hypothetical database</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> _pgsql </span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">database</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">async</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">init</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">await</span><span class="token plain"> _pgsql</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">load</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">makeDependencies</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(153, 76, 195);font-style:italic">build</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> root </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> root</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">add</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> db</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(17, 17, 17)">DatabaseService</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">//will be init&#x27;ed automatically</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li>new SernEmitter event <code>modulesLoaded</code> , which allows users to customize behavior after all modules are loaded!</li>
</ul>
<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">default</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">eventModule</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> name</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;modulesLoaded&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> type</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> EventType</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Sern</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(153, 76, 195);font-style:italic">execute</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token builtin" style="color:rgb(72, 118, 214)">console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">log</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;All modules loaded&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="quality-of-life">Quality of Life<a href="#quality-of-life" class="hash-link" aria-label="Direct link to Quality of Life" title="Direct link to Quality of Life"></a></h4>
<ul>
<li>
<p>faster module loading</p>
<ul>
<li>I utilize async generators for reading files now. A lot faster than the first iteration.</li>
</ul>
</li>
<li>
<p>better error handling</p>
</li>
<li>
<p>Less boilerplate</p>
<ul>
<li>Services api cleans up v2 boilerplate</li>
</ul>
</li>
<li>
<p>class modules devex got upgraded and work better than before</p>
</li>
<li>
<p>automatically ignore any files not ending in (mts, cts, mjs, cjs, ts, js)</p>
<ul>
<li>ignore commands and events with <code>!</code> prefix on filename or directory (ie: <code>!filename.ts</code> or <code>!directory</code> will be ignored by sern)</li>
</ul>
</li>
<li>
<p><code>Service</code> API (recommended to use this over useContainer hooks)</p>
<ul>
<li>Dependencies type must be globally augmented in order for Services api to function properly</li>
</ul>
</li>
<li>
<p>Less boilerplate</p>
</li>
<li>
<p>new methods on ModuleManager</p>
</li>
<li>
<p>automatically ignore any files not ending in (mts, cts, mjs, cjs, ts, js)</p>
<ul>
<li>ignore commands / events with <code>!</code> prefix on filename or directory (ie: <code>!filename.ts</code> or <code>!directory</code>)</li>
</ul>
</li>
<li>
<p>new SernEmitter event <code>modulesLoaded</code> , which allows users to customize behavior after all modules are loaded!</p>
</li>
<li>
<p>Init Hooks</p>
<ul>
<li>implement starting behavior for dependencies</li>
</ul>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="experimental">Experimental<a href="#experimental" class="hash-link" aria-label="Direct link to Experimental" title="Direct link to Experimental"></a></h3>
<ul>
<li>Experimental things may be subject to removal, need feedback and are not guaranteed stable</li>
<li>dev / prod mode
<ul>
<li>sern will behave differently depending on mode set</li>
</ul>
</li>
<li>init sern from <code>file</code> option
<ul>
<li>reads from local sern.config.json</li>
</ul>
</li>
</ul>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token maybe-class-name">Sern</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token method function property-access" style="color:rgb(153, 76, 195);font-style:italic">init</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;file&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"> </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking changes<a href="#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes"></a></h3>
<ul>
<li>Sern.makeDependencies -&gt; makeDependencies
<ul>
<li>it is asynchronous and top level function now. Make sure to await it before initing for proper synchronization.</li>
</ul>
</li>
<li>module store and manager internally changed, so those using them may recieve breaking changes</li>
<li>BaseOptions type removed</li>
</ul>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">- Sern.makeDependencies({ build: () =&gt; {} })</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ await makeDependencies({ build: () =&gt; {} })</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="deprecations">Deprecations<a href="#deprecations" class="hash-link" aria-label="Direct link to Deprecations" title="Direct link to Deprecations"></a></h3>
<ul>
<li>Removed all previous marked deprecations in v3</li>
<li>ModuleStore will be removed as a dependency in v4. The only way to access modules should be through ModuleManager</li>
<li>Default Dependencies will be made internal in the v4. Users should only have access to its interface / contract</li>
</ul></div><footer class="row docusaurus-mt-lg"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/release">release</a></li></ul></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="2.5 Release"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/2.5.0">Release 2.5.0</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2023-01-12T00:00:00.000Z" itemprop="datePublished">January 12, 2023</time> · <!-- -->One min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/jacoobes" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/jacoobes.png" alt="jacoobes" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/jacoobes" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">jacoobes</span></a></div><small class="avatar__subtitle" itemprop="description">Head Dev</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><h2 class="anchor anchorWithStickyNavbar_LWe7" id="25-release">2.5 Release<a href="#25-release" class="hash-link" aria-label="Direct link to 2.5 Release" title="Direct link to 2.5 Release"></a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="join-our-discord-">Join our <a href="https://sern.dev/discord" target="_blank" rel="noopener noreferrer">discord</a> <br><a href="#join-our-discord-" class="hash-link" aria-label="Direct link to join-our-discord-" title="Direct link to join-our-discord-"></a></h3>
<ul>
<li>Thank you for using sern in your projects. It&#x27;s only going to get better!</li>
<li>I apologize for the sudden small breaking change. After this update, there won&#x27;t be any for a while.
Wow! We&#x27;re increasing our semantic versioning by <code>+0.3.9</code> <br>
What does this mean?</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking changes<a href="#breaking-changes" class="hash-link" aria-label="Direct link to Breaking changes" title="Direct link to Breaking changes"></a></h3>
<ul>
<li><a href="/docs/api/modules#controller">controller</a> parameter for plugins has been removed
<ul>
<li>You&#x27;ll need to import it instead</li>
<li>This <strong>breaks</strong> old <a href="/docs/api/interfaces/CommandPlugin">CommandPlugin</a>, but <strong>not</strong> old <a href="/docs/api/interfaces/EventPlugin">EventPlugin</a></li>
</ul>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="deprecations">Deprecations<a href="#deprecations" class="hash-link" aria-label="Direct link to Deprecations" title="Direct link to Deprecations"></a></h3>
<ul>
<li><a href="/docs/api/interfaces/CommandPlugin">CommandPlugin</a> and <a href="/docs/api/interfaces/EventPlugin">EventPlugin</a> have been renamed <a href="/docs/api/interfaces/InitPlugin">InitPlugin</a> and <a href="/docs/api/interfaces/ControlPlugin">ControlPlugin</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="reason">Reason<a href="#reason" class="hash-link" aria-label="Direct link to Reason" title="Direct link to Reason"></a></h3>
<ul>
<li>The naming of plugins was getting too complex. For example, plugin naming evolved into CommandModuleCommandPlugin, CommandModuleEventPlugin and more.</li>
<li>I realize that this affects all plugins. I have updated all <a href="https://github.com/sern-handler/awesome-plugins/pull/68" target="_blank" rel="noopener noreferrer">plugins</a> to match these changes</li>
<li>The old way of declaring plugins has been deprecated in favor of newer functions that facilitate and ease typings
<ul>
<li><a href="/docs/api/modules#commandcontrolplugin">CommandControlPlugin</a></li>
<li><a href="/docs/api/modules#commandinitplugin">CommandInitPlugin</a></li>
<li><a href="/docs/api/modules#eventcontrolplugin">EventControlPlugin</a></li>
<li><a href="/docs/api/modules#eventinitplugin">EventInitPlugin</a></li>
<li><a href="/docs/api/modules#discordeventcontrolplugin">DiscordEventControlPlugin</a>
This will probably be the last breaking change in a while. Thanks for using sern!</li>
</ul>
</li>
</ul></div><footer class="row docusaurus-mt-lg"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/release">release</a></li></ul></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="2.0 Release"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/2.0.0">Release 2.0.0</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2022-12-13T00:00:00.000Z" itemprop="datePublished">December 13, 2022</time> · <!-- -->4 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/jacoobes" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/jacoobes.png" alt="jacoobes" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/jacoobes" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">jacoobes</span></a></div><small class="avatar__subtitle" itemprop="description">Head Dev</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><h2 class="anchor anchorWithStickyNavbar_LWe7" id="20-release">2.0 Release<a href="#20-release" class="hash-link" aria-label="Direct link to 2.0 Release" title="Direct link to 2.0 Release"></a></h2>
<p>Join our <a href="https://sern.dev/discord" target="_blank" rel="noopener noreferrer">discord</a>! <br>
Wow! We&#x27;re finally increasing our semantic versioning by +<code>1.7.9.</code> <br>
What does this mean?</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="plugin-support-for-event-modules">Plugin Support for Event Modules<a href="#plugin-support-for-event-modules" class="hash-link" aria-label="Direct link to Plugin Support for Event Modules" title="Direct link to Plugin Support for Event Modules"></a></h3>
<p>You can now use plugins for event modules. Previous version would throw an error if the
<code>plugins</code> field was populated.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">commandPlTest</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> SernEmitterPlugin </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> type</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> PluginType</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Command</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(153, 76, 195);font-style:italic">execute</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"> mod</span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> controller</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">if</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">mod</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">name </span><span class="token operator" style="color:rgb(12, 150, 155)">===</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;module.register&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token builtin" style="color:rgb(72, 118, 214)">console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">log</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;Event Module created correctly&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> controller</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">next</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token builtin" style="color:rgb(72, 118, 214)">console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">log</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;event name is wrong&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">return</span><span class="token plain"> controller</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">stop</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Applying this plugin to some <code>eventModule</code>:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">default</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">eventModule</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> name</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;error&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> type</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> EventType</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Sern</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> plugins</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">commandPlTest</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">execute</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token builtin" style="color:rgb(72, 118, 214)">console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">log</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">m</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="dependency-injection-and-decoupling">Dependency Injection and Decoupling<a href="#dependency-injection-and-decoupling" class="hash-link" aria-label="Direct link to Dependency Injection and Decoupling" title="Direct link to Dependency Injection and Decoupling"></a></h2>
<p>The powerful npm package <code>iti</code> decouples sern even more.
Decoupling data structures with the Inversion of Control pattern separates data from logic, which will help speed production
and make sern even more customizable than before.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-do-i-start">How do I start?<a href="#how-do-i-start" class="hash-link" aria-label="Direct link to How do I start?" title="Direct link to How do I start?"></a></h3>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_Ktv7">src/index.ts</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">//With typescript, you can customize / augment your typings.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">interface</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(17, 17, 17)">MyDependencies</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">extends</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(17, 17, 17)">Dependencies</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token string-property property" style="color:rgb(12, 150, 155)">&#x27;@sern/client&#x27;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> Singleton</span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token plain">Client</span><span class="token operator" style="color:rgb(12, 150, 155)">&gt;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token string-property property" style="color:rgb(12, 150, 155)">&#x27;@sern/logger&#x27;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> Singleton</span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token plain">DefaultLogging</span><span class="token operator" style="color:rgb(12, 150, 155)">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">const</span><span class="token plain"> useContainer </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> Sern</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token generic-function function" style="color:rgb(153, 76, 195);font-style:italic">makeDependencies</span><span class="token generic-function generic class-name operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token generic-function generic class-name" style="color:rgb(17, 17, 17)">MyDependencies</span><span class="token generic-function generic class-name operator" style="color:rgb(12, 150, 155)">&gt;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">// exclude: new Set([&#x27;@sern/logger&#x27;]), don&#x27;t autofill optional dependencies</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(153, 76, 195);font-style:italic">build</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> root </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> root</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">add</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"> </span><span class="token string-property property" style="color:rgb(12, 150, 155)">&#x27;@sern/client&#x27;</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">single</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">client</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">add</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"> </span><span class="token string-property property" style="color:rgb(12, 150, 155)">&#x27;@sern/logger&#x27;</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">single</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token keyword" style="color:rgb(12, 150, 155)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(17, 17, 17)">DefaultLogging</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">Sern</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">init</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> defaultPrefix</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;!&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">// removing defaultPrefix will shut down text commands</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> commands</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;src/commands&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">// events: &#x27;src/events&#x27; (optional),</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> containerConfig </span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> get</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> useContainer </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">//pass in your dependency getter here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Using the <code>Sern#makeDependencies</code> function, inject your dependencies.
We&#x27;ll use specific dependencies that are created with the <code>@sern/keyword</code>
key.
Using typescript to display all <code>keywords</code> and what they represent:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">interface</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(17, 17, 17)">Dependencies</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token string-property property" style="color:rgb(12, 150, 155)">&#x27;@sern/client&#x27;</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> Singleton</span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token plain">EventEmitter</span><span class="token operator" style="color:rgb(12, 150, 155)">&gt;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">//Discord Client</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;@sern/logger&#x27;</span><span class="token operator" style="color:rgb(12, 150, 155)">?</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> Singleton</span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token plain">Logging</span><span class="token operator" style="color:rgb(12, 150, 155)">&gt;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">//Logger</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token string-property property" style="color:rgb(12, 150, 155)">&#x27;@sern/emitter&#x27;</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> Singleton</span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token plain">SernEmitter</span><span class="token operator" style="color:rgb(12, 150, 155)">&gt;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">//SernEmitter</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token string-property property" style="color:rgb(12, 150, 155)">&#x27;@sern/store&#x27;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> Singleton</span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token plain">ModuleStore</span><span class="token operator" style="color:rgb(12, 150, 155)">&gt;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">//Stores all Command Modules</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token string-property property" style="color:rgb(12, 150, 155)">&#x27;@sern/modules&#x27;</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> Singleton</span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token plain">ModuleManager</span><span class="token operator" style="color:rgb(12, 150, 155)">&gt;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">//Manages Modules</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token string-property property" style="color:rgb(12, 150, 155)">&#x27;@sern/errors&#x27;</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> Singleton</span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token plain">ErrorHandling</span><span class="token operator" style="color:rgb(12, 150, 155)">&gt;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(152, 159, 177);font-style:italic">//A Lifetime / Crash Handler</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>danger</div><div class="admonitionContent_BuS1"><p>Sern#addExternal has been deprecated and removed in favor of Sern#makeDependencies</p></div></div>
<p>At the moment, one optional dependency, <code>@sern/logger</code>, exists. If not added explicitly,
we&#x27;ll <strong>autofill</strong> with a <a href="https://sern.dev/docs/api/classes/defaultlogging" target="_blank" rel="noopener noreferrer">DefaultLogger</a>.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>If you don&#x27;t want a logger, add it to the
<code>exclude</code> field while composing dependencies.</p></div></div>
<p>Use your generated dependency getter <code>useContainer</code> (use whatever name you want), access them
from anywhere.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>the function <a href="https://sern.dev/docs/api/modules#usecontainerraw" target="_blank" rel="noopener noreferrer">useContainerRaw</a> is provided for direct access to dependencies and the internal
data structure. Use this wisely as no guarantees are made and crashes can happen.</p></div></div>
<p>The <code>build</code> field follows <a href="https://itijs.org/docs/quick-start#usage" target="_blank" rel="noopener noreferrer">createContainer</a> function call.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="new-commandtypes">New CommandTypes<a href="#new-commandtypes" class="hash-link" aria-label="Direct link to New CommandTypes" title="Direct link to New CommandTypes"></a></h2>
<p>2.0 includes all the new role select menus. <code>CommandType.MenuSelect</code> has been renamed into
<code>CommandType.StringSelect</code>. The remaining SelectMenus are
<code>CommandType.RoleSelect</code>, <code>CommandType.ChannelSelect</code>, <code>CommandType.UserSelect</code>, <code>CommandType.MentionableSelect</code></p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_Ktv7">commands/roleselect.ts</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">default</span><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">commandModule</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> type</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> CommandType</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">RoleSelect</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">execute</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> ctx</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">reply</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;role select&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>In addition, commandModules with ContextMenus have been renamed.</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">- CommandType.MenuUser, CommandType.MenuMsg </span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ CommandType.CtxUser, CommandType.CtxMsg</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="typings-simplification">Typings Simplification<a href="#typings-simplification" class="hash-link" aria-label="Direct link to Typings Simplification" title="Direct link to Typings Simplification"></a></h2>
<p>Pre 2.0:
<img loading="lazy" src="https://cdn.discordapp.com/attachments/820348341358952550/1038577974829666386/image.png" class="img_ev3q">
<br> <br> <br>
Post 2.0:
<br>
<img loading="lazy" src="https://cdn.discordapp.com/attachments/820348341358952550/1052623728489550015/image.png" class="img_ev3q"></p>
<p>CommandPlugin&lt;T&gt; and EventPlugin&lt;T&gt; typings have also been static&#x27;ified, transformed from types to interfaces</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="breaking-changes">Breaking Changes<a href="#breaking-changes" class="hash-link" aria-label="Direct link to Breaking Changes" title="Direct link to Breaking Changes"></a></h2>
<img loading="lazy" src="https://img.srizan.dev/Discord_z8Sn1UBfEe.png" class="img_ev3q">
<br>
All deprecation warnings from previous versions have taken effect, and are removed in 2.0.
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">- type Module = EventModule | CommandModule</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ type AnyModule = EventModule | CommandModule</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">-export type SpreadParams&lt;T extends (...args: never) =&gt; unknown&gt; = (</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">- args: Parameters&lt;T&gt;[number],</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">- ) =&gt; unknown;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Override type has been removed due to redundancy</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">- discord.js : 14.5</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ discord.js : 14.7</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">-typescript: 4.7</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ typescript: 4.9</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">+ interface Wrapper {</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ readonly defaultPrefix?: string;</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ readonly commands: string;</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ readonly events?: string;</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ readonly containerConfig : {</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ get: (...keys: (keyof Dependencies)[]) =&gt; unknown[];</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ }</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+}</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">- interface Wrapper {</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">- readonly client: Client;</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">- readonly sernEmitter?: SernEmitter;</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">- readonly defaultPrefix?: string;</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">- readonly commands: string;</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">- readonly events?:</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">- | string</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">- | { mod: EventModule; absPath: string }[]</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">- | (() =&gt; { mod: EventModule; absPath: string }[]);</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">-}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">+ DefaultLogger</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ DefaultModuleManager</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ SernEmitter</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ DefaultErrorHandling</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ type Singleton&lt;T&gt; = () =&gt; T</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ type Transient&lt;T&gt; = () =&gt; () =&gt; T; </span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ type LogPayload&lt;T = unknown&gt; = { message: T }</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ export const single = &lt;T&gt;() =&gt; T</span><br></span><span class="token-line" style="color:#403f53"><span class="token plain">+ export const many = &lt;T&gt;() =&gt; () =&gt; T</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Including the previous section, some names to symbols and data structures were altered to
be better represented. view <a href="/404.html">changelog</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="context-refactoring">Context refactoring<a href="#context-refactoring" class="hash-link" aria-label="Direct link to Context refactoring" title="Direct link to Context refactoring"></a></h2>
<p>The context data structure has been internally altered to represent its dynamics better.</p></div><footer class="row docusaurus-mt-lg"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/release">release</a></li></ul></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="Hello everyone!"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/getting-started">How to get started with sern!</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2022-09-30T00:00:00.000Z" itemprop="datePublished">September 30, 2022</time> · <!-- -->2 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/SrIzan10" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/SrIzan10.png" alt="Sr Izan" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/SrIzan10" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Sr Izan</span></a></div><small class="avatar__subtitle" itemprop="description">Developer</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><h2 class="anchor anchorWithStickyNavbar_LWe7" id="hello-everyone">Hello everyone!<a href="#hello-everyone" class="hash-link" aria-label="Direct link to Hello everyone!" title="Direct link to Hello everyone!"></a></h2>
<p>I&#x27;m Sr Izan, your fellow user and contributor.</p>
<p>Today I&#x27;m going to show you how to get started with sern and all its cool features.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="step-1-install-the-cli">Step 1: Install the CLI.<a href="#step-1-install-the-cli" class="hash-link" aria-label="Direct link to Step 1: Install the CLI." title="Direct link to Step 1: Install the CLI."></a></h3>
<p>Install the CLI:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">npm i -g @sern/cli</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>and then run</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">sern init</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can also run <code>sern init -y</code> if you want to use the default options.</p></div></div>
<p>The CLI is written in Typescript and open-sourced on <a href="https://github.com/sern-handler/cli" target="_blank" rel="noopener noreferrer">Github</a>. (thanks <a href="https://github.com/EvolutionX-10" target="_blank" rel="noopener noreferrer">evo</a>!)</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="step-2-have-some-way-to-store-secrets">Step 2: Have some way to store secrets.<a href="#step-2-have-some-way-to-store-secrets" class="hash-link" aria-label="Direct link to Step 2: Have some way to store secrets." title="Direct link to Step 2: Have some way to store secrets."></a></h3>
<p>Normally you&#x27;d need a way to store secrets, and the best way to do that is by installing another package: <code>dotenv</code></p>
<p>just <code>npm i dotenv</code> in the project folder and add <code>require(&#x27;dotenv&#x27;).config()</code> to your import section. Then, when you login, <code>process.env.TOKEN</code> (or however you have it named on your <code>.env</code> file) should do the trick.</p>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_BuS1"><p>If you&#x27;re using ESM, configure dotenv with <code>import &#x27;dotenv/config&#x27;</code> instead of <code>require(&#x27;dotenv&#x27;).config()</code>.</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="and-thats-it">And... that&#x27;s it?<a href="#and-thats-it" class="hash-link" aria-label="Direct link to And... that&#x27;s it?" title="Direct link to And... that&#x27;s it?"></a></h3>
<p>Yes, that&#x27;s it. Here&#x27;s a little FAQ to get you started. You can also join the <a href="https://sern.dev/discord" target="_blank" rel="noopener noreferrer">Discord</a> for any problems.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="extra-video-tutorial">Extra: Video tutorial!<a href="#extra-video-tutorial" class="hash-link" aria-label="Direct link to Extra: Video tutorial!" title="Direct link to Extra: Video tutorial!"></a></h3>
<video width="400" controls="">
<source src="https://srizan.s-ul.eu/wtJBVsZU" type="video/mp4">
</video>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="faq">FAQ<a href="#faq" class="hash-link" aria-label="Direct link to FAQ" title="Direct link to FAQ"></a></h2>
<p><strong>Q</strong>: How do I publish a slash command?<br>
<strong>A</strong>: Install the publish extension. Little video:<br>
<video width="400" controls="">
<source src="https://srizan.s-ul.eu/uHzPhfcS" type="video/mp4">
</video></p>
<p><strong>Q</strong>: Any snippet VSCode extension?<br>
<strong>A</strong>: Yeah, just search <code>sern Snippets</code> made by a verified publisher called Sr Izan (haha yeah me funny!)</p>
<p><strong>Q</strong>: HEEEELLLPPPP!!!!<br>
<strong>A</strong>: Hey, don&#x27;t panic! We&#x27;re here to help so, join the <a href="https://sern.dev/discord" target="_blank" rel="noopener noreferrer">Discord</a>. We&#x27;re trying to get to 100 members!</p></div><footer class="row docusaurus-mt-lg"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/guides">guides</a></li></ul></div></footer></article><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="https://schema.org/BlogPosting"><meta itemprop="description" content="Class-based modules"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/1.2.0">Release 1.2.0</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2022-09-28T00:00:00.000Z" itemprop="datePublished">September 28, 2022</time> · <!-- -->2 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><a href="https://github.com/jacoobes" target="_blank" rel="noopener noreferrer" class="avatar__photo-link"><img class="avatar__photo" src="https://github.com/jacoobes.png" alt="jacoobes" itemprop="image"></a><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/jacoobes" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">jacoobes</span></a></div><small class="avatar__subtitle" itemprop="description">Head Dev</small></div></div></div></div></header><div class="markdown" itemprop="articleBody"><h2 class="anchor anchorWithStickyNavbar_LWe7" id="class-based-modules">Class-based modules<a href="#class-based-modules" class="hash-link" aria-label="Direct link to Class-based modules" title="Direct link to Class-based modules"></a></h2>
<p>Today we&#x27;re announcing the ability to create class based modules!
To get started, install</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token plain">npm install @sern/handler@latest</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Quick List of changes!</p>
<ul>
<li><a href="#class-based-modules">Class based modules</a></li>
<li><a href="#deprecation-warnings">Deprecation Warnings</a></li>
<li><a href="#dependencies-update">Dependencies update</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="class-based-modules-1">Class based modules<a href="#class-based-modules-1" class="hash-link" aria-label="Direct link to Class based modules" title="Direct link to Class based modules"></a></h3>
<p>Incorporate class based modules into your project instead of the traditional <code>commandModule</code> or <code>eventModule</code>
Extend the new <a href="/docs/api/classes/CommandExecutable">CommandExecutable</a> or <a href="/docs/api/classes/EventExecutable">EventExecutable</a></p>
<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_Ktv7">commands/meaning-of-life.ts</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"> CommandType</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> CommandExecutable</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">type</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(17, 17, 17)">Args</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">type</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(17, 17, 17)">Context</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;@sern/handler&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"> publish </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;../plugins/publish.js&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"> serendipityOnly </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;../plugins/serendipityOnly.js&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">default</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">class</span><span class="token plain"> </span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">extends</span><span class="token plain"> CommandExecutable</span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token plain">CommandType</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Both</span><span class="token operator" style="color:rgb(12, 150, 155)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> type </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> CommandType</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Both </span><span class="token keyword" style="color:rgb(12, 150, 155)">as</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">const</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> description </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;What is the meaning of life?&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> override onEvent </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">serendipityOnly</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> override plugins </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">publish</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">]</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#403f53"><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(153, 76, 195);font-style:italic">execute</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">ctx</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> Context</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> args</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> Args</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">await</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">reply</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;42&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_BuS1"><p>execute must not be a method of the class. It should be as above, a property on the class!</p></div></div>
<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#403f53;--prism-background-color:#FBFBFB"><div class="codeBlockTitle_Ktv7">events/guildMemberAdd.ts</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color:#403f53;background-color:#FBFBFB"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#403f53"><span class="token keyword" style="color:rgb(12, 150, 155)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"> CommandType</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> EventExecutable</span><span class="token punctuation" style="color:rgb(153, 76, 195)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">type</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(17, 17, 17)">EventType</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;@sern/handler&#x27;</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">import</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"> GuildMember </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">from</span><span class="token plain"> </span><span class="token string" style="color:rgb(72, 118, 214)">&#x27;discord.js&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token keyword" style="color:rgb(12, 150, 155)">export</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">default</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">class</span><span class="token plain"> </span><span class="token class-name keyword" style="color:rgb(12, 150, 155)">extends</span><span class="token plain"> EventExecutable</span><span class="token operator" style="color:rgb(12, 150, 155)">&lt;</span><span class="token plain">EventType</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Discord</span><span class="token operator" style="color:rgb(12, 150, 155)">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> type </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> EventType</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token plain">Discord </span><span class="token keyword" style="color:rgb(12, 150, 155)">as</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(12, 150, 155)">const</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#403f53"><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(153, 76, 195);font-style:italic">execute</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">member</span><span class="token operator" style="color:rgb(12, 150, 155)">:</span><span class="token plain"> GuildMember</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(12, 150, 155)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token builtin" style="color:rgb(72, 118, 214)">console</span><span class="token punctuation" style="color:rgb(153, 76, 195)">.</span><span class="token function" style="color:rgb(153, 76, 195);font-style:italic">log</span><span class="token punctuation" style="color:rgb(153, 76, 195)">(</span><span class="token plain">member</span><span class="token punctuation" style="color:rgb(153, 76, 195)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><span class="token punctuation" style="color:rgb(153, 76, 195)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#403f53"><span class="token plain"></span><span class="token punctuation" style="color:rgb(153, 76, 195)">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Now, you might ask <strong>why</strong> this feature was added. <br> Simply put, to give flexibility to the developers.
I believe that you should build your own structures however you might like and customize to your liking.
In addition, <strong>decorators now unofficially work with modules!</strong>
Feel free to use TypeScript experimental decorators to augment and customize your classes.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="deprecation-warnings">Deprecation Warnings<a href="#deprecation-warnings" class="hash-link" aria-label="Direct link to Deprecation Warnings" title="Direct link to Deprecation Warnings"></a></h3>
<p>The next update will bring sern v2 with some important features. Here are some things to watch out for.</p>
<ul>
<li><a href="/docs/api/interfaces/Wrapper">Wrapper#client</a> will be deprecated</li>
<li><a href="/docs/api/interfaces/Wrapper">Wrapper#sernEmitter</a> will be deprecated
<ul>
<li>a SernEmitter will be automatically created once Sern#init is called</li>
</ul>
</li>
<li>The option to pass in a function or array for <a href="/docs/api/interfaces/Wrapper">Wrapper#events</a> will be deprecated. Only strings are accepted.</li>
<li><a href="/docs/api/classes/SernEmitter">Sern#addExternal</a> will be deprecated in favor of a better way.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="dependencies-update">Dependencies Update<a href="#dependencies-update" class="hash-link" aria-label="Direct link to Dependencies Update" title="Direct link to Dependencies Update"></a></h3>
<ul>
<li>TypeScript has been updated to 4.8.3</li>
<li>Discord.js has been upgraded to 14.5</li>
</ul></div><footer class="row docusaurus-mt-lg"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/blog/tags/release">release</a></li></ul></div></footer></article><nav class="pagination-nav" aria-label="Blog list page navigation"></nav></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Information</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/intro">Docs &amp; Guide</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://stackoverflow.com/questions/tagged/sern-handler" target="_blank" rel="noopener noreferrer" class="footer__link-item">Stack Overflow<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://discord.gg/DwbF5H5JgQ" target="_blank" rel="noopener noreferrer" class="footer__link-item">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://opencollective.com/sern" target="_blank" rel="noopener noreferrer" class="footer__link-item">Open Collective<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/blog">Blog</a></li><li class="footer__item"><a href="https://github.com/sern-handler" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Built with ❤️ by the sern Handler team and its contributors</div></div></div></footer></div>
</body>
</html>