Skip to main content
Module

x/superdeno/docs/index.html

Super-agent driven library for testing Deno HTTP servers.
Latest
File
<!doctype html><html class="default no-js"><head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>superdeno</title> <meta name="description" content="Documentation for superdeno"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="assets/css/main.css"></head><body><header> <div class="tsd-page-toolbar"> <div class="container"> <div class="table-wrap"> <div class="table-cell" id="tsd-search" data-index="assets/js/search.json" data-base="."> <div class="field"> <label for="tsd-search-field" class="tsd-widget search no-caption">Search</label> <input id="tsd-search-field" type="text" /> </div> <ul class="results"> <li class="state loading">Preparing search index...</li> <li class="state failure">The search index is not available</li> </ul> <a href="index.html" class="title">superdeno</a> </div> <div class="table-cell" id="tsd-widgets"> <div id="tsd-filter"> <a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a> <div class="tsd-filter-group"> <div class="tsd-select" id="tsd-filter-visibility"> <span class="tsd-select-label">All</span> <ul class="tsd-select-list"> <li data-value="public">Public</li> <li data-value="protected">Public/Protected</li> <li data-value="private" class="selected">All</li> </ul> </div> <input type="checkbox" id="tsd-filter-inherited" checked /> <label class="tsd-widget" for="tsd-filter-inherited">Inherited</label> <input type="checkbox" id="tsd-filter-only-exported" /> <label class="tsd-widget" for="tsd-filter-only-exported">Only exported</label> </div> </div> <a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a> </div> </div> </div> </div> <div class="tsd-page-title"> <div class="container"> <ul class="tsd-breadcrumb"> <li> <a href="globals.html">Globals</a> </li> </ul> <h1>superdeno</h1> </div> </div></header><div class="container container-main"> <div class="row"> <div class="col-8 col-content"> <div class="tsd-panel tsd-typography"> <p align="center"> <a href="https://www.linkedin.com/in/hannah-morten-b1218017a/"><img height="200" style="height: 200px;" src="https://github.com/cmorten/superdeno/raw/main/.github/superdeno.png" alt="Super Deno standing in the rain at night – stoically facing the dark battle that is software engineering"></a> <h1 align="center">SuperDeno</h1> </p> <p align="center"> HTTP assertions for Deno made easy via <a href="https://github.com/visionmedia/superagent">superagent</a>. </p> <p align="center"> <a href="https://github.com/cmorten/superdeno/tags/"><img src="https://img.shields.io/github/tag/cmorten/superdeno" alt="Current version" /></a> <img src="https://github.com/cmorten/superdeno/workflows/Test/badge.svg" alt="Current test status" /> <a href="https://doc.deno.land/https/deno.land/x/superdeno/mod.ts"><img src="https://doc.deno.land/badge.svg" alt="SuperDeno docs" /></a> <a href="http://makeapullrequest.com"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" alt="PRs are welcome" /></a> <a href="https://github.com/cmorten/superdeno/issues/"><img src="https://img.shields.io/github/issues/cmorten/superdeno" alt="SuperDeno issues" /></a> <img src="https://img.shields.io/github/stars/cmorten/superdeno" alt="SuperDeno stars" /> <img src="https://img.shields.io/github/forks/cmorten/superdeno" alt="SuperDeno forks" /> <img src="https://img.shields.io/github/license/cmorten/superdeno" alt="SuperDeno license" /> <a href="https://GitHub.com/cmorten/superdeno/graphs/commit-activity"><img src="https://img.shields.io/badge/Maintained%3F-yes-green.svg" alt="SuperDeno is maintained" /></a> </p> <p align="center"> <a href="https://deno.land/x/superdeno"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fdeno-visualizer.danopia.net%2Fshields%2Flatest-version%2Fx%2Fsuperdeno%2Fmod.ts" alt="SuperDeno latest /x/ version" /></a> <a href="https://github.com/denoland/deno/blob/main/Releases.md"><img src="https://img.shields.io/badge/deno-^1.40.2-brightgreen?logo=deno" alt="Minimum supported Deno version" /></a> <a href="https://deno-visualizer.danopia.net/dependencies-of/https/deno.land/x/superdeno/mod.ts"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fdeno-visualizer.danopia.net%2Fshields%2Fdep-count%2Fx%2Fsuperdeno%2Fmod.ts" alt="SuperDeno dependency count" /></a> <a href="https://deno-visualizer.danopia.net/dependencies-of/https/deno.land/x/superdeno/mod.ts"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fdeno-visualizer.danopia.net%2Fshields%2Fupdates%2Fx%2Fsuperdeno%2Fmod.ts" alt="SuperDeno dependency outdatedness" /></a> <a href="https://deno-visualizer.danopia.net/dependencies-of/https/deno.land/x/superdeno/mod.ts"><img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fdeno-visualizer.danopia.net%2Fshields%2Fcache-size%2Fx%2Fsuperdeno%2Fmod.ts" alt="SuperDeno cached size" /></a> </p> <hr> <a href="#table-of-contents" id="table-of-contents" style="color: inherit; text-decoration: none;"> <h2>Table of Contents</h2> </a> <ul> <li><a href="#getting-started">Getting Started</a></li> <li><a href="#about">About</a></li> <li><a href="#installation">Installation</a></li> <li><a href="#examples">Examples</a></li> <li><a href="#documentation">Documentation</a></li> <li><a href="#api">API</a></li> <li><a href="#notes">Notes</a></li> <li><a href="#contributing">Contributing</a></li> <li><a href="#license">License</a></li> </ul> <a href="#getting-started" id="getting-started" style="color: inherit; text-decoration: none;"> <h2>Getting Started</h2> </a> <pre><code class="language-ts"><span class="hljs-keyword">import</span> { superdeno } <span class="hljs-keyword">from</span> <span class="hljs-string">&quot;https://deno.land/x/superdeno/mod.ts&quot;</span>;<span class="hljs-keyword">import</span> { opine } <span class="hljs-keyword">from</span> <span class="hljs-string">&quot;https://deno.land/x/opine@2.3.4/mod.ts&quot;</span>;
<span class="hljs-keyword">const</span> app = opine();
app.get(<span class="hljs-string">&quot;/user&quot;</span>, <span class="hljs-function">(<span class="hljs-params">req, res</span>) =&gt;</span> { res.setStatus(<span class="hljs-number">200</span>).json({ <span class="hljs-attr">name</span>: <span class="hljs-string">&quot;Deno&quot;</span> });});
superdeno(app) .get(<span class="hljs-string">&quot;/user&quot;</span>) .expect(<span class="hljs-string">&quot;Content-Type&quot;</span>, <span class="hljs-regexp">/json/</span>) .expect(<span class="hljs-string">&quot;Content-Length&quot;</span>, <span class="hljs-string">&quot;15&quot;</span>) .expect(<span class="hljs-number">200</span>) .end(<span class="hljs-function">(<span class="hljs-params">err, res</span>) =&gt;</span> { <span class="hljs-keyword">if</span> (err) <span class="hljs-keyword">throw</span> err; });</code></pre> <p>Looking to test an Oak web server? Check out <a href="https://github.com/cmorten/superoak">SuperOak</a>!</p> <a href="#about" id="about" style="color: inherit; text-decoration: none;"> <h2>About</h2> </a> <p>The motivation of this module is to provide a high-level abstraction for testing HTTP in Deno, while still allowing you to drop down to the lower-level API provided by <a href="https://visionmedia.github.io/superagent/">superagent</a>.</p> <a href="#installation" id="installation" style="color: inherit; text-decoration: none;"> <h2>Installation</h2> </a> <p>This is a <a href="https://deno.land/">Deno</a> module available to import direct from this repo and via the <a href="https://deno.land/x">Deno Registry</a>.</p> <p>Before importing, <a href="https://deno.land/#installation">download and install Deno</a>.</p> <p>You can then import SuperDeno straight into your project:</p> <pre><code class="language-ts"><span class="hljs-keyword">import</span> { superdeno } <span class="hljs-keyword">from</span> <span class="hljs-string">&quot;https://deno.land/x/superdeno/mod.ts&quot;</span>;</code></pre> <p>SuperDeno is also available on <a href="https://nest.land/package/superdeno">nest.land</a>, a package registry for Deno on the Blockchain.</p> <blockquote> <p>Note: All examples in this README are using the unversioned form of the import URL. In production you should always use the versioned import form such as <code>https://deno.land/x/superdeno@4.9.0/mod.ts</code>.</p> </blockquote> <a href="#examples" id="examples" style="color: inherit; text-decoration: none;"> <h2>Examples</h2> </a> <p>You may pass a url string, <a href="https://doc.deno.land/https/deno.land/std/http/mod.ts#Server"><code>http.Server</code></a>, a request handling function, or an object that implements an <code>app.listen()</code> method (which mirrors the <a href="https://doc.deno.land/https/deno.land/std/http/mod.ts#serve"><code>http.serve</code></a> interface) to <code>superdeno()</code> - if SuperDeno identifies that a server is not already listening for connections, then one is bound to an ephemeral port for you so there is no need to keep track of ports.</p> <p>SuperDeno works with any Deno test framework. Here&#39;s an example with Deno&#39;s built-in test framework, note how you can pass <code>done</code> straight to any of the <code>.expect()</code> calls:</p> <pre><code class="language-ts">Deno.test(<span class="hljs-string">&quot;GET /user responds with json&quot;</span>, <span class="hljs-keyword">async</span> () =&gt; { <span class="hljs-keyword">await</span> superdeno(app) .get(<span class="hljs-string">&quot;/user&quot;</span>) .set(<span class="hljs-string">&quot;Accept&quot;</span>, <span class="hljs-string">&quot;application/json&quot;</span>) .expect(<span class="hljs-string">&quot;Content-Type&quot;</span>, <span class="hljs-regexp">/json/</span>) .expect(<span class="hljs-number">200</span>);});</code></pre> <p>Here&#39;s an example of SuperDeno working with the Opine web framework:</p> <pre><code class="language-ts"><span class="hljs-keyword">import</span> { superdeno } <span class="hljs-keyword">from</span> <span class="hljs-string">&quot;https://deno.land/x/superdeno/mod.ts&quot;</span>;<span class="hljs-keyword">import</span> { opine } <span class="hljs-keyword">from</span> <span class="hljs-string">&quot;https://deno.land/x/opine@2.3.4/mod.ts&quot;</span>;<span class="hljs-keyword">import</span> { expect } <span class="hljs-keyword">from</span> <span class="hljs-string">&quot;https://deno.land/x/expect@v0.4.0/mod.ts&quot;</span>;
<span class="hljs-keyword">const</span> app = opine();
app.get(<span class="hljs-string">&quot;/&quot;</span>, <span class="hljs-function">(<span class="hljs-params">req, res</span>) =&gt;</span> { res.send(<span class="hljs-string">&quot;Hello Deno!&quot;</span>);});
Deno.test(<span class="hljs-string">&quot;it should support regular expressions&quot;</span>, <span class="hljs-keyword">async</span> () =&gt; { <span class="hljs-keyword">await</span> superdeno(app) .get(<span class="hljs-string">&quot;/&quot;</span>) .expect(<span class="hljs-string">&quot;Content-Type&quot;</span>, <span class="hljs-regexp">/^application/</span>) .catch(<span class="hljs-function">(<span class="hljs-params">err</span>) =&gt;</span> { expect(err.message).toEqual( <span class="hljs-string">&#x27;expected &quot;Content-Type&quot; matching /^application/, got &quot;text/html; charset=utf-8&quot;&#x27;</span> ); });});</code></pre> <p>See more examples in the <a href="./test/superdeno.opine.test.ts">Opine test suite</a>.</p> <p>Here&#39;s an example of SuperDeno working with the Express web framework:</p> <pre><code class="language-ts"><span class="hljs-keyword">import</span> { superdeno } <span class="hljs-keyword">from</span> <span class="hljs-string">&quot;https://deno.land/x/superdeno/mod.ts&quot;</span>;<span class="hljs-comment">// @deno-types=&quot;npm:@types/express@^4.17&quot;</span><span class="hljs-keyword">import</span> express <span class="hljs-keyword">from</span> <span class="hljs-string">&quot;npm:express@4.18.2&quot;</span>;<span class="hljs-keyword">import</span> { expect } <span class="hljs-keyword">from</span> <span class="hljs-string">&quot;https://deno.land/x/expect@v0.4.0/mod.ts&quot;</span>;
Deno.test(<span class="hljs-string">&quot;it should support regular expressions&quot;</span>, <span class="hljs-keyword">async</span> () =&gt; { <span class="hljs-keyword">const</span> app = express();
app.get(<span class="hljs-string">&quot;/&quot;</span>, <span class="hljs-function">(<span class="hljs-params">_req, res</span>) =&gt;</span> { res.send(<span class="hljs-string">&quot;Hello Deno!&quot;</span>); });
<span class="hljs-keyword">await</span> superdeno(app) .get(<span class="hljs-string">&quot;/&quot;</span>) .expect(<span class="hljs-string">&quot;Content-Type&quot;</span>, <span class="hljs-regexp">/^application/</span>) .catch(<span class="hljs-function">(<span class="hljs-params">err</span>) =&gt;</span> { expect(err.message).toEqual( <span class="hljs-string">&#x27;expected &quot;Content-Type&quot; matching /^application/, got &quot;text/html; charset=utf-8&quot;&#x27;</span> ); });});</code></pre> <p>See more examples in the <a href="./test/superdeno.express.test.ts">Express test suite</a>.</p> <p>Here&#39;s an example of SuperDeno working with the Oak web framework:</p> <pre><code class="language-ts"><span class="hljs-keyword">import</span> { superdeno } <span class="hljs-keyword">from</span> <span class="hljs-string">&quot;https://deno.land/x/superdeno/mod.ts&quot;</span>;<span class="hljs-keyword">import</span> { Application, Router } <span class="hljs-keyword">from</span> <span class="hljs-string">&quot;https://deno.land/x/oak@v12.6.2/mod.ts&quot;</span>;
<span class="hljs-keyword">const</span> router = <span class="hljs-keyword">new</span> Router();router.get(<span class="hljs-string">&quot;/&quot;</span>, <span class="hljs-function">(<span class="hljs-params">ctx</span>) =&gt;</span> { ctx.response.body = <span class="hljs-string">&quot;Hello Deno!&quot;</span>;});
<span class="hljs-keyword">const</span> app = <span class="hljs-keyword">new</span> Application();app.use(router.routes());app.use(router.allowedMethods());
Deno.test(<span class="hljs-string">&quot;it should support the Oak framework&quot;</span>, <span class="hljs-function">() =&gt;</span> { <span class="hljs-keyword">const</span> controller = <span class="hljs-keyword">new</span> AbortController(); <span class="hljs-keyword">const</span> { signal } = controller;
app.addEventListener(<span class="hljs-string">&quot;listen&quot;</span>, <span class="hljs-keyword">async</span> ({ hostname, port, secure }) =&gt; { <span class="hljs-keyword">const</span> protocol = secure ? <span class="hljs-string">&quot;https&quot;</span> : <span class="hljs-string">&quot;http&quot;</span>; <span class="hljs-keyword">const</span> url = <span class="hljs-string">`<span class="hljs-subst">${protocol}</span>://<span class="hljs-subst">${hostname}</span>:<span class="hljs-subst">${port}</span>`</span>;
<span class="hljs-keyword">await</span> superdeno(url) .get(<span class="hljs-string">&quot;/&quot;</span>) .expect(<span class="hljs-string">&quot;Hello Deno!&quot;</span>, <span class="hljs-function">() =&gt;</span> { controller.abort(); }); });
<span class="hljs-keyword">await</span> app.listen({ <span class="hljs-attr">port</span>: <span class="hljs-number">0</span>, signal });});</code></pre> <p>See more examples in the <a href="./test/superdeno.oak.test.ts">Oak test suite</a>.</p> <p>If you are using the <a href="https://github.com/oakserver/oak/">Oak</a> web framework then it is recommended that you use the specialized <a href="https://github.com/cmorten/superoak">SuperOak</a> assertions library for reduced bootstrapping.</p> <p>If you don&#39;t need to test the server setup side of your Oak application, or you are making use of the <code>app.handle()</code> method (for example for serverless apps) then you can write slightly less verbose tests for Oak:</p> <pre><code class="language-ts"><span class="hljs-keyword">import</span> { Application, Router } <span class="hljs-keyword">from</span> <span class="hljs-string">&quot;https://deno.land/x/oak@v12.6.2/mod.ts&quot;</span>;<span class="hljs-keyword">import</span> { superdeno } <span class="hljs-keyword">from</span> <span class="hljs-string">&quot;https://deno.land/x/superdeno/mod.ts&quot;</span>;
<span class="hljs-keyword">const</span> router = <span class="hljs-keyword">new</span> Router();
router.get(<span class="hljs-string">&quot;/&quot;</span>, <span class="hljs-function">(<span class="hljs-params">ctx</span>) =&gt;</span> { ctx.response.body = <span class="hljs-string">&quot;Hello Deno!&quot;</span>;});
<span class="hljs-keyword">const</span> app = <span class="hljs-keyword">new</span> Application();app.use(router.routes());app.use(router.allowedMethods());
Deno.test( <span class="hljs-string">&quot;it should support the Oak framework `app.handle` method&quot;</span>, <span class="hljs-keyword">async</span> () =&gt; { <span class="hljs-comment">/** * Note that we have to bind `app` to the function otherwise `app.handle` * doesn&#x27;t preserve the `this` context from `app`. */</span> <span class="hljs-keyword">await</span> superdeno(app.handle.bind(app)).get(<span class="hljs-string">&quot;/&quot;</span>).expect(<span class="hljs-string">&quot;Hello Deno!&quot;</span>); });</code></pre> <p>In this case, SuperDeno handles the setup and closing of the server for you, so you can focus on just testing your middleware.</p> <p>For further examples, see the <a href="./test">tests</a> or the <a href="https://github.com/visionmedia/supertest#example">supertest examples</a> for inspiration.</p> <a href="#documentation" id="documentation" style="color: inherit; text-decoration: none;"> <h2>Documentation</h2> </a> <ul> <li><a href="https://doc.deno.land/https/deno.land/x/superdeno/mod.ts">SuperDeno Deno Docs</a></li> <li><a href="https://cmorten.github.io/superdeno/">SuperDeno Type Docs</a></li> <li><a href="https://github.com/cmorten/superdeno/blob/main/LICENSE.md">License</a></li> <li><a href="https://github.com/cmorten/superdeno/blob/main/.github/CHANGELOG.md">Changelog</a></li> </ul> <a href="#api" id="api" style="color: inherit; text-decoration: none;"> <h2>API</h2> </a> <p>You may use any <a href="http://github.com/visionmedia/superagent">superagent</a> client (browser) methods and perform assertions in the <code>.end()</code> callback for lower-level needs.</p> <a href="#expectstatus-fn" id="expectstatus-fn" style="color: inherit; text-decoration: none;"> <h3>.expect(status[, fn])</h3> </a> <p>Assert response <code>status</code> code.</p> <a href="#expectstatus-body-fn" id="expectstatus-body-fn" style="color: inherit; text-decoration: none;"> <h3>.expect(status, body[, fn])</h3> </a> <p>Assert response <code>status</code> code and <code>body</code>.</p> <a href="#expectbody-fn" id="expectbody-fn" style="color: inherit; text-decoration: none;"> <h3>.expect(body[, fn])</h3> </a> <p>Assert response <code>body</code> text with a string, regular expression, or parsed body object.</p> <a href="#expectfield-value-fn" id="expectfield-value-fn" style="color: inherit; text-decoration: none;"> <h3>.expect(field, value[, fn])</h3> </a> <p>Assert header <code>field</code> <code>value</code> with a string or regular expression.</p> <a href="#expectfunctionres-" id="expectfunctionres-" style="color: inherit; text-decoration: none;"> <h3>.expect(function(res) {})</h3> </a> <p>Pass a custom assertion function. It&#39;ll be given the response object to check. If the check fails, throw an error.</p> <pre><code class="language-ts"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hasPreviousAndNextKeys</span>(<span class="hljs-params">res</span>) </span>{ <span class="hljs-keyword">if</span> (!(<span class="hljs-string">&quot;next&quot;</span> <span class="hljs-keyword">in</span> res.parsedBody)) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">&quot;missing next key&quot;</span>); <span class="hljs-keyword">if</span> (!(<span class="hljs-string">&quot;prev&quot;</span> <span class="hljs-keyword">in</span> res.parsedBody)) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">&quot;missing prev key&quot;</span>);}
<span class="hljs-keyword">await</span> superdeno(app).get(<span class="hljs-string">&quot;/&quot;</span>).expect(hasPreviousAndNextKeys);</code></pre> <a href="#endfn" id="endfn" style="color: inherit; text-decoration: none;"> <h3>.end(fn)</h3> </a> <p>Perform the request and invoke <code>fn(err, res)</code>.</p> <a href="#notes" id="notes" style="color: inherit; text-decoration: none;"> <h2>Notes</h2> </a> <p>This is a port of <a href="https://github.com/visionmedia/supertest">supertest</a> to TypeScript + Deno, which fulfills this motivation currently for Node. This module also includes a XHR sham so <a href="https://visionmedia.github.io/superagent/">superagent</a> client mode can be used directly.</p> <a href="#contributing" id="contributing" style="color: inherit; text-decoration: none;"> <h2>Contributing</h2> </a> <p><a href="https://github.com/cmorten/superdeno/blob/main/.github/CONTRIBUTING.md">Contributing guide</a></p> <hr> <a href="#license" id="license" style="color: inherit; text-decoration: none;"> <h2>License</h2> </a> <p>This library is a port of <a href="https://github.com/visionmedia/supertest">supertest</a> whose license and copyrights are available at <a href="./SUPERTEST_LICENSE.md">SUPERTEST_LICENSE</a> in the root of this repository, and covers all files within the <a href="./src">source</a> directory which detail that the file is a port.</p> <p>SuperDeno is licensed under the <a href="./LICENSE.md">MIT License</a>.</p> <p>Icon designed and created by <a href="https://www.linkedin.com/in/hannah-morten-b1218017a/">Hannah Morten</a>.</p> </div> </div> <div class="col-4 col-menu menu-sticky-wrap menu-highlight"> <nav class="tsd-navigation primary"> <ul> <li class="globals "> <a href="globals.html"><em>Globals</em></a> </li> <li class=" tsd-kind-module"> <a href="modules/_close_.html">&quot;close&quot;</a> </li> <li class=" tsd-kind-module"> <a href="modules/_superagent_.html">&quot;superagent&quot;</a> </li> <li class=" tsd-kind-module"> <a href="modules/_superdeno_.html">&quot;superdeno&quot;</a> </li> <li class=" tsd-kind-module"> <a href="modules/_test_.html">&quot;test&quot;</a> </li> <li class=" tsd-kind-module"> <a href="modules/_types_.html">&quot;types&quot;</a> </li> <li class=" tsd-kind-module"> <a href="modules/_utils_.html">&quot;utils&quot;</a> </li> </ul> </nav> <nav class="tsd-navigation secondary menu-sticky"> <ul class="before-current"> </ul> </nav> </div> </div></div><footer class="with-border-bottom"> <div class="container"> <h2>Legend</h2> <div class="tsd-legend-group"> <ul class="tsd-legend"> <li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li> <li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li> <li class="tsd-kind-type-alias"><span class="tsd-kind-icon">Type alias</span></li> </ul> <ul class="tsd-legend"> <li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li> </ul> <ul class="tsd-legend"> <li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li> </ul> </div> </div></footer><div class="container tsd-generator"> <p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="assets/js/main.js"></script></body></html>