Asynchronous Javascript templating for the browser and server

Overview

Dust.js Build Status Sauce Test Status

Asynchronous Javascript templating for the browser and server. This fork is maintained by LinkedIn.

Install

NPM

Important: We recommend that you lock your version of Dust to a specific minor version, instead of a major version. By default, NPM will add "dustjs-linkedin": "^2.x.y" to your package.json, which will install new minor versions automatically.

npm install --save --production dustjs-linkedin
# If you want the dustc compiler available globally
npm install --global --production dustjs-linkedin

If you want to add the Dust helpers or secure filters:

npm install --save --production dustjs-helpers
npm install --save --production dustjs-filters-secure

Bower

bower install --save dustjs-linkedin

Get Started

  • Read dustjs.com for guides, tutorials, and documentation.
  • Check out the examples/ directory in the repo for simple examples to help you get started using Dust in a variety of ways.

Contribute

  • The team provides support on Stack Overflow, so that's the best place to ask questions.
  • Bug or feature? We welcome issues and pull requests! If you'd like to submit a PR, check out the guide to contributing. PRs should include unit tests.
Comments
  • adding support for . path resolution in context get

    adding support for . path resolution in context get

    The changes are primarily in what it is searched in the scope

    1. If path not found in the current context head, search next level up in context (ie in tail.head)
    2. If not found in top context (tail.head===null), then search in Context's this.global

    This change relates to how the path is referenced

    1. If a value in a path is a function, apply the function before getting path element. eg, foo.funcbar.baz - would call apply on function 'funcbar' before getting property baz. Note that in the expression foo.funcbar that the function is not evaluated - functions are only evaluated if found before the last element of path.

    In my opinion, this make data referencing consistent.


    Also see issue #270

    This code has a few new tests and passes all existing tests.

    If you want to use this, you can simply include this gist after your dust import: https://gist.github.com/carchrae/5825054

    opened by carchrae 112
  • Fix path resolution in nested scopes.

    Fix path resolution in nested scopes.

    This PR provides a fix for dotted path resolution within nested context scopes.

    I've seen the discussion at https://github.com/linkedin/dustjs/issues/100 but still think there are good reasons for having this functionality.

    Motivations:

    • Variable names should be resolved in a consistent manner, there shouldn't be two different methods producing different results depending on whether the variable reference is judged to be a path or not.

    • Variable name resolution could and should follow the same rules as used for nested scopes in Javascript.

      Scopes can be nested in dust.js using Context.push(..). Nested scopes should be equivalent to the following JS:

      var person = { name: 'John' };
      var settee = { color: 'red' };
      (function() {
          var person = { name: 'Jack' };
          (function() {
              var person = { name: 'Harry' };
              console.log( person.name, settee.color );
          })();
          console.log( person.name, settee.color );
      })();
      

      There is no confusion at any point here about which data item any variable name references, despite some names appearing in three different scopes. Using dotted notation doesn't in any way complicate the situation.

    • We make heavy use of Context.push to create local template scopes without polluting the global scope, and often these scopes are nested 3 or 4 deep. It doesn't make sense that templates in a nested scope loose visibility of any variable that requires a dotted path reference, while keeping visibility of those variables that don't.

    • The work arounds - {#breaking}{#the}{#path}{#into}{#sections} or using a helper - are ugly and unwieldy.

    This PR also addresses problems with incorrect 'this' references when invoking function values.

    opened by juliangoacher 71
  • Whitespace is removed from dust rendered HTML

    Whitespace is removed from dust rendered HTML

    Dust removes new lines from output HTML as well as any spaces. This is a problem for cases when we have <pre></pre> tags with pre-formatted HTML .

    This example code in pre tag

    <div class="row">{~n}
     <div class="content">{~n}
        <div class="row">{~n}
          <div class="facets">6</div>{~n}
          <div class="main-content">8</div>{~n}
          <div class="aside">{~n}
            <div class="row">{~n}
              <div class="summary">4</div>{~n}
              <div class="details">6</div>{~n}
            </div>{~n}
            10{~n}
          </div>{~n}
        </div>{~n}
        24{~n}
      </div>{~n}
    </div>
    

    will be rendered as :

    <div class="row">{~n}
    <div class="content">{~n}
    <div class="row">{~n}
    <div class="facets">6</div>{~n}
    <div class="main-content">8</div>{~n}
    <div class="aside">{~n}
    <div class="row">{~n}
    <div class="summary">4</div>{~n}
    <div class="details">6</div>{~n}
    </div>{~n}
    10{~n}
    </div>{~n}
    </div>{~n}
    24{~n}
    </div>{~n}
    </div>
    

    Note, if I do not include {~n} everything is rendered as one line of text and browser handles line breaks.

    Spaces are used for indentation for the code examples. Removing whitespace is making code examples hard to read. It is pretty hard to figure out HTML nesting without indentation.

    And example for script tag is:

    sometimes there are single line comments within script tag like:

    <script>
    //this will alert "test"
    alert("this is test");
    </script>
    

    After dust compilation it will become :

    <script>//this will alert "test" alert("this is test");</script>
    

    This will basically break the code by commenting out that line of JavaScript.

    opened by kate2753 68
  • cannot access variable by path in an inner context

    cannot access variable by path in an inner context

    The main dust.js documentation says:

    To avoid brittle and confusing references, paths never backtrack up the context stack. If you need to drill into a key available within the parent context, pass the key as a parameter.

    I take that to mean that given data like this:

    {i18n : { firstname : "First Name" },
     people : [
        {"name" : "Moe"},
        {"name" : "Curly"}
     ]}
    

    A template like this should work, but it does not:

    {#people i18n=i18n}
        {i18n.firstname}: {name}
    {/people}
    

    How do you expose pathed variables to inner contexts?

    opened by jbcpollak 43
  • Add a `cb(null, compiledTemplate)` signature to `dust.onLoad`

    Add a `cb(null, compiledTemplate)` signature to `dust.onLoad`

    Currently you can either call cb(), in which case Dust will try to load the original name from cache, or cb(null, src), and Dust will try to compile src and register it under the original name.

    Sometimes, you might want to dynamically load one of several templates based on the original name.

    This change adds cb(null, compiledTemplate) so you can load any template from cache or the filesystem, register it manually (or not at all), and render it.

    The returned template will NOT be registered under the original name.

    opened by sethkinast 32
  • dust.load -> internal breaks users of the old API

    dust.load -> internal breaks users of the old API

    I was doing untoward hacks, replacing dust.load in dustjacket for internationalization purposes, and this being private now makes that impossible.

    onLoad isn't rich enough for my purposes, which otherwise require doing unbelievably ugly things in the cache.

    opened by aredridel 25
  • Should {#} work for scalar values. Its intent is mostly to use it for iteration

    Should {#} work for scalar values. Its intent is mostly to use it for iteration

    Now that we have fixed:

    https://github.com/linkedin/dustjs/pull/127

    Another annoying, not so useful thingy...

    {

    "name" : "Tesla"

    } Does the following add any value?

    {#name} {.} {/name}

    should n't # be strictly for loops and iterations?

    opened by vybs 25
  • Dust doesn't render a result set obtained from MongoDB (by Mongoose)

    Dust doesn't render a result set obtained from MongoDB (by Mongoose)

    I have an issue: Dust doesn't render a result set from MongoDB by Mongoose. But a custom made array of objects renders just fine. What is wrong? Why it happens? How to manage it? I use Windows 7 64bit if it matters.

    Here is a code.

    This is my controller. Pay attention to two model objects. The first one (custom made) is rendered fine. The second one (obtained from MongoDB) is not rendered.

        router.get('/', function (req, res) {
    
            Post.find(function (err, posts) {
                if (err) {
                    console.log(err);
                }
    
                //
                // This is rendered just fine
                //
                var model = {
                    posts: [
                        {title: "Title1", body: "Body1"},
                        {title: "Title2", body: "Body2"}
                    ]
                };
    
                //
                // This model is not rendered by Dust
                //
                var model = {
                    posts: posts
                }
    
                res.render('posts', model);
            });
        });
    

    A result set from MongoDB that is not rendered. Its Schema:

        var postSchema = mongoose.Schema({
            title: String,
            body: String,
            crAt: { type: Date, default: Date.now },
            upAt: { type: Date, default: Date.now }
        });
    

    My .dust template code:

    {>"layouts/master" /}
    {<title}
        Posts
    {/title}
    
    {<body}
        {>"partials/header" /}
        <div id="container" class="container">
    
        <ul>
        {#posts}
            <li>
                {.title}
                <br>
                {.body}
            </li>
        {/posts}
        </ul>
    
            {>"partials/footer" /}
        </div>
    {/body}
    
    opened by wzup 24
  • Enhance @math helper to support bodies

    Enhance @math helper to support bodies

    Related to pull request #99 and issue #98.

    Let's discuss how to have the @math helper drive logic that determines what to render.

    Options:

    1. Have some $mathOut variable that is in scope inside the body of the @math helper
    {@math key="{$idx}" method="mod" operand="5"}
        {@eq key="$mathout" value="1"}
         show if $idx mod 5 === 1
      {/eq}
    {/math}
    
    1. Add a param inside of @math that changes the output to a boolean (eq, lt, 'gt,ne`, etc.)
    {@math key="{$idx}" method="mod" operand="5" eq="1"} 
       show if $idx mod 5 === 1
    {/math}
    

    something else?

    enhancement 
    opened by jimmyhchan 24
  • Enhance filters to accept variables, using syntax similar to Liquid or Twig

    Enhance filters to accept variables, using syntax similar to Liquid or Twig

    Hi!

    I've added support for Dust's filters to accept arguments. This allows for syntax such as:

    {foo|replace:"bar","baz"}
    

    Or even:

    {some_text|link_to:"{url}"}
    

    The syntax is the same as that supported by Twig, the popular PHP templating language, and Liquid, which is used by lots of Ruby projects including Shopify. Filter variables are extremely useful when you need to do some simple string manipulation that is too simple to need a helper! Some examples of filters that use variables in Liquid: https://github.com/Shopify/liquid/wiki/Liquid-for-Designers

    The change is completely backwards-compatible. All tests still pass. I also added six new tests around the new functionality-- please check them out to get an idea of how filter variables work.

    To have something to test with, I did add two filters to dust.filters-- "replace" and "link_to". I understand those probably don't permanently belong in the core but I know there is some movement around filters anyways so hopefully they can find a temporary home in core and migrate on when we have a place for them.

    As an unrelated change, I noticed that the browser test suite had some incorrect logic that was removing some of the test cases erroneously, so I've fixed that as well.

    As this is a new feature and a backwards-compatible change, I also incremented the minor version, making this Dust 1.3.0.

    Thank you for reviewing this change!

    opened by sethkinast 23
  • Incomplete loading with iOS mobile safari

    Incomplete loading with iOS mobile safari

    Please refer to this stackoverflow issue for full details: http://stackoverflow.com/questions/26352839/linkedin-dustjs-on-node-express-ios-safari

    This may not be purely a dust issue, but I am unable to pinpoint where the fault it. Effectively, I have removed all modules and revert the app back to a standard Express setup. The problem persists with dust, but is gone when i replaced the view engine with EJS.

    In short, on the first clean GET request, page loading could not be completed when using iOS Safari. Inspector is showing that latter resources are not getting a response. They, will receive the response after 2 minutes.

    There seem to be a limit as to the page size before this happens, meaning to say, as I include more js or images after the threshold, they will run into "not getting a response".

    opened by calvintwr 21
  • Input Text Removes \n from the string

    Input Text Removes \n from the string

    Hi,

    We are using dust.js

    What we are doing?

    • We want to show string as it is coming from JSON into input box let say "This is the \n test box \n testing"

    Problem

    When we write <input type="text" value="This is the \n test box \n testing" /> then

    • Text box come with same string including "\n"

    When we use dynamic value from object {name: "This is the \n test box \n testing"} and use like <input type="text" value="{name}" /> then

    • it shows like "This is the test box testing" which does not have "\n" and that is the problem where our actual data changes and reflect as problem at many places.

    Please help asap.

    opened by vishal-shukla-viitorcloud 2
  • Dustjs.com website is down

    Dustjs.com website is down

    Looks like http://dustjs.com is down. This is the main source of docs for Dust and I can't find a mirror, so it would be great if this could be brought back online.

    opened by haslam22 2
  • why is v3 a breaking change?

    why is v3 a breaking change?

    Hi, thanks for releasing a new version.

    Why is v3 a breaking change please? It's not clear to me from the changelog, and there is no migration guide. This would help us upgrade our apps. Thanks!

    opened by jpw 2
  • Vulnerability Issue (High) - Please, Upgrade to chokidar 3.5.2 to Fix

    Vulnerability Issue (High) - Please, Upgrade to chokidar 3.5.2 to Fix

    We have a vulnerability issue (High):

    The audit report show the following:

    High | Regular expression denial of service Package | glob-parent Patched in >=5.1.2 Dependency of dustjs-linkedin dustjs-linkedin > chokidar > glob-parent

    opened by sambugj 1
  • Non-string types are handled inconsistently between javascript and html escaping

    Non-string types are handled inconsistently between javascript and html escaping

    With the template

    {name|h|js}{~n}
    {name|j|js}{~n}
    

    and the context

    {"name": true}
    

    You get the output

    &quot;true&quot;
    true
    

    So it seems that html escaping turns non-string types into string, but javascript escaping does not.

    opened by tomalexander 0
Releases(v3.0.1)
  • v3.0.1(Dec 29, 2021)

    What's Changed

    • Dependency update: chokidar by @sumeetkakkar in https://github.com/linkedin/dustjs/pull/808

    Full Changelog: https://github.com/linkedin/dustjs/compare/v3.0.0...v3.0.1

    Source code(tar.gz)
    Source code(zip)
  • v3.0.0(Oct 20, 2021)

    What's Changed

    • Bump deps by @sethkinast in https://github.com/linkedin/dustjs/pull/734
    • Prioritize resolution of .then by @brianmhunt in https://github.com/linkedin/dustjs/pull/736
    • Don't use instanceof to determine if a Context is a Context by @sethkinast in https://github.com/linkedin/dustjs/pull/744
    • place location provided by peg 0.9 onto the AST by @jimmyhchan in https://github.com/linkedin/dustjs/pull/706
    • {?exists} and {^exists} now supports values from a promise by @samuelms1 in https://github.com/linkedin/dustjs/pull/753
    • Decrease security vulnerabilities by upgrading cli dependency (#754 #748) by @danactive in https://github.com/linkedin/dustjs/pull/756
    • fix: Security bug about prototype pollution by @sumeetkakkar in https://github.com/linkedin/dustjs/pull/805

    New Contributors

    • @brianmhunt made their first contribution in https://github.com/linkedin/dustjs/pull/736
    • @samuelms1 made their first contribution in https://github.com/linkedin/dustjs/pull/753
    • @danactive made their first contribution in https://github.com/linkedin/dustjs/pull/756
    • @sumeetkakkar made their first contribution in https://github.com/linkedin/dustjs/pull/805

    Full Changelog: https://github.com/linkedin/dustjs/compare/v2.7.2...v3.0.0

    Source code(tar.gz)
    Source code(zip)
  • v2.7.2(Jun 9, 2015)

    Notable Changes

    Filters

    Dust filter functions previously took one argument, the string to filter. They now accept a second argument, which is the current context.

    Helpers

    Dust helpers can now return primitives.

    Helpers act like references or sections depending on if they have a body. When they have no body, they act like a reference and look in params.filters for filters to use. When they have a body, they act like a section. You can return thenables and streams normally.

    {@return value="" filters="|s" /} 
    {@return value=""}{.} World{/return}
    
    Source code(tar.gz)
    Source code(zip)
  • v2.7.1(Apr 30, 2015)

    Notable Changes

    dust.config.cache

    In previous versions, setting dust.config.cache to false would blow away the entire cache on every render. Now, setting it to false just prevents new templates from being added and cached templates from being used. Setting it back to true means that previously-cached templates will be ready to use.

    dust.onLoad

    We have added a callback(null, compiledTemplate) signature to dust.onLoad.

    Calling the onLoad callback with a compiled template function will use this template to satisfy the load request. The template is not automatically registered under any name when passed to the callback, so the onLoad function should handle registration as it needs.

    You can still call the callback with uncompiled template source and Dust will compile and store it, while respecting your dust.config.cache setting.

    dust.makeBase

    dust.makeBase is now aliased to dust.context.

    Errata

    Dust 2.7.0 broke backwards compatibility with older Dust compilers. This regression has been fixed so templates compiled with older versions of Dust will continue to work with Dust 2.7.1; you can use an older compiler if needed.

    Source code(tar.gz)
    Source code(zip)
  • v2.7.0(Apr 17, 2015)

    Supported Runtimes

    With this release we are dropping official support for:

    • Internet Explorer 7
    • Node.js 0.8

    No explicit changes have been made to break Dust in these environments, but we will no longer run tests and may break them going forward.

    Notable Changes

    More flexible rendering

    You can pass Dust body functions directly to dust.render and dust.stream, instead of the template name.

    require(['lib/dust-core', 'views/index'], function(dust, index) {
      dust.render(index, context, function(err, out) { ... });
    });
    

    This means that you can also compile templates without having to name them-- just pass the compiled function directly to dust.render. You can decide if a function is eligible to be passed as a renderable by calling dust.isTemplateFn().

    CommonJS templates

    Dust can now compile templates into CommonJS modules. Set dust.config.cjs to true, or use the --cjs flag with dustc.

    var dust = require('dustjs-linkedin'),
        index = require('views/index.js')(dust);
    
    index.template; // contains the compiled template
    index({ name: "Dust" }, function(err, out) { ... }); // use index to render or stream
    

    Streams in context

    You can include a ReadableStream directly in your Dust context and Dust will iterate over it like an array.

    var resultStream = db.query("SELECT * FROM people").stream();
    
    dust.renderSource("{#people}{firstName} {lastName}{/people}", { people: resultStream })
        .pipe(res);
    

    As long as you stream the results instead of rendering, Dust will flush data from the Stream as it is output.

    Caching

    You can disable caching of templates (useful for development) by setting dust.config.cache = false. If caching is disabled, you must write a dust.onLoad function to tell Dust how to load partials, since it wouldn't be possible to load them in advance and cache them.

    Errata

    The exposed compiler options such as dust.optimizers are deprecated. They are now exposed under, e.g. dust.compiler.optimizers. In Dust 2.8.0 the old options will be removed.

    dust.load, an undocumented but public function, has been made private. Consider using dust.onLoad to define special behavior to load a template.

    Templates compiled with earlier Dust versions should be recompiled before using 2.7.0.

    Source code(tar.gz)
    Source code(zip)
  • v2.6.2(Mar 26, 2015)

    Notable Changes

    • Dust contexts can now contain Promises. The Promise will be evaluated once it resolves or rejects.
      • More info: http://www.dustjs.com/guides/contexts/#promises
    • dustc --watch now reruns the compilation when a watched template changes
    • Added new methods to the Context public API: Context#clone, Context#pop, and Context#resolve.
      • More info: http://www.dustjs.com/docs/helper-api/
    Source code(tar.gz)
    Source code(zip)
  • v2.6.1(Mar 20, 2015)

    This release fixes two small issues:

    • Compiling templates with empty blocks such as {<foo}{/foo} leaked compiler data into the template.
    • Negative numbers can be passed as parameters, e.g. {#foo a=-1 b=-2.3 /}
    Source code(tar.gz)
    Source code(zip)
  • v2.6.0(Mar 5, 2015)

    Major changes in this version:

    Dust now supports being included as an AMD module, and allows templates to be compiled as AMD modules for inclusion. More information: https://github.com/linkedin/dustjs/wiki/Loading-Dust-via-AMD-(require.js)

    A new dustc command-line compiler that acts like a shell script, with support for input/output redirection. dustc can also operate on an entire directory of files at once and concatenate the output to a single file.

    Source code(tar.gz)
    Source code(zip)
  • v2.5.1(Dec 11, 2014)

  • v2.5.0(Dec 11, 2014)

    • #515 Remove the warning log when you attach a new Stream event (@sethkinast)
    • #513 Treat compiled body functions as blocks to render instead of functions to evaluate. Dust body functions are now flagged with .___dustBody to differentiate them from functions set in the context. (@sethkinast)
    • #511 Treat formats and buffers as interchangeable when they are mixed together in order to prevent stack overflows with large templates and add a whitespace flag to dust.config (@sethkinast)
    • #504 Update README formatting (@NickStefan)
    • #503 Update contributors list (@sethkinast)
    • #502 Don't use the regexp constructor since we are using a regexp literal anyway (@jimmyhchan)
    Source code(tar.gz)
    Source code(zip)
  • v2.4.2(Sep 10, 2014)

A powerful templating engine with inheritance, asynchronous control, and more (jinja2 inspired)

Nunjucks Nunjucks is a full featured templating engine for javascript. It is heavily inspired by jinja2. View the docs here. Installation npm install

Mozilla 8k Dec 30, 2022
1KB lightweight, fast & powerful JavaScript templating engine with zero dependencies. Compatible with server-side environments like node.js, module loaders like RequireJS and all web browsers.

JavaScript Templates Contents Demo Description Usage Client-side Server-side Requirements API tmpl() function Templates cache Output encoding Local he

Sebastian Tschan 1.7k Jan 3, 2023
Minimal templating with {{mustaches}} in JavaScript

mustache.js - Logic-less {{mustache}} templates with JavaScript What could be more logical awesome than no logic at all? mustache.js is a zero-depende

Jan Lehnardt 15.7k Jan 7, 2023
A tiny javascript templating framework in ~400 bytes gzipped

t.js A tiny javascript templating framework in ~400 bytes gzipped t.js is a simple solution to interpolating values in an html string for insertion in

Jason Mooberry 823 Dec 29, 2022
handlebars.js 8.8 4.4 L3 JavaScript An extension to the Mustache templating language.

Handlebars.js Handlebars provides the power necessary to let you build semantic templates effectively with no frustration. Handlebars is largely compa

The Handlebars Templating Language 16.9k Jan 5, 2023
handlebars.js - An extension to the Mustache templating language.

Handlebars.js Handlebars provides the power necessary to let you build semantic templates effectively with no frustration. Handlebars is largely compa

The Handlebars Templating Language 16.9k Jan 5, 2023
A compiler for the Mustache templating language

Hogan.js - A mustache compiler. Hogan.js is a compiler for the Mustache templating language. For information on Mustache, see the manpage and the spec

Twitter 5.1k Jan 2, 2023
Browser In The Browser (BITB) Templates

BITB Browser templates for Browser In The Browser (BITB) attack. More information: https://mrd0x.com/browser-in-the-browser-phishing-attack/ Usage Eac

mrd0x 2.5k Jan 5, 2023
Embedded JS template engine for Node, Deno, and the browser. Lighweight, fast, and pluggable. Written in TypeScript

eta (η) Documentation - Chat - RunKit Demo - Playground Summary Eta is a lightweight and blazing fast embedded JS templating engine that works inside

Eta 682 Dec 29, 2022
✨ A multipurpose discord bot, that can help you manage & entertain your server.

Helper Helper is a mutil purpose discord bot that is designed to bring management & entertainment to your server. ( This bot is inspired by WickBot &

Saige 4 Sep 13, 2022
eXtensible Template Engine lib for node and the browser

xtemplate High Speed, eXtensible Template Engine lib on browser and nodejs. support async control, inheritance, include, logic expression, custom func

xtemplate 553 Nov 21, 2022
The fastest + concise javascript template engine for nodejs and browsers. Partials, custom delimiters and more.

doT Created in search of the fastest and concise JavaScript templating function with emphasis on performance under V8 and nodejs. It shows great perfo

Laura Doktorova 4.9k Dec 31, 2022
A helper to send whatsapp without scheduling a contact, the project developed using TDD with Jest, Javascript classes, BotstrapVue and SweetAlert.

Project setup npm install Compiles and hot-reloads for development npm run serve Compiles and minifies for production npm run build Lints and fixes

Magascript 7 Sep 13, 2022
Embedded JavaScript templates -- http://ejs.co

Embedded JavaScript templates Installation $ npm install ejs Features Control flow with <% %> Escaped output with <%= %> (escape function configurable

Matthew Eernisse 6.8k Dec 30, 2022
Take a swig of the best template engine for JavaScript.

NOT MAINTAINED Fork and use at your own risk. Swig Swig is an awesome, Django/Jinja-like template engine for node.js. Features Available for node.js a

Paul Armstrong 3.1k Jan 4, 2023
HTML Framework that allows you not to write JavaScript code.

EHTML (or Extended HTML) can be described as a set of custom elements that you can put on HTML page for different purposes and use cases. The main ide

Guseyn Ismayylov 172 Dec 22, 2022
Variation-template - Variation is a PSD template that is covered into a web template using HTML5, CSS3, Bootstrapv4.6, JavaScript.

Variation Template Design Variation is a PSD website template. In this project this template is designed with HTML. Deployment This site is deployed a

Bipronath Saha 1 Jan 1, 2022
This is a simple ticket system bot using discord.js v13 and node.js v17. It works with buttons and slashcommands.

Ticket-bot This is an simple ticket system bot using discord.js v13. If you find an error or need support, go to my discord server and open a ticket >

Cristhian 14 Jan 2, 2023
💌 mailgo, a new concept of mailto and tel links

?? mailgo a new concept of mailto and tel links https://mailgo.dev Transform all your mailto and tel link in a beautiful modal with more possibilities

Matteo Manzinello 1k Dec 31, 2022