From 537184070339c0fa265a3bb8dcd01ffa1347e4af Mon Sep 17 00:00:00 2001 From: asos-craigmorten Date: Mon, 1 Jun 2020 16:17:30 +0100 Subject: [PATCH] feat: initial Oak extension for SuperDeno - _SuperOak_. --- .github/CHANGELOG.md | 5 + .github/CODEOWNERS.md | 3 + .github/CONTRIBUTING.md | 102 ++ .github/ISSUE_TEMPLATE.md | 14 + .github/PULL_REQUEST_TEMPLATE.md | 13 + .github/workflows/test.yml | 23 + .gitignore | 1 + .vscode/settings.json | 10 + CODE_OF_CONDUCT.md | 128 ++ LICENSE.md | 9 + Makefile | 34 + README.md | 148 ++ deps.ts | 14 + docs/_config.yaml | 5 + docs/assets/css/main.css | 2679 +++++++++++++++++++++++++++++ docs/assets/images/icons.png | Bin 0 -> 9615 bytes docs/assets/images/icons@2x.png | Bin 0 -> 28144 bytes docs/assets/images/widgets.png | Bin 0 -> 480 bytes docs/assets/images/widgets@2x.png | Bin 0 -> 855 bytes docs/assets/js/main.js | 2276 ++++++++++++++++++++++++ docs/assets/js/search.json | 1 + docs/globals.html | 113 ++ docs/index.html | 231 +++ docs/modules/_superoak_.html | 196 +++ lock.json | 262 +++ mod.ts | 7 + src/superoak.ts | 70 + test/deps.ts | 4 + test/superoak.test.ts | 984 +++++++++++ test/utils.ts | 63 + version.ts | 9 + 31 files changed, 7404 insertions(+) create mode 100644 .github/CHANGELOG.md create mode 100644 .github/CODEOWNERS.md create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/test.yml create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 CODE_OF_CONDUCT.md create mode 100644 LICENSE.md create mode 100644 Makefile create mode 100644 deps.ts create mode 100644 docs/_config.yaml create mode 100644 docs/assets/css/main.css create mode 100644 docs/assets/images/icons.png create mode 100644 docs/assets/images/icons@2x.png create mode 100644 docs/assets/images/widgets.png create mode 100644 docs/assets/images/widgets@2x.png create mode 100644 docs/assets/js/main.js create mode 100644 docs/assets/js/search.json create mode 100644 docs/globals.html create mode 100644 docs/index.html create mode 100644 docs/modules/_superoak_.html create mode 100644 lock.json create mode 100644 mod.ts create mode 100644 src/superoak.ts create mode 100644 test/deps.ts create mode 100644 test/superoak.test.ts create mode 100644 test/utils.ts create mode 100644 version.ts diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md new file mode 100644 index 0000000..a5940d5 --- /dev/null +++ b/.github/CHANGELOG.md @@ -0,0 +1,5 @@ +# ChangeLog + +## [1.0.0] - 01-06-2020 + +- feat: initial Oak extension for SuperDeno - _SuperOak_. diff --git a/.github/CODEOWNERS.md b/.github/CODEOWNERS.md new file mode 100644 index 0000000..de90c3e --- /dev/null +++ b/.github/CODEOWNERS.md @@ -0,0 +1,3 @@ +# CODEOWNERS + +- @asos-craigmorten - diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..d058fe3 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,102 @@ +# Contributing to this repository + +First of all, thanks for taking the time to read this document and contributing to our codebase! :tada: + +Please read each section carefully. + +## Getting started + +The first thing to do before starting to work on your feature would be to have a conversation with the codeowners about it, we may have some pointers or examples that might make your life much easier! + +The other thing you will need before you start is to create an issue describing what it is that you're set to do, or if its a bug make sure there are clear reproduction steps on the description. + +Things to talk about in our first conversation: + +- Planned implementation +- Test plan + +Be sure to check for existing issues before raising your own! + +## Working on your feature + +### Branching + +On this project we follow mainline development (or trunk based development), and our default branch is `master`. + +Therefore you need to branch from `master` and merge into `master`. + +We use the following convention for branch names `feat/issue-#-short-description`, where the the `#` should be replaced with the GitHub issue number, and the short description should provide an idea of what the branch is for. + +Here are some examples: + +- `feat/issue-137-new-icon`, a new feature. +- `fix/issue-239-windows-bug`, a bug fix. +- `chore/issue-95-improve-docs`, a chore is something that doesn't add functionality to the user but needs to be done. + +### Coding style + +Generally try to match the style and conventions of the code around your changes. Ultimately we want code that is clear, concise, consistent and easy to read. + +Broadly we're in-tune with the following style guides: + +- +- +- + +As this is a Deno project will also insist on meeting the Deno `fmt` standards. + +### Format Code + +To format the code run: + +```bash +make fmt +``` + +To ensure that your code is properly formatted run: + +```bash +make lint +``` + +### Tests + +Before opening a PR, please run the following command to make sure your branch will build and pass all the tests: + +```console +make test +``` + +If your change will impact server performance, you can use: + +```bash +make benchmark +``` + +to get a benchmark report for your changes. + +### Documentation + +Before opening a PR, please delete your `./docs` directory and run the following command to make sure your branch will being fully documented: + +```console +make typedoc +``` + +Please also ensure that the `./docs/_config.yaml` is re-instated. + +### Run Tests + +```bash +make test +``` + +## Opening a PR + +Once you're confident your branch is ready to review, open a PR against `master` on this repo. + +Please make sure you fill the PR template correctly. + +## Merging and publishing + +When your feature branch/PR has been tested and has an approval, it is then ready to merge. Please contact the maintainer to action the merge. diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..9caabaa --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,14 @@ +# Issue + +Setup: + +- Deno Version: +- v8 Version: +- Typescript Version: +- Opine Version: + +> Please replace this line with a short description of the issue. + +## Details + +> Please replace this quote block with the details of the feature / bug you wish to be addressed. If it is a bug please do your best to add steps to reproduce. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..f77c808 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,13 @@ +# Issue + +[_ISSUE_ID_](https://github.com/asos-craigmorten/opine/issues/_ISSUE_ID_) + +## Details + +Brief summary of PR purpose and code changes. + +## CheckList + +- [ ] PR starts with [_ISSUE_ID_] and branch name is e.g. feature/_description_ (see branching strategy in [CONTRIBUTING](./CONTRIBUTING.md)). +- [ ] Squashed commit message is prefixed with [_ISSUE_ID_] as above. +- [ ] Has been tested (where required) before merge to develop. diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..e69d03d --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,23 @@ +name: Test + +on: + push: + branches: [master] + pull_request: + branches: [master] + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + deno-version: [1.0.0, 1.0.2, 1.0.3] + + steps: + - uses: actions/checkout@v2 + - name: Use Deno ${{ matrix.deno-version }} + uses: denolib/setup-deno@master + with: + deno-version: ${{ matrix.deno-version }} + - run: make ci diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..496ee2c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0d0b0ed --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "deno.enable": true, + "[typescript]": { + "editor.defaultFormatter": "axetroy.vscode-deno" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "axetroy.vscode-deno" + }, + "editor.defaultFormatter": "esbenp.prettier-vscode" +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..984b3a3 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or + advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email + address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +. All complaints will be reviewed and investigated promptly +and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +. Translations are available at +. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..20bbec8 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,9 @@ +(The MIT License) + +Copyright (c) 2020 Craig Morten + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ee8037e --- /dev/null +++ b/Makefile @@ -0,0 +1,34 @@ +.PHONY: build ci doc fmt fmt-check lock precommit test typedoc + +build: + @deno run --lock=lock.json --reload mod.ts + +ci: + @make fmt-check + @make build + @make test + +doc: + @deno doc ./mod.ts + +fmt: + @deno fmt + +fmt-check: + @deno fmt --check + +lock: + @deno run --lock=lock.json --lock-write --reload mod.ts + +precommit: + @make lock + @make typedoc + @make fmt + @make fmt + +test: + @deno test --allow-net --allow-read + +typedoc: + @typedoc --ignoreCompilerErrors --out ./docs --mode modules --includeDeclarations --excludeExternals ./src + diff --git a/README.md b/README.md index 60a4209..3cfdb5d 100644 --- a/README.md +++ b/README.md @@ -1 +1,149 @@ # superoak + +HTTP assertions for Deno's Oak web framework made easy via [SuperDeno](https://github.com/asos-craigmorten/superdeno). + +[![GitHub tag](https://img.shields.io/github/tag/asos-craigmorten/superoak)](https://github.com/asos-craigmorten/superoak/tags/) ![Test](https://github.com/asos-craigmorten/superoak/workflows/Test/badge.svg) [![deno doc](https://doc.deno.land/badge.svg)](https://doc.deno.land/https/deno.land/x/superoak/mod.ts) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com) [![GitHub issues](https://img.shields.io/github/issues/asos-craigmorten/superoak)](https://img.shields.io/github/issues/asos-craigmorten/superoak) +![GitHub stars](https://img.shields.io/github/stars/asos-craigmorten/superoak) ![GitHub forks](https://img.shields.io/github/forks/asos-craigmorten/superoak) ![superoak License](https://img.shields.io/github/license/asos-craigmorten/superoak) [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://GitHub.com/asos-craigmorten/superoak/graphs/commit-activity) [![HitCount](http://hits.dwyl.com/asos-craigmorten/superoak.svg)](http://hits.dwyl.com/asos-craigmorten/superoak) + +## About + +This module aims to provide a high-level abstraction for testing HTTP in Deno's Oak web framework. This is a wrapper compatibility layer around [SuperDeno](https://github.com/asos-craigmorten/superdeno) to reduce some of the boilerplate needed to setup Oak integration + functional tests. + +## Installation + +This is a [Deno](https://deno.land/) module available to import direct from this repo and via the [Deno Registry](https://deno.land/x). + +Before importing, [download and install Deno](https://deno.land/#installation). + +You can then import SuperOak straight into your project: + +```ts +import { superoak } from "https://deno.land/x/superoak@master/mod.ts"; +``` + +If you want to use a specific version of SuperOak, just modify the import url to contain the version: + +```ts +import { superoak } from "https://deno.land/x/superoak@0.3.0/mod.ts"; +``` + +Or if you want to use a specific commit of SuperOak, just modify the import url to contain the commit hash: + +```ts +import { superoak } from "https://deno.land/x/superoak@c21f8d6/mod.ts"; +``` + +## Example + +You may pass a url string (for an already running Oak server), or an Oak `Application` object to `superoak()` - when passing an Oak `Application`, SuperOak will automatically handle the creation of a server, binding to a free ephemeral port and closing of the server on a call to `.end()`. + +SuperOak works with any Deno test framework. Here's an example with Deno's built-in test framework, note how you can pass `done` straight to any of the `.expect()` calls: + +```ts +import { superoak } from "https://deno.land/x/superoak@master/mod.ts"; +import { Application, Router } from "https://deno.land/x/oak@master/mod.ts"; + +Deno.test("it should support the Oak framework", (done) => { + const router = new Router(); + router.get("/", (ctx) => { + ctx.response.body = "Hello Deno!"; + }); + + const app = new Application(); + app.use(router.routes()); + app.use(router.allowedMethods()); + + const request = await superoak(app); + request.get("/").expect("Hello Deno!", done); +}); +``` + +For further examples, see the [tests](./test/superoak.test.ts) or the [SuperDeno examples](https://github.com/asos-craigmorten/superdeno#example) for inspiration. + +## Docs + +- [SuperOak Type Docs](https://asos-craigmorten.github.io/superoak/) +- [SuperOak Deno Docs](https://doc.deno.land/https/deno.land/x/superoak/mod.ts) +- [License](https://github.com/asos-craigmorten/superoak/blob/master/LICENSE.md) +- [Changelog](https://github.com/asos-craigmorten/superoak/blob/master/.github/CHANGELOG.md) + +## API + +Please refer to the [SuperDeno API](https://github.com/asos-craigmorten/superdeno#api). + +## Notes + +- Unlike [SuperDeno](https://github.com/asos-craigmorten/superdeno), `superoak()` returns a promise which will need to be awaited before you can call a method such as `.get("/")`. +- Unlike [SuperDeno](https://github.com/asos-craigmorten/superdeno), you cannot re-use a SuperOak instance once the chained `.end()` method has been called. This is because SuperOak will automatically close the server once the chained `.end()` method is called. For example the following example will fail due to this limitation: + + ```ts + Deno.test( + "it will throw a `Request has been terminated` error when trying to use an ended SuperOak object", + async (done) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "Hello Deno!"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + const request = await superoak(app); + + request.get("/").end(() => { + request.get("/").end((err, res) => { + /** + * This will have the following error: + * + * Error: Request has been terminated + * Possible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc. + * ... + */ + expect(err).toBeNull(); + done(); + }); + }); + } + ); + ``` + + Instead you should make all of your assertions on the one SuperOak instance, or create a new SuperOak instance like below: + + ```ts + Deno.test( + "it will allow your to re-use the Application for another SuperOak instance", + async (done) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "Hello Deno!"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + let request = await superoak(app); + + request.get("/").end(async () => { + request = await superoak(app); + + request.get("/").end((err, res) => { + expect(err).toBeNull(); + done(); + }); + } + ); + ``` + +## Contributing + +[Contributing guide](https://github.com/asos-craigmorten/superoak/blob/master/.github/CONTRIBUTING.md) + +--- + +## License + +SuperOak is licensed under the [MIT License](./LICENSE.md). diff --git a/deps.ts b/deps.ts new file mode 100644 index 0000000..9572e0d --- /dev/null +++ b/deps.ts @@ -0,0 +1,14 @@ +export { Server } from "https://deno.land/std@0.53.0/http/server.ts"; +export { + superdeno, + SuperDeno, + Test, + IRequest, + IResponse, +} from "https://deno.land/x/superdeno@1.1.1/mod.ts"; +export * from "https://deno.land/x/oak@v5.0.0/mod.ts"; +export { methods } from "https://deno.land/x/opine@0.8.0/mod.ts"; +export { + getFreePort, + isFreePort, +} from "https://deno.land/x/free_port@v1.2.0/mod.ts"; diff --git a/docs/_config.yaml b/docs/_config.yaml new file mode 100644 index 0000000..4511f82 --- /dev/null +++ b/docs/_config.yaml @@ -0,0 +1,5 @@ +future: true +encoding: "UTF-8" +include: + - "_*_.html" + - "_*_.*.html" diff --git a/docs/assets/css/main.css b/docs/assets/css/main.css new file mode 100644 index 0000000..959edd7 --- /dev/null +++ b/docs/assets/css/main.css @@ -0,0 +1,2679 @@ +/*! normalize.css v1.1.3 | MIT License | git.io/normalize */ +/* ========================================================================== + * * HTML5 display definitions + * * ========================================================================== */ +/** + * * Correct `block` display not defined in IE 6/7/8/9 and Firefox 3. */ +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { + display: block; +} + +/** + * * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. */ +audio, canvas, video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +/** + * * Prevent modern browsers from displaying `audio` without controls. + * * Remove excess height in iOS 5 devices. */ +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. + * * Known issue: no IE 6 support. */ +[hidden] { + display: none; +} + +/* ========================================================================== + * * Base + * * ========================================================================== */ +/** + * * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using + * * `em` units. + * * 2. Prevent iOS text size adjust after orientation change, without disabling + * * user zoom. */ +html { + font-size: 100%; + /* 1 */ + -ms-text-size-adjust: 100%; + /* 2 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + font-family: sans-serif; +} + +/** + * * Address `font-family` inconsistency between `textarea` and other form + * * elements. */ +button, input, select, textarea { + font-family: sans-serif; +} + +/** + * * Address margins handled incorrectly in IE 6/7. */ +body { + margin: 0; +} + +/* ========================================================================== + * * Links + * * ========================================================================== */ +/** + * * Address `outline` inconsistency between Chrome and other browsers. */ +a:focus { + outline: thin dotted; +} +a:active, a:hover { + outline: 0; +} + +/** + * * Improve readability when focused and also mouse hovered in all browsers. */ +/* ========================================================================== + * * Typography + * * ========================================================================== */ +/** + * * Address font sizes and margins set differently in IE 6/7. + * * Address font sizes within `section` and `article` in Firefox 4+, Safari 5, + * * and Chrome. */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +h2 { + font-size: 1.5em; + margin: 0.83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4, .tsd-index-panel h3 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} + +/** + * * Address styling not present in IE 7/8/9, Safari 5, and Chrome. */ +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * * Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome. */ +b, strong { + font-weight: bold; +} + +blockquote { + margin: 1em 40px; +} + +/** + * * Address styling not present in Safari 5 and Chrome. */ +dfn { + font-style: italic; +} + +/** + * * Address differences between Firefox and other browsers. + * * Known issue: no IE 6/7 normalization. */ +hr { + box-sizing: content-box; + height: 0; +} + +/** + * * Address styling not present in IE 6/7/8/9. */ +mark { + background: #ff0; + color: #000; +} + +/** + * * Address margins set differently in IE 6/7. */ +p, pre { + margin: 1em 0; +} + +/** + * * Correct font family set oddly in IE 6, Safari 4/5, and Chrome. */ +code, kbd, pre, samp { + font-family: monospace, serif; + _font-family: "courier new", monospace; + font-size: 1em; +} + +/** + * * Improve readability of pre-formatted text in all browsers. */ +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +/** + * * Address CSS quotes not supported in IE 6/7. */ +q { + quotes: none; +} +q:before, q:after { + content: ""; + content: none; +} + +/** + * * Address `quotes` property not supported in Safari 4. */ +/** + * * Address inconsistent and variable font size in all browsers. */ +small { + font-size: 80%; +} + +/** + * * Prevent `sub` and `sup` affecting `line-height` in all browsers. */ +sub { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* ========================================================================== + * * Lists + * * ========================================================================== */ +/** + * * Address margins set differently in IE 6/7. */ +dl, menu, ol, ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +/** + * * Address paddings set differently in IE 6/7. */ +menu, ol, ul { + padding: 0 0 0 40px; +} + +/** + * * Correct list images handled incorrectly in IE 7. */ +nav ul, nav ol { + list-style: none; + list-style-image: none; +} + +/* ========================================================================== + * * Embedded content + * * ========================================================================== */ +/** + * * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. + * * 2. Improve image quality when scaled in IE 7. */ +img { + border: 0; + /* 1 */ + -ms-interpolation-mode: bicubic; +} + +/* 2 */ +/** + * * Correct overflow displayed oddly in IE 9. */ +svg:not(:root) { + overflow: hidden; +} + +/* ========================================================================== + * * Figures + * * ========================================================================== */ +/** + * * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. */ +figure, form { + margin: 0; +} + +/* ========================================================================== + * * Forms + * * ========================================================================== */ +/** + * * Correct margin displayed oddly in IE 6/7. */ +/** + * * Define consistent border, margin, and padding. */ +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * * 1. Correct color not being inherited in IE 6/7/8/9. + * * 2. Correct text not wrapping in Firefox 3. + * * 3. Correct alignment displayed oddly in IE 6/7. */ +legend { + border: 0; + /* 1 */ + padding: 0; + white-space: normal; + /* 2 */ + *margin-left: -7px; +} + +/* 3 */ +/** + * * 1. Correct font size not being inherited in all browsers. + * * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, + * * and Chrome. + * * 3. Improve appearance and consistency in all browsers. */ +button, input, select, textarea { + font-size: 100%; + /* 1 */ + margin: 0; + /* 2 */ + vertical-align: baseline; + /* 3 */ + *vertical-align: middle; +} + +/* 3 */ +/** + * * Address Firefox 3+ setting `line-height` on `input` using `!important` in + * * the UA stylesheet. */ +button, input { + line-height: normal; +} + +/** + * * Address inconsistent `text-transform` inheritance for `button` and `select`. + * * All other form control elements do not inherit `text-transform` values. + * * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. + * * Correct `select` style inheritance in Firefox 4+ and Opera. */ +button, select { + text-transform: none; +} + +/** + * * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * * and `video` controls. + * * 2. Correct inability to style clickable `input` types in iOS. + * * 3. Improve usability and consistency of cursor style between image-type + * * `input` and others. + * * 4. Remove inner spacing in IE 7 without affecting normal text inputs. + * * Known issue: inner spacing remains in IE 6. */ +button, html input[type=button] { + -webkit-appearance: button; + /* 2 */ + cursor: pointer; + /* 3 */ + *overflow: visible; +} + +/* 4 */ +input[type=reset], input[type=submit] { + -webkit-appearance: button; + /* 2 */ + cursor: pointer; + /* 3 */ + *overflow: visible; +} + +/* 4 */ +/** + * * Re-set default cursor for disabled elements. */ +button[disabled], html input[disabled] { + cursor: default; +} + +/** + * * 1. Address box sizing set to content-box in IE 8/9. + * * 2. Remove excess padding in IE 8/9. + * * 3. Remove excess padding in IE 7. + * * Known issue: excess padding remains in IE 6. */ +input { + /* 3 */ +} +input[type=checkbox], input[type=radio] { + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ + *height: 13px; + /* 3 */ + *width: 13px; +} +input[type=search] { + -webkit-appearance: textfield; + /* 1 */ + /* 2 */ + box-sizing: content-box; +} +input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * * (include `-moz` to future-proof). */ +/** + * * Remove inner padding and search cancel button in Safari 5 and Chrome + * * on OS X. */ +/** + * * Remove inner padding and border in Firefox 3+. */ +button::-moz-focus-inner, input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * * 1. Remove default vertical scrollbar in IE 6/7/8/9. + * * 2. Improve readability and alignment in all browsers. */ +textarea { + overflow: auto; + /* 1 */ + vertical-align: top; +} + +/* 2 */ +/* ========================================================================== + * * Tables + * * ========================================================================== */ +/** + * * Remove most spacing between table cells. */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* * + * *Visual Studio-like style based on original C# coloring by Jason Diamond */ +.hljs { + display: inline-block; + padding: 0.5em; + background: white; + color: black; +} + +.hljs-comment, .hljs-annotation, .hljs-template_comment, .diff .hljs-header, .hljs-chunk, .apache .hljs-cbracket { + color: #008000; +} + +.hljs-keyword, .hljs-id, .hljs-built_in, .css .smalltalk .hljs-class, .hljs-winutils, .bash .hljs-variable, .tex .hljs-command, .hljs-request, .hljs-status, .nginx .hljs-title { + color: #00f; +} + +.xml .hljs-tag { + color: #00f; +} +.xml .hljs-tag .hljs-value { + color: #00f; +} + +.hljs-string, .hljs-title, .hljs-parent, .hljs-tag .hljs-value, .hljs-rules .hljs-value { + color: #a31515; +} + +.ruby .hljs-symbol { + color: #a31515; +} +.ruby .hljs-symbol .hljs-string { + color: #a31515; +} + +.hljs-template_tag, .django .hljs-variable, .hljs-addition, .hljs-flow, .hljs-stream, .apache .hljs-tag, .hljs-date, .tex .hljs-formula, .coffeescript .hljs-attribute { + color: #a31515; +} + +.ruby .hljs-string, .hljs-decorator, .hljs-filter .hljs-argument, .hljs-localvars, .hljs-array, .hljs-attr_selector, .hljs-pseudo, .hljs-pi, .hljs-doctype, .hljs-deletion, .hljs-envvar, .hljs-shebang, .hljs-preprocessor, .hljs-pragma, .userType, .apache .hljs-sqbracket, .nginx .hljs-built_in, .tex .hljs-special, .hljs-prompt { + color: #2b91af; +} + +.hljs-phpdoc, .hljs-javadoc, .hljs-xmlDocTag { + color: #808080; +} + +.vhdl .hljs-typename { + font-weight: bold; +} +.vhdl .hljs-string { + color: #666666; +} +.vhdl .hljs-literal { + color: #a31515; +} +.vhdl .hljs-attribute { + color: #00b0e8; +} + +.xml .hljs-attribute { + color: #f00; +} + +ul.tsd-descriptions > li > :first-child, .tsd-panel > :first-child, .col > :first-child, .col-11 > :first-child, .col-10 > :first-child, .col-9 > :first-child, .col-8 > :first-child, .col-7 > :first-child, .col-6 > :first-child, .col-5 > :first-child, .col-4 > :first-child, .col-3 > :first-child, .col-2 > :first-child, .col-1 > :first-child, +ul.tsd-descriptions > li > :first-child > :first-child, +.tsd-panel > :first-child > :first-child, +.col > :first-child > :first-child, +.col-11 > :first-child > :first-child, +.col-10 > :first-child > :first-child, +.col-9 > :first-child > :first-child, +.col-8 > :first-child > :first-child, +.col-7 > :first-child > :first-child, +.col-6 > :first-child > :first-child, +.col-5 > :first-child > :first-child, +.col-4 > :first-child > :first-child, +.col-3 > :first-child > :first-child, +.col-2 > :first-child > :first-child, +.col-1 > :first-child > :first-child, +ul.tsd-descriptions > li > :first-child > :first-child > :first-child, +.tsd-panel > :first-child > :first-child > :first-child, +.col > :first-child > :first-child > :first-child, +.col-11 > :first-child > :first-child > :first-child, +.col-10 > :first-child > :first-child > :first-child, +.col-9 > :first-child > :first-child > :first-child, +.col-8 > :first-child > :first-child > :first-child, +.col-7 > :first-child > :first-child > :first-child, +.col-6 > :first-child > :first-child > :first-child, +.col-5 > :first-child > :first-child > :first-child, +.col-4 > :first-child > :first-child > :first-child, +.col-3 > :first-child > :first-child > :first-child, +.col-2 > :first-child > :first-child > :first-child, +.col-1 > :first-child > :first-child > :first-child { + margin-top: 0; +} +ul.tsd-descriptions > li > :last-child, .tsd-panel > :last-child, .col > :last-child, .col-11 > :last-child, .col-10 > :last-child, .col-9 > :last-child, .col-8 > :last-child, .col-7 > :last-child, .col-6 > :last-child, .col-5 > :last-child, .col-4 > :last-child, .col-3 > :last-child, .col-2 > :last-child, .col-1 > :last-child, +ul.tsd-descriptions > li > :last-child > :last-child, +.tsd-panel > :last-child > :last-child, +.col > :last-child > :last-child, +.col-11 > :last-child > :last-child, +.col-10 > :last-child > :last-child, +.col-9 > :last-child > :last-child, +.col-8 > :last-child > :last-child, +.col-7 > :last-child > :last-child, +.col-6 > :last-child > :last-child, +.col-5 > :last-child > :last-child, +.col-4 > :last-child > :last-child, +.col-3 > :last-child > :last-child, +.col-2 > :last-child > :last-child, +.col-1 > :last-child > :last-child, +ul.tsd-descriptions > li > :last-child > :last-child > :last-child, +.tsd-panel > :last-child > :last-child > :last-child, +.col > :last-child > :last-child > :last-child, +.col-11 > :last-child > :last-child > :last-child, +.col-10 > :last-child > :last-child > :last-child, +.col-9 > :last-child > :last-child > :last-child, +.col-8 > :last-child > :last-child > :last-child, +.col-7 > :last-child > :last-child > :last-child, +.col-6 > :last-child > :last-child > :last-child, +.col-5 > :last-child > :last-child > :last-child, +.col-4 > :last-child > :last-child > :last-child, +.col-3 > :last-child > :last-child > :last-child, +.col-2 > :last-child > :last-child > :last-child, +.col-1 > :last-child > :last-child > :last-child { + margin-bottom: 0; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 40px; +} +@media (max-width: 640px) { + .container { + padding: 0 20px; + } +} + +.container-main { + padding-bottom: 200px; +} + +.row { + display: -ms-flexbox; + display: flex; + position: relative; + margin: 0 -10px; +} +.row:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +.col, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 { + box-sizing: border-box; + float: left; + padding: 0 10px; +} + +.col-1 { + width: 8.3333333333%; +} + +.offset-1 { + margin-left: 8.3333333333%; +} + +.col-2 { + width: 16.6666666667%; +} + +.offset-2 { + margin-left: 16.6666666667%; +} + +.col-3 { + width: 25%; +} + +.offset-3 { + margin-left: 25%; +} + +.col-4 { + width: 33.3333333333%; +} + +.offset-4 { + margin-left: 33.3333333333%; +} + +.col-5 { + width: 41.6666666667%; +} + +.offset-5 { + margin-left: 41.6666666667%; +} + +.col-6 { + width: 50%; +} + +.offset-6 { + margin-left: 50%; +} + +.col-7 { + width: 58.3333333333%; +} + +.offset-7 { + margin-left: 58.3333333333%; +} + +.col-8 { + width: 66.6666666667%; +} + +.offset-8 { + margin-left: 66.6666666667%; +} + +.col-9 { + width: 75%; +} + +.offset-9 { + margin-left: 75%; +} + +.col-10 { + width: 83.3333333333%; +} + +.offset-10 { + margin-left: 83.3333333333%; +} + +.col-11 { + width: 91.6666666667%; +} + +.offset-11 { + margin-left: 91.6666666667%; +} + +.tsd-kind-icon { + display: block; + position: relative; + padding-left: 20px; + text-indent: -20px; +} +.tsd-kind-icon:before { + content: ""; + display: inline-block; + vertical-align: middle; + width: 17px; + height: 17px; + margin: 0 3px 2px 0; + background-image: url(../images/icons.png); +} +@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + .tsd-kind-icon:before { + background-image: url(../images/icons@2x.png); + background-size: 238px 204px; + } +} + +.tsd-signature.tsd-kind-icon:before { + background-position: 0 -153px; +} + +.tsd-kind-object-literal > .tsd-kind-icon:before { + background-position: 0px -17px; +} +.tsd-kind-object-literal.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -17px; +} +.tsd-kind-object-literal.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -17px; +} + +.tsd-kind-class > .tsd-kind-icon:before { + background-position: 0px -34px; +} +.tsd-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -34px; +} +.tsd-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -34px; +} + +.tsd-kind-class.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -51px; +} +.tsd-kind-class.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -51px; +} +.tsd-kind-class.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -51px; +} + +.tsd-kind-interface > .tsd-kind-icon:before { + background-position: 0px -68px; +} +.tsd-kind-interface.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -68px; +} +.tsd-kind-interface.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -68px; +} + +.tsd-kind-interface.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -85px; +} +.tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -85px; +} +.tsd-kind-interface.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -85px; +} + +.tsd-kind-namespace > .tsd-kind-icon:before { + background-position: 0px -102px; +} +.tsd-kind-namespace.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -102px; +} +.tsd-kind-namespace.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -102px; +} + +.tsd-kind-module > .tsd-kind-icon:before { + background-position: 0px -102px; +} +.tsd-kind-module.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -102px; +} +.tsd-kind-module.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -102px; +} + +.tsd-kind-enum > .tsd-kind-icon:before { + background-position: 0px -119px; +} +.tsd-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -119px; +} +.tsd-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -119px; +} + +.tsd-kind-enum-member > .tsd-kind-icon:before { + background-position: 0px -136px; +} +.tsd-kind-enum-member.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -136px; +} +.tsd-kind-enum-member.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -136px; +} + +.tsd-kind-signature > .tsd-kind-icon:before { + background-position: 0px -153px; +} +.tsd-kind-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -153px; +} +.tsd-kind-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -153px; +} + +.tsd-kind-type-alias > .tsd-kind-icon:before { + background-position: 0px -170px; +} +.tsd-kind-type-alias.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -170px; +} +.tsd-kind-type-alias.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -170px; +} + +.tsd-kind-type-alias.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -187px; +} +.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -187px; +} +.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -187px; +} + +.tsd-kind-variable > .tsd-kind-icon:before { + background-position: -136px -0px; +} +.tsd-kind-variable.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -0px; +} +.tsd-kind-variable.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -0px; +} +.tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -0px; +} + +.tsd-kind-property > .tsd-kind-icon:before { + background-position: -136px -0px; +} +.tsd-kind-property.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -0px; +} +.tsd-kind-property.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -0px; +} +.tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -0px; +} + +.tsd-kind-get-signature > .tsd-kind-icon:before { + background-position: -136px -17px; +} +.tsd-kind-get-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -17px; +} +.tsd-kind-get-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -17px; +} + +.tsd-kind-set-signature > .tsd-kind-icon:before { + background-position: -136px -34px; +} +.tsd-kind-set-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -34px; +} +.tsd-kind-set-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -34px; +} + +.tsd-kind-accessor > .tsd-kind-icon:before { + background-position: -136px -51px; +} +.tsd-kind-accessor.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -51px; +} +.tsd-kind-accessor.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -51px; +} + +.tsd-kind-function > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-method > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-call-signature > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-function.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: -136px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -85px; +} + +.tsd-kind-method.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: -136px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -85px; +} + +.tsd-kind-constructor > .tsd-kind-icon:before { + background-position: -136px -102px; +} +.tsd-kind-constructor.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -102px; +} +.tsd-kind-constructor.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -102px; +} + +.tsd-kind-constructor-signature > .tsd-kind-icon:before { + background-position: -136px -102px; +} +.tsd-kind-constructor-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -102px; +} +.tsd-kind-constructor-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -102px; +} + +.tsd-kind-index-signature > .tsd-kind-icon:before { + background-position: -136px -119px; +} +.tsd-kind-index-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -119px; +} +.tsd-kind-index-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -119px; +} + +.tsd-kind-event > .tsd-kind-icon:before { + background-position: -136px -136px; +} +.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -136px; +} +.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -136px; +} +.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -136px; +} + +.tsd-is-static > .tsd-kind-icon:before { + background-position: -136px -153px; +} +.tsd-is-static.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -153px; +} +.tsd-is-static.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -153px; +} +.tsd-is-static.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -153px; +} +.tsd-is-static.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -153px; +} +.tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -153px; +} + +.tsd-is-static.tsd-kind-function > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-method > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-call-signature > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-event > .tsd-kind-icon:before { + background-position: -136px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -102px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -221px -187px; +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes shift-to-left { + from { + transform: translate(0, 0); + } + to { + transform: translate(-25%, 0); + } +} +@keyframes unshift-to-left { + from { + transform: translate(-25%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: #fdfdfd; + font-family: "Segoe UI", sans-serif; + font-size: 16px; + color: #222; +} + +a { + color: #4da6ff; + text-decoration: none; +} +a:hover { + text-decoration: underline; +} + +code, pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 14px; + background-color: rgba(0, 0, 0, 0.04); +} + +pre { + padding: 10px; +} +pre code { + padding: 0; + font-size: 100%; + background-color: transparent; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography h4, .tsd-typography .tsd-index-panel h3, .tsd-index-panel .tsd-typography h3, .tsd-typography h5, .tsd-typography h6 { + font-size: 1em; + margin: 0; +} +.tsd-typography h5, .tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, .tsd-typography ul, .tsd-typography ol { + margin: 1em 0; +} + +@media (min-width: 901px) and (max-width: 1024px) { + html.default .col-content { + width: 72%; + } + html.default .col-menu { + width: 28%; + } + html.default .tsd-navigation { + padding-left: 10px; + } +} +@media (max-width: 900px) { + html.default .col-content { + float: none; + width: 100%; + } + html.default .col-menu { + position: fixed !important; + overflow: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + width: 100%; + padding: 20px 20px 0 0; + max-width: 450px; + visibility: hidden; + background-color: #fff; + transform: translate(100%, 0); + } + html.default .col-menu > *:last-child { + padding-bottom: 20px; + } + html.default .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + html.default.to-has-menu .overlay { + animation: fade-in 0.4s; + } + html.default.to-has-menu header, +html.default.to-has-menu footer, +html.default.to-has-menu .col-content { + animation: shift-to-left 0.4s; + } + html.default.to-has-menu .col-menu { + animation: pop-in-from-right 0.4s; + } + html.default.from-has-menu .overlay { + animation: fade-out 0.4s; + } + html.default.from-has-menu header, +html.default.from-has-menu footer, +html.default.from-has-menu .col-content { + animation: unshift-to-left 0.4s; + } + html.default.from-has-menu .col-menu { + animation: pop-out-to-right 0.4s; + } + html.default.has-menu body { + overflow: hidden; + } + html.default.has-menu .overlay { + visibility: visible; + } + html.default.has-menu header, +html.default.has-menu footer, +html.default.has-menu .col-content { + transform: translate(-25%, 0); + } + html.default.has-menu .col-menu { + visibility: visible; + transform: translate(0, 0); + } +} + +.tsd-page-title { + padding: 70px 0 20px 0; + margin: 0 0 40px 0; + background: #fff; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.35); +} +.tsd-page-title h1 { + margin: 0; +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: #808080; +} +.tsd-breadcrumb a { + color: #808080; + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +html.minimal .container { + margin: 0; +} +html.minimal .container-main { + padding-top: 50px; + padding-bottom: 0; +} +html.minimal .content-wrap { + padding-left: 300px; +} +html.minimal .tsd-navigation { + position: fixed !important; + overflow: auto; + -webkit-overflow-scrolling: touch; + box-sizing: border-box; + z-index: 1; + left: 0; + top: 40px; + bottom: 0; + width: 300px; + padding: 20px; + margin: 0; +} +html.minimal .tsd-member .tsd-member { + margin-left: 0; +} +html.minimal .tsd-page-toolbar { + position: fixed; + z-index: 2; +} +html.minimal #tsd-filter .tsd-filter-group { + right: 0; + transform: none; +} +html.minimal footer { + background-color: transparent; +} +html.minimal footer .container { + padding: 0; +} +html.minimal .tsd-generator { + padding: 0; +} +@media (max-width: 900px) { + html.minimal .tsd-navigation { + display: none; + } + html.minimal .content-wrap { + padding-left: 0; + } +} + +dl.tsd-comment-tags { + overflow: hidden; +} +dl.tsd-comment-tags dt { + float: left; + padding: 1px 5px; + margin: 0 10px 0 0; + border-radius: 4px; + border: 1px solid #808080; + color: #808080; + font-size: 0.8em; + font-weight: normal; +} +dl.tsd-comment-tags dd { + margin: 0 0 10px 0; +} +dl.tsd-comment-tags dd:before, dl.tsd-comment-tags dd:after { + display: table; + content: " "; +} +dl.tsd-comment-tags dd pre, dl.tsd-comment-tags dd:after { + clear: both; +} +dl.tsd-comment-tags p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.toggle-protected .tsd-is-private { + display: none; +} + +.toggle-public .tsd-is-private, +.toggle-public .tsd-is-protected, +.toggle-public .tsd-is-private-protected { + display: none; +} + +.toggle-inherited .tsd-is-inherited { + display: none; +} + +.toggle-only-exported .tsd-is-not-exported { + display: none; +} + +.toggle-externals .tsd-is-external { + display: none; +} + +#tsd-filter { + position: relative; + display: inline-block; + height: 40px; + vertical-align: bottom; +} +.no-filter #tsd-filter { + display: none; +} +#tsd-filter .tsd-filter-group { + display: inline-block; + height: 40px; + vertical-align: bottom; + white-space: nowrap; +} +#tsd-filter input { + display: none; +} +@media (max-width: 900px) { + #tsd-filter .tsd-filter-group { + display: block; + position: absolute; + top: 40px; + right: 20px; + height: auto; + background-color: #fff; + visibility: hidden; + transform: translate(50%, 0); + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + } + .has-options #tsd-filter .tsd-filter-group { + visibility: visible; + } + .to-has-options #tsd-filter .tsd-filter-group { + animation: fade-in 0.2s; + } + .from-has-options #tsd-filter .tsd-filter-group { + animation: fade-out 0.2s; + } + #tsd-filter label, +#tsd-filter .tsd-select { + display: block; + padding-right: 20px; + } +} + +footer { + border-top: 1px solid #eee; + background-color: #fff; +} +footer.with-border-bottom { + border-bottom: 1px solid #eee; +} +footer .tsd-legend-group { + font-size: 0; +} +footer .tsd-legend { + display: inline-block; + width: 25%; + padding: 0; + font-size: 16px; + list-style: none; + line-height: 1.333em; + vertical-align: top; +} +@media (max-width: 900px) { + footer .tsd-legend { + width: 50%; + } +} + +.tsd-hierarchy { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-index-panel .tsd-index-content { + margin-bottom: -30px !important; +} +.tsd-index-panel .tsd-index-section { + margin-bottom: 30px !important; +} +.tsd-index-panel h3 { + margin: 0 -20px 10px -20px; + padding: 0 20px 10px 20px; + border-bottom: 1px solid #eee; +} +.tsd-index-panel ul.tsd-index-list { + -moz-column-count: 3; + -ms-column-count: 3; + -o-column-count: 3; + column-count: 3; + -moz-column-gap: 20px; + -ms-column-gap: 20px; + -o-column-gap: 20px; + column-gap: 20px; + padding: 0; + list-style: none; + line-height: 1.333em; +} +@media (max-width: 900px) { + .tsd-index-panel ul.tsd-index-list { + -moz-column-count: 1; + -ms-column-count: 1; + -o-column-count: 1; + column-count: 1; + } +} +@media (min-width: 901px) and (max-width: 1024px) { + .tsd-index-panel ul.tsd-index-list { + -moz-column-count: 2; + -ms-column-count: 2; + -o-column-count: 2; + column-count: 2; + } +} +.tsd-index-panel ul.tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} +.tsd-index-panel a, +.tsd-index-panel .tsd-parent-kind-module a { + color: #9600ff; +} +.tsd-index-panel .tsd-parent-kind-interface a { + color: #7da01f; +} +.tsd-index-panel .tsd-parent-kind-enum a { + color: #cc9900; +} +.tsd-index-panel .tsd-parent-kind-class a { + color: #4da6ff; +} +.tsd-index-panel .tsd-kind-module a { + color: #9600ff; +} +.tsd-index-panel .tsd-kind-interface a { + color: #7da01f; +} +.tsd-index-panel .tsd-kind-enum a { + color: #cc9900; +} +.tsd-index-panel .tsd-kind-class a { + color: #4da6ff; +} +.tsd-index-panel .tsd-is-private a { + color: #808080; +} + +.tsd-flag { + display: inline-block; + padding: 1px 5px; + border-radius: 4px; + color: #fff; + background-color: #808080; + text-indent: 0; + font-size: 14px; + font-weight: normal; +} + +.tsd-anchor { + position: absolute; + top: -100px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + margin-top: 0; + margin-bottom: 0; + border-bottom: none; +} + +.tsd-navigation { + margin: 0 0 0 40px; +} +.tsd-navigation a { + display: block; + padding-top: 2px; + padding-bottom: 2px; + border-left: 2px solid transparent; + color: #222; + text-decoration: none; + transition: border-left-color 0.1s; +} +.tsd-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul { + margin: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li { + padding: 0; +} + +.tsd-navigation.primary { + padding-bottom: 40px; +} +.tsd-navigation.primary a { + display: block; + padding-top: 6px; + padding-bottom: 6px; +} +.tsd-navigation.primary ul li a { + padding-left: 5px; +} +.tsd-navigation.primary ul li li a { + padding-left: 25px; +} +.tsd-navigation.primary ul li li li a { + padding-left: 45px; +} +.tsd-navigation.primary ul li li li li a { + padding-left: 65px; +} +.tsd-navigation.primary ul li li li li li a { + padding-left: 85px; +} +.tsd-navigation.primary ul li li li li li li a { + padding-left: 105px; +} +.tsd-navigation.primary > ul { + border-bottom: 1px solid #eee; +} +.tsd-navigation.primary li { + border-top: 1px solid #eee; +} +.tsd-navigation.primary li.current > a { + font-weight: bold; +} +.tsd-navigation.primary li.label span { + display: block; + padding: 20px 0 6px 5px; + color: #808080; +} +.tsd-navigation.primary li.globals + li > span, .tsd-navigation.primary li.globals + li > a { + padding-top: 20px; +} + +.tsd-navigation.secondary { + max-height: calc(100vh - 1rem - 40px); + overflow: auto; + position: -webkit-sticky; + position: sticky; + top: calc(.5rem + 40px); + transition: 0.3s; +} +.tsd-navigation.secondary.tsd-navigation--toolbar-hide { + max-height: calc(100vh - 1rem); + top: 0.5rem; +} +.tsd-navigation.secondary ul { + transition: opacity 0.2s; +} +.tsd-navigation.secondary ul li a { + padding-left: 25px; +} +.tsd-navigation.secondary ul li li a { + padding-left: 45px; +} +.tsd-navigation.secondary ul li li li a { + padding-left: 65px; +} +.tsd-navigation.secondary ul li li li li a { + padding-left: 85px; +} +.tsd-navigation.secondary ul li li li li li a { + padding-left: 105px; +} +.tsd-navigation.secondary ul li li li li li li a { + padding-left: 125px; +} +.tsd-navigation.secondary ul.current a { + border-left-color: #eee; +} +.tsd-navigation.secondary li.focus > a, +.tsd-navigation.secondary ul.current li.focus > a { + border-left-color: #000; +} +.tsd-navigation.secondary li.current { + margin-top: 20px; + margin-bottom: 20px; + border-left-color: #eee; +} +.tsd-navigation.secondary li.current > a { + font-weight: bold; +} + +@media (min-width: 901px) { + .menu-sticky-wrap { + position: static; + } +} + +.tsd-panel { + margin: 20px 0; + padding: 20px; + background-color: #fff; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, .tsd-panel > h2, .tsd-panel > h3 { + margin: 1.5em -20px 10px -20px; + padding: 0 20px 10px 20px; + border-bottom: 1px solid #eee; +} +.tsd-panel > h1.tsd-before-signature, .tsd-panel > h2.tsd-before-signature, .tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: 0; +} +.tsd-panel table { + display: block; + width: 100%; + overflow: auto; + margin-top: 10px; + word-break: normal; + word-break: keep-all; +} +.tsd-panel table th { + font-weight: bold; +} +.tsd-panel table th, .tsd-panel table td { + padding: 6px 13px; + border: 1px solid #ddd; +} +.tsd-panel table tr { + background-color: #fff; + border-top: 1px solid #ccc; +} +.tsd-panel table tr:nth-child(2n) { + background-color: #f8f8f8; +} + +.tsd-panel-group { + margin: 60px 0; +} +.tsd-panel-group > h1, .tsd-panel-group > h2, .tsd-panel-group > h3 { + padding-left: 20px; + padding-right: 20px; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 40px; + height: 40px; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: #222; +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + padding: 0 10px; + background-color: #fdfdfd; +} +#tsd-search .results li:nth-child(even) { + background-color: #fff; +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current, +#tsd-search .results li:hover { + background-color: #eee; +} +#tsd-search .results a { + display: block; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: #808080; + font-weight: normal; +} +#tsd-search.has-focus { + background-color: #eee; +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +.tsd-signature { + margin: 0 0 1em 0; + padding: 10px; + border: 1px solid #eee; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; +} +.tsd-signature.tsd-kind-icon { + padding-left: 30px; +} +.tsd-signature.tsd-kind-icon:before { + top: 10px; + left: 10px; +} +.tsd-panel > .tsd-signature { + margin-left: -20px; + margin-right: -20px; + border-width: 1px 0; +} +.tsd-panel > .tsd-signature.tsd-kind-icon { + padding-left: 40px; +} +.tsd-panel > .tsd-signature.tsd-kind-icon:before { + left: 20px; +} + +.tsd-signature-symbol { + color: #808080; + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + border: 1px solid #eee; +} +.tsd-signatures .tsd-signature { + margin: 0; + border-width: 1px 0 0 0; + transition: background-color 0.1s; +} +.tsd-signatures .tsd-signature:first-child { + border-top-width: 0; +} +.tsd-signatures .tsd-signature.current { + background-color: #eee; +} +.tsd-signatures.active > .tsd-signature { + cursor: pointer; +} +.tsd-panel > .tsd-signatures { + margin-left: -20px; + margin-right: -20px; + border-width: 1px 0; +} +.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon { + padding-left: 40px; +} +.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon:before { + left: 20px; +} +.tsd-panel > a.anchor + .tsd-signatures { + border-top-width: 0; + margin-top: -20px; +} + +ul.tsd-descriptions { + position: relative; + overflow: hidden; + padding: 0; + list-style: none; +} +ul.tsd-descriptions.active > .tsd-description { + display: none; +} +ul.tsd-descriptions.active > .tsd-description.current { + display: block; +} +ul.tsd-descriptions.active > .tsd-description.fade-in { + animation: fade-in-delayed 0.3s; +} +ul.tsd-descriptions.active > .tsd-description.fade-out { + animation: fade-out-delayed 0.3s; + position: absolute; + display: block; + top: 0; + left: 0; + right: 0; + opacity: 0; + visibility: hidden; +} +ul.tsd-descriptions h4, ul.tsd-descriptions .tsd-index-panel h3, .tsd-index-panel ul.tsd-descriptions h3 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} + +ul.tsd-parameters, +ul.tsd-type-parameters { + list-style: square; + margin: 0; + padding-left: 20px; +} +ul.tsd-parameters > li.tsd-parameter-signature, +ul.tsd-type-parameters > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; +} +ul.tsd-parameters h5, +ul.tsd-type-parameters h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} +ul.tsd-parameters .tsd-comment, +ul.tsd-type-parameters .tsd-comment { + margin-top: -0.5em; +} + +.tsd-sources { + font-size: 14px; + color: #808080; + margin: 0 0 1em 0; +} +.tsd-sources a { + color: #808080; + text-decoration: underline; +} +.tsd-sources ul, .tsd-sources p { + margin: 0 !important; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: fixed; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 40px; + color: #333; + background: #fff; + border-bottom: 1px solid #eee; + transition: transform 0.3s linear; +} +.tsd-page-toolbar a { + color: #333; + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .table-wrap { + display: table; + width: 100%; + height: 40px; +} +.tsd-page-toolbar .table-cell { + display: table-cell; + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} + +.tsd-page-toolbar--hide { + transform: translateY(-100%); +} + +.tsd-select .tsd-select-list li:before, .tsd-select .tsd-select-label:before, .tsd-widget:before { + content: ""; + display: inline-block; + width: 40px; + height: 40px; + margin: 0 -8px 0 0; + background-image: url(../images/widgets.png); + background-repeat: no-repeat; + text-indent: -1024px; + vertical-align: bottom; +} +@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + .tsd-select .tsd-select-list li:before, .tsd-select .tsd-select-label:before, .tsd-widget:before { + background-image: url(../images/widgets@2x.png); + background-size: 320px 40px; + } +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.6; + height: 40px; + transition: opacity 0.1s, background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.8; +} +.tsd-widget.active { + opacity: 1; + background-color: #eee; +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} +.tsd-widget.search:before { + background-position: 0 0; +} +.tsd-widget.menu:before { + background-position: -40px 0; +} +.tsd-widget.options:before { + background-position: -80px 0; +} +.tsd-widget.options, .tsd-widget.menu { + display: none; +} +@media (max-width: 900px) { + .tsd-widget.options, .tsd-widget.menu { + display: inline-block; + } +} +input[type=checkbox] + .tsd-widget:before { + background-position: -120px 0; +} +input[type=checkbox]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +.tsd-select { + position: relative; + display: inline-block; + height: 40px; + transition: opacity 0.1s, background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-select .tsd-select-label { + opacity: 0.6; + transition: opacity 0.2s; +} +.tsd-select .tsd-select-label:before { + background-position: -240px 0; +} +.tsd-select.active .tsd-select-label { + opacity: 0.8; +} +.tsd-select.active .tsd-select-list { + visibility: visible; + opacity: 1; + transition-delay: 0s; +} +.tsd-select .tsd-select-list { + position: absolute; + visibility: hidden; + top: 40px; + left: 0; + margin: 0; + padding: 0; + opacity: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + transition: visibility 0s 0.2s, opacity 0.2s; +} +.tsd-select .tsd-select-list li { + padding: 0 20px 0 0; + background-color: #fdfdfd; +} +.tsd-select .tsd-select-list li:before { + background-position: 40px 0; +} +.tsd-select .tsd-select-list li:nth-child(even) { + background-color: #fff; +} +.tsd-select .tsd-select-list li:hover { + background-color: #eee; +} +.tsd-select .tsd-select-list li.selected:before { + background-position: -200px 0; +} +@media (max-width: 900px) { + .tsd-select .tsd-select-list { + top: 0; + left: auto; + right: 100%; + margin-right: -5px; + } + .tsd-select .tsd-select-label:before { + background-position: -280px 0; + } +} + +img { + max-width: 100%; +} \ No newline at end of file diff --git a/docs/assets/images/icons.png b/docs/assets/images/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..3836d5fe46e48bbe186116855aae879c23935327 GIT binary patch literal 9615 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 NZmR35l_G4O{0}dcmS_L~ literal 0 HcmV?d00001 diff --git a/docs/assets/images/icons@2x.png b/docs/assets/images/icons@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5a209e2f6d7f915cc9cb6fe7a4264c8be4db87b0 GIT binary patch literal 28144 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 U&wLp6h6BX&boFyt=akR{0G%$)mH+?% literal 0 HcmV?d00001 diff --git a/docs/assets/images/widgets@2x.png b/docs/assets/images/widgets@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4bbbd57272f3b28f47527d4951ad10f950b8ad43 GIT binary patch literal 855 zcmeAS@N?(olHy`uVBq!ia0y~yU}^xe12~w0Jcmn z@(X6T|9^jgLcx21{)7exgY)a>N6m2F0<`Rqr;B4q1>>88jUdw-7W`c)zLE*mq8W2H z-<&Jl_Hco5BuC5n@AbF5GD82~-e8-v=#zCyUX0F-o}8pPfAv`!GN$ff+TL<~@kgt} z62eO?_|&+>xBmM$@p|z`tIKEdpPf8%qI>4r7@jn<=eta*{3~?g(zz{Ke9zc-G^gr? z-7foa?LcS!hmbwzru}ICvbWLlW8;+l-}!^=c32!^nV`+`C*;0-*Y%l94pC;Cb3GXz zzSf%a!{gVr{Y_lVuUj+a)*Ca+!-Hu%xmP&&X-2CuANY8^i{D7Kg6qzP zXz_ps9+lN8ESH{K4`yu&b~I>N9xGlE&;2u*b?+Go!AhN?m-bxlLvtC#MzDF2kFzfHJ1W7ybqdefSqVhbOykd*Yi%EDuhs z4wF{ft^bv2+DDnKb8gj1FuvcV`M}luS>lO<^)8x>y1#R;a=-ZKwWTQQb)ioBbi;zh zD!f5V)8581to1LL7c9!l^PSC$NBPYif!_vAZhmL4)v4U)4UsrLYiH_9rmQDd?)(e5 z^pcH>qvBg*i0dus2r*mp4;zKvu=P#s-ti;2obl`NjjwoYd>e(oo#j_uyRb<7Pv^If zzZ|mGHmV)8^tbO%^>eqMw(@7(&3g{jEp-Najo7V75xI_ZHK*FA`elF{r5}E*d7+j_R literal 0 HcmV?d00001 diff --git a/docs/assets/js/main.js b/docs/assets/js/main.js new file mode 100644 index 0000000..3c74a5b --- /dev/null +++ b/docs/assets/js/main.js @@ -0,0 +1,2276 @@ +!function () { + var e = function (t) { + var r = new e.Builder(); + return r.pipeline.add(e.trimmer, e.stopWordFilter, e.stemmer), + r.searchPipeline.add(e.stemmer), + t.call(r, r), + r.build(); + }; + e.version = "2.3.7", + e.utils = {}, + e.utils.warn = function (e) { + return function (t) { + e.console && console.warn && console.warn(t); + }; + }(this), + e.utils.asString = function (e) { + return null == e ? "" : e.toString(); + }, + e.utils.clone = function (e) { + if (null == e) return e; + for ( + var t = Object.create(null), r = Object.keys(e), i = 0; + i < r.length; + i++ + ) { + var n = r[i], s = e[n]; + if (Array.isArray(s)) t[n] = s.slice(); + else { + if ( + "string" != typeof s && "number" != typeof s && + "boolean" != typeof s + ) { + throw new TypeError( + "clone is not deep and does not support nested objects", + ); + } + t[n] = s; + } + } + return t; + }, + e.FieldRef = function (e, t, r) { + this.docRef = e, this.fieldName = t, this._stringValue = r; + }, + e.FieldRef.joiner = "/", + e.FieldRef.fromString = function (t) { + var r = t.indexOf(e.FieldRef.joiner); + if (-1 === r) throw "malformed field ref string"; + var i = t.slice(0, r), n = t.slice(r + 1); + return new e.FieldRef(n, i, t); + }, + e.FieldRef.prototype.toString = function () { + return null == this._stringValue && + (this._stringValue = this.fieldName + e.FieldRef.joiner + this.docRef), + this._stringValue; + }, + e.Set = function (e) { + if (this.elements = Object.create(null), e) { + this.length = e.length; + for (var t = 0; t < this.length; t++) this.elements[e[t]] = !0; + } else this.length = 0; + }, + e.Set.complete = { + intersect: function (e) { + return e; + }, + union: function (e) { + return e; + }, + contains: function () { + return !0; + }, + }, + e.Set.empty = { + intersect: function () { + return this; + }, + union: function (e) { + return e; + }, + contains: function () { + return !1; + }, + }, + e.Set.prototype.contains = function (e) { + return !!this.elements[e]; + }, + e.Set.prototype.intersect = function (t) { + var r, i, n, s = []; + if (t === e.Set.complete) return this; + if (t === e.Set.empty) return t; + i = this.length < t.length ? (r = this, t) : (r = t, this), + n = Object.keys(r.elements); + for (var o = 0; o < n.length; o++) { + var a = n[o]; + a in i.elements && s.push(a); + } + return new e.Set(s); + }, + e.Set.prototype.union = function (t) { + return t === e.Set.complete ? e.Set.complete + : t === e.Set.empty ? this + : new e.Set(Object.keys(this.elements).concat(Object.keys(t.elements))); + }, + e.idf = function (e, t) { + var r = 0; + for (var i in e) "_index" != i && (r += Object.keys(e[i]).length); + var n = (t - r + .5) / (r + .5); + return Math.log(1 + Math.abs(n)); + }, + e.Token = function (e, t) { + this.str = e || "", this.metadata = t || {}; + }, + e.Token.prototype.toString = function () { + return this.str; + }, + e.Token.prototype.update = function (e) { + return this.str = e(this.str, this.metadata), this; + }, + e.Token.prototype.clone = function (t) { + return t = t || function (e) { + return e; + }, + new e.Token(t(this.str, this.metadata), this.metadata); + }, + e.tokenizer = function (t, r) { + if (null == t || null == t) return []; + if (Array.isArray(t)) { + return t.map(function (t) { + return new e.Token( + e.utils.asString(t).toLowerCase(), + e.utils.clone(r), + ); + }); + } + for ( + var i = t.toString().toLowerCase(), n = i.length, s = [], o = 0, a = 0; + o <= n; + o++ + ) { + var l = o - a; + if (i.charAt(o).match(e.tokenizer.separator) || o == n) { + if (0 < l) { + var c = e.utils.clone(r) || {}; + c.position = [a, l], + c.index = s.length, + s.push(new e.Token(i.slice(a, o), c)); + } + a = o + 1; + } + } + return s; + }, + e.tokenizer.separator = /[\s\-]+/, + e.Pipeline = function () { + this._stack = []; + }, + e.Pipeline.registeredFunctions = Object.create(null), + e.Pipeline.registerFunction = function (t, r) { + r in this.registeredFunctions && + e.utils.warn("Overwriting existing registered function: " + r), + t.label = r, + e.Pipeline.registeredFunctions[t.label] = t; + }, + e.Pipeline.warnIfFunctionNotRegistered = function (t) { + t.label && t.label in this.registeredFunctions || + e.utils.warn( + "Function is not registered with pipeline. This may cause problems when serialising the index.\n", + t, + ); + }, + e.Pipeline.load = function (t) { + var r = new e.Pipeline(); + return t.forEach(function (t) { + var i = e.Pipeline.registeredFunctions[t]; + if (!i) throw new Error("Cannot load unregistered function: " + t); + r.add(i); + }), + r; + }, + e.Pipeline.prototype.add = function () { + Array.prototype.slice.call(arguments).forEach(function (t) { + e.Pipeline.warnIfFunctionNotRegistered(t), this._stack.push(t); + }, this); + }, + e.Pipeline.prototype.after = function (t, r) { + e.Pipeline.warnIfFunctionNotRegistered(r); + var i = this._stack.indexOf(t); + if (-1 == i) throw new Error("Cannot find existingFn"); + i += 1, this._stack.splice(i, 0, r); + }, + e.Pipeline.prototype.before = function (t, r) { + e.Pipeline.warnIfFunctionNotRegistered(r); + var i = this._stack.indexOf(t); + if (-1 == i) throw new Error("Cannot find existingFn"); + this._stack.splice(i, 0, r); + }, + e.Pipeline.prototype.remove = function (e) { + var t = this._stack.indexOf(e); + -1 != t && this._stack.splice(t, 1); + }, + e.Pipeline.prototype.run = function (e) { + for (var t = this._stack.length, r = 0; r < t; r++) { + for (var i = this._stack[r], n = [], s = 0; s < e.length; s++) { + var o = i(e[s], s, e); + if (null != o && "" !== o) { + if (Array.isArray(o)) { + for (var a = 0; a < o.length; a++) n.push(o[a]); + } else { + n.push(o); + } + } + } + e = n; + } + return e; + }, + e.Pipeline.prototype.runString = function (t, r) { + var i = new e.Token(t, r); + return this.run([i]).map(function (e) { + return e.toString(); + }); + }, + e.Pipeline.prototype.reset = function () { + this._stack = []; + }, + e.Pipeline.prototype.toJSON = function () { + return this._stack.map(function (t) { + return e.Pipeline.warnIfFunctionNotRegistered(t), t.label; + }); + }, + e.Vector = function (e) { + this._magnitude = 0, this.elements = e || []; + }, + e.Vector.prototype.positionForIndex = function (e) { + if (0 == this.elements.length) return 0; + for ( + var t = 0, + r = this.elements.length / 2, + i = r - t, + n = Math.floor(i / 2), + s = this.elements[2 * n]; + 1 < i && (s < e && (t = n), e < s && (r = n), s != e); + ) { + i = r - t, n = t + Math.floor(i / 2), s = this.elements[2 * n]; + } + return s == e ? 2 * n : e < s ? 2 * n : s < e ? 2 * (n + 1) : void 0; + }, + e.Vector.prototype.insert = function (e, t) { + this.upsert(e, t, function () { + throw "duplicate index"; + }); + }, + e.Vector.prototype.upsert = function (e, t, r) { + this._magnitude = 0; + var i = this.positionForIndex(e); + this.elements[i] == e ? this.elements[i + 1] = r(this.elements[i + 1], t) + : this.elements.splice(i, 0, e, t); + }, + e.Vector.prototype.magnitude = function () { + if (this._magnitude) return this._magnitude; + for (var e = 0, t = this.elements.length, r = 1; r < t; r += 2) { + var i = this.elements[r]; + e += i * i; + } + return this._magnitude = Math.sqrt(e); + }, + e.Vector.prototype.dot = function (e) { + for ( + var t = 0, + r = this.elements, + i = e.elements, + n = r.length, + s = i.length, + o = 0, + a = 0, + u = 0, + l = 0; + u < n && l < s; + ) { + (o = r[u]) < (a = i[l]) + ? u += 2 + : a < o + ? l += 2 + : o == a && (t += r[u + 1] * i[l + 1], u += 2, l += 2); + } + return t; + }, + e.Vector.prototype.similarity = function (e) { + return this.dot(e) / this.magnitude() || 0; + }, + e.Vector.prototype.toArray = function () { + for ( + var e = new Array(this.elements.length / 2), t = 1, r = 0; + t < this.elements.length; + t += 2, r++ + ) { + e[r] = this.elements[t]; + } + return e; + }, + e.Vector.prototype.toJSON = function () { + return this.elements; + }, + e.stemmer = function () { + var e = { + ational: "ate", + tional: "tion", + enci: "ence", + anci: "ance", + izer: "ize", + bli: "ble", + alli: "al", + entli: "ent", + eli: "e", + ousli: "ous", + ization: "ize", + ation: "ate", + ator: "ate", + alism: "al", + iveness: "ive", + fulness: "ful", + ousness: "ous", + aliti: "al", + iviti: "ive", + biliti: "ble", + logi: "log", + }, + t = { + icate: "ic", + ative: "", + alize: "al", + iciti: "ic", + ical: "ic", + ful: "", + ness: "", + }, + i = "[aeiouy]", + n = "[^aeiou][^aeiouy]*", + c = new RegExp( + "^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*", + ), + h = new RegExp( + "^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*[aeiouy][aeiou]*[^aeiou][^aeiouy]*", + ), + d = new RegExp( + "^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*([aeiouy][aeiou]*)?$", + ), + f = new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy]"), + p = /^(.+?)(ss|i)es$/, + y = /^(.+?)([^s])s$/, + m = /^(.+?)eed$/, + v = /^(.+?)(ed|ing)$/, + g = /.$/, + x = /(at|bl|iz)$/, + w = new RegExp("([^aeiouylsz])\\1$"), + Q = new RegExp("^" + n + i + "[^aeiouwxy]$"), + k = /^(.+?[^aeiou])y$/, + S = + /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/, + E = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/, + L = + /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/, + b = /^(.+?)(s|t)(ion)$/, + P = /^(.+?)e$/, + T = /ll$/, + O = new RegExp("^" + n + i + "[^aeiouwxy]$"), + I = function (r) { + var i, n, s, o, a, u, l; + if (r.length < 3) return r; + if ( + "y" == (s = r.substr(0, 1)) && + (r = s.toUpperCase() + r.substr(1)), + a = y, + (o = p).test(r) ? r = r.replace(o, "$1$2") + : a.test(r) && (r = r.replace(a, "$1$2")), + a = v, + (o = m).test(r) + ) { + var I = o.exec(r); + (o = c).test(I[1]) && (o = g, r = r.replace(o, "")); + } else if (a.test(r)) { + i = (I = a.exec(r))[1], + (a = f).test(i) && + (u = w, + l = Q, + (a = x).test(r = i) ? r += "e" : u.test(r) + ? (o = g, r = r.replace(o, "")) + : l.test(r) && (r += "e")); + } + (o = k).test(r) && (r = (i = (I = o.exec(r))[1]) + "i"); + (o = S).test(r) && + (i = (I = o.exec(r))[1], + n = I[2], + (o = c).test(i) && (r = i + e[n])); + (o = E).test(r) && + (i = (I = o.exec(r))[1], + n = I[2], + (o = c).test(i) && (r = i + t[n])); + if (a = b, (o = L).test(r)) { + i = (I = o.exec(r))[1], (o = h).test(i) && (r = i); + } else if (a.test(r)) { + i = (I = a.exec(r))[1] + I[2], (a = h).test(i) && (r = i); + } + (o = P).test(r) && + (i = (I = o.exec(r))[1], + a = d, + u = O, + ((o = h).test(i) || a.test(i) && !u.test(i)) && (r = i)); + return a = h, + (o = T).test(r) && a.test(r) && (o = g, r = r.replace(o, "")), + "y" == s && (r = s.toLowerCase() + r.substr(1)), + r; + }; + return function (e) { + return e.update(I); + }; + }(), + e.Pipeline.registerFunction(e.stemmer, "stemmer"), + e.generateStopWordFilter = function (e) { + var t = e.reduce(function (e, t) { + return e[t] = t, e; + }, {}); + return function (e) { + if (e && t[e.toString()] !== e.toString()) return e; + }; + }, + e.stopWordFilter = e.generateStopWordFilter( + [ + "a", + "able", + "about", + "across", + "after", + "all", + "almost", + "also", + "am", + "among", + "an", + "and", + "any", + "are", + "as", + "at", + "be", + "because", + "been", + "but", + "by", + "can", + "cannot", + "could", + "dear", + "did", + "do", + "does", + "either", + "else", + "ever", + "every", + "for", + "from", + "get", + "got", + "had", + "has", + "have", + "he", + "her", + "hers", + "him", + "his", + "how", + "however", + "i", + "if", + "in", + "into", + "is", + "it", + "its", + "just", + "least", + "let", + "like", + "likely", + "may", + "me", + "might", + "most", + "must", + "my", + "neither", + "no", + "nor", + "not", + "of", + "off", + "often", + "on", + "only", + "or", + "other", + "our", + "own", + "rather", + "said", + "say", + "says", + "she", + "should", + "since", + "so", + "some", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "this", + "tis", + "to", + "too", + "twas", + "us", + "wants", + "was", + "we", + "were", + "what", + "when", + "where", + "which", + "while", + "who", + "whom", + "why", + "will", + "with", + "would", + "yet", + "you", + "your", + ], + ), + e.Pipeline.registerFunction(e.stopWordFilter, "stopWordFilter"), + e.trimmer = function (e) { + return e.update(function (e) { + return e.replace(/^\W+/, "").replace(/\W+$/, ""); + }); + }, + e.Pipeline.registerFunction(e.trimmer, "trimmer"), + e.TokenSet = function () { + this.final = !1, + this.edges = {}, + this.id = e.TokenSet._nextId, + e.TokenSet._nextId += 1; + }, + e.TokenSet._nextId = 1, + e.TokenSet.fromArray = function (t) { + for (var r = new e.TokenSet.Builder(), i = 0, n = t.length; i < n; i++) { + r.insert(t[i]); + } + return r.finish(), r.root; + }, + e.TokenSet.fromClause = function (t) { + return "editDistance" in t + ? e.TokenSet.fromFuzzyString(t.term, t.editDistance) + : e.TokenSet.fromString(t.term); + }, + e.TokenSet.fromFuzzyString = function (t, r) { + for ( + var i = new e.TokenSet(), n = [{ node: i, editsRemaining: r, str: t }]; + n.length; + ) { + var s = n.pop(); + if (0 < s.str.length) { + var o, a = s.str.charAt(0); + a in s.node.edges + ? o = s.node.edges[a] + : (o = new e.TokenSet(), s.node.edges[a] = o), + 1 == s.str.length && (o.final = !0), + n.push( + { + node: o, + editsRemaining: s.editsRemaining, + str: s.str.slice(1), + }, + ); + } + if (0 != s.editsRemaining) { + if ("*" in s.node.edges) var u = s.node.edges["*"]; + else { + u = new e.TokenSet(); + s.node.edges["*"] = u; + } + if ( + 0 == s.str.length && (u.final = !0), + n.push( + { node: u, editsRemaining: s.editsRemaining - 1, str: s.str }, + ), + 1 < s.str.length && + n.push( + { + node: s.node, + editsRemaining: s.editsRemaining - 1, + str: s.str.slice(1), + }, + ), + 1 == s.str.length && (s.node.final = !0), + 1 <= s.str.length + ) { + if ("*" in s.node.edges) var l = s.node.edges["*"]; + else { + l = new e.TokenSet(); + s.node.edges["*"] = l; + } + 1 == s.str.length && (l.final = !0), + n.push( + { + node: l, + editsRemaining: s.editsRemaining - 1, + str: s.str.slice(1), + }, + ); + } + if (1 < s.str.length) { + var c, h = s.str.charAt(0), d = s.str.charAt(1); + d in s.node.edges + ? c = s.node.edges[d] + : (c = new e.TokenSet(), s.node.edges[d] = c), + 1 == s.str.length && (c.final = !0), + n.push( + { + node: c, + editsRemaining: s.editsRemaining - 1, + str: h + s.str.slice(2), + }, + ); + } + } + } + return i; + }, + e.TokenSet.fromString = function (t) { + for (var r = new e.TokenSet(), i = r, n = 0, s = t.length; n < s; n++) { + var o = t[n], a = n == s - 1; + if ("*" == o) (r.edges[o] = r).final = a; + else { + var u = new e.TokenSet(); + u.final = a, r.edges[o] = u, r = u; + } + } + return i; + }, + e.TokenSet.prototype.toArray = function () { + for (var e = [], t = [{ prefix: "", node: this }]; t.length;) { + var r = t.pop(), i = Object.keys(r.node.edges), n = i.length; + r.node.final && (r.prefix.charAt(0), e.push(r.prefix)); + for (var s = 0; s < n; s++) { + var o = i[s]; + t.push({ prefix: r.prefix.concat(o), node: r.node.edges[o] }); + } + } + return e; + }, + e.TokenSet.prototype.toString = function () { + if (this._str) return this._str; + for ( + var e = this.final ? "1" : "0", + t = Object.keys(this.edges).sort(), + r = t.length, + i = 0; + i < r; + i++ + ) { + var n = t[i]; + e = e + n + this.edges[n].id; + } + return e; + }, + e.TokenSet.prototype.intersect = function (t) { + for ( + var r = new e.TokenSet(), + i = void 0, + n = [{ qNode: t, output: r, node: this }]; + n.length; + ) { + i = n.pop(); + for ( + var s = Object.keys(i.qNode.edges), + o = s.length, + a = Object.keys(i.node.edges), + u = a.length, + l = 0; + l < o; + l++ + ) { + for (var c = s[l], h = 0; h < u; h++) { + var d = a[h]; + if (d == c || "*" == c) { + var f = i.node.edges[d], + p = i.qNode.edges[c], + y = f.final && p.final, + m = void 0; + d in i.output.edges + ? (m = i.output.edges[d]).final = m.final || y + : ((m = new e.TokenSet()).final = y, i.output.edges[d] = m), + n.push({ qNode: p, output: m, node: f }); + } + } + } + } + return r; + }, + e.TokenSet.Builder = function () { + this.previousWord = "", + this.root = new e.TokenSet(), + this.uncheckedNodes = [], + this.minimizedNodes = {}; + }, + e.TokenSet.Builder.prototype.insert = function (t) { + var r, i = 0; + if (t < this.previousWord) throw new Error("Out of order word insertion"); + for ( + var n = 0; + n < t.length && n < this.previousWord.length && + t[n] == this.previousWord[n]; + n++ + ) { + i++; + } + this.minimize(i), + r = 0 == this.uncheckedNodes.length + ? this.root + : this.uncheckedNodes[this.uncheckedNodes.length - 1].child; + for (n = i; n < t.length; n++) { + var s = new e.TokenSet(), o = t[n]; + r.edges[o] = s, + this.uncheckedNodes.push({ parent: r, char: o, child: s }), + r = s; + } + r.final = !0, this.previousWord = t; + }, + e.TokenSet.Builder.prototype.finish = function () { + this.minimize(0); + }, + e.TokenSet.Builder.prototype.minimize = function (e) { + for (var t = this.uncheckedNodes.length - 1; e <= t; t--) { + var r = this.uncheckedNodes[t], i = r.child.toString(); + i in this.minimizedNodes + ? r.parent.edges[r.char] = this.minimizedNodes[i] + : (r.child._str = i, this.minimizedNodes[i] = r.child), + this.uncheckedNodes.pop(); + } + }, + e.Index = function (e) { + this.invertedIndex = e.invertedIndex, + this.fieldVectors = e.fieldVectors, + this.tokenSet = e.tokenSet, + this.fields = e.fields, + this.pipeline = e.pipeline; + }, + e.Index.prototype.search = function (t) { + return this.query(function (r) { + new e.QueryParser(t, r).parse(); + }); + }, + e.Index.prototype.query = function (t) { + for ( + var r = new e.Query(this.fields), + i = Object.create(null), + n = Object.create(null), + s = Object.create(null), + o = Object.create(null), + a = Object.create(null), + u = 0; + u < this.fields.length; + u++ + ) { + n[this.fields[u]] = new e.Vector(); + } + t.call(r, r); + for (u = 0; u < r.clauses.length; u++) { + var c, l = r.clauses[u], h = e.Set.complete; + c = l.usePipeline + ? this.pipeline.runString(l.term, { fields: l.fields }) + : [l.term]; + for (var d = 0; d < c.length; d++) { + var f = c[d]; + l.term = f; + var p = e.TokenSet.fromClause(l), + y = this.tokenSet.intersect(p).toArray(); + if (0 === y.length && l.presence === e.Query.presence.REQUIRED) { + for (var m = 0; m < l.fields.length; m++) {o[v = l.fields[m]] = + e.Set.empty;} + break; + } + for (var g = 0; g < y.length; g++) { + var x = y[g], w = this.invertedIndex[x], Q = w._index; + for (m = 0; m < l.fields.length; m++) { + var k = w[v = l.fields[m]], + S = Object.keys(k), + E = x + "/" + v, + L = new e.Set(S); + if ( + l.presence == e.Query.presence.REQUIRED && + (h = h.union(L), void 0 === o[v] && (o[v] = e.Set.complete)), + l.presence != e.Query.presence.PROHIBITED + ) { + if ( + n[v].upsert(Q, l.boost, function (e, t) { + return e + t; + }), !s[E] + ) { + for (var b = 0; b < S.length; b++) { + var P, T = S[b], O = new e.FieldRef(T, v), I = k[T]; + void 0 === (P = i[O]) + ? i[O] = new e.MatchData(x, v, I) + : P.add(x, v, I); + } + s[E] = !0; + } + } else { + void 0 === a[v] && (a[v] = e.Set.empty), a[v] = a[v].union(L); + } + } + } + } + if (l.presence === e.Query.presence.REQUIRED) { + for (m = 0; m < l.fields.length; m++) { + o[v = l.fields[m]] = o[v].intersect(h); + } + } + } + var R = e.Set.complete, F = e.Set.empty; + for (u = 0; u < this.fields.length; u++) { + var v; + o[v = this.fields[u]] && (R = R.intersect(o[v])), + a[v] && (F = F.union(a[v])); + } + var C = Object.keys(i), N = [], _ = Object.create(null); + if (r.isNegated()) { + C = Object.keys(this.fieldVectors); + for (u = 0; u < C.length; u++) { + O = C[u]; + var j = e.FieldRef.fromString(O); + i[O] = new e.MatchData(); + } + } + for (u = 0; u < C.length; u++) { + var D = (j = e.FieldRef.fromString(C[u])).docRef; + if (R.contains(D) && !F.contains(D)) { + var A, B = this.fieldVectors[j], V = n[j.fieldName].similarity(B); + if (void 0 !== (A = _[D])) A.score += V, A.matchData.combine(i[j]); + else { + var z = { ref: D, score: V, matchData: i[j] }; + _[D] = z, N.push(z); + } + } + } + return N.sort(function (e, t) { + return t.score - e.score; + }); + }, + e.Index.prototype.toJSON = function () { + var t = Object.keys(this.invertedIndex).sort().map(function (e) { + return [e, this.invertedIndex[e]]; + }, this), + r = Object.keys(this.fieldVectors).map(function (e) { + return [e, this.fieldVectors[e].toJSON()]; + }, this); + return { + version: e.version, + fields: this.fields, + fieldVectors: r, + invertedIndex: t, + pipeline: this.pipeline.toJSON(), + }; + }, + e.Index.load = function (t) { + var r = {}, + i = {}, + n = t.fieldVectors, + s = Object.create(null), + o = t.invertedIndex, + a = new e.TokenSet.Builder(), + u = e.Pipeline.load(t.pipeline); + t.version != e.version && + e.utils.warn( + "Version mismatch when loading serialised index. Current version of lunr '" + + e.version + "' does not match serialized index '" + t.version + "'", + ); + for (var l = 0; l < n.length; l++) { + var h = (c = n[l])[0], d = c[1]; + i[h] = new e.Vector(d); + } + for (l = 0; l < o.length; l++) { + var c, f = (c = o[l])[0], p = c[1]; + a.insert(f), s[f] = p; + } + return a.finish(), + r.fields = t.fields, + r.fieldVectors = i, + r.invertedIndex = s, + r.tokenSet = a.root, + r.pipeline = u, + new e.Index(r); + }, + e.Builder = function () { + this._ref = "id", + this._fields = Object.create(null), + this._documents = Object.create(null), + this.invertedIndex = Object.create(null), + this.fieldTermFrequencies = {}, + this.fieldLengths = {}, + this.tokenizer = e.tokenizer, + this.pipeline = new e.Pipeline(), + this.searchPipeline = new e.Pipeline(), + this.documentCount = 0, + this._b = .75, + this._k1 = 1.2, + this.termIndex = 0, + this.metadataWhitelist = []; + }, + e.Builder.prototype.ref = function (e) { + this._ref = e; + }, + e.Builder.prototype.field = function (e, t) { + if (/\//.test(e)) { + throw new RangeError( + "Field '" + e + "' contains illegal character '/'", + ); + } + this._fields[e] = t || {}; + }, + e.Builder.prototype.b = function (e) { + this._b = e < 0 ? 0 : 1 < e ? 1 : e; + }, + e.Builder.prototype.k1 = function (e) { + this._k1 = e; + }, + e.Builder.prototype.add = function (t, r) { + var i = t[this._ref], n = Object.keys(this._fields); + this._documents[i] = r || {}, this.documentCount += 1; + for (var s = 0; s < n.length; s++) { + var o = n[s], + a = this._fields[o].extractor, + u = a ? a(t) : t[o], + l = this.tokenizer(u, { fields: [o] }), + c = this.pipeline.run(l), + h = new e.FieldRef(i, o), + d = Object.create(null); + this.fieldTermFrequencies[h] = d, + this.fieldLengths[h] = 0, + this.fieldLengths[h] += c.length; + for (var f = 0; f < c.length; f++) { + var p = c[f]; + if ( + null == d[p] && (d[p] = 0), + d[p] += 1, + null == this.invertedIndex[p] + ) { + var y = Object.create(null); + y._index = this.termIndex, this.termIndex += 1; + for (var m = 0; m < n.length; m++) y[n[m]] = Object.create(null); + this.invertedIndex[p] = y; + } + null == this.invertedIndex[p][o][i] && + (this.invertedIndex[p][o][i] = Object.create(null)); + for (var v = 0; v < this.metadataWhitelist.length; v++) { + var g = this.metadataWhitelist[v], x = p.metadata[g]; + null == this.invertedIndex[p][o][i][g] && + (this.invertedIndex[p][o][i][g] = []), + this.invertedIndex[p][o][i][g].push(x); + } + } + } + }, + e.Builder.prototype.calculateAverageFieldLengths = function () { + for ( + var t = Object.keys(this.fieldLengths), + r = t.length, + i = {}, + n = {}, + s = 0; + s < r; + s++ + ) { + var o = e.FieldRef.fromString(t[s]), a = o.fieldName; + n[a] || (n[a] = 0), + n[a] += 1, + i[a] || (i[a] = 0), + i[a] += this.fieldLengths[o]; + } + var u = Object.keys(this._fields); + for (s = 0; s < u.length; s++) { + var l = u[s]; + i[l] = i[l] / n[l]; + } + this.averageFieldLength = i; + }, + e.Builder.prototype.createFieldVectors = function () { + for ( + var t = {}, + r = Object.keys(this.fieldTermFrequencies), + i = r.length, + n = Object.create(null), + s = 0; + s < i; + s++ + ) { + for ( + var o = e.FieldRef.fromString(r[s]), + a = o.fieldName, + u = this.fieldLengths[o], + l = new e.Vector(), + c = this.fieldTermFrequencies[o], + h = Object.keys(c), + d = h.length, + f = this._fields[a].boost || 1, + p = this._documents[o.docRef].boost || 1, + y = 0; + y < d; + y++ + ) { + var m, v, g, x = h[y], w = c[x], Q = this.invertedIndex[x]._index; + void 0 === n[x] + ? (m = e.idf(this.invertedIndex[x], this.documentCount), n[x] = m) + : m = n[x], + v = m * ((this._k1 + 1) * w) / + (this._k1 * + (1 - this._b + this._b * (u / this.averageFieldLength[a])) + + w), + v *= f, + v *= p, + g = Math.round(1e3 * v) / 1e3, + l.insert(Q, g); + } + t[o] = l; + } + this.fieldVectors = t; + }, + e.Builder.prototype.createTokenSet = function () { + this.tokenSet = e.TokenSet.fromArray( + Object.keys(this.invertedIndex).sort(), + ); + }, + e.Builder.prototype.build = function () { + return this.calculateAverageFieldLengths(), + this.createFieldVectors(), + this.createTokenSet(), + new e.Index( + { + invertedIndex: this.invertedIndex, + fieldVectors: this.fieldVectors, + tokenSet: this.tokenSet, + fields: Object.keys(this._fields), + pipeline: this.searchPipeline, + }, + ); + }, + e.Builder.prototype.use = function (e) { + var t = Array.prototype.slice.call(arguments, 1); + t.unshift(this), e.apply(this, t); + }, + e.MatchData = function (e, t, r) { + for ( + var i = Object.create(null), n = Object.keys(r || {}), s = 0; + s < n.length; + s++ + ) { + var o = n[s]; + i[o] = r[o].slice(); + } + this.metadata = Object.create(null), + void 0 !== e && + (this.metadata[e] = Object.create(null), this.metadata[e][t] = i); + }, + e.MatchData.prototype.combine = function (e) { + for (var t = Object.keys(e.metadata), r = 0; r < t.length; r++) { + var i = t[r], n = Object.keys(e.metadata[i]); + null == this.metadata[i] && + (this.metadata[i] = Object.create(null)); + for (var s = 0; s < n.length; s++) { + var o = n[s], a = Object.keys(e.metadata[i][o]); + null == this.metadata[i][o] && + (this.metadata[i][o] = Object.create(null)); + for (var u = 0; u < a.length; u++) { + var l = a[u]; + null == this.metadata[i][o][l] + ? this.metadata[i][o][l] = e.metadata[i][o][l] + : this.metadata[i][o][l] = this.metadata[i][o][l].concat( + e.metadata[i][o][l], + ); + } + } + } + }, + e.MatchData.prototype.add = function (e, t, r) { + if (!(e in this.metadata)) { + return this.metadata[e] = Object.create(null), + void (this.metadata[e][t] = r); + } + if (t in this.metadata[e]) { + for (var i = Object.keys(r), n = 0; n < i.length; n++) { + var s = i[n]; + s in this.metadata[e][t] + ? this.metadata[e][t][s] = this.metadata[e][t][s].concat(r[s]) + : this.metadata[e][t][s] = r[s]; + } + } else this.metadata[e][t] = r; + }, + e.Query = function (e) { + this.clauses = [], this.allFields = e; + }, + e.Query.wildcard = new String("*"), + e.Query.wildcard.NONE = 0, + e.Query.wildcard.LEADING = 1, + e.Query.wildcard.TRAILING = 2, + e.Query.presence = { OPTIONAL: 1, REQUIRED: 2, PROHIBITED: 3 }, + e.Query.prototype.clause = function (t) { + return "fields" in t || (t.fields = this.allFields), + "boost" in t || (t.boost = 1), + "usePipeline" in t || (t.usePipeline = !0), + "wildcard" in t || (t.wildcard = e.Query.wildcard.NONE), + t.wildcard & e.Query.wildcard.LEADING && + t.term.charAt(0) != e.Query.wildcard && (t.term = "*" + t.term), + t.wildcard & e.Query.wildcard.TRAILING && + t.term.slice(-1) != e.Query.wildcard && (t.term = t.term + "*"), + "presence" in t || (t.presence = e.Query.presence.OPTIONAL), + this.clauses.push(t), + this; + }, + e.Query.prototype.isNegated = function () { + for (var t = 0; t < this.clauses.length; t++) { + if (this.clauses[t].presence != e.Query.presence.PROHIBITED) { + return !1; + } + } + return !0; + }, + e.Query.prototype.term = function (t, r) { + if (Array.isArray(t)) { + return t.forEach(function (t) { + this.term(t, e.utils.clone(r)); + }, this), + this; + } + var i = r || {}; + return i.term = t.toString(), this.clause(i), this; + }, + e.QueryParseError = function (e, t, r) { + this.name = "QueryParseError", + this.message = e, + this.start = t, + this.end = r; + }, + e.QueryParseError.prototype = new Error(), + e.QueryLexer = function (e) { + this.lexemes = [], + this.str = e, + this.length = e.length, + this.pos = 0, + this.start = 0, + this.escapeCharPositions = []; + }, + e.QueryLexer.prototype.run = function () { + for (var t = e.QueryLexer.lexText; t;) t = t(this); + }, + e.QueryLexer.prototype.sliceString = function () { + for ( + var e = [], t = this.start, r = this.pos, i = 0; + i < this.escapeCharPositions.length; + i++ + ) { + r = this.escapeCharPositions[i], + e.push(this.str.slice(t, r)), + t = r + 1; + } + return e.push(this.str.slice(t, this.pos)), + this.escapeCharPositions.length = 0, + e.join(""); + }, + e.QueryLexer.prototype.emit = function (e) { + this.lexemes.push( + { type: e, str: this.sliceString(), start: this.start, end: this.pos }, + ), this.start = this.pos; + }, + e.QueryLexer.prototype.escapeCharacter = function () { + this.escapeCharPositions.push(this.pos - 1), this.pos += 1; + }, + e.QueryLexer.prototype.next = function () { + if (this.pos >= this.length) return e.QueryLexer.EOS; + var t = this.str.charAt(this.pos); + return this.pos += 1, t; + }, + e.QueryLexer.prototype.width = function () { + return this.pos - this.start; + }, + e.QueryLexer.prototype.ignore = function () { + this.start == this.pos && (this.pos += 1), this.start = this.pos; + }, + e.QueryLexer.prototype.backup = function () { + this.pos -= 1; + }, + e.QueryLexer.prototype.acceptDigitRun = function () { + for (var t, r; 47 < (r = (t = this.next()).charCodeAt(0)) && r < 58;); + t != e.QueryLexer.EOS && this.backup(); + }, + e.QueryLexer.prototype.more = function () { + return this.pos < this.length; + }, + e.QueryLexer.EOS = "EOS", + e.QueryLexer.FIELD = "FIELD", + e.QueryLexer.TERM = "TERM", + e.QueryLexer.EDIT_DISTANCE = "EDIT_DISTANCE", + e.QueryLexer.BOOST = "BOOST", + e.QueryLexer.PRESENCE = "PRESENCE", + e.QueryLexer.lexField = function (t) { + return t.backup(), + t.emit(e.QueryLexer.FIELD), + t.ignore(), + e.QueryLexer.lexText; + }, + e.QueryLexer.lexTerm = function (t) { + if ( + 1 < t.width() && (t.backup(), t.emit(e.QueryLexer.TERM)), + t.ignore(), + t.more() + ) { + return e.QueryLexer.lexText; + } + }, + e.QueryLexer.lexEditDistance = function (t) { + return t.ignore(), + t.acceptDigitRun(), + t.emit(e.QueryLexer.EDIT_DISTANCE), + e.QueryLexer.lexText; + }, + e.QueryLexer.lexBoost = function (t) { + return t.ignore(), + t.acceptDigitRun(), + t.emit(e.QueryLexer.BOOST), + e.QueryLexer.lexText; + }, + e.QueryLexer.lexEOS = function (t) { + 0 < t.width() && t.emit(e.QueryLexer.TERM); + }, + e.QueryLexer.termSeparator = e.tokenizer.separator, + e.QueryLexer.lexText = function (t) { + for (;;) { + var r = t.next(); + if (r == e.QueryLexer.EOS) return e.QueryLexer.lexEOS; + if (92 != r.charCodeAt(0)) { + if (":" == r) return e.QueryLexer.lexField; + if ("~" == r) { + return t.backup(), + 0 < t.width() && t.emit(e.QueryLexer.TERM), + e.QueryLexer.lexEditDistance; + } + if ("^" == r) { + return t.backup(), + 0 < t.width() && t.emit(e.QueryLexer.TERM), + e.QueryLexer.lexBoost; + } + if ("+" == r && 1 === t.width()) { + return t.emit(e.QueryLexer.PRESENCE), e.QueryLexer.lexText; + } + if ("-" == r && 1 === t.width()) { + return t.emit(e.QueryLexer.PRESENCE), e.QueryLexer.lexText; + } + if (r.match(e.QueryLexer.termSeparator)) return e.QueryLexer.lexTerm; + } else t.escapeCharacter(); + } + }, + e.QueryParser = function (t, r) { + this.lexer = new e.QueryLexer(t), + this.query = r, + this.currentClause = {}, + this.lexemeIdx = 0; + }, + e.QueryParser.prototype.parse = function () { + this.lexer.run(), this.lexemes = this.lexer.lexemes; + for (var t = e.QueryParser.parseClause; t;) t = t(this); + return this.query; + }, + e.QueryParser.prototype.peekLexeme = function () { + return this.lexemes[this.lexemeIdx]; + }, + e.QueryParser.prototype.consumeLexeme = function () { + var e = this.peekLexeme(); + return this.lexemeIdx += 1, e; + }, + e.QueryParser.prototype.nextClause = function () { + var e = this.currentClause; + this.query.clause(e), this.currentClause = {}; + }, + e.QueryParser.parseClause = function (t) { + var r = t.peekLexeme(); + if (null != r) { + switch (r.type) { + case e.QueryLexer.PRESENCE: + return e.QueryParser.parsePresence; + case e.QueryLexer.FIELD: + return e.QueryParser.parseField; + case e.QueryLexer.TERM: + return e.QueryParser.parseTerm; + default: + var i = "expected either a field or a term, found " + r.type; + throw 1 <= r.str.length && (i += " with value '" + r.str + "'"), + new e.QueryParseError(i, r.start, r.end); + } + } + }, + e.QueryParser.parsePresence = function (t) { + var r = t.consumeLexeme(); + if (null != r) { + switch (r.str) { + case "-": + t.currentClause.presence = e.Query.presence.PROHIBITED; + break; + case "+": + t.currentClause.presence = e.Query.presence.REQUIRED; + break; + default: + var i = "unrecognised presence operator'" + r.str + "'"; + throw new e.QueryParseError(i, r.start, r.end); + } + var n = t.peekLexeme(); + if (null == n) { + i = "expecting term or field, found nothing"; + throw new e.QueryParseError(i, r.start, r.end); + } + switch (n.type) { + case e.QueryLexer.FIELD: + return e.QueryParser.parseField; + case e.QueryLexer.TERM: + return e.QueryParser.parseTerm; + default: + i = "expecting term or field, found '" + n.type + "'"; + throw new e.QueryParseError(i, n.start, n.end); + } + } + }, + e.QueryParser.parseField = function (t) { + var r = t.consumeLexeme(); + if (null != r) { + if (-1 == t.query.allFields.indexOf(r.str)) { + var i = t.query.allFields.map(function (e) { + return "'" + e + "'"; + }).join(", "), + n = "unrecognised field '" + r.str + "', possible fields: " + i; + throw new e.QueryParseError(n, r.start, r.end); + } + t.currentClause.fields = [r.str]; + var s = t.peekLexeme(); + if (null == s) { + n = "expecting term, found nothing"; + throw new e.QueryParseError(n, r.start, r.end); + } + switch (s.type) { + case e.QueryLexer.TERM: + return e.QueryParser.parseTerm; + default: + n = "expecting term, found '" + s.type + "'"; + throw new e.QueryParseError(n, s.start, s.end); + } + } + }, + e.QueryParser.parseTerm = function (t) { + var r = t.consumeLexeme(); + if (null != r) { + t.currentClause.term = r.str.toLowerCase(), + -1 != r.str.indexOf("*") && (t.currentClause.usePipeline = !1); + var i = t.peekLexeme(); + if (null == i) return void t.nextClause(); + switch (i.type) { + case e.QueryLexer.TERM: + return t.nextClause(), e.QueryParser.parseTerm; + case e.QueryLexer.FIELD: + return t.nextClause(), e.QueryParser.parseField; + case e.QueryLexer.EDIT_DISTANCE: + return e.QueryParser.parseEditDistance; + case e.QueryLexer.BOOST: + return e.QueryParser.parseBoost; + case e.QueryLexer.PRESENCE: + return t.nextClause(), e.QueryParser.parsePresence; + default: + var n = "Unexpected lexeme type '" + i.type + "'"; + throw new e.QueryParseError(n, i.start, i.end); + } + } + }, + e.QueryParser.parseEditDistance = function (t) { + var r = t.consumeLexeme(); + if (null != r) { + var i = parseInt(r.str, 10); + if (isNaN(i)) { + var n = "edit distance must be numeric"; + throw new e.QueryParseError(n, r.start, r.end); + } + t.currentClause.editDistance = i; + var s = t.peekLexeme(); + if (null == s) return void t.nextClause(); + switch (s.type) { + case e.QueryLexer.TERM: + return t.nextClause(), e.QueryParser.parseTerm; + case e.QueryLexer.FIELD: + return t.nextClause(), e.QueryParser.parseField; + case e.QueryLexer.EDIT_DISTANCE: + return e.QueryParser.parseEditDistance; + case e.QueryLexer.BOOST: + return e.QueryParser.parseBoost; + case e.QueryLexer.PRESENCE: + return t.nextClause(), e.QueryParser.parsePresence; + default: + n = "Unexpected lexeme type '" + s.type + "'"; + throw new e.QueryParseError(n, s.start, s.end); + } + } + }, + e.QueryParser.parseBoost = function (t) { + var r = t.consumeLexeme(); + if (null != r) { + var i = parseInt(r.str, 10); + if (isNaN(i)) { + var n = "boost must be numeric"; + throw new e.QueryParseError(n, r.start, r.end); + } + t.currentClause.boost = i; + var s = t.peekLexeme(); + if (null == s) return void t.nextClause(); + switch (s.type) { + case e.QueryLexer.TERM: + return t.nextClause(), e.QueryParser.parseTerm; + case e.QueryLexer.FIELD: + return t.nextClause(), e.QueryParser.parseField; + case e.QueryLexer.EDIT_DISTANCE: + return e.QueryParser.parseEditDistance; + case e.QueryLexer.BOOST: + return e.QueryParser.parseBoost; + case e.QueryLexer.PRESENCE: + return t.nextClause(), e.QueryParser.parsePresence; + default: + n = "Unexpected lexeme type '" + s.type + "'"; + throw new e.QueryParseError(n, s.start, s.end); + } + } + }, + function (e, t) { + "function" == typeof define && define.amd ? define(t) + : "object" == typeof exports ? module.exports = t() : e.lunr = t(); + }(this, function () { + return e; + }); +}(); +var typedoc, + __extends = this && this.__extends || function () { + var extendStatics = function (d, b) { + return (extendStatics = Object.setPrototypeOf || + { __proto__: [] } instanceof Array && function (d, b) { + d.__proto__ = b; + } || + function (d, b) { + for (var p in b) b.hasOwnProperty(p) && (d[p] = b[p]); + })(d, b); + }; + return function (d, b) { + function __() { + this.constructor = d; + } + extendStatics(d, b), + d.prototype = null === b + ? Object.create(b) + : (__.prototype = b.prototype, new __()); + }; + }(); +!function (typedoc) { + var services = [], components = []; + typedoc.registerService = function (constructor, name, priority) { + void 0 === priority && (priority = 0), + services.push( + { + constructor: constructor, + name: name, + priority: priority, + instance: null, + }, + ), + services.sort(function (a, b) { + return a.priority - b.priority; + }); + }, + typedoc.registerComponent = function ( + constructor, + selector, + priority, + namespace, + ) { + void 0 === priority && (priority = 0), + void 0 === namespace && (namespace = "*"), + components.push( + { + selector: selector, + constructor: constructor, + priority: priority, + namespace: namespace, + }, + ), + components.sort(function (a, b) { + return a.priority - b.priority; + }); + }; + var Application = function () { + function Application() { + this.createServices(), this.createComponents(document.body); + } + return Application.prototype.createServices = function () { + services.forEach(function (c) { + c.instance = new c.constructor(), typedoc[c.name] = c.instance; + }); + }, + Application.prototype.createComponents = function (context, namespace) { + void 0 === namespace && (namespace = "default"), + components.forEach(function (c) { + c.namespace != namespace && "*" != c.namespace || + context.querySelectorAll(c.selector).forEach(function (el) { + el.dataset.hasInstance || + (new c.constructor({ el: el }), + el.dataset.hasInstance = String(!0)); + }); + }); + }, + Application; + }(); + typedoc.Application = Application; +}(typedoc || (typedoc = {})), + function (typedoc) { + var EventTarget = function () { + function EventTarget() { + this.listeners = {}; + } + return EventTarget.prototype.addEventListener = function ( + type, + callback, + ) { + type in this.listeners || (this.listeners[type] = []), + this.listeners[type].push(callback); + }, + EventTarget.prototype.removeEventListener = function (type, callback) { + if (type in this.listeners) { + for ( + var stack = this.listeners[type], i = 0, l = stack.length; + i < l; + i++ + ) { + if (stack[i] === callback) return void stack.splice(i, 1); + } + } + }, + EventTarget.prototype.dispatchEvent = function (event) { + if (!(event.type in this.listeners))return !0; + for ( + var stack = this.listeners[event.type].slice(), + i = 0, + l = stack.length; + i < l; + i++ + ) { + stack[i].call(this, event); + } + return !event.defaultPrevented; + }, + EventTarget; + }(); + typedoc.EventTarget = EventTarget; + }(typedoc || (typedoc = {})), + function (typedoc) { + typedoc.throttle = function (fn, wait) { + void 0 === wait && (wait = 100); + var time = Date.now(); + return function () { + for (var args = [], _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + time + wait - Date.now() < 0 && + (fn.apply(void 0, args), time = Date.now()); + }; + }; + }(typedoc || (typedoc = {})), + function (typedoc) { + var Viewport = function (_super) { + function Viewport() { + var _this = _super.call(this) || this; + return _this.scrollTop = 0, + _this.lastY = 0, + _this.width = 0, + _this.height = 0, + _this.showToolbar = !0, + _this.toolbar = document.querySelector(".tsd-page-toolbar"), + _this.secondaryNav = document.querySelector( + ".tsd-navigation.secondary", + ), + window.addEventListener( + "scroll", + typedoc.throttle(function () { + return _this.onScroll(); + }, 10), + ), + window.addEventListener( + "resize", + typedoc.throttle(function () { + return _this.onResize(); + }, 10), + ), + _this.onResize(), + _this.onScroll(), + _this; + } + return __extends(Viewport, _super), + Viewport.prototype.triggerResize = function () { + var event = new CustomEvent( + "resize", + { detail: { width: this.width, height: this.height } }, + ); + this.dispatchEvent(event); + }, + Viewport.prototype.onResize = function () { + this.width = window.innerWidth || 0, + this.height = window.innerHeight || 0; + var event = new CustomEvent( + "resize", + { detail: { width: this.width, height: this.height } }, + ); + this.dispatchEvent(event); + }, + Viewport.prototype.onScroll = function () { + this.scrollTop = window.scrollY || 0; + var event = new CustomEvent( + "scroll", + { detail: { scrollTop: this.scrollTop } }, + ); + this.dispatchEvent(event), this.hideShowToolbar(); + }, + Viewport.prototype.hideShowToolbar = function () { + var isShown = this.showToolbar; + this.showToolbar = this.lastY >= this.scrollTop || + 0 === this.scrollTop, + isShown !== this.showToolbar && + (this.toolbar.classList.toggle("tsd-page-toolbar--hide"), + this.secondaryNav.classList.toggle( + "tsd-navigation--toolbar-hide", + )), + this.lastY = this.scrollTop; + }, + Viewport; + }(typedoc.EventTarget); + typedoc.Viewport = Viewport, typedoc.registerService(Viewport, "viewport"); + }(typedoc || (typedoc = {})), + function (typedoc) { + function Component(options) { + this.el = options.el; + } + typedoc.Component = Component; + }(typedoc || (typedoc = {})), + function (typedoc) { + typedoc.pointerDown = "mousedown", + typedoc.pointerMove = "mousemove", + typedoc.pointerUp = "mouseup", + typedoc.pointerDownPosition = { x: 0, y: 0 }, + typedoc.preventNextClick = !1, + typedoc.isPointerDown = !1, + typedoc.isPointerTouch = !1, + typedoc.hasPointerMoved = !1, + typedoc.isMobile = + /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( + navigator.userAgent, + ), + document.documentElement.classList.add( + typedoc.isMobile ? "is-mobile" : "not-mobile", + ), + typedoc.isMobile && "ontouchstart" in document.documentElement && + (typedoc.isPointerTouch = !0, + typedoc.pointerDown = "touchstart", + typedoc.pointerMove = "touchmove", + typedoc.pointerUp = "touchend"), + document.addEventListener(typedoc.pointerDown, function (e) { + typedoc.isPointerDown = !0, typedoc.hasPointerMoved = !1; + var t = "touchstart" == typedoc.pointerDown ? e.targetTouches[0] : e; + typedoc.pointerDownPosition.y = t.pageY || 0, + typedoc.pointerDownPosition.x = t.pageX || 0; + }), + document.addEventListener(typedoc.pointerMove, function (e) { + if (typedoc.isPointerDown && !typedoc.hasPointerMoved) { + var t = "touchstart" == typedoc.pointerDown ? e.targetTouches[0] : e, + x = typedoc.pointerDownPosition.x - (t.pageX || 0), + y = typedoc.pointerDownPosition.y - (t.pageY || 0); + typedoc.hasPointerMoved = 10 < Math.sqrt(x * x + y * y); + } + }), + document.addEventListener(typedoc.pointerUp, function () { + typedoc.isPointerDown = !1; + }), + document.addEventListener("click", function (e) { + typedoc.preventNextClick && + (e.preventDefault(), + e.stopImmediatePropagation(), + typedoc.preventNextClick = !1); + }); + }(typedoc || (typedoc = {})), + function (typedoc) { + var FilterItem = function () { + function FilterItem(key, value) { + this.key = key, + this.value = value, + this.defaultValue = value, + this.initialize(), + window.localStorage[this.key] && + this.setValue(this.fromLocalStorage(window.localStorage[this.key])); + } + return FilterItem.prototype.initialize = function () {}, + FilterItem.prototype.setValue = function (value) { + if (this.value != value) { + var oldValue = this.value; + this.value = value, + window.localStorage[this.key] = this.toLocalStorage(value), + this.handleValueChange(oldValue, value); + } + }, + FilterItem; + }(), + FilterItemCheckbox = function (_super) { + function FilterItemCheckbox() { + return null !== _super && _super.apply(this, arguments) || this; + } + return __extends(FilterItemCheckbox, _super), + FilterItemCheckbox.prototype.initialize = function () { + var _this = this, + checkbox = document.querySelector("#tsd-filter-" + this.key); + checkbox && + (this.checkbox = checkbox, + this.checkbox.addEventListener("change", function () { + _this.setValue(_this.checkbox.checked); + })); + }, + FilterItemCheckbox.prototype.handleValueChange = function ( + oldValue, + newValue, + ) { + this.checkbox.checked = this.value, + document.documentElement.classList.toggle( + "toggle-" + this.key, + this.value != this.defaultValue, + ); + }, + FilterItemCheckbox.prototype.fromLocalStorage = function (value) { + return "true" == value; + }, + FilterItemCheckbox.prototype.toLocalStorage = function (value) { + return value ? "true" : "false"; + }, + FilterItemCheckbox; + }(FilterItem), + FilterItemSelect = function (_super) { + function FilterItemSelect() { + return null !== _super && _super.apply(this, arguments) || this; + } + return __extends(FilterItemSelect, _super), + FilterItemSelect.prototype.initialize = function () { + var _this = this; + document.documentElement.classList.add( + "toggle-" + this.key + this.value, + ); + var select = document.querySelector("#tsd-filter-" + this.key); + if (select) { + this.select = select; + function onActivate() { + _this.select.classList.add("active"); + } + this.select.addEventListener(typedoc.pointerDown, onActivate), + this.select.addEventListener("mouseover", onActivate), + this.select.addEventListener("mouseleave", function () { + _this.select.classList.remove("active"); + }), + this.select.querySelectorAll("li").forEach(function (el) { + el.addEventListener(typedoc.pointerUp, function (e) { + select.classList.remove("active"), + _this.setValue(e.target.dataset.value || ""); + }); + }), + document.addEventListener(typedoc.pointerDown, function (e) { + _this.select.contains(e.target) || + _this.select.classList.remove("active"); + }); + } + }, + FilterItemSelect.prototype.handleValueChange = function ( + oldValue, + newValue, + ) { + this.select.querySelectorAll("li.selected").forEach(function (el) { + el.classList.remove("selected"); + }); + var selected = this.select.querySelector( + 'li[data-value="' + newValue + '"]', + ), + label = this.select.querySelector(".tsd-select-label"); + selected && label && + (selected.classList.add("selected"), + label.textContent = selected.textContent), + document.documentElement.classList.remove("toggle-" + oldValue), + document.documentElement.classList.add("toggle-" + newValue); + }, + FilterItemSelect.prototype.fromLocalStorage = function (value) { + return value; + }, + FilterItemSelect.prototype.toLocalStorage = function (value) { + return value; + }, + FilterItemSelect; + }(FilterItem), + Filter = function (_super) { + function Filter(options) { + var _this = _super.call(this, options) || this; + return _this.optionVisibility = new FilterItemSelect( + "visibility", + "private", + ), + _this.optionInherited = new FilterItemCheckbox("inherited", !0), + _this.optionExternals = new FilterItemCheckbox("externals", !0), + _this.optionOnlyExported = new FilterItemCheckbox( + "only-exported", + !1, + ), + _this; + } + return __extends(Filter, _super), + Filter.isSupported = function () { + try { + return void 0 !== window.localStorage; + } catch (e) { + return !1; + } + }, + Filter; + }(typedoc.Component); + Filter.isSupported() ? typedoc.registerComponent(Filter, "#tsd-filter") + : document.documentElement.classList.add("no-filter"); + }(typedoc || (typedoc = {})), + function (typedoc) { + var MenuHighlight = function (_super) { + function MenuHighlight(options) { + var _this = _super.call(this, options) || this; + return _this.anchors = [], + _this.index = -1, + typedoc.viewport.addEventListener("resize", function () { + return _this.onResize(); + }), + typedoc.viewport.addEventListener("scroll", function (e) { + return _this.onScroll(e); + }), + _this.createAnchors(), + _this; + } + return __extends(MenuHighlight, _super), + MenuHighlight.prototype.createAnchors = function () { + var _this = this, base = window.location.href; + -1 != base.indexOf("#") && + (base = base.substr(0, base.indexOf("#"))), + this.el.querySelectorAll("a").forEach(function (el) { + var href = el.href; + if ( + -1 != href.indexOf("#") && href.substr(0, base.length) == base + ) { + var hash = href.substr(href.indexOf("#") + 1), + anchor = document.querySelector( + "a.tsd-anchor[name=" + hash + "]", + ), + link = el.parentNode; + anchor && link && + _this.anchors.push( + { link: link, anchor: anchor, position: 0 }, + ); + } + }), + this.onResize(); + }, + MenuHighlight.prototype.onResize = function () { + for ( + var anchor, index = 0, count = this.anchors.length; + index < count; + index++ + ) { + var rect = (anchor = this.anchors[index]).anchor + .getBoundingClientRect(); + anchor.position = rect.top + document.body.scrollTop; + } + this.anchors.sort(function (a, b) { + return a.position - b.position; + }); + var event = new CustomEvent( + "scroll", + { detail: { scrollTop: typedoc.viewport.scrollTop } }, + ); + this.onScroll(event); + }, + MenuHighlight.prototype.onScroll = function (event) { + for ( + var scrollTop = event.detail.scrollTop + 5, + anchors = this.anchors, + count = anchors.length - 1, + index = this.index; + -1 < index && anchors[index].position > scrollTop; + ) { + index -= 1; + } + for (; index < count && anchors[index + 1].position < scrollTop;) { + index += 1; + } + this.index != index && + (-1 < this.index && + this.anchors[this.index].link.classList.remove("focus"), + this.index = index, + -1 < this.index && + this.anchors[this.index].link.classList.add("focus")); + }, + MenuHighlight; + }(typedoc.Component); + typedoc.MenuHighlight = MenuHighlight, + typedoc.registerComponent(MenuHighlight, ".menu-highlight"); + }(typedoc || (typedoc = {})), + function (typedoc) { + !function (search) { + var SearchLoadingState; + !function (SearchLoadingState) { + SearchLoadingState[SearchLoadingState.Idle = 0] = "Idle", + SearchLoadingState[SearchLoadingState.Loading = 1] = "Loading", + SearchLoadingState[SearchLoadingState.Ready = 2] = "Ready", + SearchLoadingState[SearchLoadingState.Failure = 3] = "Failure"; + }(SearchLoadingState || (SearchLoadingState = {})); + var Search = function (_super) { + function Search(options) { + var _this = _super.call(this, options) || this; + _this.query = "", + _this.loadingState = SearchLoadingState.Idle, + _this.hasFocus = !1, + _this.preventPress = !1, + _this.data = null, + _this.index = null, + _this.resultClicked = !1; + var field = document.querySelector("#tsd-search-field"), + results = document.querySelector(".results"); + if (!field || !results) { + throw new Error( + "The input field or the result list wrapper are not found", + ); + } + return _this.field = field, + _this.results = results, + _this.base = _this.el.dataset.base + "/", + _this.bindEvents(), + _this; + } + return __extends(Search, _super), + Search.prototype.loadIndex = function () { + var _this = this; + if (this.loadingState == SearchLoadingState.Idle && !this.data) { + setTimeout(function () { + _this.loadingState == SearchLoadingState.Idle && + _this.setLoadingState(SearchLoadingState.Loading); + }, 500); + var url = this.el.dataset.index; + url + ? fetch(url).then(function (response) { + if (!response.ok) { + throw new Error("The search index is missing"); + } + return response.json(); + }).then(function (source) { + _this.data = source, + _this.index = lunr.Index.load(source.index), + _this.setLoadingState(SearchLoadingState.Ready); + }).catch(function (error) { + console.error(error), + _this.setLoadingState(SearchLoadingState.Failure); + }) + : this.setLoadingState(SearchLoadingState.Failure); + } + }, + Search.prototype.updateResults = function () { + if ( + this.loadingState == SearchLoadingState.Ready && + (this.results.textContent = "", + this.query && this.index && this.data) + ) { + var res = this.index.search("*" + this.query + "*"); + 0 === res.length && + (res = this.index.search("*" + this.query + "~1*")); + for (var i = 0, c = Math.min(10, res.length); i < c; i++) { + var row = this.data.rows[Number(res[i].ref)], + name = row.name.replace( + new RegExp(this.query, "i"), + function (match) { + return "" + match + ""; + }, + ), + parent = row.parent || ""; + (parent = parent.replace( + new RegExp(this.query, "i"), + function (match) { + return "" + match + ""; + }, + )) && + (name = '' + parent + "." + name); + var item = document.createElement("li"); + item.classList.value = row.classes, + item.innerHTML = '\n ' + name + + "'\n ", + this.results.appendChild(item); + } + } + }, + Search.prototype.setLoadingState = function (value) { + this.loadingState != value && + (this.el.classList.remove( + SearchLoadingState[this.loadingState].toLowerCase(), + ), + this.loadingState = value, + this.el.classList.add( + SearchLoadingState[this.loadingState].toLowerCase(), + ), + this.updateResults()); + }, + Search.prototype.setHasFocus = function (value) { + this.hasFocus != value && + (this.hasFocus = value, + this.el.classList.toggle("has-focus"), + value ? (this.setQuery(""), this.field.value = "") + : this.field.value = this.query); + }, + Search.prototype.setQuery = function (value) { + this.query = value.trim(), this.updateResults(); + }, + Search.prototype.setCurrentResult = function (dir) { + var current = this.results.querySelector(".current"); + if (current) { + var rel = 1 == dir ? current.nextElementSibling + : current.previousElementSibling; + rel && + (current.classList.remove("current"), + rel.classList.add("current")); + } else { + (current = this.results.querySelector( + 1 == dir ? "li:first-child" : "li:last-child", + )) && current.classList.add("current"); + } + }, + Search.prototype.gotoCurrentResult = function () { + var current = this.results.querySelector(".current"); + if ( + current || + (current = this.results.querySelector("li:first-child")), current + ) { + var link = current.querySelector("a"); + link && (window.location.href = link.href), this.field.blur(); + } + }, + Search.prototype.bindEvents = function () { + var _this = this; + this.results.addEventListener("mousedown", function () { + _this.resultClicked = !0; + }), + this.results.addEventListener("mouseup", function () { + _this.resultClicked = !1, _this.setHasFocus(!1); + }), + this.field.addEventListener("focusin", function () { + _this.setHasFocus(!0), _this.loadIndex(); + }), + this.field.addEventListener("focusout", function () { + _this.resultClicked + ? _this.resultClicked = !1 + : setTimeout(function () { + return _this.setHasFocus(!1); + }, 100); + }), + this.field.addEventListener("input", function () { + _this.setQuery(_this.field.value); + }), + this.field.addEventListener("keydown", function (e) { + 13 == e.keyCode || 27 == e.keyCode || 38 == e.keyCode || + 40 == e.keyCode + ? (_this.preventPress = !0, + e.preventDefault(), + 13 == e.keyCode + ? _this.gotoCurrentResult() + : 27 == e.keyCode + ? _this.field.blur() + : 38 == e.keyCode + ? _this.setCurrentResult(-1) + : 40 == e.keyCode && _this.setCurrentResult(1)) + : _this.preventPress = !1; + }), + this.field.addEventListener("keypress", function (e) { + _this.preventPress && e.preventDefault(); + }), + document.body.addEventListener("keydown", function (e) { + e.altKey || e.ctrlKey || e.metaKey || + !_this.hasFocus && 47 < e.keyCode && e.keyCode < 112 && + _this.field.focus(); + }); + }, + Search; + }(typedoc.Component); + search.Search = Search, typedoc.registerComponent(Search, "#tsd-search"); + }(typedoc.search || (typedoc.search = {})); + }(typedoc || (typedoc = {})), + function (typedoc) { + var SignatureGroup = function () { + function SignatureGroup(signature, description) { + this.signature = signature, this.description = description; + } + return SignatureGroup.prototype.addClass = function (className) { + return this.signature.classList.add(className), + this.description.classList.add(className), + this; + }, + SignatureGroup.prototype.removeClass = function (className) { + return this.signature.classList.remove(className), + this.description.classList.remove(className), + this; + }, + SignatureGroup; + }(), + Signature = function (_super) { + function Signature(options) { + var _this = _super.call(this, options) || this; + return _this.groups = [], + _this.index = -1, + _this.createGroups(), + _this.container && + (_this.el.classList.add("active"), + Array.from(_this.el.children).forEach(function (signature) { + signature.addEventListener("touchstart", function (event) { + return _this.onClick(event); + }), + signature.addEventListener("click", function (event) { + return _this.onClick(event); + }); + }), + _this.container.classList.add("active"), + _this.setIndex(0)), + _this; + } + return __extends(Signature, _super), + Signature.prototype.setIndex = function (index) { + if ( + index < 0 && (index = 0), + index > this.groups.length - 1 && + (index = this.groups.length - 1), + this.index != index + ) { + var to = this.groups[index]; + if (-1 < this.index) { + var from_1 = this.groups[this.index]; + from_1.removeClass("current").addClass("fade-out"), + to.addClass("current"), + to.addClass("fade-in"), + typedoc.viewport.triggerResize(), + setTimeout(function () { + from_1.removeClass("fade-out"), to.removeClass("fade-in"); + }, 300); + } else to.addClass("current"), typedoc.viewport.triggerResize(); + this.index = index; + } + }, + Signature.prototype.createGroups = function () { + var signatures = this.el.children; + if (!(signatures.length < 2)) { + this.container = this.el.nextElementSibling; + var descriptions = this.container.children; + this.groups = []; + for (var index = 0; index < signatures.length; index++) { + this.groups.push( + new SignatureGroup(signatures[index], descriptions[index]), + ); + } + } + }, + Signature.prototype.onClick = function (e) { + var _this = this; + this.groups.forEach(function (group, index) { + group.signature === e.currentTarget && _this.setIndex(index); + }); + }, + Signature; + }(typedoc.Component); + typedoc.registerComponent(Signature, ".tsd-signatures"); + }(typedoc || (typedoc = {})), + function (typedoc) { + var Toggle = function (_super) { + function Toggle(options) { + var _this = _super.call(this, options) || this; + return _this.className = _this.el.dataset.toggle || "", + _this.el.addEventListener(typedoc.pointerUp, function (e) { + return _this.onPointerUp(e); + }), + _this.el.addEventListener("click", function (e) { + return e.preventDefault(); + }), + document.addEventListener(typedoc.pointerDown, function (e) { + return _this.onDocumentPointerDown(e); + }), + document.addEventListener(typedoc.pointerUp, function (e) { + return _this.onDocumentPointerUp(e); + }), + _this; + } + return __extends(Toggle, _super), + Toggle.prototype.setActive = function (value) { + if (this.active != value) { + this.active = value, + document.documentElement.classList.toggle( + "has-" + this.className, + value, + ), + this.el.classList.toggle("active", value); + var transition = (this.active ? "to-has-" : "from-has-") + + this.className; + document.documentElement.classList.add(transition), + setTimeout(function () { + return document.documentElement.classList.remove(transition); + }, 500); + } + }, + Toggle.prototype.onPointerUp = function (event) { + typedoc.hasPointerMoved || + (this.setActive(!0), event.preventDefault()); + }, + Toggle.prototype.onDocumentPointerDown = function (e) { + if (this.active) { + if (e.target.closest(".col-menu, .tsd-filter-group")) return; + this.setActive(!1); + } + }, + Toggle.prototype.onDocumentPointerUp = function (e) { + var _this = this; + if ( + !typedoc.hasPointerMoved && this.active && + e.target.closest(".col-menu") + ) { + var link = e.target.closest("a"); + if (link) { + var href = window.location.href; + -1 != href.indexOf("#") && + (href = href.substr(0, href.indexOf("#"))), + link.href.substr(0, href.length) == href && + setTimeout(function () { + return _this.setActive(!1); + }, 250); + } + } + }, + Toggle; + }(typedoc.Component); + typedoc.registerComponent(Toggle, "a[data-toggle]"); + }(typedoc || (typedoc = {})), + function (typedoc) { + typedoc.app = new typedoc.Application(); + }(typedoc || (typedoc = {})); diff --git a/docs/assets/js/search.json b/docs/assets/js/search.json new file mode 100644 index 0000000..e5d21c3 --- /dev/null +++ b/docs/assets/js/search.json @@ -0,0 +1 @@ +{"kinds":{"1":"Module","64":"Function"},"rows":[{"id":0,"kind":1,"name":"\"superoak\"","url":"modules/_superoak_.html","classes":"tsd-kind-module"},{"id":1,"kind":64,"name":"random","url":"modules/_superoak_.html#random","classes":"tsd-kind-function tsd-parent-kind-module tsd-is-private tsd-is-not-exported","parent":"\"superoak\""},{"id":2,"kind":64,"name":"superoak","url":"modules/_superoak_.html#superoak","classes":"tsd-kind-function tsd-parent-kind-module","parent":"\"superoak\""}],"index":{"version":"2.3.8","fields":["name","parent"],"fieldVectors":[["name/0",[0,1.054]],["parent/0",[]],["name/1",[1,9.808]],["parent/1",[0,0.087]],["name/2",[0,1.054]],["parent/2",[0,0.087]]],"invertedIndex":[["random",{"_index":1,"name":{"1":{}},"parent":{}}],["superoak",{"_index":0,"name":{"0":{},"2":{}},"parent":{"1":{},"2":{}}}]],"pipeline":[]}} \ No newline at end of file diff --git a/docs/globals.html b/docs/globals.html new file mode 100644 index 0000000..9d4ef69 --- /dev/null +++ b/docs/globals.html @@ -0,0 +1,113 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

+
+
+
+
+
+
+
+

Index

+
+
+
+

Modules

+ +
+
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..92728a8 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,231 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

+
+
+
+
+
+
+
+ +

superoak

+
+

HTTP assertions for Deno's Oak web framework made easy via SuperDeno.

+

GitHub tag Test deno doc PRs Welcome GitHub issues + GitHub stars GitHub forks superoak License Maintenance HitCount

+ +

About

+
+

This module aims to provide a high-level abstraction for testing HTTP in Deno's Oak web framework. This is a wrapper compatibility layer around SuperDeno to reduce some of the boilerplate needed to setup Oak integration + functional tests.

+ +

Installation

+
+

This is a Deno module available to import direct from this repo and via the Deno Registry.

+

Before importing, download and install Deno.

+

You can then import SuperOak straight into your project:

+
import { superoak } from "https://deno.land/x/superoak@master/mod.ts";
+

If you want to use a specific version of SuperOak, just modify the import url to contain the version:

+
import { superoak } from "https://deno.land/x/superoak@0.3.0/mod.ts";
+

Or if you want to use a specific commit of SuperOak, just modify the import url to contain the commit hash:

+
import { superoak } from "https://deno.land/x/superoak@c21f8d6/mod.ts";
+ +

Example

+
+

You may pass a url string (for an already running Oak server), or an Oak Application object to superoak() - when passing an Oak Application, SuperOak will automatically handle the creation of a server, binding to a free ephemeral port and closing of the server on a call to .end().

+

SuperOak works with any Deno test framework. Here's an example with Deno's built-in test framework, note how you can pass done straight to any of the .expect() calls:

+
import { superoak } from "https://deno.land/x/superoak@master/mod.ts";
+import { Application, Router } from "https://deno.land/x/oak@master/mod.ts";
+
+Deno.test("it should support the Oak framework", (done) => {
+  const router = new Router();
+  router.get("/", (ctx) => {
+    ctx.response.body = "Hello Deno!";
+  });
+
+  const app = new Application();
+  app.use(router.routes());
+  app.use(router.allowedMethods());
+
+  const request = await superoak(app);
+  request.get("/").expect("Hello Deno!", done);
+});
+

For further examples, see the tests or the SuperDeno examples for inspiration.

+ +

Docs

+
+ + +

API

+
+

Please refer to the SuperDeno API.

+ +

Notes

+
+
    +
  • Unlike SuperDeno, superoak() returns a promise which will need to be awaited before you can call a method such as .get("/").

    +
  • +
  • Unlike SuperDeno, you cannot re-use a SuperOak instance once the chained .end() method has been called. This is because SuperOak will automatically close the server once the chained .end() method is called. For example the following example will fail due to this limitation:

    +
    Deno.test(
    +  "it will throw a `Request has been terminated` error when trying to use an ended SuperOak object",
    +  async (done) => {
    +    const router = new Router();
    +    const app = new Application();
    +
    +    router.get("/", async (ctx: RouterContext) => {
    +      ctx.response.body = "Hello Deno!";
    +    });
    +
    +    app.use(router.routes());
    +    app.use(router.allowedMethods());
    +
    +    const request = await superoak(app);
    +
    +    request.get("/").end(() => {
    +      request.get("/").end((err, res) => {
    +        /**
    +         * This will have the following error:
    +         *
    +         * Error: Request has been terminated
    +         * Possible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.
    +         * ...
    +         */
    +        expect(err).toBeNull();
    +        done();
    +      });
    +    });
    +  }
    +);
    +

    Instead you should make all of your assertions on the one SuperOak instance, or create a new SuperOak instance like below:

    +
    Deno.test(
    +  "it will allow your to re-use the Application for another SuperOak instance",
    +  async (done) => {
    +    const router = new Router();
    +    const app = new Application();
    +
    +    router.get("/", async (ctx: RouterContext) => {
    +      ctx.response.body = "Hello Deno!";
    +    });
    +
    +    app.use(router.routes());
    +    app.use(router.allowedMethods());
    +
    +    let request = await superoak(app);
    +
    +    request.get("/").end(async () => {
    +      request = await superoak(app);
    +
    +      request.get("/").end((err, res) => {
    +        expect(err).toBeNull();
    +        done();
    +    });
    +  }
    +);
    +
  • +
+ +

Contributing

+
+

Contributing guide

+
+ +

License

+
+

SuperOak is licensed under the MIT License.

+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + + \ No newline at end of file diff --git a/docs/modules/_superoak_.html b/docs/modules/_superoak_.html new file mode 100644 index 0000000..b79a046 --- /dev/null +++ b/docs/modules/_superoak_.html @@ -0,0 +1,196 @@ + + + + + + "superoak" | + + + + + +
+
+
+
+ +
+
+ Options +
+
+ All +
    +
  • Public
  • +
  • Public/Protected
  • +
  • All
  • +
+
+ + + + +
+
+ Menu +
+
+
+
+
+
+ +

Module "superoak"

+
+
+
+
+
+
+
+

Index

+
+
+
+

Functions

+ +
+
+
+
+
+

Functions

+
+ +

Private random

+
    +
  • random(min: number, max: number): number
  • +
+
    +
  • + +
    +
    +

    Generates a random number between min and max

    +
    +
    +

    Parameters

    +
      +
    • +
      min: number
      +
    • +
    • +
      max: number
      +
      +
      +
    • +
    +

    Returns number

    +
  • +
+
+
+ +

superoak

+
    +
  • superoak(app: string | Application, secure?: boolean): Promise<SuperDeno>
  • +
+
    +
  • + +
    +
    +

    Takes a url string (for an already running Oak server), or an Oak Application object.

    +
    +

    When passing a url string, accepts an optional second argument of secure to determine + whether connections should be over HTTPS (true) or HTTP (false).

    +

    When passing an Oak Application, SuperOak will automatically handle the creation of a server, binding + to a free ephemeral port and closing of the server on a call to .end().

    +
    +

    Parameters

    +
      +
    • +
      app: string | Application
      +
    • +
    • +
      Optional secure: boolean
      +
      +
      +
    • +
    +

    Returns Promise<SuperDeno>

    +
  • +
+
+
+
+ +
+
+
+
+

Legend

+
+
    +
  • Function
  • +
+
+
+
+
+

Generated using TypeDoc

+
+
+ + + + \ No newline at end of file diff --git a/lock.json b/lock.json new file mode 100644 index 0000000..1fb65ef --- /dev/null +++ b/lock.json @@ -0,0 +1,262 @@ +{ + "https://deno.land/x/opine@0.8.0/src/middleware/serveStatic.ts": "9a9f1f4b5ef2f92ddbd80052b0915019809238387bbf55f3d5fb14a7b0d145d8", + "https://deno.land/std/http/_io.ts": "4d6b6afa750d4092754272cbfb4674b252e520c3d4a26da4c922ecca53ab3795", + "https://deno.land/x/evt@1.7.9/lib/types/index.ts": "2f1bdb1e24011cc0ee58f5c2b40b0a4a92ea082873931ad6d391e7899323d8e9", + "https://deno.land/x/opine@0.8.0/src/request.ts": "16aca7455e4454aee1b776953df571ac920d0773afc95c348f7e66bf6a66704f", + "https://deno.land/std/testing/asserts.ts": "4133876642e3a8b79c0b350104e8c88d2cc7c5f1ab3ae1a7b0bee21674634c5b", + "https://deno.land/std@0.53.0/async/delay.ts": "35957d585a6e3dd87706858fb1d6b551cb278271b03f52c5a2cb70e65e00c26a", + "https://deno.land/std@0.53.0/path/_util.ts": "b678a7ecbac6b04c1166832ae54e1024c0431dd2b340b013c46eb2956ab24d4c", + "https://deno.land/x/media_types/db.ts": "ecbb836ceadc885e53192a9923f054ac2417cbdb1892edf960fd328b1be3f665", + "https://deno.land/x/evt@1.7.9/tools/typeSafety/index.ts": "77f9d2125366756c0e9f48316f32f72761a5fe24e3c230d8efa64cdb09149b47", + "https://dev.jspm.io/npm:which-typed-array@1?dew": "c315cd24f04137850c27bd046f4519f79a4288c3536a61d165766793172c3edb", + "https://deno.land/std@0.51.0/path/_globrex.ts": "a88b9da6a150b8d8e87a7b9eef794f97b10e709910071bb57f8619dd2d0291dc", + "https://deno.land/x/evt@1.7.9/lib/types/EvtError.ts": "61eb61e75da34ad69c6950dcfb2e5f8760429cb934d5e600c17e8f65188417cf", + "https://deno.land/std@0.53.0/testing/diff.ts": "8f591074fad5d35c0cafa63b1c5334dc3a17d5b934f3b9e07172eed9d5b55553", + "https://deno.land/x/opine@0.8.0/src/utils/merge.ts": "4ea10dbd9552a230905885d14c8f28ff730c05df951923a5bdb0ec21617f07ff", + "https://dev.jspm.io/npm:es-abstract@1.17.5/GetIntrinsic.dew.js": "face5ad5845c364be516940787e320b5fc1c015f65cabbe55e7c30fb1fbf255f", + "https://dev.jspm.io/npm:is-arguments@1.0.4/index.dew.js": "b26e5c7303e25510c1703d98fecebe03ef19da469f5917ee43d736e092daa016", + "https://dev.jspm.io/npm:util@0.12.3/util.dew.js": "35f766a38806bf49a25506eef21413878c1f08e2be3f1915b805a68723514575", + "https://dev.jspm.io/npm:es-abstract@1/helpers/getOwnPropertyDescriptor?dew": "54d4d2a504da58ed02a3bc147cdad30dd77b493362d14c944fc9aec9636243f4", + "https://deno.land/std@0.53.0/path/_constants.ts": "f6c332625f21d49d5a69414ba0956ac784dbf4b26a278041308e4914ba1c7e2e", + "https://deno.land/std@0.53.0/http/server.ts": "d2b977c100d830262d8525915c3f676ce33f1e986926a3cdbc81323cf724b599", + "https://deno.land/x/opine@0.8.0/src/router/index.ts": "c2806806e311c1b908da03e635b1e97c731e3032e71a12f97fcbce259ff4cb22", + "https://dev.jspm.io/npm:es-abstract@1/helpers/callBound?dew": "1f102eafef8807b3a3f38f195992ce03aadb2c26ce1fa1ae363cf3e8998ef055", + "https://dev.jspm.io/npm:fast-safe-stringify@2?dew": "cf4851d1915da1fa7d4af06f2b736f2214ef11b7d458789e8e84439be8b977b1", + "https://deno.land/std/async/delay.ts": "35957d585a6e3dd87706858fb1d6b551cb278271b03f52c5a2cb70e65e00c26a", + "https://deno.land/std/path/_globrex.ts": "696996deed47bd98fcab9de0034233380ead443a5cd702631151c6a71e3d21a2", + "https://deno.land/x/evt@1.7.9/lib/util/genericOperators/index.ts": "af1fa4c0388fbd3a90c78ed60b78c025ae7ffea6f2592e7821e852b715070c99", + "https://deno.land/x/opine@0.8.0/src/router/route.ts": "363965ffb27464dd8e2b7a08ba49bb9c24eea664b124fb89904e5ce24a40758b", + "https://deno.land/std/io/bufio.ts": "0be99d122e459c0040fbadb5c984935fd12a662c9b8c7fddd1cde4176c6cff27", + "https://dev.jspm.io/npm:has-symbols@1?dew": "60311a9c9e90e9b2f27a85d1fda9e89477bf6f06e249357a5e9a06d6b1e76a31", + "https://deno.land/x/oak@v5.0.0/context.ts": "50bad3ac822cdce255e63c2c37b7926fce542c501176bae1d53fd153ac415a9f", + "https://dev.jspm.io/npm:component-emitter@1.3.0/index.dew.js": "79beee598d83a89514bde4e388d3273c3f664928f7c299fab88d40b2e84b165c", + "https://deno.land/std@0.53.0/encoding/utf8.ts": "8654fa820aa69a37ec5eb11908e20b39d056c9bf1c23ab294303ff467f3d50a1", + "https://deno.land/x/evt@1.7.9/lib/Evt.ts": "6dcb5c894709d7d7c23b210df5e30b23a8796b94c3b7c9b873ff906d6ae45a2b", + "https://deno.land/x/evt@1.7.9/lib/util/invokeOperator.ts": "072a981806d2814d03f445c3b186b1612926553db08cadba3cf08131ca809f07", + "https://deno.land/x/opine@0.8.0/src/utils/mergeDescriptors.ts": "e61d541bb6eeeb651f051accbe935fbbdddcb4c1d382994099b4fddf29d10d02", + "https://deno.land/std@0.51.0/path/_constants.ts": "f6c332625f21d49d5a69414ba0956ac784dbf4b26a278041308e4914ba1c7e2e", + "https://deno.land/std/path/_constants.ts": "e11f32a36644e04dce243f3c1f30c02cc5d149827f48a755628176f0707cfc70", + "https://deno.land/x/opine@0.8.0/src/middleware/bodyParser/text.ts": "b96f7708ca75ba4608ad77f16d2fa0a540d20694171d13d45c859b89ed4e98be", + "https://deno.land/x/negotiator/src/charset.ts": "ee56810906ed4fb5ee52abd4dfd8b57485685939c6b63fb2b5d289b971465f67", + "https://deno.land/std@0.53.0/path/glob.ts": "ab85e98e4590eae10e561ce8266ad93ebe5af2b68c34dc68b85d9e25bccb4eb7", + "https://deno.land/x/evt@1.7.9/lib/importProxy.ts": "6f57cee2ada724db9575242b44bd7bf598161ea46d8d12e10264fa51a6e7b01f", + "https://deno.land/std@0.53.0/io/bufio.ts": "0be99d122e459c0040fbadb5c984935fd12a662c9b8c7fddd1cde4176c6cff27", + "https://deno.land/x/evt@1.7.9/lib/Evt.loosenType.ts": "a43aaa204e80db39a0d1008e1fa0b1d159a66509787dcd046cc9f53a4255b4a7", + "https://deno.land/std@0.53.0/path/interface.ts": "89f6e68b0e3bba1401a740c8d688290957de028ed86f95eafe76fe93790ae450", + "https://deno.land/std/async/mod.ts": "bf46766747775d0fc4070940d20d45fb311c814989485861cdc8a8ef0e3bbbab", + "https://deno.land/x/oak@v5.0.0/helpers.ts": "ffc907c49368dcbe591f0bfee122a354b3a66def9621de48e06bbbdefe913b3d", + "https://raw.githubusercontent.com/garronej/run_exclusive/2.2.4/mod.ts": "1219baae8b08f63804cdb2df9d26936cc7a61194a5d06404cbf38bb4b82e6bec", + "https://deno.land/std@0.51.0/path/mod.ts": "a789541f8df9170311daa98313c5a76c06b5988f2948647957b3ec6e017d963e", + "https://deno.land/x/opine@0.8.0/src/utils/pathToRegex.ts": "488f6538794c737856fe901b9e3a4acffd5849f740f3dec66c845ff8a0abe62e", + "https://deno.land/x/oak@v5.0.0/tssCompare.ts": "e72cc0039d561bf2a56746194cf647376d686f9dcdc4a500285631ab6fb9c774", + "https://deno.land/std/fmt/colors.ts": "06444b6ebc3842a4b2340d804bfa81fc5452a03513cbb81bd7f6bf8f4b8f3ac4", + "https://deno.land/std@0.53.0/async/mod.ts": "bf46766747775d0fc4070940d20d45fb311c814989485861cdc8a8ef0e3bbbab", + "https://deno.land/x/http_errors@2.0.0/mod.ts": "520b6b1c437bb93f26d5581164f36bf0dd01f208884503aafc472b9529f11bae", + "https://deno.land/x/superdeno@1.1.1/src/test.ts": "5b10016cc056dddd960d2ccaa6099f585f5fc9528a3040ef735a1d72bbb00910", + "https://deno.land/x/media_typer/mod.ts": "01aebf79f0ecf43897a663dca9730d2dbd2a698eac9d297a6ac26b4b647bb7cc", + "https://dev.jspm.io/npm:es-abstract@1.17.5/helpers/callBound.dew.js": "d15738d2aa7e4b6fb3d41ab131ab07f8288d4353a9f04e2c9aa68d602ec454fd", + "https://deno.land/x/evt@1.7.9/lib/Evt.asPostable.ts": "0a6db703bf1379ec9cd792db2e23356e6c1555cba85ae568ad4b3a8b59c153cf", + "https://deno.land/std/http/cookie.ts": "948e9066409bdd78b1ce99774e8254cddcd41c6b8fd5ac80183e3928e2777d15", + "https://deno.land/std@0.51.0/path/_util.ts": "b678a7ecbac6b04c1166832ae54e1024c0431dd2b340b013c46eb2956ab24d4c", + "https://deno.land/std/encoding/utf8.ts": "8654fa820aa69a37ec5eb11908e20b39d056c9bf1c23ab294303ff467f3d50a1", + "https://deno.land/x/opine@0.8.0/src/methods.ts": "5dba355af605dbb55a5f02c417786afc2a07018bffc3a4bec1e7066d4fe16c7d", + "https://deno.land/x/content_type/mod.ts": "5dc435e84b665c2968d6845c573569ddeef65a41baa9a04c51e1c5e927806583", + "https://deno.land/x/evt@1.7.9/lib/LazyStatefulEvt.ts": "3dbdd8f4641d110fa6123628c8abbddddb6cd44c0613916358736be6650bf7f0", + "https://deno.land/std@0.53.0/datetime/mod.ts": "b533eb7f7627799e5030131ae80dae4d73e100507a3a1fddc1a34be677de7b1b", + "https://dev.jspm.io/npm:function-bind@1?dew": "fe36da64ee41c2cce6f94893c58224e114d7643edfa3ce8e15c0b1079959d03b", + "https://deno.land/x/evt@1.7.9/lib/util/index.ts": "6dfdfc04d8a57ab74add8c57b9265c85dbdce3a8e36b908c2ddb35fa50193ea6", + "https://deno.land/x/evt@1.7.9/lib/Evt.newCtx.ts": "3e5e660eacb5af62b0e585a2206d06e5ed4680dadf198f8dcc569d52452f59a4", + "https://dev.jspm.io/npm:is-typed-array@1.1.3/index.dew.js": "cb782e8964aa2754f4485b91ccddf9ad8135b896138f053a7e9a1bd88597aee1", + "https://deno.land/x/oak@v5.0.0/deps.ts": "4f5ebabaf8acb59f70eef901e47808e64711e71041d23ad599978a4985b41de1", + "https://deno.land/x/evt@1.7.9/lib/Evt.from.ts": "a4c87046b730b38ac14d327957d528def6aefa31be972be30845751279dc9f7b", + "https://deno.land/x/opine@0.8.0/src/response.ts": "7fb2ad170b3df66c416a9cd9db141fe668c8e0a5ad374be1a7be913f5c2ce720", + "https://dev.jspm.io/npm:foreach@2.0.5/index.dew.js": "857f00785a3a7b5705de591779ce37e0d52c86ac2ce36c42bdc985eacd8e29ab", + "https://deno.land/std@0.53.0/fmt/colors.ts": "ec9d653672a9a3c7b6eafe53c5bc797364a2db2dcf766ab649c1155fea7a80b2", + "https://deno.land/x/evt@1.7.9/lib/Evt.create.ts": "387388929e07f520386d00b67915bab9b779433950313fb71ebf6b1d424a4ece", + "https://dev.jspm.io/npm:available-typed-arrays@1.0.2/index.dew.js": "c8f09c55df45ed2efc86c0b53cfd8e3625c8570d324771d832f134733982e590", + "https://deno.land/x/opine@0.8.0/src/middleware/init.ts": "dc35180c4566167d13a367e4feefe70aeea08a75805a6fad14f5e475e0ee00b8", + "https://deno.land/x/superdeno@1.1.1/version.ts": "6045035764dc68e7cfa361cd4a416d2635d82dcf3fe49cf68842283a00bebc2c", + "https://deno.land/x/opine@0.8.0/src/middleware/bodyParser/getCharset.ts": "85b0a7385fdc9d82d6b8a97e2bf85c95f1eefd2f7faaa949ec05ec40598cecd3", + "https://deno.land/x/media_types@v2.3.1/mod.ts": "d8bd0fbb6047902b02ee2f30d1689adbab169893c418639040ef22bfa92e9896", + "https://deno.land/x/type_is@1.0.1/mod.ts": "3e471cf55f7ca9ec137ddb5feacb0d33b26e6b5b61bf7b2e2a4337b6939b8fd8", + "https://deno.land/x/superdeno@1.1.1/src/utils.ts": "af4d5fe8fb83d6c325dacd75f412375390bc0f5c75da3489ce151a9d99a3f59e", + "https://deno.land/x/media_types/deps.ts": "b4d4698240d6c87bdb0c51bb79e288305e945b82a0c94c85dec792bd199fec79", + "https://deno.land/x/oak@v5.0.0/negotiation/language.ts": "62ef13ea3146538dd52a4666611bd423ebb9a6438e7312398e17a4d16dbafb51", + "https://deno.land/x/evt@1.7.9/lib/Evt.merge.ts": "8721642afb4dbad7c701a4ef061f9089694e44476b92d4b9972300c0f1a06829", + "https://deno.land/x/evt@1.7.9/lib/Evt.useEffect.ts": "da14d655107d4f9b5757281fbbddebc4ee1615d8113e44bc6645b8079de23ee2", + "https://deno.land/x/evt@1.7.9/tools/typeSafety/id.ts": "5e4b76ff7cb41641224adc8d2d94de8dcdaefd122f686944910e8656d244519c", + "https://deno.land/std@0.53.0/io/util.ts": "ae133d310a0fdcf298cea7bc09a599c49acb616d34e148e263bcb02976f80dee", + "https://dev.jspm.io/npm:util@0.12.3/support/isBuffer.dew.js": "d6fa0e79174f1603034a9db86d15283c5521e52a5de19500d62c0ba39350df83", + "https://deno.land/x/evt@1.7.9/lib/LazyEvt.ts": "ecc6b67ecdf05aeebd9f65aa4685688e81dfc458abc7d488f09290319bd58f07", + "https://deno.land/std@0.51.0/path/common.ts": "95115757c9dc9e433a641f80ee213553b6752aa6fbb87eb9f16f6045898b6b14", + "https://deno.land/std@0.51.0/testing/asserts.ts": "213fedbb90a60ae232932c45bd62668f0c5cd17fc0f2a273e96506cba416d181", + "https://dev.jspm.io/npm:superagent@5.2.2/lib/utils.dew.js": "d47dbac6ea6605e2bcb8b10fd9c4d0a36c1dc84e429ce06ae4392d09cf04201f", + "https://deno.land/std/path/mod.ts": "6de8885c2534757097818e302becd1cefcbc4c28ac022cc279e612ee04e8cfd1", + "https://deno.land/x/media_types/mod.ts": "d8bd0fbb6047902b02ee2f30d1689adbab169893c418639040ef22bfa92e9896", + "https://deno.land/std@0.53.0/path/mod.ts": "a789541f8df9170311daa98313c5a76c06b5988f2948647957b3ec6e017d963e", + "https://deno.land/x/evt@1.7.9/lib/util/genericOperators/to.ts": "9f1aa067e713d7ba85d095bbdcfe29191138d138baaad2c0db80fc051b81d282", + "https://deno.land/x/media_types@v2.3.3/deps.ts": "b4d4698240d6c87bdb0c51bb79e288305e945b82a0c94c85dec792bd199fec79", + "https://dev.jspm.io/npm:is-typed-array@1?dew": "fd296547d81d20b32f2fcb1efc8ff5fe3f6c354c49229a84ded5853cc58377f8", + "https://deno.land/std@0.53.0/async/mux_async_iterator.ts": "e2a4c2c53aee22374b493b88dfa08ad893bc352c8aeea34f1e543e938ec6ccc6", + "https://deno.land/std@0.51.0/path/glob.ts": "ab85e98e4590eae10e561ce8266ad93ebe5af2b68c34dc68b85d9e25bccb4eb7", + "https://deno.land/x/evt@1.7.9/tools/typeSafety/exclude.ts": "49a66cf27578c7c9e92b9e841d3229e62962b20b0bd81458e45c282f3db519df", + "https://dev.jspm.io/npm:component-emitter@1?dew": "e2957bc3be509c8ef1ff860a5554d2258d9c88b2791c8c0fb022f8dda945f425", + "https://dev.jspm.io/npm:inherits@2.0.4/inherits_browser.dew.js": "9d3b15dd8ae6d05b71806ba70371069c12a3583b590e420f23b09b3c5b4dc5c5", + "https://deno.land/x/oak@v5.0.0/cookies.ts": "f7c5ef6b70db89053bbe4605e5c1a1e310ed0296aef7a7d93b32f7fc746e00bd", + "https://dev.jspm.io/npm:superagent@5.2.2/lib/agent-base.dew.js": "1324503fafe17bd67ae02977e374dfff6abc09473bbf27c5b41d82df200d3d85", + "https://deno.land/std@0.51.0/path/win32.ts": "61248a2b252bb8534f54dafb4546863545e150d2016c74a32e2a4cfb8e061b3f", + "https://deno.land/x/oak@v5.0.0/keyStack.ts": "a490066c90cbfea6b7de73303b9530e68ffbe86ff48b99ff17dab1cc9cf0751f", + "https://deno.land/std@0.53.0/hash/sha256.ts": "830ce61b9bb5413415850436f7b41bf839786ca3a4be6c0635f71acf06bb1a04", + "https://deno.land/x/opine@0.8.0/src/utils/defineGetter.ts": "5f19a1789ea936963dd4733de480adfb0de0d1c8a9bf3e33f7126086dc090f29", + "https://deno.land/x/media_types@v2.3.1/db.ts": "ecbb836ceadc885e53192a9923f054ac2417cbdb1892edf960fd328b1be3f665", + "https://dev.jspm.io/npm:superagent@5.2.2/lib/client.dew.js": "ef7eab243bcc0f4662ac39d573621dc2c1a28f2d8131284ca290e74877f59278", + "https://deno.land/x/evt@1.7.9/lib/Evt.factorize.ts": "878e0577d223f3b295b82d8d1d79f988e57f95148de93568ef1da4580aaf7e0f", + "https://deno.land/x/negotiator/src/language.ts": "690d0560552fe99e47cbc8d325b92665d9dea56fb451957607966cb7ba9cef6b", + "https://deno.land/x/vary@dc17535/mod.ts": "e7c452694b21336419f16e0891f8ea503adaafc7bde956fb29e1a86f450a68e6", + "https://deno.land/x/superdeno@1.1.1/deps.ts": "867432c04aa4e0688c7aceacfab049c44c7ceffa1dacc5b0b41517fd5d09916a", + "https://deno.land/x/oak@v5.0.0/send.ts": "13f26864c0f8ba7fc37579ed5b9383bb82421a68c5f991d0efbdec01ceeca33f", + "https://deno.land/std/path/common.ts": "e4ec66a7416d56f60331b66e27a8a4f08c7b1cf48e350271cb69754a01cf5c04", + "https://deno.land/x/oak@v5.0.0/mod.ts": "43296490a1cfcc565a74e163368ba66f2e8878d5c41a3e8f9bee2ac616cc2efb", + "https://deno.land/x/evt@1.7.9/lib/types/interfaces/index.ts": "b0d6ca5b4c508fcf8fcdc372936539d1f4903023813e2fc2ff5b5a82bba97882", + "https://dev.jspm.io/npm:superagent@5.2.2/lib/response-base.dew.js": "b7ecd833fe997d21677adecd5a3ba59090b73fd27ebaf56b4109ab8371a8ce06", + "https://dev.jspm.io/npm:@jspm/core@1/nodelibs/process.js": "a9b37603d48c1d4117bd0b778b84ddab867d67e8ac8ff87ad71fccf72cdc615d", + "https://deno.land/std@0.53.0/bytes/mod.ts": "5ad1325fc232f19b59fefbded30013b4bcd39fee4cf1eee73d6a6915ae46bdcd", + "https://deno.land/x/opine@0.8.0/src/utils/parseUrl.ts": "80b14d44bd458a483e165b893eea399aed01991aeeb9833cc8a4c3edbbf6292f", + "https://deno.land/std@0.53.0/path/common.ts": "95115757c9dc9e433a641f80ee213553b6752aa6fbb87eb9f16f6045898b6b14", + "https://deno.land/x/free_port@v1.2.0/mod.ts": "512646732aaea41fbfd1f210f3ae82660f38251777d189d290da331d0235a58e", + "https://deno.land/std@0.53.0/textproto/mod.ts": "aa585cd8dceb14437cf4499d6620c1fe861140ccfe56125eb931db4cfb90c3b2", + "https://deno.land/x/oak@v5.0.0/router.ts": "b88606b1fb63fb3c15dccd3c7a15d39a1ed322e8ba277a8cee38b81ce99eb79c", + "https://dev.jspm.io/npm:has-symbols@1.0.1/shams.dew.js": "09167eae4c19348cbc71174ab1392f29d37e4199baa0c89a361a3d98543c1415", + "https://dev.jspm.io/npm:util@0.12.3/support/types.dew.js": "47faf7e5211b30c1e3263091900198c1f4e87a83a1ec1a1bf458e4f0c8e264ff", + "https://raw.githubusercontent.com/garronej/run_exclusive/2.2.4/lib/runExclusive.ts": "6376cf9404bfa900daf26ba2a56ddeb18671b8b111ca62b94fec13ad48c8e0a1", + "https://deno.land/x/evt@1.7.9/tools/typeSafety/defineAccessors.ts": "225826b62d33edf3ca67f65050fba63814d07c17396e65b85baa29ffd3423fd1", + "https://deno.land/std/path/glob.ts": "9bb20d6dd3cdd815b02e187079fb55f197988af23ae0593b81291bd63e6c3ba3", + "https://deno.land/std@0.53.0/http/http_status.ts": "84ae4289053c4f045cd655fd3b05f33ce62c685bdc0eac2210b12d827ffa7157", + "https://dev.jspm.io/npm:@jspm/core@1.1.1/nodelibs/process.js": "9f0a862b551c5c13b46cd32b50ab8f18a95bdd943ac54292ed087c3590b2de4a", + "https://deno.land/x/opine@0.8.0/version.ts": "e668966fd6e763a524253f993836b271fe3f66adda1edd1470868ac9adce8fa0", + "https://deno.land/x/opine@0.8.0/src/middleware/bodyParser/urlencoded.ts": "dfca4807e0449de9b546ac2aa0565aac2fbd963dd02a98355978ddd1d1b9e001", + "https://deno.land/x/oak@v5.0.0/negotiation/charset.ts": "b4c2e0c49dd5122f130f95bf29508448d983c424801b5bc304b00288b5ae3195", + "https://deno.land/x/accepts@1.0.0/deps.ts": "230c8e4888c7b745a2b6c33cedc53c25f77fadb089c0dddba978418909497aea", + "https://dev.jspm.io/npm:superagent@5.2.2/lib/request-base.dew.js": "1ecee2c8e0aed7f3cb0513324cbbf56ffc935c72f92a62ce4a39bcc1e2467b98", + "https://deno.land/std/textproto/mod.ts": "aa585cd8dceb14437cf4499d6620c1fe861140ccfe56125eb931db4cfb90c3b2", + "https://raw.githubusercontent.com/garronej/minimal_polyfills/2.1.0/Set.ts": "2298d1990567c657bdc876a5e5552ad46561b036c2f4b52e901810211b36605f", + "https://deno.land/x/evt@1.7.9/tools/typeSafety/typeGuard.ts": "ef91a6cccc54dddbe71339b068f8afea25541d731d8d2c4b72a6109071cbd245", + "https://deno.land/std@0.53.0/path/posix.ts": "b742fe902d5d6821c39c02319eb32fc5a92b4d4424b533c47f1a50610afbf381", + "https://deno.land/x/opine@0.8.0/src/utils/compileETag.ts": "32edd6a8158a65389b99e6b24bba6c3933b509f21687f2ef39a838212cfb153d", + "https://deno.land/std/async/deferred.ts": "ac95025f46580cf5197928ba90995d87f26e202c19ad961bc4e3177310894cdc", + "https://deno.land/x/opine@0.8.0/src/application.ts": "74121e99066600b2ad9bf63e1bdc8493ab3173c540367ae7b4ee93c90735b94e", + "https://deno.land/std@0.53.0/hash/sha1.ts": "c1a97bde767b98b88495470f39c30c37e44ac3984409f120ef65fd84c9d27608", + "https://deno.land/std@0.53.0/path/win32.ts": "61248a2b252bb8534f54dafb4546863545e150d2016c74a32e2a4cfb8e061b3f", + "https://deno.land/x/media_types@v2.3.3/mod.ts": "d8bd0fbb6047902b02ee2f30d1689adbab169893c418639040ef22bfa92e9896", + "https://deno.land/std@0.53.0/http/cookie.ts": "948e9066409bdd78b1ce99774e8254cddcd41c6b8fd5ac80183e3928e2777d15", + "https://deno.land/x/evt@1.7.9/tools/typeSafety/objectKeys.ts": "47e50004c5c50e6c95c950736bcaaee0acf99ef9c08ee97e2f68bc8b7975e9af", + "https://dev.jspm.io/npm:util@0.12.3": "fc8ddcb26e703ebe6bfefe680feefae2af8f8136139c598aa7c6bad940dfeceb", + "https://deno.land/x/escape_html@1.0.0/mod.ts": "fd6671533b7f8bbf267047e3d1a20786837b3285c31552fa5f82f1e34f6e37c3", + "https://deno.land/x/evt@1.7.9/mod.ts": "a287b21f79647774e5d3c23b5f4a512e74eb6124346bd7f898c8615d2fc23dc1", + "https://dev.jspm.io/npm:superagent@5.2.2/lib/is-object.dew.js": "4c24365dbc705405cc247a2989e8d8467251aa27ebdbef3f1f2b033044de07dd", + "https://deno.land/x/evt@1.7.9/lib/types/EventTargetLike.ts": "fc235a64cc580ea667ad98ee930a4f9319ba59332e7184e80b327e7ae7bd134a", + "https://dev.jspm.io/npm:foreach@2?dew": "074be3338f17bd9c8df477f804988160a1c9cfd9aad796682d19d6d7881220b2", + "https://dev.jspm.io/npm:function-bind@1.1.1/index.dew.js": "727a5ef1e204821622d942741288d461ee2859f329afb37bd2cd02f44590ec47", + "https://deno.land/std/path/_util.ts": "feacfbe104df3baf2a08ca80263d6a9cf63f9c32e7c9cbe54602ec12864a72e9", + "https://deno.land/x/evt@1.7.9/tools/typeSafety/matchVoid.ts": "5b5b8f05957a4aa9638e36e8b7360edb9c69f6bde7de4b81372ecc80512f908f", + "https://deno.land/x/superdeno@1.1.1/mod.ts": "9ed0579461eadee75b1e78c32860f47155424c51161f6ffc69052d2bbf4adf4e", + "https://deno.land/std/async/mux_async_iterator.ts": "e2a4c2c53aee22374b493b88dfa08ad893bc352c8aeea34f1e543e938ec6ccc6", + "https://raw.githubusercontent.com/pillarjs/path-to-regexp/v6.1.0/src/index.ts": "8747ddaf85a761df4059cbc48a78cf710106f6b4c9d6932feb4d35120ac0990a", + "https://deno.land/x/type_is@1.0.1/deps.ts": "e02cf93f70606ab11e8b601860625788958db686280fdfad5b6db1546bd879c4", + "https://raw.githubusercontent.com/garronej/minimal_polyfills/2.1.0/Object.is.ts": "e90029a06fb86dd63e5f6b799d87702b7abe2397a220b78f1cfcce35b922f15a", + "https://dev.jspm.io/npm:is-generator-function@1?dew": "1b535baf4dea94cceab7c1ee4db07dd72f29e89d1c3641e409b7f9d579acbf40", + "https://deno.land/x/oak@v5.0.0/application.ts": "a20fe1277f469ea0ccd3bd964084647ddf4ece8c89386c023f03b5a8c30a3084", + "https://deno.land/std/path/separator.ts": "9dd15d46ff84a16e13554f56af7fee1f85f8d0f379efbbe60ac066a60561f036", + "https://deno.land/x/opine@0.8.0/src/middleware/bodyParser/read.ts": "d3ec26f64f4c18c3a09bfd407b845964733fc02b3aa47344e67c8e3439c0e8f5", + "https://dev.jspm.io/npm:function-bind@1.1.1/implementation.dew.js": "ee9e1be5b0bc8e7983e5d57442758ce21ba18779f555a81ed2c86eacb286ed5d", + "https://deno.land/std@0.53.0/async/deferred.ts": "ac95025f46580cf5197928ba90995d87f26e202c19ad961bc4e3177310894cdc", + "https://raw.githubusercontent.com/garronej/minimal_polyfills/2.1.0/WeakMap.ts": "3b0cb6ab1348897b5e107e932f53213e1459e9759db0c5eea5d01eb9bd3e0ddb", + "https://dev.jspm.io/npm:es-abstract@1.17.5/helpers/callBind.dew.js": "ead18c1c4b327b9e5b8dc3ccb9aa6ddf985d3f16928a3520b76e36443a876dde", + "https://deno.land/x/superdeno@1.1.1/src/xhrSham.js": "d4701b5f307f0b2cc05998a997a0edfd69e1891d6cd82a6115a22bcc85847301", + "https://deno.land/std/http/mod.ts": "7f2ddc904c7951757228709a2f72c5b3960dee3e81f552f21d382edfdd2a1165", + "https://deno.land/x/oak@v5.0.0/negotiation/encoding.ts": "b6b351150dfaa37d43c1e4679f0afa7ee70c2fa775d8bc8b9e9baf15bcf65888", + "https://dev.jspm.io/npm:array-filter@1?dew": "50415f26d91786895d8248bbbd53bdfe63b788ec279d4f0dd417bc621ecda024", + "https://dev.jspm.io/npm:es-abstract@1.17.5/helpers/getOwnPropertyDescriptor.dew.js": "57437e452d983aa4c37706eefec974f2e86a7a43f3acb8f429ea52a4a8a4e868", + "https://dev.jspm.io/npm:util@0.12.3/support/isBufferBrowser.dew.js": "b3016da05b0cfdf0b95a74faf5e2e15720fb442f187462b3e067366691d1dcc9", + "https://deno.land/std@0.53.0/node/timers.ts": "3d7063ba3b0477c247573c20fe3efc8999a5cee555dbb2cc45cdb06320a907c2", + "https://deno.land/x/evt@1.7.9/lib/types/lib.dom.ts": "38978a711746f666da1511afb56a64ac36912e1df8662d4ff735c9e37473a579", + "https://deno.land/x/opine@0.8.0/deps.ts": "4e805c87ac7ad5ef400a8d6000d551d519d1628f1a821e91a4699f0227e7c951", + "https://dev.jspm.io/npm:has-symbols@1.0.1/index.dew.js": "e1ea27956f3750cf7c7a1c2daa5511b94215b298e21d95c05b2e3c974212d8e7", + "https://deno.land/x/negotiator/mod.ts": "d8b28a0a7b2d75c944cebef8f87a58eeb344974d432fe0dea85e2d98e03daf24", + "https://raw.githubusercontent.com/garronej/minimal_polyfills/2.1.0/Array.prototype.find.ts": "59e93f4825b13e1d473c6a0548b45c34ce86a008e01d24b7809c8b022527dc9c", + "https://dev.jspm.io/npm:is-generator-function@1.0.7/index.dew.js": "89e4118bf20327439ad9560c592e0e175178a0111127a75d0d9b3c7c2a727d2e", + "https://deno.land/std/path/win32.ts": "07127ca39d75914d13457d4ca83df7d5c1ca1bbbcab27964ef29f985ea167837", + "https://deno.land/std@0.53.0/path/separator.ts": "7bdb45c19c5c934c49c69faae861b592ef17e6699a923449d3eaaf83ec4e7919", + "https://deno.land/std@0.51.0/fmt/colors.ts": "127ce39ca2ad9714d4ada8d61367f540d76b5b0462263aa839166876b522d3de", + "https://deno.land/x/opine@0.8.0/src/utils/contentDisposition.ts": "5bc8ab225c61c48b4957777f47d3055740ba7f7bb96ecb5883cdb07f17101f1f", + "https://deno.land/x/oak@v5.0.0/mediaTyper.ts": "042b853fc8e9c3f6c628dd389e03ef481552bf07242efc3f8a1af042102a6105", + "https://deno.land/x/superdeno@1.1.1/src/superdeno.ts": "d09882f7718114fdbbf869ca62f7b3313456a52fb4c35007fcc7c8eb2cb3c097", + "https://deno.land/x/opine@0.8.0/src/utils/fresh.ts": "acaf697f99e3cd0c74fc581e9b331cfbec3612e32ec512705befc2cf8aadf1ef", + "https://deno.land/x/opine@0.8.0/src/middleware/bodyParser/typeChecker.ts": "be4914988a8be3dc74d2c02d1babbd5795d09b4b88caa1b98949076163d7a320", + "https://deno.land/x/opine@0.8.0/src/middleware/bodyParser/raw.ts": "e552cd0c4d9f97be56b1981b900db802bd89f804284a90b81ea203ad308b3d40", + "https://deno.land/x/superdeno@1.1.1/src/close.ts": "078bdc5dc071dbf9f384cb2fb4c31dcac234c16334bc33443821b14beb3a0253", + "https://deno.land/x/opine@0.8.0/src/middleware/bodyParser/json.ts": "99faef1f72f1a5b82b8e3ad6fb326b32da6c4579f72d9db25bfc36070a240456", + "https://deno.land/x/evt@1.7.9/lib/util/encapsulateOpState.ts": "d9d74b9b21a2687a7a8aa795764afd85689786ef121d6e1e1648e237edd8b99c", + "https://deno.land/x/media_types@v2.3.3/db.ts": "ecbb836ceadc885e53192a9923f054ac2417cbdb1892edf960fd328b1be3f665", + "https://dev.jspm.io/npm:is-arguments@1?dew": "1c0a43fce76b51dee36ce4dc0927cae7cb8793d085a2cdd06b3ac0a59c4e2b78", + "https://deno.land/x/opine@0.8.0/src/utils/finalHandler.ts": "50aa1dfa4c61469bfeefb96ec7acca3863ae10648b76f1d81dabda05a8c62e55", + "https://deno.land/x/encodeurl@1.0.0/mod.ts": "b797af240fd3c4b3876b3f32b8c2404601e5503c4a10afa719e54815056685d8", + "https://deno.land/x/evt@1.7.9/lib/types/helper/index.ts": "c6177abf99ec1f7ced101b5ddbd551797809f04e72ebf2f2d203e76c521ebd6b", + "https://deno.land/std/path/_interface.ts": "5876f91d35fd42624893a4aaddaee352144e1f46e719f1dde6511bab7c3c1029", + "https://dev.jspm.io/npm:@jspm/core@1.1.1/nodelibs/chunk-0c2d1322.js": "3eed4c7a6cf097af01d9102b533f5a00f12163316eee6aa9c5c83e8b2adb24e5", + "https://deno.land/x/oak@v5.0.0/middleware.ts": "aac7ab52d12e86905833c23a1683ec1fe4186ceaf83fdb039d77af5599a4eb57", + "https://deno.land/x/evt@1.7.9/tools/typeSafety/overwriteReadonlyProp.ts": "02f5fa386e88fae182830b7910b770a746f9baf0f0ce7e5a37e27c0c96990abd", + "https://deno.land/x/http_errors@2.0.0/deps.ts": "3353be28bb8ccb88f18390a25e8fefbcded7eca9cc5471d3ac17b575fe44b266", + "https://deno.land/x/evt@1.7.9/lib/Evt.getCtx.ts": "9d49747a2ef5a98a9f8e2c48c1d0ec026bdd06e02cf9a1156f89870535f77df3", + "https://deno.land/std@0.53.0/http/_io.ts": "025d3735c6b9140fc4bf748bc41dd4e80272de1bc398773ea3e9a8a727cd6032", + "https://deno.land/x/evt@1.7.9/lib/util/genericOperators/throttleTime.ts": "742c8bde694db3032335c21d9152a86c4fcbaad7e0052e2c6752c599ebad8bfd", + "https://deno.land/std@0.53.0/path/_globrex.ts": "a88b9da6a150b8d8e87a7b9eef794f97b10e709910071bb57f8619dd2d0291dc", + "https://deno.land/std/http/http_status.ts": "0ecc0799a208f49452023b1b927106ba5a2c13cc6cf6666345db028239d554ab", + "https://deno.land/x/opine@0.8.0/src/utils/etag.ts": "69948dd97a5163c598da1ba98d1c20a086168ea618df4a7551feaadadd8d3706", + "https://deno.land/x/oak@v5.0.0/response.ts": "02b7150a43648ec586d818cf3bc0030235b58315624f7077867843c5ad0b4919", + "https://dev.jspm.io/npm:inherits@2?dew": "033e494b585fac494061a707f27bc9934d3eaf22e3b5420a5f7cdf176d4b12ef", + "https://deno.land/x/opine@0.8.0/src/middleware/query.ts": "599a953e5b7946cc9a0ce102b475e34a7bfd710384a009cc05131620e3c64531", + "https://deno.land/x/evt@1.7.9/lib/index.ts": "0074bc06faf8c9fc6d0218b31cce7dbe3d8f155fdbf44c7e45e75bd6b8e8174e", + "https://deno.land/std/testing/diff.ts": "77338e2b479626c096278d7b4a95f750753ee39558f314db6b794e8d8a98d515", + "https://deno.land/x/opine@0.8.0/src/utils/normalizeType.ts": "d7720ad6ee5437aebcd7c48776e062e641be99eb34ec49253765fc60f25cf054", + "https://deno.land/x/accepts@1.0.0/mod.ts": "928576bb8b922e900fc629f80050a13248cd3bae0ee05d70e0dc69243e71fe15", + "https://deno.land/x/evt@1.7.9/lib/StatefulEvt.ts": "5b19594f118c77f8db06e4eddb6fdea5dc775dfd24262e0dcef889a1ed587c39", + "https://deno.land/x/evt@1.7.9/tools/Deferred.ts": "d7fde0179647da5c3b8f85a1ad316304c2ee63991db22f3421ac3c342a98af10", + "https://deno.land/x/opine@0.8.0/src/router/layer.ts": "390fcb1aa0f1bd8a1afe698f8d043fddee9fa561d6e4959abb3b0f0051a452fa", + "https://deno.land/std@0.51.0/testing/diff.ts": "8f591074fad5d35c0cafa63b1c5334dc3a17d5b934f3b9e07172eed9d5b55553", + "https://deno.land/x/oak@v5.0.0/negotiation/common.ts": "f54d599d37408005f8c565d0f6505de51fed31feaa3654a7758e2359c006b02c", + "https://deno.land/x/negotiator/src/media_type.ts": "d93ce1a6480d005a3418761c0cbf5b62b5ca6f71b84666f65f51d16ba819653e", + "https://dev.jspm.io/npm:which-typed-array@1.1.2/index.dew.js": "2f2e2740933b146e1b98274c8862f63dff56db38ddcb22e15a31a76003d72853", + "https://deno.land/x/oak@v5.0.0/isMediaType.ts": "77b94675822d7de7f6af21bb765ed9f25b956c7ac4d292dd66c2ecb9ea9478e5", + "https://dev.jspm.io/npm:superagent@5.2.2": "608e651dc79c7c014b4f69b8317139fabe68825696b1056098c3d90ecccf7352", + "https://deno.land/x/negotiator/src/encoding.ts": "161e3d4ded71fe2421de9188b9ec2be59558ea99a6c3c89b0124b3fdf4d84899", + "https://deno.land/x/media_types@v2.3.1/deps.ts": "02a37b0bef1e1aed7afcac7fd482aecd2598722914239ff5ca1cae0a8b7cd2ca", + "https://deno.land/x/evt@1.7.9/lib/Ctx.ts": "33032a434e595e67f9b570403738a77e0c097cf59b77fc3c9d35a90f1f74230d", + "https://deno.land/x/opine@0.8.0/src/utils/stringify.ts": "0b9c75e6e078e693b54ff3f7603bb65be655dc8a1b7400d445de9c5e0cc25691", + "https://dev.jspm.io/npm:fast-safe-stringify@2.0.7/index.dew.js": "bf235312429708bf79319ac43daf434fb22bd715a885a1139a65efb1c8f08f5c", + "https://deno.land/std/bytes/mod.ts": "5ad1325fc232f19b59fefbded30013b4bcd39fee4cf1eee73d6a6915ae46bdcd", + "https://deno.land/x/opine@0.8.0/mod.ts": "f3361943def1538d347162dc9f78fc50d6bffd355d8fea0a86c3e8cb0da4f6f0", + "https://deno.land/x/oak@v5.0.0/util.ts": "fe6ff98b22017e0d0b2be57486ad908593e1fe7690a3ee764e84beb5f093f2f7", + "https://deno.land/x/oak@v5.0.0/httpError.ts": "a8049129e86b02305da26e82f1d916456a006f2d653f519c4413cdf7682245dd", + "https://deno.land/x/oak@v5.0.0/request.ts": "3147e8ab4a5597dc9b7e652e290b184c90875d333c58cebc9a3fb4cba40d1500", + "https://deno.land/x/evt@1.7.9/lib/Evt.parsePropsFromArgs.ts": "a27cffc27661016584dbfc6224f0bcdba8c39897c034a932587dead38eb73feb", + "https://deno.land/std@0.53.0/testing/asserts.ts": "1dc683a61218e2d8c5e9e87e3602a347000288fb207b4d7301414935620e24b3", + "https://dev.jspm.io/npm:array-filter@1.0.0/index.dew.js": "149481867f2b27c22a3c92f5cdb149b270a60b065120ca138e7c1ced7c7f6b49", + "https://raw.githubusercontent.com/garronej/minimal_polyfills/2.1.0/Map.ts": "23e7bae86df110ad8a68097750530f288c5117fe4c4b30e645b449d20fe156a5", + "https://deno.land/std/io/util.ts": "ae133d310a0fdcf298cea7bc09a599c49acb616d34e148e263bcb02976f80dee", + "https://deno.land/std/datetime/mod.ts": "b533eb7f7627799e5030131ae80dae4d73e100507a3a1fddc1a34be677de7b1b", + "https://deno.land/x/evt@1.7.9/lib/types/interfaces/CtxLike.ts": "666492e3600aae3ae75ebfafd14816acb87a738b920a45c4ed060cabc12c02c3", + "https://deno.land/std@0.51.0/path/separator.ts": "7bdb45c19c5c934c49c69faae861b592ef17e6699a923449d3eaaf83ec4e7919", + "https://deno.land/x/oak@v5.0.0/negotiation/mediaType.ts": "7e25cc34600beea3bf0b0879ff1783c752260fcb517dffea2e122830c36e8451", + "https://deno.land/x/evt@1.7.9/lib/util/compose.ts": "b2ff006b8725190c0df8d0492f6f452eb42aa5f634cf25759b9a5fc81ea56762", + "https://deno.land/x/isIP@1.0.0/mod.ts": "bd55c2180f7275930d9b1ef0b8f031108625ae3f9b87a1fa75cc8ee15d485ff8", + "https://deno.land/x/evt@1.7.9/lib/Evt.asNonPostable.ts": "b4dbaef2ec42b12716e34499a31c26bb09ade16de405aee6368b6fc004b3f758", + "https://deno.land/std@0.51.0/path/posix.ts": "b742fe902d5d6821c39c02319eb32fc5a92b4d4424b533c47f1a50610afbf381", + "https://deno.land/std/path/posix.ts": "514c39f5f7ca45bee2ace2a2e83da74dde5ff08fba837c71f86f459abe846fd7", + "https://deno.land/x/evt@1.7.9/tools/typeSafety/assert.ts": "42d43a9d20f33a3363535e02ef5903cf63be70c6b50ce9b25aea8fc6018121cd", + "https://deno.land/std@0.51.0/path/interface.ts": "89f6e68b0e3bba1401a740c8d688290957de028ed86f95eafe76fe93790ae450", + "https://deno.land/x/opine@0.8.0/src/opine.ts": "c5b741b8ae60bd2944b9e4f5ab8991bf32733f347fcfcc0b24aca29d257ca8bc", + "https://dev.jspm.io/npm:available-typed-arrays@1?dew": "17381426dcd95265622ca2fabb02e4bf9cd88ba6cdf512a7dea23d0455a5a851", + "https://deno.land/std/http/server.ts": "59d5ea54096c65db952aca39b1d3c91e5033592fec5307ebcd06149748d59b78", + "https://deno.land/x/evt@1.7.9/lib/types/Operator.ts": "384bd0410ca2ed861a883619926b6cad4b58c9159b148348641bfc9baba6f57b" +} \ No newline at end of file diff --git a/mod.ts b/mod.ts new file mode 100644 index 0000000..740d450 --- /dev/null +++ b/mod.ts @@ -0,0 +1,7 @@ +export { superoak } from "./src/superoak.ts"; +export { VERSION, DENO_SUPPORTED_VERSIONS } from "./version.ts"; + +/** + * Re-export useful types from SuperDeno. + */ +export { SuperDeno, Test, IRequest, IResponse } from "./deps.ts"; diff --git a/src/superoak.ts b/src/superoak.ts new file mode 100644 index 0000000..72e3cf3 --- /dev/null +++ b/src/superoak.ts @@ -0,0 +1,70 @@ +import { + superdeno, + Server, + SuperDeno, + Application, + getFreePort, +} from "../deps.ts"; + +/** + * Generates a random number between min and max + * @param {number} min + * @param {number} max + * + * @returns {number} + * @private + */ +function random(min: number, max: number): number { + return Math.round(Math.random() * (max - min)) + min; +} + +/** + * Takes a url string (for an already running Oak server), or an Oak `Application` object. + * + * When passing a url string, accepts an optional second argument of `secure` to determine + * whether connections should be over _HTTPS_ (`true`) or _HTTP_ (`false`). + * + * When passing an Oak `Application`, SuperOak will automatically handle the creation of a server, binding + * to a free ephemeral port and closing of the server on a call to `.end()`. + * + * @param {string|Application} app + * @param {?boolean} secure + * + * @returns {Promise} + * @public + */ +export async function superoak( + app: string | Application, + secure?: boolean, +): Promise { + if (app instanceof Application) { + const controller = new AbortController(); + const { signal } = controller; + + return await new Promise(async (resolve) => { + app.addEventListener("listen", ({ hostname, port, secure }) => { + const serverSham: Server = Object.create(Server.prototype); + + serverSham.close = () => controller.abort(); + + serverSham.listener = { + addr: { + port, + hostname: hostname as string, + transport: "tcp", + }, + } as any; + + resolve(superdeno(serverSham, secure)); + }); + + const freePort = await getFreePort(random(1024, 49151)); + + app.listen( + { hostname: "127.0.0.1", port: freePort, signal }, + ); + }); + } + + return superdeno(app, secure); +} diff --git a/test/deps.ts b/test/deps.ts new file mode 100644 index 0000000..907ae5d --- /dev/null +++ b/test/deps.ts @@ -0,0 +1,4 @@ +export { expect } from "https://deno.land/x/expect@9effa6c6da3bcf4b66114b44e6b1662e85c91337/mod.ts"; +export * from "https://deno.land/x/oak@v5.0.0/mod.ts"; +export { dirname, join } from "https://deno.land/std@0.53.0/path/mod.ts"; +export { isFreePort } from "https://deno.land/x/free_port@v1.2.0/mod.ts"; diff --git a/test/superoak.test.ts b/test/superoak.test.ts new file mode 100644 index 0000000..568bcf8 --- /dev/null +++ b/test/superoak.test.ts @@ -0,0 +1,984 @@ +import { + Application, + RouterContext, + Router, + expect, + isFreePort, +} from "./deps.ts"; +import { Test, getFreePort } from "../deps.ts"; +import { describe, it } from "./utils.ts"; +import { superoak } from "../mod.ts"; + +describe("superoak(url)", () => { + it("superoak(url): should support `superoak(url)` if consumer wants to handle server themselves", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", (ctx: RouterContext) => { + ctx.response.body = "hello"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + const controller = new AbortController(); + const { signal } = controller; + + app.addEventListener("listen", async ({ hostname, port, secure }: any) => { + const protocol = secure ? "https" : "http"; + const url = `${protocol}://${hostname}:${port}`; + + (await superoak(url)) + .get("/") + .expect("hello", () => { + controller.abort(); + done(); + }); + }); + + await app.listen( + { hostname: "localhost", port: await getFreePort(1024), signal }, + ); + }); + + describe(".end(cb)", () => { + it("Oak: superoak(url): .end(cb): should set `this` to the test object when calling the `cb` in `.end(cb)`", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", (ctx: RouterContext) => { + ctx.response.body = "hello"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + const controller = new AbortController(); + const { signal } = controller; + + app.addEventListener( + "listen", + async ({ hostname, port, secure }: any) => { + const protocol = secure ? "https" : "http"; + const url = `${protocol}://${hostname}:${port}`; + const test = (await superoak(url)).get("/"); + + test.end(function (this: Test) { + expect(test).toEqual(this); + controller.abort(); + done(); + }); + }, + ); + + await app.listen( + { hostname: "localhost", port: await getFreePort(1024), signal }, + ); + }); + + it("superoak(url): .end(cb): should handle error returned when server goes down", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", (ctx: RouterContext) => { + ctx.response.body = ""; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + const controller = new AbortController(); + const { signal } = controller; + + app.addEventListener( + "listen", + async ({ hostname, port, secure }: any) => { + const protocol = secure ? "https" : "http"; + const url = `${protocol}://${hostname}:${port}`; + + controller.abort(); + + (await superoak(url)) + .get("/") + .expect(200, (err) => { + expect(err).toBeInstanceOf(Error); + done(); + }); + }, + ); + + await app.listen( + { hostname: "localhost", port: await getFreePort(1024), signal }, + ); + }); + }); +}); + +describe("superoak(app)", () => { + it("superoak(app): should fire up the app on an ephemeral port", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", (ctx: RouterContext) => { + ctx.response.body = "hey"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .end((err, res) => { + expect(res.status).toEqual(200); + expect(res.text).toEqual("hey"); + done(); + }); + }); + + // TODO: https test. + // it("superoak(app, true): should work with a https server", (done) => {}); + + it("superoak(app): should work with .send() etc", async (done) => { + const router = new Router(); + const app = new Application(); + + router.post("/", async (ctx: RouterContext) => { + if (ctx.request.hasBody) { + ctx.response.body = await ctx.request.body(); + } + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .post("/") + .send({ name: "john" }) + .expect("john", () => { + done(); + }); + }); + + describe(".end(fn)", () => { + it("superoak(app): .end(fn): should close server", async (done) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "superoak FTW!"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + const portPromise: Promise = new Promise((resolve) => { + app.addEventListener("listen", async ({ port }) => resolve(port)); + }); + + (await superoak(app)).get("/") + .end(async (err, res) => { + const port: number = await portPromise; + const isClosed = await isFreePort(port); + expect(isClosed).toBeTruthy(); + done(); + }); + }); + + // TODO: support nested requests using the same `superoak` instance. + // it("superoak(app): .end(fn): should support nested requests", async ( + // done, + // ) => { + // const router = new Router(); + // const app = new Application(); + + // router.get("/", async (ctx: RouterContext) => { + // ctx.response.body = "superoak FTW!"; + // }); + + // app.use(router.routes()); + // app.use(router.allowedMethods()); + + // const test = await superoak(app); + + // test + // .get("/") + // .end(() => { + // test + // .get("/") + // .end((err, res) => { + // expect(err).toBeNull(); + // expect(res.status).toEqual(200); + // expect(res.text).toEqual("superoak FTW!"); + // done(); + // }); + // }); + // }); + + it("superoak(app): .end(fn): should support nested requests if create a new superoak instance", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "superoak FTW!"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + let test = await superoak(app); + + test + .get("/") + .end(async () => { + test = await superoak(app); + + test + .get("/") + .end((err, res) => { + expect(err).toBeNull(); + expect(res.status).toEqual(200); + expect(res.text).toEqual("superoak FTW!"); + done(); + }); + }); + }); + + it("superoak(app): .end(fn): should include the response in the error callback", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "whatever"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect(() => { + throw new Error("Some error"); + }) + .end((err, res) => { + expect(err).toBeDefined(); + expect(res).toBeDefined(); + // Duck-typing response, just in case. + expect(res.status).toEqual(200); + + done(); + }); + }); + + it("superoak(app): .end(fn): should set `this` to the test object when calling the error callback", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "whatever"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + const test = (await superoak(app)).get("/"); + + test.expect(() => { + throw new Error("Some error"); + }).end(function (this: Test, err, res) { + expect(err).toBeDefined(); + expect(this).toEqual(test); + done(); + }); + }); + + it("superoak(app): .end(fn): should handle an undefined Response", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + await new Promise((resolve) => { + setTimeout(() => { + ctx.response.body = ""; + resolve(); + }, 20); + }); + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)).get("/").timeout(1) + .expect(200, (err, res) => { + expect(err).toBeInstanceOf(Error); + done(); + }); + }); + + // TODO: determine if _can_ test a server going down? + }); + + describe(".expect(status[, fn])", () => { + it("superoak(app): .expect(status[, fn]): should assert the response status", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "hey"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect(404) + .end((err, res) => { + expect(err.message).toEqual('expected 404 "Not Found", got 200 "OK"'); + done(); + }); + }); + }); + + describe(".expect(status)", () => { + it("superoak(app): .expect(status): should assert only status", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "hey"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect(200) + .end(done); + }); + }); + + describe(".expect(status, body[, fn])", () => { + it("superoak(app): .expect(status, body[, fn]): should assert the response body and status", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "foo"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect(200, "foo", done); + }); + + describe("when the body argument is an empty string", () => { + it("superoak(app): .expect(status, body[, fn]): should not quietly pass on failure", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "foo"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect(200, "") + .end((err, res) => { + expect(err.message).toEqual("expected '' response body, got 'foo'"); + done(); + }); + }); + }); + }); + + describe(".expect(body[, fn])", () => { + it("superoak(app): .expect(body[, fn]): should assert the response body", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = { foo: "bar" }; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect("hey") + .end((err, res) => { + expect(err.message).toEqual( + "expected 'hey' response body, got '{\"foo\":\"bar\"}'", + ); + done(); + }); + }); + + it("superoak(app): .expect(body[, fn]): should assert the status before the body", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.status = 500; + ctx.response.body = { message: "something went wrong" }; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect(200) + .expect("hey") + .end((err, res) => { + expect(err.message).toEqual( + 'expected 200 "OK", got 500 "Internal Server Error"', + ); + done(); + }); + }); + + it("superoak(app): .expect(body[, fn]): should assert the response text", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = { foo: "bar" }; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect('{"foo":"bar"}', done); + }); + + it("superoak(app): .expect(body[, fn]): should assert the parsed response body", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = { foo: "bar" }; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect({ foo: "baz" }) + .end(async (err, res) => { + expect(err.message).toEqual( + "expected { foo: 'baz' } response body, got { foo: 'bar' }", + ); + + (await superoak(app)) + .get("/") + .expect({ foo: "bar" }) + .end(done); + }); + }); + + it("superoak(app): .expect(body[, fn]): should test response object types", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.status = 200; + ctx.response.body = { stringValue: "foo", numberValue: 3 }; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect({ stringValue: "foo", numberValue: 3 }, done); + }); + + it("superoak(app): .expect(body[, fn]): should deep test response object types", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.status = 200; + ctx.response.body = { + stringValue: "foo", + numberValue: 3, + nestedObject: { innerString: "5" }, + }; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect( + { + stringValue: "foo", + numberValue: 3, + nestedObject: { innerString: 5 }, + }, + ) + .end(async (err, res) => { + expect(err.message).toEqual( + "expected { stringValue: 'foo',\n numberValue: 3,\n nestedObject: { innerString: 5 } } response body, got { stringValue: 'foo',\n numberValue: 3,\n nestedObject: { innerString: '5' } }", + ); // eslint-disable-line max-len + + (await superoak(app)) + .get("/") + .expect( + { + stringValue: "foo", + numberValue: 3, + nestedObject: { innerString: "5" }, + }, + ) + .end(done); + }); + }); + + it("superoak(app): .expect(body[, fn]): should support regular expressions", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "foobar"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect(/^bar/) + .end((err, res) => { + expect(err.message).toEqual("expected body 'foobar' to match /^bar/"); + done(); + }); + }); + }); + + it("superoak(app): .expect(body[, fn]): should assert response body multiple times", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "hey deno"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect(/deno/) + .expect("hey") + .expect("hey deno") + .end((err, res) => { + expect(err.message).toEqual( + "expected 'hey' response body, got 'hey deno'", + ); + done(); + }); + + it("superoak(app): .expect(body[, fn]): should assert response body multiple times with no exception", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "hey deno"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect(/deno/) + .expect(/^hey/) + .expect("hey deno", done); + }); + }); + + describe(".expect(field, value[, fn])", () => { + it("superoak(app): .expect(field, value[, fn]): should assert the header field presence", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = { foo: "bar" }; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect("Content-Foo", "bar") + .end((err, res) => { + expect(err.message).toEqual('expected "Content-Foo" header field'); + done(); + }); + }); + + it("superoak(app): .expect(field, value[, fn]): should assert the header field value", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = { foo: "bar" }; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect("Content-Type", "text/plain") + .end((err, res) => { + expect(err.message).toEqual( + 'expected "Content-Type" of "text/plain", got "application/json; charset=utf-8"', + ); + done(); + }); + }); + + it("superoak(app): .expect(field, value[, fn]): should assert multiple fields", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "hey"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect("Content-Type", "text/plain; charset=utf-8") + .expect("Content-Length", "3") + .end(done); + }); + + it("superoak(app): .expect(field, value[, fn]): should support regular expressions", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "hey"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect("Content-Type", /^application/) + .end((err) => { + expect(err.message).toEqual( + 'expected "Content-Type" matching /^application/, got "text/plain; charset=utf-8"', + ); + done(); + }); + }); + + it("superoak(app): .expect(field, value[, fn]): should support numbers", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "hey"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect("Content-Length", 4) + .end((err) => { + expect(err.message).toEqual( + 'expected "Content-Length" of "4", got "3"', + ); + done(); + }); + }); + + describe("handling arbitrary expect functions", async () => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "hey"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + it("superoak(app): .expect(field, value[, fn]): reports errors", async ( + done, + ) => { + (await superoak(app)).get("/") + .expect((res) => { + throw new Error("failed"); + }) + .end((err) => { + expect(err.message).toEqual("failed"); + done(); + }); + }); + + it( + "superoak(app): .expect(field, value[, fn]): ensures truthy non-errors returned from asserts are not promoted to errors", + async (done) => { + (await superoak(app)).get("/") + .expect((res) => { + return "some descriptive error"; + }) + .end((err) => { + expect(err).toBeNull(); + done(); + }); + }, + ); + + it("superoak(app): .expect(field, value[, fn]): ensures truthy errors returned from asserts are throw to end", async ( + done, + ) => { + (await superoak(app)).get("/") + .expect((res) => { + return new Error("some descriptive error"); + }) + .end((err) => { + expect(err.message).toEqual("some descriptive error"); + expect(err).toBeInstanceOf(Error); + done(); + }); + }); + + it("superoak(app): .expect(field, value[, fn]): doesn't create false negatives", async ( + done, + ) => { + (await superoak(app)).get("/") + .expect((res) => { + }) + .end(done); + }); + + it("superoak(app): .expect(field, value[, fn]): handles multiple asserts", async ( + done, + ) => { + const calls: number[] = []; + + (await superoak(app)).get("/") + .expect((res) => { + calls[0] = 1; + }) + .expect((res) => { + calls[1] = 1; + }) + .expect((res) => { + calls[2] = 1; + }) + .end(() => { + const callCount = [0, 1, 2].reduce((count, i) => { + return count + calls[i]; + }, 0); + expect(callCount).toEqual(3); + done(); + }); + }); + + it("superoak(app): .expect(field, value[, fn]): plays well with normal assertions - no false positives", async ( + done, + ) => { + (await superoak(app)).get("/") + .expect((res) => { + }) + .expect("Content-Type", /json/) + .end((err) => { + expect(err.message).toMatch(/Content-Type/); + done(); + }); + }); + + it("superoak(app): .expect(field, value[, fn]): plays well with normal assertions - no false negatives", async ( + done, + ) => { + (await superoak(app)).get("/") + .expect((res) => { + }) + .expect("Content-Type", /plain/) + .expect((res) => { + }) + .expect("Content-Type", /text/) + .end(done); + }); + }); + + describe("handling multiple assertions per field", () => { + it("superoak(app): .expect(field, value[, fn]): should work", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "hey"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect("Content-Type", /text/) + .expect("Content-Type", /plain/) + .end(done); + }); + + it("superoak(app): .expect(field, value[, fn]): should return an error if the first one fails", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "hey"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect("Content-Type", /bloop/) + .expect("Content-Type", /plain/) + .end((err) => { + expect(err.message).toEqual( + 'expected "Content-Type" matching /bloop/, ' + + 'got "text/plain; charset=utf-8"', + ); + done(); + }); + }); + + it("superoak(app): .expect(field, value[, fn]): should return an error if a middle one fails", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "hey"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect("Content-Type", /text/) + .expect("Content-Type", /bloop/) + .expect("Content-Type", /plain/) + .end((err) => { + expect(err.message).toEqual( + 'expected "Content-Type" matching /bloop/, ' + + 'got "text/plain; charset=utf-8"', + ); + done(); + }); + }); + + it("superoak(app): .expect(field, value[, fn]): should return an error if the last one fails", async ( + done, + ) => { + const router = new Router(); + const app = new Application(); + + router.get("/", async (ctx: RouterContext) => { + ctx.response.body = "hey"; + }); + + app.use(router.routes()); + app.use(router.allowedMethods()); + + (await superoak(app)) + .get("/") + .expect("Content-Type", /text/) + .expect("Content-Type", /plain/) + .expect("Content-Type", /bloop/) + .end((err) => { + expect(err.message).toEqual( + 'expected "Content-Type" matching /bloop/, ' + + 'got "text/plain; charset=utf-8"', + ); + done(); + }); + }); + }); + }); +}); diff --git a/test/utils.ts b/test/utils.ts new file mode 100644 index 0000000..95d555a --- /dev/null +++ b/test/utils.ts @@ -0,0 +1,63 @@ +/** + * Test timeout. + */ +export const TEST_TIMEOUT = 3000; + +/** + * A no-op _describe_ method. + * + * @param name + * @param fn + */ +export async function describe(name: string, fn: () => void | Promise) { + fn(); +} + +/** + * An _it_ wrapper around `Deno.test`. + * + * @param name + * @param fn + */ +export async function it( + name: string, + fn: (done?: any) => void | Promise, +) { + Deno.test(name, async () => { + let done: any = (err?: any) => { + if (err) throw err; + }; + let race: Promise = Promise.resolve(); + + if (fn.length === 1) { + let resolve: () => void; + const donePromise = new Promise((r) => { + resolve = r; + }); + + let timeoutId: number; + + race = Promise.race([ + new Promise((_, reject) => + timeoutId = setTimeout(() => { + reject( + new Error( + `test "${name}" failed to complete by calling "done" within ${TEST_TIMEOUT}ms.`, + ), + ); + }, TEST_TIMEOUT) + ), + donePromise, + ]); + + done = (err?: any) => { + clearTimeout(timeoutId); + resolve(); + if (err) throw err; + }; + } + + await fn(done); + await race; + }); +} diff --git a/version.ts b/version.ts new file mode 100644 index 0000000..9cfa4c3 --- /dev/null +++ b/version.ts @@ -0,0 +1,9 @@ +/** + * Version of Opine. + */ +export const VERSION: string = "1.0.0"; + +/** + * Supported versions of Deno. + */ +export const DENO_SUPPORTED_VERSIONS: string[] = ["1.0.0", "1.0.2", "1.0.3"];