diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..f73358ec --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,96 @@ +const readonly = 'readonly'; +const error = 'error'; +const warn = 'warn'; +const off = 'off'; + +module.exports = { + extends: 'airbnb-base', + env: { + es6: true, + browser: true, + jquery: true, + greasemonkey: true, + node: false, + }, + globals: { + $el: readonly, + api: readonly, + axios: readonly, + BootstrapDialog: readonly, + cardHelper: readonly, + changelog: readonly, + chatRoomNames: readonly, + debug: readonly, + decrypt: readonly, + eventManager: readonly, + fn: readonly, + footer: readonly, + footer2: readonly, + global: readonly, + globalSet: readonly, + Hotkey: readonly, + hotkeys: readonly, + hover: readonly, + luxon: readonly, + menu: readonly, + noop: readonly, + onPage: readonly, + ProfileButton: readonly, + pendingIgnore: readonly, + profile: readonly, + SimpleToast: readonly, + script: readonly, + scriptVersion: readonly, + settings: readonly, + setVersion: readonly, + shouldIgnore: readonly, + showdown: readonly, + sleep: readonly, + style: readonly, + tippy: readonly, + VarStore: readonly, + wrap: readonly, + }, + parserOptions: { + sourceType: 'script', + ecmaFeatures: { + globalReturn: true, + } + }, + rules: { + // Warn, we allow this behavior, but want to be aware of any possible issues + 'consistent-return': warn, + // We allow modification of properties + 'no-param-reassign': [warn, { props: false }], + // Allow short circuits: test && action + 'no-unused-expressions': [error, { allowShortCircuit: true }], + // Allow function arguments to be unused + 'no-unused-vars': [error, { args: 'none' }], + // Allow functions to be defined after references (functions are top-level) + 'no-use-before-define': [error, 'nofunc'], + // Deconstruction not required when assigning to object properties (declared_var = object.key) + 'prefer-destructuring': [error, { + AssignmentExpression: { array: true, object: false }, + }], + // Allow for loops to use unary (++/--) + 'no-plusplus': [error, { allowForLoopAfterthoughts: true }], + 'prefer-arrow-callback': [error, { allowNamedFunctions: true } ], + 'no-useless-return': warn, + 'class-methods-use-this': off, + 'no-restricted-globals': [error, ''], + 'no-bitwise': off, + 'no-mixed-operators': off, + 'no-continue': off, + 'object-curly-newline': [error, { multiline: true, consistent: true }], + 'operator-linebreak': [error, 'after'], + 'quotes': [error, 'single', { allowTemplateLiterals: true, }], + 'max-len': [error, { + code: 120, + ignoreComments: true, + ignoreRegExpLiterals: true, + ignoreStrings: true, + tabWidth: 2, + }], + 'no-extra-boolean-cast': warn, + }, +}; diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..9a76d61c --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [feildmaster] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: feildmaster # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.gitignore b/.gitignore index 9785d0b6..a94d2247 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,10 @@ -/_site +/docs/_site /node_modules /dist +**/*.ignore* +**/*.local* +/_site /.vscode -/src - -*.ignore.* \ No newline at end of file +/_features +/_api +/assets diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..85c6f05e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,27 @@ +language: node_js +node_js: + - "8" +before_script: + - npm install -g gulp-cli +script: gulp --deploy +deploy: + - provider: npm # add this first to prevent accidental releases to master somehow + skip-cleanup: true + email: "underscript@feildmaster.com" + api_key: $npm_token + tag: next + on: + branch: next + - provider: npm + skip-cleanup: true + email: "underscript@feildmaster.com" + api_key: $npm_token + on: + tags: true + branch: master + - provider: releases + skip_cleanup: true + api_key: $github_token + on: + tags: true + branch: master diff --git a/Gemfile b/Gemfile deleted file mode 100644 index fcb0ffb3..00000000 --- a/Gemfile +++ /dev/null @@ -1,33 +0,0 @@ -source "https://rubygems.org" - -# Hello! This is where you manage which Jekyll version is used to run. -# When you want to use a different version, change it below, save the -# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: -# -# bundle exec jekyll serve -# -# This will help ensure the proper Jekyll version is running. -# Happy Jekylling! -#gem "jekyll", "~> 3.8.5" - -# This is the default theme for new Jekyll sites. You may change this to anything you like. -gem "minima", "~> 2.0" - -# If you want to use GitHub Pages, remove the "gem "jekyll"" above and -# uncomment the line below. To upgrade, run `bundle update github-pages`. -gem "github-pages", group: :jekyll_plugins - -# If you have any plugins, put them here! -group :jekyll_plugins do - gem "jekyll-feed", "~> 0.6" -end - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby] - -# Performance-booster for watching directories on Windows -gem "wdm", "~> 0.1.0" if Gem.win_platform? - -group :jekyll_plugins do - gem "jekyll-last-modified-at" -end \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 2afbe907..00000000 --- a/Gemfile.lock +++ /dev/null @@ -1,260 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - activesupport (4.2.10) - i18n (~> 0.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.5.2) - public_suffix (>= 2.0.2, < 4.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.11.1) - colorator (1.1.0) - commonmarker (0.17.13) - ruby-enum (~> 0.5) - concurrent-ruby (1.0.5) - dnsruby (1.61.2) - addressable (~> 2.5) - em-websocket (0.5.1) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0.6.0) - ethon (0.11.0) - ffi (>= 1.3.0) - eventmachine (1.2.7-x64-mingw32) - execjs (2.7.0) - faraday (0.15.3) - multipart-post (>= 1.2, < 3) - ffi (1.9.25-x64-mingw32) - forwardable-extended (2.6.0) - gemoji (3.0.0) - github-pages (192) - activesupport (= 4.2.10) - github-pages-health-check (= 1.8.1) - jekyll (= 3.7.4) - jekyll-avatar (= 0.6.0) - jekyll-coffeescript (= 1.1.1) - jekyll-commonmark-ghpages (= 0.1.5) - jekyll-default-layout (= 0.1.4) - jekyll-feed (= 0.10.0) - jekyll-gist (= 1.5.0) - jekyll-github-metadata (= 2.9.4) - jekyll-mentions (= 1.4.1) - jekyll-optional-front-matter (= 0.3.0) - jekyll-paginate (= 1.1.0) - jekyll-readme-index (= 0.2.0) - jekyll-redirect-from (= 0.14.0) - jekyll-relative-links (= 0.5.3) - jekyll-remote-theme (= 0.3.1) - jekyll-sass-converter (= 1.5.2) - jekyll-seo-tag (= 2.5.0) - jekyll-sitemap (= 1.2.0) - jekyll-swiss (= 0.4.0) - jekyll-theme-architect (= 0.1.1) - jekyll-theme-cayman (= 0.1.1) - jekyll-theme-dinky (= 0.1.1) - jekyll-theme-hacker (= 0.1.1) - jekyll-theme-leap-day (= 0.1.1) - jekyll-theme-merlot (= 0.1.1) - jekyll-theme-midnight (= 0.1.1) - jekyll-theme-minimal (= 0.1.1) - jekyll-theme-modernist (= 0.1.1) - jekyll-theme-primer (= 0.5.3) - jekyll-theme-slate (= 0.1.1) - jekyll-theme-tactile (= 0.1.1) - jekyll-theme-time-machine (= 0.1.1) - jekyll-titles-from-headings (= 0.5.1) - jemoji (= 0.10.1) - kramdown (= 1.17.0) - liquid (= 4.0.0) - listen (= 3.1.5) - mercenary (~> 0.3) - minima (= 2.5.0) - nokogiri (>= 1.8.2, < 2.0) - rouge (= 2.2.1) - terminal-table (~> 1.4) - github-pages-health-check (1.8.1) - addressable (~> 2.3) - dnsruby (~> 1.60) - octokit (~> 4.0) - public_suffix (~> 2.0) - typhoeus (~> 1.3) - html-pipeline (2.8.4) - activesupport (>= 2) - nokogiri (>= 1.4) - http_parser.rb (0.6.0) - i18n (0.9.5) - concurrent-ruby (~> 1.0) - jekyll (3.7.4) - addressable (~> 2.4) - colorator (~> 1.0) - em-websocket (~> 0.5) - i18n (~> 0.7) - jekyll-sass-converter (~> 1.0) - jekyll-watch (~> 2.0) - kramdown (~> 1.14) - liquid (~> 4.0) - mercenary (~> 0.3.3) - pathutil (~> 0.9) - rouge (>= 1.7, < 4) - safe_yaml (~> 1.0) - jekyll-avatar (0.6.0) - jekyll (~> 3.0) - jekyll-coffeescript (1.1.1) - coffee-script (~> 2.2) - coffee-script-source (~> 1.11.1) - jekyll-commonmark (1.2.0) - commonmarker (~> 0.14) - jekyll (>= 3.0, < 4.0) - jekyll-commonmark-ghpages (0.1.5) - commonmarker (~> 0.17.6) - jekyll-commonmark (~> 1) - rouge (~> 2) - jekyll-default-layout (0.1.4) - jekyll (~> 3.0) - jekyll-feed (0.10.0) - jekyll (~> 3.3) - jekyll-gist (1.5.0) - octokit (~> 4.2) - jekyll-github-metadata (2.9.4) - jekyll (~> 3.1) - octokit (~> 4.0, != 4.4.0) - jekyll-last-modified-at (1.2.1) - jekyll (>= 3.7, < 5.0) - posix-spawn (~> 0.3.9) - jekyll-mentions (1.4.1) - html-pipeline (~> 2.3) - jekyll (~> 3.0) - jekyll-optional-front-matter (0.3.0) - jekyll (~> 3.0) - jekyll-paginate (1.1.0) - jekyll-readme-index (0.2.0) - jekyll (~> 3.0) - jekyll-redirect-from (0.14.0) - jekyll (~> 3.3) - jekyll-relative-links (0.5.3) - jekyll (~> 3.3) - jekyll-remote-theme (0.3.1) - jekyll (~> 3.5) - rubyzip (>= 1.2.1, < 3.0) - jekyll-sass-converter (1.5.2) - sass (~> 3.4) - jekyll-seo-tag (2.5.0) - jekyll (~> 3.3) - jekyll-sitemap (1.2.0) - jekyll (~> 3.3) - jekyll-swiss (0.4.0) - jekyll-theme-architect (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-cayman (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-dinky (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-hacker (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-leap-day (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-merlot (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-midnight (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-minimal (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-modernist (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-primer (0.5.3) - jekyll (~> 3.5) - jekyll-github-metadata (~> 2.9) - jekyll-seo-tag (~> 2.0) - jekyll-theme-slate (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-tactile (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-time-machine (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-titles-from-headings (0.5.1) - jekyll (~> 3.3) - jekyll-watch (2.1.2) - listen (~> 3.0) - jemoji (0.10.1) - gemoji (~> 3.0) - html-pipeline (~> 2.2) - jekyll (~> 3.0) - kramdown (1.17.0) - liquid (4.0.0) - listen (3.1.5) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - ruby_dep (~> 1.2) - mercenary (0.3.6) - mini_portile2 (2.3.0) - minima (2.5.0) - jekyll (~> 3.5) - jekyll-feed (~> 0.9) - jekyll-seo-tag (~> 2.1) - minitest (5.11.3) - multipart-post (2.0.0) - nokogiri (1.8.5-x64-mingw32) - mini_portile2 (~> 2.3.0) - octokit (4.13.0) - sawyer (~> 0.8.0, >= 0.5.3) - pathutil (0.16.2) - forwardable-extended (~> 2.6) - posix-spawn (0.3.13) - public_suffix (2.0.5) - rb-fsevent (0.10.3) - rb-inotify (0.9.10) - ffi (>= 0.5.0, < 2) - rouge (2.2.1) - ruby-enum (0.7.2) - i18n - ruby_dep (1.5.0) - rubyzip (1.2.2) - safe_yaml (1.0.4) - sass (3.6.0) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - sawyer (0.8.1) - addressable (>= 2.3.5, < 2.6) - faraday (~> 0.8, < 1.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) - typhoeus (1.3.0) - ethon (>= 0.9.0) - tzinfo (1.2.5) - thread_safe (~> 0.1) - tzinfo-data (1.2018.7) - tzinfo (>= 1.0.0) - unicode-display_width (1.4.0) - wdm (0.1.1) - -PLATFORMS - x64-mingw32 - -DEPENDENCIES - github-pages - jekyll-feed (~> 0.6) - jekyll-last-modified-at - minima (~> 2.0) - tzinfo-data - wdm (~> 0.1.0) - -BUNDLED WITH - 1.17.1 diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..d41983ca --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 feildmaster + +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/_api/eventemitter.md b/_api/eventemitter.md deleted file mode 100644 index 9b988f66..00000000 --- a/_api/eventemitter.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: EventEmitter ---- -Explain the event manager!!! - -## Events -There are many built-in events, they include (but are not limited to) the following: -1. -1. diff --git a/_api/index.md b/_api/index.md deleted file mode 100644 index eeb79016..00000000 --- a/_api/index.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Public API ---- diff --git a/_api/plugin/_template.md b/_api/plugin/_template.md deleted file mode 100644 index 606e07a1..00000000 --- a/_api/plugin/_template.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: -categories: plugin -date: 2020- -method: false -property: false ---- -DESCRIPTION GOES HERE - -## Syntax -> - -## Methods - -## Examples -{% highlight javascript %} -{% endhighlight %} diff --git a/_api/plugin/addStyle.md b/_api/plugin/addStyle.md deleted file mode 100644 index 646499f1..00000000 --- a/_api/plugin/addStyle.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: plugin.addStyle() -categories: plugin -plugin: true -method: true ---- -Add CSS to the document. - -## Syntax -> plugin.addStyle(...styles); - -...styles -: Styles to add to the document - -Return Value -: Returns `Style` object -{% highlight javascript %} -Style { - remove(), - replace(...styles), - append(...styles), -} -{% endhighlight %} - -## Examples -{% highlight javascript %} -const style = plugin.addStyle('.style1 {}'); // Styles: .style1 -style.remove(); // Styles: none -style.replace('.style2 {}'); // Styles: .style2 -style.append('.style3 {}', '.style4 {}'); // Styles: .style2, .style3, .style4 -{% endhighlight %} diff --git a/_api/plugin/events.md b/_api/plugin/events.md deleted file mode 100644 index 4eeeb87f..00000000 --- a/_api/plugin/events.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: plugin.events() -categories: plugin -plugin: true -method: true ---- -Listen to and emit events. - -## Syntax -> plugin.events(); - -## Event Methods -Read more -* on(*event*, *data*) -* emit(*event*, *data*, *options*) - -## Examples -{% highlight javascript %} -const plugin = underscript.plugin('My great plugin'); -const eventManager = plugin.events(); -eventManager.on(':load', () => console.log('Page finished loading')); - -// Call a custom event -eventManager.emit('customevent', {foo: 'bar'}); -eventManager.on('customevent', (data) => console.log(data.foo)); // output: bar -{% endhighlight %} \ No newline at end of file diff --git a/_api/plugin/index.md b/_api/plugin/index.md deleted file mode 100644 index b695e7df..00000000 --- a/_api/plugin/index.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Plugin Object -categories: plugin ---- -## Methods -{% for page in site.api %} - {% if page.plugin and page.method %} -{{ page.title }} -: {{ page.excerpt }} - {% endif %} -{% endfor %} - -## Properties -{% for page in site.api %} - {% if page.plugin and page.property %} -{{ page.title }} -: {{ page.excerpt }} - {% endif %} -{% endfor %} diff --git a/_api/plugin/logger.md b/_api/plugin/logger.md deleted file mode 100644 index a462fd54..00000000 --- a/_api/plugin/logger.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: plugin.logger() -categories: plugin -plugin: true -method: true ---- -The logger is a way to output to console, prefixing the plugin name to the console output. - -## Syntax -> plugin.logger() - -## Methods - - -## Examples -{% highlight javascript %} -{% endhighlight %} diff --git a/_api/plugin/name.md b/_api/plugin/name.md deleted file mode 100644 index 1694b29d..00000000 --- a/_api/plugin/name.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: plugin.name -categories: plugin -plugin: true -method: false -property: true ---- -Output the name of the plugin. - -## Syntax -> plugin.name; - -## Examples -{% highlight javascript %} -console.log(plugin.name); // My awesome plugin -{% endhighlight %} diff --git a/_api/plugin/settings.md b/_api/plugin/settings.md deleted file mode 100644 index 243e4551..00000000 --- a/_api/plugin/settings.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: plugin.settings() -categories: plugin -plugin: true -method: true ---- -Provides access to the settings API. - -## Syntax -> plugin.settings(); - -Return Value -: [`RegisteredSetting`](#registered-setting) object - -## Methods -### add() -Add a setting to the UnderScript settings window. -> settings.add({
     - *key*, - *name*, - *type*, - *note*, - *refresh*, - *disabled*, - *default*, - *options*, - *reset*, - *onChange*, - *export*, - *min*, - *max*, - *step*, -
}); - -key: `string` -: Setting key, required - -name: `string` -: Setting name - -type: `string` -: Type of setting, (default: `boolean`, `select` if `options` exist).
-See [Setting Types](#setting-types) - -note: `string` or `function(): string` -: Show note when hovering over setting - -refresh: `boolean` or `function(): boolean` -: True to append "Will require you to refresh the page" to your setting's note - -disabled: `boolean` or `function(): boolean` -: True to disable setting - -default: `string` or `any` -: Default setting value - -reset: `boolean` -: Adds a reset button (sets to default) - -onChange: `function(newValue, oldValue): void` -: Called when setting value is changed - -export: `boolean` or `function(): boolean` -: False to disable exporting (default: true)
-**Note**: Exporting not enabled - -hidden: `boolean` -: True to register setting, but not show it in the setting window. Useful for exporting. - -options: `Array` -: For type `select`. Array of items to select from. - -min: `number` -: For type `slider`. Minimum number for range selection (default: 0) - -max: `number` -: For type `slider`. Max number for range selection (default: 100) - -step: `number` -: For type `slider`. Amount to change between values in range (default: 1) - -### on() -Register an event listener to trigger when a setting changes -> settings.on(*setting name*, *data*); - -Read more: [EventEmitter]({% link _api/eventemitter.md %}) - -### isOpen() -> settings.isOpen(); - -## Setting Types -boolean -: Checkbox (true/false) (default) - -select -: Drop down menu - -remove -: Deletes itself when selected - -array -: Stores an array of data, each item is displayed as a "remove" setting - -slider -: A sliding bar - -color -: Color selector - -## Registered Setting -{% highlight javascript %} -RegisteredSetting { - key, // Output: key for setting - value(), // Get current value - set(), // Set value to newValue, NOTE: currently bugged (bypasses events and checks) -} -{% endhighlight %} - -## Examples -{% highlight javascript %} -// TODO -{% endhighlight %} diff --git a/_api/plugin/toast.md b/_api/plugin/toast.md deleted file mode 100644 index 73b47856..00000000 --- a/_api/plugin/toast.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: plugin.toast() -categories: plugin -plugin: true -method: true ---- -Allow plugins to send toasts. - -## Syntax -> - -## Methods -* - -## Examples -{% highlight javascript %} -{% endhighlight %} diff --git a/_api/underscript/_packs.buy.md b/_api/underscript/_packs.buy.md deleted file mode 100644 index 8bf715e0..00000000 --- a/_api/underscript/_packs.buy.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: underscript.buyPacks() -categories: underscript -method: true ---- -Buy packs. - -## Syntax -> - -## Examples -{% highlight javascript %} -{% endhighlight %} diff --git a/_api/underscript/_template.md b/_api/underscript/_template.md deleted file mode 100644 index 7017db07..00000000 --- a/_api/underscript/_template.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: -categories: underscript -date: 2020- -method: false -property: false ---- -DESCRIPTION GOES HERE - -## Syntax -> - -## Examples -{% highlight javascript %} -{% endhighlight %} diff --git a/_api/underscript/addStyle.md b/_api/underscript/addStyle.md deleted file mode 100644 index 34a0009b..00000000 --- a/_api/underscript/addStyle.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: underscript.addStyle() -categories: underscript -method: true -published: false ---- -Add CSS to the document. - -## Syntax -> underscript.addStyle(...styles); - -...styles -: Styles to add to the document - -Return Value -: Returns `Style` object -{% highlight javascript %} -Style { - remove(), - replace(...styles), - append(...styles), -} -{% endhighlight %} - -## Examples -{% highlight javascript %} -const style = underscript.addStyle('style1 {}'); // Styles: style1 -style.remove(); // Styles: none -style.replace('style2 {}'); // Styles: style2 -style.append('style3 {}', 'style4 {}'); // Styles: style2, style3, style4 -{% endhighlight %} diff --git a/_api/underscript/index.md b/_api/underscript/index.md deleted file mode 100644 index 14b1896c..00000000 --- a/_api/underscript/index.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: UnderScript Object -categories: underscript ---- -## Methods -{% for page in site.api %} - {% if page.categories contains "underscript" and page.method %} -{{ page.title }} -: {{ page.excerpt }} - {% endif %} -{% endfor %} - -## Properties -{% for page in site.api %} - {% if page.categories contains "underscript" and page.property %} -{{ page.title }} -: {{ page.excerpt }} - {% endif %} -{% endfor %} \ No newline at end of file diff --git a/_api/underscript/onPage.md b/_api/underscript/onPage.md deleted file mode 100644 index f6fa40b3..00000000 --- a/_api/underscript/onPage.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: underscript.onPage() -categories: underscript -method: true ---- -Check if you're on a page. - -## Syntax -> underscript.onPage(*name*, *fn*); - -### Parameters -name -: Name of page to check - -fn -: callback function, optional, gets called if on page - -Return Value -: true if on page diff --git a/_api/underscript/packs.open.md b/_api/underscript/packs.open.md deleted file mode 100644 index 73fc9263..00000000 --- a/_api/underscript/packs.open.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: underscript.openPacks() -categories: underscript -method: true ---- -Opens packs and outputs the results (via toast). - -## Syntax -> underscript.openPacks(*count*, *type*); - -### Parameters -count -: Number of packs to open - -type -: Type of pack to open ('', 'DR', 'Shiny', 'Super', 'Final') (default: '') - -## Examples -{% highlight javascript %} -// Open 10 packs -undescript.openPacks(10); - -// Open 5 deltarune packs -undescript.openPacks(5, 'DR'); -{% endhighlight %} diff --git a/_api/underscript/plugin.md b/_api/underscript/plugin.md deleted file mode 100644 index cfb9130d..00000000 --- a/_api/underscript/plugin.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: underscript.plugin() -categories: underscript -method: true ---- -The Plugin API is a service made to allow elevated access to UnderScript's internals. - -## Syntax -> underscript.plugin(*name*); - -name -: Name of plugin (See [name restrictions](#restrictions)) - -Return Value -: Returns `Plugin` object - -## Methods -{% for page in site.api %} - {% if page.plugin and page.method %} -{{ page.title }} -: {{ page.excerpt }} - {% endif %} -{% endfor %} - -## Properties -{% for page in site.api %} - {% if page.plugin and page.property %} -{{ page.title }} -: {{ page.excerpt }} - {% endif %} -{% endfor %} - -## Restrictions -Plugin names have the following restrictions: - -1. No two plugins may share the same name -2. Plugin names cant be longer than 20 characters -3. Plugin names can only contain alphanumeric characters and space (A-Z0-9 ) - -Any plugin names outside these bounds will trigger an error and not create a plugin diff --git a/_api/underscript/streamerMode.md b/_api/underscript/streamerMode.md deleted file mode 100644 index 4d4879d7..00000000 --- a/_api/underscript/streamerMode.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: underscript.streamerMode() -categories: underscript -method: true ---- -Detect if streamer mode is active. - -## Syntax -> underscript.streamerMode(); - -Return Value -: true if streamer mode enabled - -## Examples -{% highlight javascript %} -if (underscript.streamerMode()) { - // Do something special -} -{% endhighlight %} diff --git a/_api/underscript/version.md b/_api/underscript/version.md deleted file mode 100644 index e54494c7..00000000 --- a/_api/underscript/version.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: underscript.version -categories: underscript -method: false -property: true ---- -The version of UnderScript being used. - -## Syntax -> underscript.version; diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 477c3dd8..00000000 --- a/_config.yml +++ /dev/null @@ -1,33 +0,0 @@ -title: UnderScript -description: Various changes to undercards, an undertale fan-made card game. -google_analytics: UA-38424623-3 -discord_url: https://discord.gg/jRupwTU -repository: UCProjects/UnderScript -theme: jekyll-theme-dinky -permalink: /:title -plugins: - - jekyll-last-modified-at -collections: - features: - output: true - permalink: /feature/:title - api: - output: true - permalink: /api/:categories/:title -defaults: - - scope: # Make all file layouts "default" - path: "" - values: - layout: "default" - - scope: # make author of a feature feildmaster - path: "" - type: "features" - values: - layout: "feature" - author: "feildmaster" - - scope: # make author of api feildmaster - path: "" - type: "api" - values: - layout: "api" - author: "feildmaster" diff --git a/_features/api.md b/_features/api.md deleted file mode 100644 index 957516dc..00000000 --- a/_features/api.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: Public API -date: 2019-12-30 -version: 0.30.0 -banner: -credit: -notice: -requested-by: CMD_God ---- -Underscript exposes a public API via the variable `underscript`. - -## Methods -{% for page in site.api %} - {% if page.categories contains "underscript" and page.method %} -{{ page.title }} -: {{ page.excerpt }} - {% endif %} -{% endfor %} - -## Properties -{% for page in site.api %} - {% if page.categories contains "underscript" and page.property %} -{{ page.title }} -: {{ page.excerpt }} - {% endif %} -{% endfor %} - -## Examples -```javascript -// Open 10 DR packs -underscript.openPacks(10, 'DR'); - -// Log to console if streaming -if (underscript.streamerMode()) console.log('Streaming!'); - -// Log to console if on pack page -if (underscript.onPage('Packs')) console.log('On Pack page!'); -// or -underscript.onPage('Packs', () => console.log('On Pack page!')); -``` diff --git a/_features/aprilFools.md b/_features/aprilFools.md deleted file mode 100644 index 622832b5..00000000 --- a/_features/aprilFools.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: April Fools -banner: -date: 2019-04-01 -version: 0.24.0 -credit: -notice: Only has a purpose on April Fools day ---- - -Disabled almost all odd cosmetic changes that happens on april fools day. diff --git a/_features/atO.md b/_features/atO.md deleted file mode 100644 index 3ed482dd..00000000 --- a/_features/atO.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Tag Opponent (@o) -banner: -date: 2019-03-21 -version: 0.23.0 -credit: -notice: ---- - -Type `@o` to ping your opponent while in a match. diff --git a/_features/autodecksort.md b/_features/autodecksort.md deleted file mode 100644 index 3da31321..00000000 --- a/_features/autodecksort.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Automatically sort deck -notice: live in undercards -deprecated: true -date: 2018-03-16 -version: 0.11.0 ---- diff --git a/_features/battlelog.md b/_features/battlelog.md deleted file mode 100644 index 5923e46f..00000000 --- a/_features/battlelog.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Battle Log -banner: battlelog.png -date: 2016-10-30 -version: 0.5.0 ---- - -The battle log gives you a visual history of what's happened during your game. diff --git a/_features/boardDisplayFixes.md b/_features/boardDisplayFixes.md deleted file mode 100644 index 4f40a7ea..00000000 --- a/_features/boardDisplayFixes.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Clear mines from board -date: 2018-03-22 -version: 0.11.3 ---- - -Attempts to remove broken cards (spells, effects, blank) from the board as soon as possible. diff --git a/_features/bootstrapDialogEvents.md b/_features/bootstrapDialogEvents.md deleted file mode 100644 index f040d67b..00000000 --- a/_features/bootstrapDialogEvents.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: BootstrapDialog Events -date: 2021-07-19 -version: 0.46.0 -deprecated: false -banner: -credit: CMD_God -notice: ---- -UnderScript wraps BootstrapDialog in a way that all of their dialog events call an event in the EventManager. - -## Events -All events have access to the `dialog` instance. -1. `BootstrapDialog:create`: Created dialog -3. `BootstrapDialog:preshow`: Before `dialog.show()` gets processed - - Cancelable -4. `BootstrapDialog:show`: in the process of rendering -5. `BootstrapDialog:shown`: finished rendering on screen -6. `BootstrapDialog:hide`: in the process of hiding -7. `BootstrapDialog:hidden`: finished hiding - -## Examples -```javascript -plugin.events().on('BootstrapDialog:create', (dialog) => { - // Do stuff here, `dialog` was created. -}); - -plugin.events().on('BootstrapDialog:preshow', function (dialog) { - // Do stuff here, `dialog` is being shown. - this.canceled = true; // Now it wont show. -}); -``` diff --git a/_features/cardskins.md b/_features/cardskins.md deleted file mode 100644 index 35a5e7e3..00000000 --- a/_features/cardskins.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Card Skin shop layout improvements -notice: live in undercards -banner: cardskins.png -deprecated: true -date: 2018-10-17 -version: 0.12.0 ---- - -Red button means you can't afford it. diff --git a/_features/chatCommands.md b/_features/chatCommands.md deleted file mode 100644 index e4832246..00000000 --- a/_features/chatCommands.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: Chat Commands -banner: -date: 2019-04-06 -version: 0.25.0 -credit: -notice: ---- - -### /spectate [text] -Sends `You vs Opponent: link [text]`. Text is optional - -### /gg -Sends `good game @o` - -### /scroll -Scrolls the chat window to the bottom diff --git a/_features/chatPing.md b/_features/chatPing.md deleted file mode 100644 index 503997b3..00000000 --- a/_features/chatPing.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Custom Ping Phrases -date: 2018-11-15 -version: 0.19.0 ---- - -Insert custom words to get notified on. diff --git a/_features/chatcontext.md b/_features/chatcontext.md deleted file mode 100644 index e7b929a7..00000000 --- a/_features/chatcontext.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Right click user chat for context menu -banner: chatcontext.png -date: 2018-10-20 -version: 0.13.0 ---- - -A context menu is available to easily perform user-specific actions. diff --git a/_features/chatpingtoast.md b/_features/chatpingtoast.md deleted file mode 100644 index b6523e2e..00000000 --- a/_features/chatpingtoast.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Ping notification toasts -banner: pingtoast.png -date: 2018-11-13 -version: 0.19.0 ---- - -Show a notification (toast) when pinged in chat. diff --git a/_features/class.md b/_features/class.md deleted file mode 100644 index 6cbbda71..00000000 --- a/_features/class.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Remember Class Selection -notice: live in undercards -deprecated: true -date: 2016-10-23 -version: 0.1.0 ---- - -On the play screen, your last played class is pre-selected. diff --git a/_features/craftMax.md b/_features/craftMax.md deleted file mode 100644 index f35da972..00000000 --- a/_features/craftMax.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Craft to max -banner: -date: 2019-05-27 -version: 0.26.0 -credit: -notice: ---- - -Use the hotkey (CTRL + Click) to craft up to max of that card at once (if you can afford it). diff --git a/_features/customGameFriendsMode.md b/_features/customGameFriendsMode.md deleted file mode 100644 index 800fe3bd..00000000 --- a/_features/customGameFriendsMode.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Custom Game friend mode -banner: -date: 2019-03-31 -version: 0.25.0 -credit: -notice: If someone gets "kicked" on accident you will have to recreate for them to join. ---- diff --git a/_features/customGameTimeout.md b/_features/customGameTimeout.md deleted file mode 100644 index 67809940..00000000 --- a/_features/customGameTimeout.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Fix custom games being removed from the lobby -date: 2018-10-22 -version: 0.16.0 ---- - -Ever had a friend unable to find your custom game after waiting for him to join it? Now your game wont disappear until you start playing. diff --git a/_features/deckAverage.md b/_features/deckAverage.md deleted file mode 100644 index 5e08df9d..00000000 --- a/_features/deckAverage.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Average Deck Counter -date: 2018-11-25 -version: 0.20.0 -banner: deckAverage.png -credit: PassingWord ---- - -Calculates the average cost (in gold) of your deck. Purely informational diff --git a/_features/deckpreview.md b/_features/deckpreview.md deleted file mode 100644 index f6d3121d..00000000 --- a/_features/deckpreview.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Deck card preview -banner: deckpreview.png -notice: live in undercards -deprecated: true -date: 2018-03-12 -version: 0.10.0 ---- diff --git a/_features/deckstorage.md b/_features/deckstorage.md deleted file mode 100644 index ad2ecfea..00000000 --- a/_features/deckstorage.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Deck Storage -banner: deckstorage.png -date: 2018-10-28 -version: 0.18.0 ---- - -Store 4 [four] decks (up to 24 [twenty-four]) for each soul. diff --git a/_features/disableChatEmotes.md b/_features/disableChatEmotes.md deleted file mode 100644 index 5ee8455c..00000000 --- a/_features/disableChatEmotes.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Disable chat emotes -banner: -date: 2019-04-07 -version: 0.25.0 -credit: -notice: Broken since Beta 34 (thanks Onu) ---- diff --git a/_features/disableMinigames.md b/_features/disableMinigames.md deleted file mode 100644 index 5aa316c1..00000000 --- a/_features/disableMinigames.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Disable minigames -banner: -date: 2019-04-7 -version: 0.25.0 -credit: -notice: ---- - -Tired of those minigames? Just want to wait in peace until your game starts? Enable this setting. diff --git a/_features/dustcounter.md b/_features/dustcounter.md deleted file mode 100644 index f9fdaf81..00000000 --- a/_features/dustcounter.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Dust Counter -banner: dustcounter.png -notice: Currently serves no purpose other than informational -date: 2018-10-17 -version: 0.12 -credit: Jake Horror ---- diff --git a/_features/endturnrestrictions.md b/_features/endturnrestrictions.md deleted file mode 100644 index ab9fb63b..00000000 --- a/_features/endturnrestrictions.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: End Turn Restrictions -date: 2018-03-20 -version: 0.11.2 ---- - -Prevents acidentally ending your turn. diff --git a/_features/friendRequests.md b/_features/friendRequests.md deleted file mode 100644 index f53221bd..00000000 --- a/_features/friendRequests.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Friend Request Toast -date: 2018-12-06 -banner: friendrequest.png -version: 0.20.0 ---- - -Get notified of friend requests almost as soon as they get sent. diff --git a/_features/gameFoundNotification.md b/_features/gameFoundNotification.md deleted file mode 100644 index e170ce3a..00000000 --- a/_features/gameFoundNotification.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Game found notification -banner: -date: 2019-06-01 -version: 0.27.0 -credit: -notice: This used to be a vanilla feature until removed by Onutrem ---- diff --git a/_features/hotkeys.md b/_features/hotkeys.md deleted file mode 100644 index e82cef26..00000000 --- a/_features/hotkeys.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Hotkeys -date: 2016-10-23 -version: 0.2.0 ---- - -Current Hotkeys: -* Space - end turn -* Middle Click - end turn -* Escape - Settings diff --git a/_features/iconHelper.md b/_features/iconHelper.md deleted file mode 100644 index e0fc03e5..00000000 --- a/_features/iconHelper.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Icon Helper -date: 2019-09-02 -version: 0.29.0 -banner: -credit: -notice: -requested-by: Bihapove, timbob ---- diff --git a/_features/improvedFriendslist.md b/_features/improvedFriendslist.md deleted file mode 100644 index fda77568..00000000 --- a/_features/improvedFriendslist.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Improved Friends Page -date: 2019-01-01 -version: 0.22.0 -notice: ---- - -* Removing friends no longer refreshes
Added: {{ '2018-12-09' | date: '%B %d, %Y' }} (Version 0.20.0) -* Denying friend requests no longer refreshes
Added: {{ '2019-01-01' | date: '%B %d, %Y' }} (Version 0.22.0) -* Adding friends no longer refreshes
Added: {{ '2019-01-01' | date: '%B %d, %Y' }} (Version 0.22.0) -* Auto decline friends (blacklist)
Added {{ '2019-03-21' | date: '%B %d, %Y' }} (Version 0.25.0) -* Decline all friend requests
Added {{ '2019-03-22' | date: '%B %d, %Y' }} (Version 0.23.0) \ No newline at end of file diff --git a/_features/leaderboardMagic.md b/_features/leaderboardMagic.md deleted file mode 100644 index 27b8611a..00000000 --- a/_features/leaderboardMagic.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Leaderboard improvements -banner: -date: 2019-04-11 -version: 0.25.0 -credit: -notice: ---- - -1. Switch to a specific page with a dropdown menu -1. Generates a URL to a user/page -1. Notification (toast) when user isn't found diff --git a/_features/legendaryDrawToasts.md b/_features/legendaryDrawToasts.md deleted file mode 100644 index 5f266481..00000000 --- a/_features/legendaryDrawToasts.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Card draw toasts -banner: legendarydraw.png -date: 2018-11-11 -version: 0.19.0 ---- - -Display a notification when players draw rare cards instead of (or as well as) cluttering your chat. The toast can also work if your chat window is closed. diff --git a/_features/linkHandling.md b/_features/linkHandling.md deleted file mode 100644 index f8110e51..00000000 --- a/_features/linkHandling.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Better link detection -date: 2018-11-13 -version: 0.19.0 ---- - -Bypass link warning by middle clicking links. diff --git a/_features/localResetTime.md b/_features/localResetTime.md deleted file mode 100644 index 25c313e3..00000000 --- a/_features/localResetTime.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Local Reset Time -date: 2018-12-05 -version: 0.20.0 -credit: Sarkness ---- - -Shows you your local reset time on the quest page. diff --git a/_features/massFriendDeletion.md b/_features/massFriendDeletion.md deleted file mode 100644 index d2b41902..00000000 --- a/_features/massFriendDeletion.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Quick Deletion -date: 2018-12-25 -version: 0.20.0 ---- - -Decline all friend requests with a single button. diff --git a/_features/matchFoundTitle.md b/_features/matchFoundTitle.md deleted file mode 100644 index b5107a41..00000000 --- a/_features/matchFoundTitle.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Change title on found match -date: 2019-01-02 -version: 0.22.0 -credit: -notice: ---- diff --git a/_features/missingImport.md b/_features/missingImport.md deleted file mode 100644 index 300ff758..00000000 --- a/_features/missingImport.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: -date: 2019-08-24 -version: 0.28 -banner: -credit: -notice: -requested-by: ---- diff --git a/_features/onlineFriends.md b/_features/onlineFriends.md deleted file mode 100644 index 052012f8..00000000 --- a/_features/onlineFriends.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: List online friends -banner: -date: 2019-03-22 -version: 0.25.0 -credit: -notice: ---- - -Online friend list when hovering over the `Friends` button under `Social`. diff --git a/_features/persistBGM.md b/_features/persistBGM.md deleted file mode 100644 index f24c308a..00000000 --- a/_features/persistBGM.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Persistant Background Music -date: 2019-01-11 -version: 0.22.0 ---- - -Remembers the music that was playing, no longer losing it on refresh. diff --git a/_features/questHighlight.md b/_features/questHighlight.md deleted file mode 100644 index f48b76f6..00000000 --- a/_features/questHighlight.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Quest Highlight (and toast) -date: 2018-11-28 -banner: questToast.png -version: 0.20.0 ---- - -Quests highlight yellow when you have a quest completed. Finishing a match now prompts you of any quests you may have completed. diff --git a/_features/quickpacks.md b/_features/quickpacks.md deleted file mode 100644 index 7032a306..00000000 --- a/_features/quickpacks.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Quick open packs -date: 2018-10-26 -version: 0.17.0 ---- - -Quickly open booster packs with Shift (all) and Ctrl (one). diff --git a/_features/refreshGameList.md b/_features/refreshGameList.md deleted file mode 100644 index b55d34db..00000000 --- a/_features/refreshGameList.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Automatically refresh game list (home page) -date: 2018-12-06 -version: 0.20.0 ---- - -The home page will now update as frequently as possible so you are less likely to spectate a non-existent game. diff --git a/_features/removeBrokenCards.md b/_features/removeBrokenCards.md deleted file mode 100644 index 660c3b61..00000000 --- a/_features/removeBrokenCards.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Clear broken hovered cards -banner: -date: 2019-04-03 -version: 0.25.0 -credit: -notice: ---- - -If a card is ghosting (exists even though it shouldn't), click to remove it. diff --git a/_features/resizegamelist.md b/_features/resizegamelist.md deleted file mode 100644 index 63df7dff..00000000 --- a/_features/resizegamelist.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Utilize screen space for games list -date: 2018-10-20 -version: 0.14.0 ---- - -The game list on the home page now scales to your screen. diff --git a/_features/scriptSettings.md b/_features/scriptSettings.md deleted file mode 100644 index 1e19e5b8..00000000 --- a/_features/scriptSettings.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Settings Page -date: 2018-11-05 -version: 0.19.0 ---- - -An expansive settings page to suit all your needs. diff --git a/_features/skinToasts.md b/_features/skinToasts.md deleted file mode 100644 index 15f2726e..00000000 --- a/_features/skinToasts.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Skin Toasts -banner: -date: 2019-01-03 -version: 0.22.0 -credit: -notice: ---- - -Take control of your home page and free up space by moving skin announcements to a toast notification. diff --git a/_features/smartDisenchant.md b/_features/smartDisenchant.md deleted file mode 100644 index 870e6d79..00000000 --- a/_features/smartDisenchant.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Smart Disenchant -date: 2019-01-08 -version: 0.22.0 -notice: Reported to be unreliable, use at own risk ---- diff --git a/_features/soundManager.md b/_features/soundManager.md deleted file mode 100644 index 19c789c6..00000000 --- a/_features/soundManager.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Sound Manager -date: 2018-03-16 -version: 0.21.0 ---- - -hahahaha... god diff --git a/_features/ssdecklist.md b/_features/ssdecklist.md deleted file mode 100644 index 403902f5..00000000 --- a/_features/ssdecklist.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Smooth Scrolling deck list -date: 2018-10-26 -version: 0.17.0 ---- diff --git a/_features/streamerMode.md b/_features/streamerMode.md deleted file mode 100644 index ec96c421..00000000 --- a/_features/streamerMode.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Streamer mode -banner: -date: 2019-04-08 -version: 0.25.0 -credit: Ceveno -notice: This feature is hidden by default ---- - -### Hide email while streaming -### Hide PM's while streaming diff --git a/_features/tagEnemies.md b/_features/tagEnemies.md deleted file mode 100644 index 19252711..00000000 --- a/_features/tagEnemies.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Highlight opponents in chat -date: 2018-12-08 -version: 0.20.0 ---- - -Opponents are now highlighted in chat so you are more aware of their messages. diff --git a/_features/tagFriends.md b/_features/tagFriends.md deleted file mode 100644 index 39cc973e..00000000 --- a/_features/tagFriends.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Highlight friends in chat -date: 2018-12-07 -banner: friendtag.png -version: 0.20.0 ---- - -Friends are now highlighted in chat so you are more aware of their messages. diff --git a/_features/toastContent.md b/_features/toastContent.md deleted file mode 100644 index ded24274..00000000 --- a/_features/toastContent.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: -date: 2019-08-24 -version: 0.28 -banner: -credit: -notice: -requested-by: ---- diff --git a/_features/toastify.md b/_features/toastify.md deleted file mode 100644 index 0004038b..00000000 --- a/_features/toastify.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Toastify Game End while spectating -banner: gameendtoast.png -date: 2018-03-11 -version: 0.9.0 ---- diff --git a/_features/translateMagic.md b/_features/translateMagic.md deleted file mode 100644 index 6af1e9a3..00000000 --- a/_features/translateMagic.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Translation improvements -banner: -date: 2019-05-30 -version: 0.26.0 -credit: -notice: ---- - -1. Switch to a specific page with a dropdown menu. diff --git a/_features/translationPreview.md b/_features/translationPreview.md deleted file mode 100644 index ffd08e76..00000000 --- a/_features/translationPreview.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: -date: 2019-10-05 -version: 0.30.0 -banner: -credit: -notice: -requested-by: ---- diff --git a/_features/volume.md b/_features/volume.md deleted file mode 100644 index 9661d525..00000000 --- a/_features/volume.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Lower game found volume -date: 2016-10-27 -version: 0.3.0 ---- - -After finding a game and getting alerted, the volume is played at 30% of the original volume. - -(no more going deaf) diff --git a/_features/winstreakToast.md b/_features/winstreakToast.md deleted file mode 100644 index 45121b31..00000000 --- a/_features/winstreakToast.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Winstreak Toasts -banner: -date: 2019-03-17 -version: 0.23.0 -credit: -notice: ---- - -Declutter your chat windows by routing these messages to toast notifications. diff --git a/_layouts/api.html b/_layouts/api.html deleted file mode 100644 index 32b01ab0..00000000 --- a/_layouts/api.html +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: default ---- -

{{ page.title }}

-by {{ page.author }} ({{ page.date | date: "%B %-d, %Y" }}) -
- -{{ content }} - -
-API Documentation: -| UnderScript -| Plugin -| EventEmitter -| -
-{{ page.last_modified_at | date: "Last updated: %B %-d, %Y at %H:%M" }} \ No newline at end of file diff --git a/_layouts/default.html b/_layouts/default.html deleted file mode 100644 index 8ed2186a..00000000 --- a/_layouts/default.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - {% seo %} - - - - - - - - - -
-
-

{{ site.title | default: site.github.repository_name }}

-

{{ site.description | default: site.github.project_tagline }}

- - - - {% if site.github.is_project_page %} -

This project is maintained by {{ site.github.owner_name }}

- {% endif %} - - {% if site.github.is_user_page %} - - {% endif %} -
- -
- {{ content }} -
- - -
- - - - - {% if site.google_analytics %} - - {% endif %} - - diff --git a/_layouts/feature.html b/_layouts/feature.html deleted file mode 100644 index 182c3365..00000000 --- a/_layouts/feature.html +++ /dev/null @@ -1,18 +0,0 @@ ---- -layout: default ---- -

{{ page.title }}

-by {{ page.author }} ({{ page.date | date: "%B %-d, %Y" }}) - -{% if page.credit %} -
Proposed by {{ page.credit }}
-{% endif %} -{% if page.notice %} -
{{ page.notice }}
-{% endif %} -
-{% if page.banner %} - -{% endif %} - -{{ content }} diff --git a/assets/css/style.scss b/assets/css/style.scss deleted file mode 100644 index e3c7f1da..00000000 --- a/assets/css/style.scss +++ /dev/null @@ -1,35 +0,0 @@ ---- ---- - -@import "{{ site.theme }}"; - -/* Custom CSS goes here */ - -img { border: 0; padding: 0; margin: 0; } - -a.discord { background: url(../images/discord_logo.svg) no-repeat -2px 1px; } - -.notice { color: #f00; border: 1px dashed #f00; margin: 5px; padding: 5px; width: 100%; display: block; } -.notice:before {content: 'Notice: '} - -code.highlighter-rouge { background-color: lightslategrey; color: white; padding: 5px; } - -/* Setup CSS */ -ul.setup { list-style: none; padding: 0; } -.setup li { list-style-type: none; width: fit-content; height: fit-content; margin-bottom: 12px; line-height: 1em; padding: 6px 6px 6px 7px; background: #AF0011; background: -moz-linear-gradient(top, #AF0011 0%, #820011 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f8f8f8), color-stop(100%, #dddddd)); background: -webkit-linear-gradient(top, #AF0011 0%, #820011 100%); background: -o-linear-gradient(top, #AF0011 0%, #820011 100%); background: -ms-linear-gradient(top, #AF0011 0%, #820011 100%); background: linear-gradient(to top, #AF0011 0%, #820011 100%); border-radius: 4px; border: 1px solid #0D0D0D; -webkit-box-shadow: inset 0px 1px 1px 0 #e90226; box-shadow: inset 0px 1px 1px 0 #e90226; } -.setup li:hover { background: #C3001D; background: -moz-linear-gradient(top, #C3001D 0%, #950119 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f8f8f8), color-stop(100%, #dddddd)); background: -webkit-linear-gradient(top, #C3001D 0%, #950119 100%); background: -o-linear-gradient(top, #C3001D 0%, #950119 100%); background: -ms-linear-gradient(top, #C3001D 0%, #950119 100%); background: linear-gradient(to top, #C3001D 0%, #950119 100%); } -.setup li a { color: #dddddd; } -a.install::before { content: 'Install '; } -a.hide { display: none; } -a.installed::before { content: 'Installed ' } -a.installed { background: url("data:image/svg+xml;utf8,") no-repeat; } -a.installed::after { content: '!' } -a.update::before { content: 'Update '; } -li:target { background-color: yellow; } - -dl dd, dl p { font-style: initial; } - -blockquote { border-left: 5px solid rgb(138, 138, 138); background-color: rgb(207, 207, 207); font-style: normal; } - -.highlight .c1 { color: rgb(26, 121, 26); } -.highlight .nx { color: rgb(36, 163, 221); } diff --git a/assets/features/battlelog.png b/assets/features/battlelog.png deleted file mode 100644 index 90de49ef..00000000 Binary files a/assets/features/battlelog.png and /dev/null differ diff --git a/assets/features/cardskins.png b/assets/features/cardskins.png deleted file mode 100644 index c59fee65..00000000 Binary files a/assets/features/cardskins.png and /dev/null differ diff --git a/assets/features/chatcontext.png b/assets/features/chatcontext.png deleted file mode 100644 index 27d42c70..00000000 Binary files a/assets/features/chatcontext.png and /dev/null differ diff --git a/assets/features/deckAverage.png b/assets/features/deckAverage.png deleted file mode 100644 index 8ce8228f..00000000 Binary files a/assets/features/deckAverage.png and /dev/null differ diff --git a/assets/features/deckpreview.png b/assets/features/deckpreview.png deleted file mode 100644 index d12359a4..00000000 Binary files a/assets/features/deckpreview.png and /dev/null differ diff --git a/assets/features/deckstorage.png b/assets/features/deckstorage.png deleted file mode 100644 index 718c8358..00000000 Binary files a/assets/features/deckstorage.png and /dev/null differ diff --git a/assets/features/dustcounter.png b/assets/features/dustcounter.png deleted file mode 100644 index 472f8f8b..00000000 Binary files a/assets/features/dustcounter.png and /dev/null differ diff --git a/assets/features/friendrequest.png b/assets/features/friendrequest.png deleted file mode 100644 index 504284f0..00000000 Binary files a/assets/features/friendrequest.png and /dev/null differ diff --git a/assets/features/friendtag.png b/assets/features/friendtag.png deleted file mode 100644 index 516f0105..00000000 Binary files a/assets/features/friendtag.png and /dev/null differ diff --git a/assets/features/gameendtoast.png b/assets/features/gameendtoast.png deleted file mode 100644 index ee7f5ebf..00000000 Binary files a/assets/features/gameendtoast.png and /dev/null differ diff --git a/assets/features/installscript.png b/assets/features/installscript.png deleted file mode 100644 index 46da8e63..00000000 Binary files a/assets/features/installscript.png and /dev/null differ diff --git a/assets/features/legendarydraw.png b/assets/features/legendarydraw.png deleted file mode 100644 index cbf6c58d..00000000 Binary files a/assets/features/legendarydraw.png and /dev/null differ diff --git a/assets/features/pingtoast.png b/assets/features/pingtoast.png deleted file mode 100644 index 19cddb26..00000000 Binary files a/assets/features/pingtoast.png and /dev/null differ diff --git a/assets/features/questToast.png b/assets/features/questToast.png deleted file mode 100644 index aea35d63..00000000 Binary files a/assets/features/questToast.png and /dev/null differ diff --git a/assets/images/discord_logo.svg b/assets/images/discord_logo.svg deleted file mode 100644 index 4613aa9a..00000000 --- a/assets/images/discord_logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/js/simpletoast.js b/assets/js/simpletoast.js deleted file mode 100644 index 0510dc3b..00000000 --- a/assets/js/simpletoast.js +++ /dev/null @@ -1,253 +0,0 @@ -/* - * SimpleToast - A small library for toasts - */ -((root, factory) => { - // Do we care about frames? Until I get some tests in... no - if (window !== window.top) return; - const boundToast = window.SimpleToast; - const localToast = factory(); - root.SimpleToast = localToast; - console.log(`SimpleToast(v${localToast.versionString}): Loaded`); - // Apply to window if SimpleToast doesn't currently exist - if (root !== window && !(boundToast instanceof localToast)) { - window.SimpleToast = localToast; - console.log(`SimpleToast(v${localToast.versionString}): Publicized`); - } -})(this, () => { - const version = buildVersion(1, 11, 0); - const style = { - root: { - display: 'flex', - 'flex-direction': 'column-reverse', - 'align-items': 'flex-end', - position: 'fixed', - 'white-space': 'pre-wrap', - bottom: 0, - right: 0, - zIndex: 1000, - }, - title: { - display: 'block', - fontSize: '15px', - 'font-style': 'italic', - }, - toast: { - maxWidth: '320px', - padding: '5px 8px', - borderRadius: '3px', - fontFamily: 'cursive, sans-serif', - fontSize: '13px', - cursor: 'pointer', - color: '#fafeff', - margin: '4px', - textShadow: '#3498db 1px 2px 1px', - background: '#2980b9', - }, - footer: { - display: 'block', - fontSize: '10px', - }, - button: { - height: '20px', - margin: '-3px 0 0 3px', - padding: '0 5px', - verticalAlign: 'middle', - whiteSpace: 'nowrap', - border: '1px solid rgba(27,31,35,0.2)', - borderRadius: '10px', - fontSize: '11px', - textShadow: '#173646 0px 0px 3px', - background: '#2c9fea', - mouseOver: { - 'border-color': 'rgba(27,31,35,0.35)', - background: '#149FFF', - }, - }, - }; - - function applyCSS(element, css = {}) { - const old = {}; - Object.keys(css).forEach((key) => { - const val = css[key]; - if (typeof val === 'object') return; - old[key] = element.style[key]; - element.style[key] = css[key]; - }); - return old; - } - - const toasts = new Map(); - let root = (() => { - function create() { - const el = document.createElement('div'); - el.setAttribute('id', 'AlertToast'); - applyCSS(el, style.root); - - const body = document.getElementsByTagName('body')[0]; - if (body) { // Depending on when the script is loaded... this might be null - body.appendChild(el); - } else { - window.addEventListener('load', () => { - const exists = document.getElementById(el.id); - if (exists) { // Another script may have created it already - if (el.hasChildNodes()) { // Transfer existing nodes to new root - const nodes = el.childNodes; - for (let i = 0, l = nodes.length; i < l; i++) { - exists.appendChild(nodes[i]); - } - } - root = exists; // Set this incase anyone still has a reference to this toast - return; - } - document.getElementsByTagName('body')[0].appendChild(el); - }); - } - return el; - } - return document.getElementById('AlertToast') || create(); - })(); - let count = 0; - - let timeout = null; - function startTimeout() { - if (timeout) return; - timeout = setTimeout(() => { - timeout = null; - const now = Date.now(); - let pending = 0; - toasts.forEach((toast) => { - if (!toast.timeout) return; - if (now < toast.timeout) { - pending += 1; - return; - } - toast.timedout(); - }); - if (pending) { - startTimeout(); - } - }, 1000); - } - - function noop() {} - const blankToast = Object.freeze({ - setText: noop, - exists: () => false, - close: noop, - }); - function Toast({title, text, footer, className, css = {}, buttons, timeout, onClose} = {}) { - if (typeof arguments[0] === 'string') { - text = arguments[0]; - } - if (!text) return blankToast; - const id = count++; - const el = document.createElement('div'); - const tel = el.appendChild(document.createElement('span')); - const body = el.appendChild(document.createElement('span')); - const fel = el.appendChild(document.createElement('span')); - if (className) { - const clazz = className.toast || className; - el.className = Array.isArray(clazz) ? clazz.join(' ') : (typeof clazz === 'string' ? clazz : undefined); - } - applyCSS(el, style.toast); - applyCSS(el, css.toast || css); - - // Add title, body - if (title) { - applyCSS(tel, style.title); - applyCSS(tel, css.title); - tel.textContent = title; - } - body.textContent = text; - if (footer) { - applyCSS(fel, style.footer); - applyCSS(fel, css.footer); - fel.textContent = footer; - } - - let closeType = 'unknown'; - const toast = { - setText: (newText) => { - if (!newText || !toast.exists()) return; - body.textContent = newText; - }, - exists: () => toasts.has(id), - close: () => { - if (!toast.exists()) return; - root.removeChild(el); - toasts.delete(id); - if (typeof onClose === 'function') { - onClose(toast, closeType); - } - }, - timedout: () => { - closeType = 'timeout'; - toast.close(); - }, - closed: () => { - closeType = 'dismissed'; - toast.close(); - }, - }; - if (timeout) { - toast.timeout = Date.now() + timeout; - } - - if (typeof buttons === 'object') { - if (!Array.isArray(buttons)) { - buttons = [buttons]; - } - buttons.forEach((button) => { - if (!button.text) return; - const elb = document.createElement('button'); - if (button.className || className && className.button) { - const clazz = button.className || className.button; - elb.className = Array.isArray(clazz) ? clazz.join(' ') : clazz; - } - elb.innerHTML = button.text; - applyCSS(elb, style.button); - applyCSS(elb, css.button); - applyCSS(elb, button.css); - if (typeof button.onclick === 'function') { - elb.onclick = button.onclick; - } - let prev = {}; - elb.onmouseover = () => { - const hoverStyle = Object.assign( - {}, - style.button.mouseOver, - css.button && css.button.mouseOver, - button.css && button.css.mouseOver - ); - prev = applyCSS(hoverStyle); - }; - elb.onmouseout = () => { - applyCSS(elb, prev); - prev = {}; - }; - el.insertBefore(elb, fel); - }); - } - el.addEventListener('click', toast.closed); - - root.appendChild(el); - toasts.set(id, toast); - if (timeout) { - startTimeout(); - } - const safeToast = {}; - Object.keys(blankToast).forEach((key) => safeToast[key] = toast[key]); - return safeToast; - } - - Toast.version = version.number; - Toast.versionString = version.string; - Toast.count = () => toasts.size; - function buildVersion(major, minor = 0, patch = 0) { - return { - string: `${major}.${minor}${patch ? `.${patch}` : ''}`, - number: major * 1000000000 + minor * 1000 + patch, - }; - } - return Object.freeze(Toast); -}); diff --git a/assets/js/versioning.js b/assets/js/versioning.js deleted file mode 100644 index 02aed816..00000000 --- a/assets/js/versioning.js +++ /dev/null @@ -1,36 +0,0 @@ -const underscript = { - latest: undefined, - version: undefined, -}; - -function setVersion(version) { - underscript.version = version; - const list = document.getElementsByClassName('setup')[0].children; - // Just hide the tampermonkey button - list[0].style.display = 'none'; - // Mark that the script has been installed - list[1].children[0].className = 'buttons installed'; - // In case axios updated really quick - checkUpdate(); -} - -function checkUpdate() { - const {version, latest} = underscript; - if (!(version && latest)) return; - if (latest !== version) { - document.getElementById('install').className = 'buttons update'; - } -} - -axios.get('https://api.github.com/repos/UCProjects/UnderScript/releases/latest').then(({ data: { tag_name: version, assets = [] } }) => { - const file = assets.find(({ name = '' }) => name.endsWith('.user.js'))?.browser_download_url; - if (!file) return; - underscript.latest = version; - const install = document.getElementById('install'); - install.textContent = `UnderScript (${version})`; - install.href = '#'; - install.onclick = () => { - window.open(file, 'updateUserScript', 'noreferrer'); - }; - checkUpdate(); -}); diff --git a/changelog.md b/changelog.md new file mode 100644 index 00000000..b6d03dc9 --- /dev/null +++ b/changelog.md @@ -0,0 +1,328 @@ +# UnderScript Changelog + +## Version 0.39.0 +### New Features +1. Minigames no longer take over your arrow keys while playing minigames + +## Version 0.38.1 +1. Fixed bug that made deck storage load only one card at a time +1. Fixed bug where deleted artifacts caused deck loading to repeat endlessly + +## Version 0.38.0 +### New Features +1. Display a toast about space/middle click turn skip hotkey +1. Added a friendship reward toast +1. Added a progress bar when opening multiple packs (and a stop button) +1. Added a button to collect all available Friendship rewards +### Fixes +1. You can now open all packs again +1. Fixed patch notes not showing on mid-season patch +1. Fixed a bug with loading new reinforcement artifact from deck storage +1. Fixed a bug with Bundle toasts not working +1. Fixed bug where it thinks you're on the play page while in a game +### Misc +1. Removed duplicate "disable skin toasts" setting + +## Version 0.37.0 +### New Features +1. Added setting to disable game list refresh +### Fixes +1. Fixed completed daily quests looking bad +### Stop-gap +1. Quick opening packs can now only open 10 at a time, due to Onucode. + +## Version 0.36.2 +1. Fixed background song playing twice +1. Fixed duplicate names in autocomplete + +## Version 0.36.1 +1. Fixed various bugs + +## Version 0.36.0 +### New Features +1. Visual Autocomplete +1. List completed quests +1. Call an event when translations get loaded +1. Disable breaking card art setting +### Fixes +1. CTRL+SHIFT when opening packs will only open one pack (with toast) +1. Fixed not having any ping phrases causing everything to ping you +1. Fixed battle log setting not applying while playing game +1. Fixed ignoring stacking messages in a single window +1. Fixed 'none' ignore type not being an option +1. Fix the header mixing with card tribes and such +1. Footer can no longer cover any part of the page +1. Vanilla settings that shouldn't show no longer show +1. Fixed bugs that cropped up when the spectate URL changed +### Misc +1. Removed some old features that don't do anything anymore + +## Version 0.35.0 +### New Features +1. Disable full card art setting +1. Added Volume Slider for Game Found sound +1. More Api + + 1. ready: boolean + 1. addStyle(...style: string): void + 1. plugin(name: string): RegisteredPlugin + 1. plugin.toast(data): toast + 1. plugin.logger + 1. plugin.events + 1. plugin.settings() + 1. appendCard() event + +### Fixes +1. Gold average works again +1. `@` now works in custom ping values +1. Tip styling arrow (online friends list) +1. Fixed `/scroll` giving an error +### Misc +1. Removed `smooth scrolling deck` feature (it causes bugs, don't need it anymore) +1. Added note for streamer mode +1. More stability for opening large amounts of packs + +## Version 0.34.1 +1. Fixed battle log not showing card events + +## Version 0.34.0 +1. Fixed /spectate command +1. Fixed deck page squishing buttons +1. Fixed updater not working +1. Fixed battle log size issues +1. Changed the position of the game timer +1. Added some more API functions + + 1. streamerMode(): boolean + 1. onPage(page): boolean + + +## Version 0.33.1 +1. Fixed revealing packs +1. Fixed crafting max cards +1. Fixed highlighting craftable cards + +## Version 0.33.0 +Happy new year! +### New Features +1. You can now change the color of friends +1. Error toast when the queue mess up (you get disconnected) +1. Added a few simple APIs + + `underscript.` + 1. openPacks + 1. eventManager + +### Improvements +1. Improved pack opening (less likely to crash with over 2000 packs) +### Fixes +1. Fixed server-restart not being detected +1. Fixed removing cosmetics highlight in the menu +1. Fixed opponent tag setting not working + +## Version 0.32.8 +1. Updated for next season (again) + +## Version 0.32.7 +1. Updated for next season + +## Version 0.32.6 +1. Fixed battle log when spectating + +## Version 0.32.5 +1. Fix battle log soul color +1. Fixed miscellaneous errors + +## Version 0.32.4 +1. Fixed deck storage +1. Fixed various other issues on Decks page + +## Version 0.32.3 +I messed up the last changelog, so you get the old change log this time as well. +1. Fixed battle log error for next season +1. Fixed spam crafting with CTRL+Click +1. Fixed more bugs + +## Version 0.32.2 +1. Fixed battle log error for next season +1. Fixed spam crafting with CTRL+Click + +## Version 0.32.1 +1. Prep for next season +2. Fix menu getting covered by other stuff sometimes + +## Version 0.32.0 +### New Features +1. Make undercards tips pretty (by using our theme) +### Fixes +1. Fix emotes not getting toasted +1. Support animated avatars + +## Version 0.31.1 +1. Fixed tippy being an old version + +## Version 0.31.0 +### New Features +1. You can now disable in-game battle log +1. Added setting to disable header scrolling +### Fixes +1. In-game battle log no longer covers your avatar (Sorry 'bout that) +1. Possible fix for header scrolling leaving a bunch of lines on some computers (otherwise you can disable it now) + +## Version 0.30.0 +### New Features +1. Translations now have a preview +2. The header bar now scrolls with the page +### Fixes +1. Fixed card name in english setting (maybe) +2. Fixed quest name showing up when quests completed (hopefully) + +## Version 0.29.0 +### New Features +1. Added an Icon helper (Packs and such) +### Fixes +1. Pack count now decreases when opening all packs +1. You should no longer get as many invalid friend requests +### Misc. +1. Dust counter is now disabled by default + +## Version 0.28.1 +### Fixes +1. The deck hub no longer thinks you're always missing artifacts + +## Version 0.28.0 +### New Features +1. Added link to card editor under "Links" +1. You can now completely hide ignored messages +### Fixes +1. Skins toast properly again +### Misc. +1. You can now ignore balancers +1. You can access UnderScript's menu from UnderCards' menu +1. Updated code for next season + +## Version 0.27.2 +1. New color for friends in chat +1. Fix game patches not turning into toasts +1. Fix chat toast room name + +## Version 0.27.1 +1. Fixed card skin shop names looking small +1. Fixed local reset time +1. Fixed surrender/disconnect message in battle log + +## Version 0.27.0 +### New Features +1. Return of the "game found" notification + +### Fixes +1. Winstreak toast displays properly (for real this time) + +## Version 0.26.3 +1. Fix quest notification +1. Fix home page translations +1. Fix legend user notification +1. Fix legendary card draw notification +1. Fix winstreak notification + +## Version 0.26.2 +1. Fix battle log (again) + +## Version 0.26.1 +1. Fix battle log and dust count + +## Version 0.26.0 +### New Features +1. Craft max with a hotkey (CTRL + Click) +1. Translation support + 1. Drop down menu to select specific pages + 1. Attempt to translate things UnderScript loads if possible + 1. Added setting to force card names to appear in English (no matter your language) + +### Fixes +1. Fix card skin store not displaying cards correctly + +## Version 0.25.2 +1. Fixed /gg command + +## Version 0.25.1 +1. Fixed chat breaking + +## Version 0.25.0 +### New Features +1. Added settings to auto decline specific friend requests +1. Added toggle to lock custom games to friends +1. Automatically update the online friends list +1. Click on hovered cards (that shouldn't be there) to remove them +1. Chat will now scroll to the bottom more often +1. You can now disable minigames in the lobby +1. Chat commands~ + 1. /scroll to scroll to the bottom of the chat + 1. /gg to send `@o good game` + 1. /spectate to send the spectate url +1. You can now turn off emotes in chat (will turn into text) +1. Added settings for disabling in-game emotes +1. Streamer mode +1. Leaderboard gets a touch of magic + * Added a drop down menu for selecting specific pages + * Added URLs to go directly to a page/user + * Feedback when a user is not found + +### Fixes +1. Fixed bug where the spectate list refreshes too quickly +1. Fixed shiny base cards showing as craftable when you can't afford it +1. Cards now have their correct description on the history log +1. Disabling scrolling on collection now works + +## Version 0.24.2 +1. Fixed chat breaking + +## Version 0.24.1 +1. Fixed @username not pinging you + +## Version 0.24.0 +### New Features +1. Added setting to stop April Fools Day + +### Fixes +1. Updated chat to account for @ +1. Fixed surrender button + +## Version 0.23.6 +1. Prepped for next season + +## Version 0.23.1 +1. Fixed updates going to the wrong URL + +## Version 0.23.0 +### New Features +1. Deck Storage now saves and loads artifacts + * Note: You need to resave your decks to add artifacts to them +1. Added changelog +1. Added options for winstreak announcements +1. Added options for legend rank announcement +1. Jump to First/Last collection page + * Control Click +1. Added option to disable changing collection page with scrollwheel +1. Added option to disable screen shaking +1. Added confirmation for ignoring users +1. @O now tags opponent +1. Can now decline all friend requests at once + +### Fixes +1. Fixed the spectator list not resizing sometimes + +## Version 0.22.9 (3/19/19) +1. Actually fix smart disenchanting + +## Version 0.22.8 (3/17/19) +1. Smart Disenchant now works + +## Version 0.22.7 (3/15/19) +1. Script now loads properly on crafting/deck page + +## Version 0.22.6 (3/15/19) +1. Fix crafting features + +## Version 0.22.5 (3/14/19) +1. Fix most of the deck features to work with 32.1 diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 00000000..cc7f43ee --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,44 @@ +/* eslint-env node */ +const { dest, series, src, watch } = require('gulp'); +const concat = require('gulp-concat'); +const rename = require('gulp-rename'); +const replace = require('gulp-replace'); +const insert = require('gulp-insert'); +const iff = require('gulp-if'); +const package = require('./package.json'); + +const deploy = process.argv.includes('--deploy'); +const metafile = 'src/meta.js'; +const underscript = [metafile, 'src/utils/**/*.js', 'src/base/**/*.js', 'src/hooks/**/*.js', '!src/**/*.ignore.js']; + +function buildMeta() { + return src(metafile) + .pipe(replace('{{ version }}', package.version)) + .pipe(rename('undercards.meta.js')) + .pipe(to()); +} + +function build() { + return src(underscript) + .pipe(replace('{{ version }}', package.version)) + .pipe(replace(/((?: +|\t+|^)\/\/.[^@=].*$|(?: +|\t+|^)\/\*(?:[^*]|\n\r?)+\*\/)/gm, '')) + .pipe(replace(/(\r?\n){2,}/gm, '$1')) + .pipe(iff(!deploy, insert.transform((content, file) => `// ${file.basename}\n${content}`))) + .pipe(concat('undercards.user.js')) + .pipe(to()); +} + +function to() { + return dest('dist'); +} + +if (deploy) { + underscript.push( + '!src/**/*.local.js', + '!src/**/*.test.js', + ); +} else { + watch(underscript, build); +} + +exports.default = series(buildMeta, build); diff --git a/index.md b/index.md deleted file mode 100644 index 88da8d14..00000000 --- a/index.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: UnderScript ---- - -## What is UnderScript? ## -UnderScript is a userscript (made with javascript) that gets loaded by a script manager to change the behavior of undercards. These changes range from fixing bugs (removing ghost mines from the board) to adding features (a battle log). There are {{ site.features.size }} features and counting for UnderScript, and is fairly popular and completely safe to use. UnderScript will never add anything to harm your computer or account, nor will it ever feature anything considered "hacking" or get you banned. - -### Why Tampermonkey? ### -Tampermonkey is a script manager program that loads scripts automatically, and is supported on all major browsers, so you don't have to do anything extra yourself. - -## Setup ## -UnderScript is not supported on mobile devices - -![Install UnderScript](/assets/features/installscript.png) - -## Features ## - -
    -{% assign features = site.features | sort: "date" %} -{% for feature in features %} -
  1. - - {% if feature.deprecated %}{% endif %}{{ feature.title }}{% if feature.deprecated %}{% endif %} - -
  2. -{% endfor %} -
diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..0248d80a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5242 @@ +{ + "name": "underscript", + "version": "0.38.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "dev": true + }, + "acorn-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "dev": true + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-escapes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", + "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "requires": { + "async-done": "^1.2.2" + } + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "binaryextensions": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz", + "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "dev": true, + "requires": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "duplexify": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.2.tgz", + "integrity": "sha512-YoKuru3Lyoy7yVTBSH2j7UxTqe/je3dWAruC0sHvZX1GNd5zX8SSLvQqEgO9b3Ex8IW+goFI9arEEsFIbulhOw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + }, + "dependencies": { + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz", + "integrity": "sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.7", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "eslint-module-utils": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", + "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz", + "integrity": "sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "dev": true, + "requires": { + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "fork-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz", + "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + } + }, + "glob-watcher": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", + "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "object.defaults": "^1.1.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", + "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "dependencies": { + "gulp-cli": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", + "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.1.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.0.1", + "yargs": "^7.1.0" + } + } + } + }, + "gulp-concat": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", + "dev": true, + "requires": { + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" + } + }, + "gulp-if": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz", + "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=", + "dev": true, + "requires": { + "gulp-match": "^1.0.3", + "ternary-stream": "^2.0.1", + "through2": "^2.0.1" + } + }, + "gulp-insert": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/gulp-insert/-/gulp-insert-0.5.0.tgz", + "integrity": "sha1-MjE/E+SiPPWsylzl8MCAkjx3hgI=", + "dev": true, + "requires": { + "readable-stream": "^1.0.26-4", + "streamqueue": "0.0.6" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "gulp-match": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz", + "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=", + "dev": true, + "requires": { + "minimatch": "^3.0.3" + } + }, + "gulp-rename": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", + "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", + "dev": true + }, + "gulp-replace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.0.0.tgz", + "integrity": "sha512-lgdmrFSI1SdhNMXZQbrC75MOl1UjYWlOWNbNRnz+F/KHmgxt3l6XstBoAYIdadwETFyG/6i+vWUSCawdC3pqOw==", + "dev": true, + "requires": { + "istextorbinary": "2.2.1", + "readable-stream": "^2.0.1", + "replacestream": "^4.0.0" + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz", + "integrity": "sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + } + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + }, + "dependencies": { + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + } + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istextorbinary": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", + "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", + "dev": true, + "requires": { + "binaryextensions": "2", + "editions": "^1.3.3", + "textextensions": "2" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/replace/-/replace-1.1.5.tgz", + "integrity": "sha512-Mww6GyTix4GqN1GSbJDkUzftkjQE0xfzzlGkFF26ukm8DBzgwGPFntvmVsvAKJogwSSMjvAoZei7fJ2tfiKMcA==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "minimatch": "3.0.4", + "yargs": "^12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", + "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "requires": { + "sver-compat": "^1.5.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "spdx-correct": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", + "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", + "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamqueue": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/streamqueue/-/streamqueue-0.0.6.tgz", + "integrity": "sha1-ZvX17JTpuK8knkrsLdH3Qb/pTeM=", + "dev": true, + "requires": { + "readable-stream": "^1.0.26-2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ternary-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz", + "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=", + "dev": true, + "requires": { + "duplexify": "^3.5.0", + "fork-stream": "^0.0.4", + "merge-stream": "^1.0.0", + "through2": "^2.0.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "textextensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz", + "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } +} diff --git a/package.json b/package.json index 1aeeb3a1..8da0cd7d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,39 @@ { - "name": "underscript-pages", - "private": true, + "name": "underscript", + "version": "0.38.1", + "description": "Script for Undercards. An undertale fan-made game.", + "homepage": "https://feildmaster.github.io/UnderScript/", + "repository": "feildmaster/UnderScript", + "main": "dist/undercards.user.js", + "unpkg": "dist/undercards.user.js", + "browser": "dist/undercards.user.js", + "license": "MIT", + "author": "Alan H (feildmaster) (https://feildmaster.com/)", + "contributors": [ + "Austin Peterson (https://blog.akpwebdesign.com)" + ], "scripts": { - "start": "bundle exec jekyll serve" + "build": "gulp --deploy", + "prepack": "gulp --deploy", + "update": "npm version minor --m=\"chore(%s): Release update\"", + "patch": "npm version patch --m=\"chore(%s): Release patch\"", + "nextpatch": "npm version prepatch --m\"chore(%s): Build test patch\"", + "prep": "npm version preminor --preid= --m=\"chore(%s): Prep for next release\"", + "next": "npm version prerelease --m=\"chore(%s): Build test script\"" + }, + "files": [ + "dist/*.js" + ], + "devDependencies": { + "eslint": "^6.8.0", + "eslint-config-airbnb-base": "^14.0.0", + "eslint-plugin-import": "^2.20.0", + "gulp": "^4.0.2", + "gulp-concat": "^2.6.1", + "gulp-if": "^2.0.2", + "gulp-insert": "^0.5.0", + "gulp-rename": "^1.4.0", + "gulp-replace": "^1.0.0", + "replace": "^1.1.5" } -} \ No newline at end of file +} diff --git a/readme.md b/readme.md new file mode 100644 index 00000000..12fe7194 --- /dev/null +++ b/readme.md @@ -0,0 +1,3 @@ +# Undercards Script # + +Looking to install the script? [Click Here](https://git.io/fxysg) \ No newline at end of file diff --git a/scripts/gist.sh b/scripts/gist.sh new file mode 100644 index 00000000..7a1c6cfe --- /dev/null +++ b/scripts/gist.sh @@ -0,0 +1,39 @@ +FNAME="${1:-}" + +if [[ ! -f "$FNAME" ]]; then + echo "File not found" + exit 2 +else + CONTENT=$(cat "$FNAME") +fi + +if [[ ! $gist_token ]]; then + echo 'Token not provided' + exit 2 +fi + +CONTENT=$(echo "${CONTENT}" | sed -e 's/\\/\\\\/g' -e 's/\r//' -e's/\t/\\t/g' -e 's/"/\\"/g' | sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g') + +TEMP=$(mktemp) +cat > $TEMP < { + const first = text.indexOf(`\n## ${cache ? `Version ${version}` : ''}`); + let end; + if (!~first) throw new Error('Invalid Changelog'); + if (short) { + const index = text.indexOf('\n## ', first + 1); + if (!!~index) end = index; + } + const parsedHTML = getMarkdown().makeHtml(text.substring(first, end).trim()).replace(/\r?\n/g, ''); + // Cache results + if (cache) changelog[key] = parsedHTML; + return parsedHTML; + }); + } + + function load(version = 'latest', short = false) { + const container = $('
').text('Please wait'); + open(container); + get(version, short).catch((e) => { + console.error(e); + return 'Unavailable at this time'; + }).then((m) => container.html(m)); + } + + // Add menu button + menu.addButton({ + text: 'UnderScript Change Log', + action() { + load(scriptVersion === 'L' ? 'latest' : scriptVersion); + }, + enabled() { + return typeof BootstrapDialog !== 'undefined'; + }, + note() { + if (!this.enabled()) { + return 'Unavailable on this page'; + } + }, + }); + + return { + load, get, + }; +}); diff --git a/src/base/chat/autocomplete.friends.js b/src/base/chat/autocomplete.friends.js new file mode 100644 index 00000000..f7caecb5 --- /dev/null +++ b/src/base/chat/autocomplete.friends.js @@ -0,0 +1,7 @@ +wrap(() => { + eventManager.on('@autocomplete', ({ list }) => { + list.splice(0, 0, ...global('selfFriends') + .map(fn.user.name) + .filter((name) => !list.includes(name))); + }); +}); diff --git a/src/base/chat/autocomplete.js b/src/base/chat/autocomplete.js new file mode 100644 index 00000000..825ce35f --- /dev/null +++ b/src/base/chat/autocomplete.js @@ -0,0 +1,181 @@ +wrap(function setup() { + const setting = settings.register({ + name: 'Visual Autocomplete', + key: 'underscript.autocomplete', + default: true, + page: 'Chat', + }); + + let current = false; + const lists = {}; + style.add( + // '.chat-footer { position: relative; }', // this bugs the chat + '.autobox { position: absolute; border: 1px solid #d4d4d4; border-bottom: none; border-top: none; bottom: 100%; left: 0; right: 0; }', + '.autobox div { padding: 10px; cursor: pointer; background-color: rgba(0,0,0,0.9); border-top: 1px solid #d4d4d4; border-bottom: 1px solid #d4d4d4; }', + '.autobox div:hover { background-color: #666; }', + 'div.autobox-active { background-color: #333; color: #fff }', + ); + + function autocomplete(input, room) { + const list = lists[room]; + let el; + + function listener(event) { + let el2; + // If current word starts with @, show autocomplete + const { text, replace } = getWord(this); + closeList(); + if (text === undefined) return; + debug(`"${text}"`); + el = document.createElement('div'); + el.setAttribute('id', 'autobox'); + el.setAttribute('class', 'autobox'); + this.parentNode.appendChild(el); + let x = 0; + const localList = [...list]; + eventManager.emit('@autocomplete', { + list: localList, + }); + const listLength = localList.length; + for (let i = 1; i <= listLength && x < 5; i++) { // Limit to 5 most recent entries + /* check if the item starts with the same letters as the text field value: */ + const item = localList[listLength - i]; + if (item.substr(0, text.length).toUpperCase() !== text.toUpperCase()) continue; + x += 1; // If we display this name, increment limit + el2 = document.createElement('div'); + el2.innerHTML = `${item.substr(0, text.length)}${item.substr(text.length)}`; + /* execute a function when someone clicks on the item value (DIV element) */ + el2.addEventListener('click', (e) => { + replace(item); + closeList(); + }); + el.appendChild(el2); + } + if (x === 0) return; + current = 0; + addActive(el.getElementsByTagName('div')); + } + + input.addEventListener('input', listener); + input.addEventListener('focus', listener); + // input.addEventListener('blur', closeList); // TODO: Close autocomplete when not chatting + input.addEventListener('keydown', (e) => { + if (e.which === 39) return; // right (move into @) + if (current === false) return; + const x = el.getElementsByTagName('div'); + if (!x.length) return; + let active = true; + switch (e.which) { + case 40: // down + current += 1; + break; + case 38: // up + current -= 1; + break; + case 13: // enter + case 9: // tab + x[current].click(); + active = false; + break; + case 37: // left + // if moves before @ + return; // TODO + case 27: // escape + closeList(); // fallthrough + default: return; + } + if (active) addActive(x); + e.preventDefault(); + }); + function addActive(x) { + if (!x) return; + removeActive(x); + if (current >= x.length) current = 0; + if (current < 0) current = (x.length - 1); + x[current].classList.add('autobox-active'); + } + function removeActive(x) { + for (let i = 0; i < x.length; i++) { + x[i].classList.remove('autobox-active'); + } + } + function closeList() { + current = false; + if (!el) return; + el.parentNode.removeChild(el); + el = undefined; + } + } + + // FALL DOWN LOGIC: very important to not ruin + const boundaries = ['', ' ']; + function getWord(input) { + const text = input.value; + let start = -1; + let end = 0; + + if (text.includes('@')) { + let x = text.indexOf(' '); + if (x === -1) { // I'm not really sure why I'm special casing for spaces + if (text.startsWith('@')) { + start = 1; + end = text.length; + } + } + if (start === -1) { // TODO - Find the @ and any text following it + const cursor = input.selectionStart; + if (boundaries.includes(text.substring(cursor, cursor + 1))) { + let str = text.substring(0, cursor); + x = str.lastIndexOf('@'); + if (x > -1) { + if (x === 0 || boundaries.includes(str[x - 1])) { + str = str.substr(x + 1); + if (!str.length || str[0] !== ' ' && str.indexOf(' ') === str.lastIndexOf(' ')) { // if immediate space, if more than 1 space, ignore it + start = x + 1; + end = cursor; + } + } + } + } + } + } + + if (start === -1) return {}; + + function replace(str) { + input.value = `${text.substring(0, start)}${str} ${text.substring(end)}`; + input.selectionStart = start + str.length + 1; + input.selectionEnd = input.selectionStart; + input.focus(); + } + return { + replace, + text: text.substring(start, end), + }; + } + + function add(name, list) { + if (name === global('selfUsername')) return; + const slot = list.indexOf(name); + if (slot > -1) list.splice(slot, 1); + list.push(name); + } + + eventManager.on('Chat:getHistory', ({ room, history }) => { + if (lists[room] === undefined) { + lists[room] = []; + } + const list = lists[room]; + JSON.parse(history).forEach(({ user }) => add(fn.user.name(user), list)); + autocomplete($(`#${room} input.chat-text`)[0], room); + }); + eventManager.on('Chat:getMessage', ({ room, chatMessage }) => { + add(fn.user.name(JSON.parse(chatMessage).user), lists[room]); + }); + eventManager.on(':loaded', () => { + globalSet('autoComplete', (...args) => { + if (setting.value()) return; + this.super(...args); + }); + }); +}); diff --git a/src/base/chat/broadcast.js b/src/base/chat/broadcast.js new file mode 100644 index 00000000..cc584eb7 --- /dev/null +++ b/src/base/chat/broadcast.js @@ -0,0 +1,14 @@ +settings.register({ + name: 'Disable Broadcast Toast', + key: 'underscript.disable.broadcast', + page: 'Chat', +}); + +eventManager.on('Chat:getMessageBroadcast', function broadcast({ message }) { + if (settings.value('underscript.disable.broadcast')) return; + fn.infoToast({ + title: '[INFO] Undercards Broadcast Message', + text: `${message}`, + footer: 'info-chan via UnderScript', + }); +}); diff --git a/src/base/chat/closed.js b/src/base/chat/closed.js new file mode 100644 index 00000000..31fd343c --- /dev/null +++ b/src/base/chat/closed.js @@ -0,0 +1,10 @@ +eventManager.on('ChatDetected', () => { + const socketChat = global('socketChat'); + const oClose = socketChat.onclose; + socketChat.onclose = () => { + oClose(); + $('.chat-box').each((i, e) => { + global('scroll')($(e).attr('id'), true); + }); + }; +}); diff --git a/src/base/chat/commands/scroll.js b/src/base/chat/commands/scroll.js new file mode 100644 index 00000000..162edf9d --- /dev/null +++ b/src/base/chat/commands/scroll.js @@ -0,0 +1,18 @@ +wrap(function scroll() { + const command = 'scroll'; + const setting = settings.register({ + name: `Disable ${command} command`, + key: `underscript.command.${command}`, + note: `/${command}`, + page: 'Chat', + category: 'Commands', + }); + + eventManager.on('Chat:command', (data) => { + debug(data); + if (this.canceled || data.command !== command || setting.value()) return; + debug('Scroll command'); + this.canceled = true; + global('scroll')(data.room, true); + }); +}); diff --git a/src/base/chat/context.js b/src/base/chat/context.js new file mode 100644 index 00000000..d3510b4e --- /dev/null +++ b/src/base/chat/context.js @@ -0,0 +1,209 @@ +settings.register({ + name: 'Disable Chat Context (right click)', + key: 'underscript.disable.chatContext', + page: 'Chat', +}); + +eventManager.on('ChatDetected', () => { + style.add( + '.chatContext { background-color: #F4F4F4; margin: 10px; color: #333; border: 1px dashed #000; position: absolute; z-index: 20; text-align: center; border-radius: 10px; }', + '.chatContext header { padding: 0px 5px; height: auto; }', + '.chatContext select { background-color: transparent !important; }', + '.chatContext li { list-style: none; margin: 0; padding: 3px; border-top: 1px solid #CCC; cursor: pointer; }', + '.chatContext .disabled { background-color: #ccc; cursor: not-allowed; }', + '.chatContext li:not(.disabled):hover { background-color: #003366; color: #F2F2F2; }', + '.chatContext > :last-child { border-radius: 0 0 10px 10px; }', + ); + let toast; + + const ignorePrefix = 'underscript.ignore.'; + const context = (() => { + const container = $('
'); + const profile = $('
  • Profile
  • '); + const message = $('
  • Message
  • '); + const ignore = $('
  • Ignore
  • '); + const mention = $('
  • Mention
  • '); + const mute = $('
  • Mute
  • '); + const muteTime = $('
    +
    ${artifacts(i)}
    +
    Click to load (${deck.length})
    +
    ${cards(deck)}
    +
    + * Right Click to name deck
    + * Shift Click to re-save deck
    + * CTRL Click to erase deck +
    + `; + } else { + text = ` +
    ${soul}-${i + 1}
    +
    Click to save current deck
    `; + } + } + hover.show(text)(e); + } + if (!localStorage.getItem(deckKey)) { + button.addClass('btn-danger') + .removeClass('btn-primary') + .hover(hoverButton) + .one('click.script.deckStorage', saveButton); + } else { + button.removeClass('btn-danger') + .addClass('btn-primary') + .hover(hoverButton) + .on('click.script.deckStorage', (e) => { + if (e.ctrlKey && e.shiftKey) { // Crazy people... + return; + } + if (e.ctrlKey) { // ERASE + localStorage.removeItem(nameKey); + localStorage.removeItem(deckKey); + loadButton(i); // Reload :( + refreshHover(); // Update + } else if (e.shiftKey) { // Re-save + saveDeck(i); // Save + refreshHover(); // Update + } else { // Load + loadDeck(i); + } + }) + .on('contextmenu.script.deckStorage', (e) => { + e.preventDefault(); + const input = $('#deckNameInput'); + const display = $('#deckName'); + function storeInput() { + localStorage.setItem(nameKey, input.val()); + display.text(input.val()).show(); + loadButton(i); // I really hate this + refreshHover(); + } + display.hide(); + input.show() + .focus() + .select() + // eslint-disable-next-line no-shadow + .on('keydown.script.deckStorage', (e) => { + if (e.which === 27 || e.which === 13) { + e.preventDefault(); + storeInput(); + } + }) + .on('focusout.script.deckStorage', () => { + storeInput(); + }); + }); + } + } + + eventManager.on('Deck:Loaded', () => { + loadStorage(); + }); + clearDeck.on('click', () => { + pending = []; + }); + }); +}); diff --git a/src/base/friends/add.js b/src/base/friends/add.js new file mode 100644 index 00000000..db0903eb --- /dev/null +++ b/src/base/friends/add.js @@ -0,0 +1,50 @@ +settings.register({ + name: 'Add friends without refreshing', + key: 'underscript.friend.add', + default: true, + page: 'Friends', +}); + +onPage('Friends', function addFriend() { + const single = true; + const input = document.querySelector('input[name="username"]'); + + function submit() { + if (typeof URLSearchParams === 'undefined' || !settings.value('underscript.friend.add')) return undefined; + const name = input.value.trim(); + if (name) { + input.value = ''; + input.focus(); + const params = new URLSearchParams(); + params.append('username', name); + params.append('addFriend', 'Add friend'); + axios.post('/Friends', params).then((results) => { + const page = new DOMParser().parseFromString(results.data, 'text/html').querySelector('div.mainContent'); + const result = page.querySelector('form[action="Friends"] + p'); + if (result) { + const success = result.classList.contains('green'); + debug(result); + fn.toast({ + text: `

    ${success ? 'Sent' : 'Failed to send'} friend request to ${name}

    `, + }); + if (success) { + const element = $el.text.contains(decrypt(page).querySelectorAll('a[href^="Friends?delete="]'), `${name} LV`, { mutex, single }); + $el.text.contains(document.querySelectorAll('p'), 'Pending requests', { single }).parentElement.append(element); + eventManager.emit('newElement', element); + } + } + }); + } + return false; + } + function mutex(el) { + return el.parentElement; + } + + input.addEventListener('keydown', (e) => { + if ((e.keyCode || e.which) === 13 || [e.code, e.key].contains('Enter')) { + if (submit() === false) e.preventDefault(); + } + }); + document.querySelector('form[action="Friends"]').onsubmit = submit; +}); diff --git a/src/base/friends/autoDecline.js b/src/base/friends/autoDecline.js new file mode 100644 index 00000000..54597f7f --- /dev/null +++ b/src/base/friends/autoDecline.js @@ -0,0 +1,97 @@ +wrap(function autoDecline() { + const disabled = settings.register({ + name: 'Disable', + key: 'userscript.autodecline.disable', + page: 'Friends', + category: 'Auto Decline', + }); + + const silent = settings.register({ + name: 'Silent', + key: 'underscript.autodecline.silent', + default: true, + page: 'Friends', + category: 'Auto Decline', + }); + + const chat = settings.register({ + name: 'Include ignored chat users', + key: 'underscript.autodecline.ignored', + default: true, + page: 'Friends', + category: 'Auto Decline', + }); + + // Load blocked users + fn.each(localStorage, (name, key) => { + if (!key.startsWith('underscript.autodecline.user.')) return; + register(key, name); + }); + + function register(key, name, set = false) { + settings.register({ + key, + name, + type: 'remove', + page: 'Friends', + category: 'Auto Decline', + }); + if (set) { + localStorage.setItem(key, name); + } + } + + function post(id, name) { + axios.get(`/Friends?delete=${id}`).then(() => { + if (!name) return; + const message = `Auto declined friend request from: ${name}`; + debug(message); + if (!silent.value()) { + fn.toast(message); + } + }).catch(console.error); + } + + function isBlocked(id) { + return !!settings.value(`underscript.autodecline.user.${id}`); + } + + function isIgnored(id) { + return chat.value() && !!settings.value(`underscript.ignore.${id}`); + } + + eventManager.on('preFriends:requests', function filter(requests) { + if (disabled.value()) return; + fn.each(requests, (name, id) => { + if (isBlocked(id) || isIgnored(id)) { + debug(`Blocking ${name}[${id}]`); + delete requests[id]; + post(id, name); + } + }); + }); + + // Add a way to block users + onPage('Friends', function blockRequests() { + eventManager.on('jQuery', () => { + const block = $('').css({ + 'font-size': '14px', + }).text('block'); + $('p:contains("Friend requests")').parent().find('li').each(function elements() { + const el = $(this); + const name = el.text().substring(0, el.text().lastIndexOf(' LV ')); + el.append(' ', block.clone().click(function onClick() { + hover.hide(); + const link = el.find('a:first').attr('href'); + const id = link.substring(link.indexOf('=') + 1); + + register(`underscript.autodecline.user.${id}`, name, true); + post(id); + el.find('a[href^="Friends?"]').remove(); + el.addClass('deleted'); + $(this).remove(); + }).hover(hover.show(`Block ${el.text().substring(0, name)}`))); + }); + }); + }); +}); diff --git a/src/base/friends/delete.js b/src/base/friends/delete.js new file mode 100644 index 00000000..5b9cac8a --- /dev/null +++ b/src/base/friends/delete.js @@ -0,0 +1,51 @@ +settings.register({ + name: 'Remove friends without refreshing', + key: 'underscript.removeFriend.background', + default: true, + page: 'Friends', +}); + +onPage('Friends', function deleteFriends() { + let reminded = false; + style.add('.deleted { text-decoration: line-through; }'); + + function remove(e) { + if (!settings.value('underscript.removeFriend.background')) return; + e.preventDefault(); + process($(this)); + } + + function process(btn) { + const parent = btn.parent(); + btn.detach(); + const link = btn.attr('href'); + axios.get(link).then((response) => { + const onlineFriends = $(response.data).find(`#onlineFriends`); + if (!onlineFriends.length) { + fn.errorToast('Try logging back in'); + return; + } + const found = fn.decrypt(onlineFriends).find(`a[href="${link}"]`); + if (found.length) { + fn.toast(`Failed to remove: ${found.parent().find('span:nth-child(3)').text()}`); + btn.appendTo(parent); + } else { + if (!reminded) { + fn.toast({ + title: 'Please note:', + text: 'Friends list will be updated upon refresh.', + }); + reminded = true; + } + parent.addClass('deleted'); + } + }).catch((e) => { + fn.debug(`DeleteFriend: ${e}`); + }); + } + + eventManager.on('Chat:getOnlineFriends', () => $('a.crossDelete').click(remove)); + eventManager.on(':loaded', () => $('a[href^="Friends?"]').click(remove)); + eventManager.on('newElement', (e) => $(e).find('a').click(remove)); + eventManager.on('friendAction', process); +}); diff --git a/src/base/friends/groupRequest.js b/src/base/friends/groupRequest.js new file mode 100644 index 00000000..fc264813 --- /dev/null +++ b/src/base/friends/groupRequest.js @@ -0,0 +1,22 @@ +settings.register({ + name: 'Disable decline all button', + key: 'underscript.disable.declineAll', + refresh: true, + page: 'Friends', +}); + +onPage('Friends', function groupButtons() { + eventManager.on('jQuery', () => { + if (settings.value('underscript.disable.declineAll')) return; + const declineAll = $(''); + const container = $('p:contains("Friend requests")').append(' ', declineAll).parent(); + declineAll.text(' ').addClass('glyphicon glyphicon-remove red').css({ + cursor: 'pointer', + }).hover(hover.show('Decline all')) + .click(() => { + container.find('a[href^="Friends?delete="]').each(function declineFriend() { + eventManager.emit('friendAction', $(this)); + }); + }); + }); +}); diff --git a/src/base/friends/online.js b/src/base/friends/online.js new file mode 100644 index 00000000..fcbf4a2d --- /dev/null +++ b/src/base/friends/online.js @@ -0,0 +1,36 @@ +settings.register({ + name: 'Enable online friends', + key: 'underscript.enable.onlinefriends', + default: true, + page: 'Friends', +}); +eventManager.on(':loaded', () => { + const px = 12; + style.add( + '.tippy-tooltip.undercards-theme { background-color: rgba(0,0,0,0.9); font-size: 13px; border: 1px solid #fff; }', + `.tippy-popper[x-placement^='top'] .tippy-tooltip.undercards-theme .tippy-arrow { border-top-color: #fff; bottom: -${px}px; }`, + `.tippy-popper[x-placement^='bottom'] .tippy-tooltip.undercards-theme .tippy-arrow { border-bottom-color: #fff; top: -${px}px; }`, + `.tippy-popper[x-placement^='left'] .tippy-tooltip.undercards-theme .tippy-arrow { border-left-color: #fff; right: -${px}px; }`, + `.tippy-popper[x-placement^='right'] .tippy-tooltip.undercards-theme .tippy-arrow { border-right-color: #fff; left: -${px}px; }`, + ); + + const el = document.querySelector('a span.nbFriends'); + if (!el) return; + const target = el.parentElement; + hover.new('

    (Loading)
    ', target, { + arrow: true, + distance: 0, + follow: false, + offset: null, + footer: 'short', + placement: 'top-start', + onShow: () => settings.value('underscript.enable.onlinefriends'), + }); + + function updateTip() { + // eslint-disable-next-line no-underscore-dangle + target._tippy.popper.querySelector('.onlineFriends').innerHTML = global('selfFriends').filter(({ online }) => online).map((user) => fn.user.name(user)).join('
    ') || 'None'; + } + eventManager.on('Chat:getSelfInfos', updateTip); + this.updateTip = updateTip; +}); diff --git a/src/base/friends/requests.js b/src/base/friends/requests.js new file mode 100644 index 00000000..1766f541 --- /dev/null +++ b/src/base/friends/requests.js @@ -0,0 +1,43 @@ +eventManager.on('Friends:requests', (friends) => { + // id: name + function post(id, accept = true) { + const action = accept ? 'accept' : 'delete'; + axios.get(`/Friends?${action}=${id}`).then(() => { + const key = `underscript.request.${id}`; + const name = sessionStorage.getItem(key); + sessionStorage.removeItem(key); + fn.toast(`${accept ? 'Accepted' : 'Declined'} friend request from: ${name}`); + }).catch(noop()); + } + const newRequests = []; + fn.each(friends, (friend, id) => { + const key = `underscript.request.${id}`; + if (sessionStorage.getItem(key)) return; + const css = { + background: 'inherit', + }; // I need to add a way to clear all styles + fn.toast({ + title: `Pending Friend Request`, + text: friend, + buttons: [{ + css, + text: ' ', + className: 'glyphicon glyphicon-ok green', + onclick: post.bind(null, id), + }, { + css, + text: ' ', + className: 'glyphicon glyphicon-remove red', + onclick: post.bind(null, id, false), + }], + }); + sessionStorage.setItem(key, friend); + }); +}); +eventManager.on('logout', () => { + Object.keys(sessionStorage).forEach((key) => { + if (key.startsWith('underscript.request.')) { + sessionStorage.removeItem(key); + } + }); +}); diff --git a/src/base/friends/updateList.js b/src/base/friends/updateList.js new file mode 100644 index 00000000..df9760ba --- /dev/null +++ b/src/base/friends/updateList.js @@ -0,0 +1,30 @@ +eventManager.on('ChatDetected', () => { + let updatingFriends = false; + eventManager.on('Friends:refresh', () => { + const socketChat = global('socketChat'); + if (socketChat.readyState !== 1) return; + updatingFriends = true; + socketChat.send(JSON.stringify({ action: 'getOnlineFriends' })); + }); + eventManager.on('preChat:getOnlineFriends', function updateFriends(data) { + if (!updatingFriends) return; + updatingFriends = false; + this.canceled = true; + const friends = {}; + JSON.parse(data.friends).forEach((friend) => { + friends[friend.id] = friend; + }); + const selfFriends = global('selfFriends'); + selfFriends.forEach((friend) => { + // id, online, idGame, username + const id = friend.id; + const now = friends[id]; + delete friends[id]; + if (now && friend.online !== now.online) { + friend.online = now.online; + } + }); + $('.nbFriends').text(selfFriends.filter((friend) => friend.online).length); + script.updateTip && script.updateTip(); + }); +}); diff --git a/src/base/friendship/collect.js b/src/base/friendship/collect.js new file mode 100644 index 00000000..e99bd334 --- /dev/null +++ b/src/base/friendship/collect.js @@ -0,0 +1,86 @@ +wrap(() => { + onPage('Friendship', () => { + const maxClaim = 200 / 5; // Current level limit, no way to dynamically figure this out if he ever adds more rewards + let button; + let collecting = false; + const rewards = {}; + let pending = 0; + + function canClaim({ notClaimed, claim }) { + return notClaimed && claim < maxClaim; + } + + function canCollect() { + return fn.some(global('friendshipItems'), canClaim); + } + + function claimReward(data) { + if (canClaim(data)) { + global('claim')(data.idCard); + pending += 1; + } + } + + function collect() { + if (!canCollect() || collecting) return; + collecting = true; + pending = 0; + fn.clear(rewards); + fn.each(global('friendshipItems'), claimReward); + } + + function getLabel(type = '') { + switch (type) { + case 'GOLD': return ''; + case 'DUST': return ''; + case 'PACK': return ''; + case 'DR_PACK': return ''; + default: return type.toLowerCase(); + } + } + + eventManager.on('Friendship:loaded', () => { + button.prop('disabled', !canCollect()); + }); + + eventManager.on('Friendship:claim', ({ + data, reward, quantity, error, + }) => { + if (!pending || !collecting) return; + pending -= 1; + + if (!error) { + rewards[reward] = (rewards[reward] || 0) + quantity; + + // Claim again if necessary + claimReward(data); + } + + if (pending) return; + + eventManager.emit('Friendship:results', error); + }); + + eventManager.on('Friendship:results', (error) => { + const lines = []; + fn.each(rewards, (count, type) => { + lines.push(`- ${count} ${getLabel(type)}`); + }); + const toast = error ? fn.errorToast : fn.toast; + toast({ + title: 'Claimed Friendship Rewards', + text: lines.join('
    '), + }); + button.prop('disabled', !canCollect()); + collecting = false; + }); + + eventManager.on(':loaded', () => { + button = $(''); + button.prop('disabled', true); + button.on('click.script', collect); + button.hover(hover.show('Collect all rewards')); + $('p[data-i18n="[html]crafting-all-cards"]').css('display', 'inline-block').after(' ', button); + }); + }); +}); diff --git a/src/base/friendship/magic.js b/src/base/friendship/magic.js new file mode 100644 index 00000000..c4d3c559 --- /dev/null +++ b/src/base/friendship/magic.js @@ -0,0 +1,44 @@ +wrap(() => { + const setting = settings.register({ + name: 'Disable friendship notification', + key: 'underscript.disable.friendship.notification', + }); + + const max = 200 / 5; // Limit level 200 + + function getFriendship() { + if (setting.value()) return; + axios.get('/FriendshipConfig').then((resp) => { + const items = JSON.parse(resp.data.friendshipItems) + .filter((item) => { + const lvl = fn.getLevel(item.xp); + return lvl > 0 && item.claim < Math.min(Math.floor(lvl / 5), max); + }).map((item) => $.i18n(`card-name-${item.idCard}`, 1)); + + if (!items.length) return; + + fn.toast({ + title: 'Pending Friendship Rewards', + text: `- ${items.join('\n- ')}`, + className: 'dismissable', + buttons: { + text: 'Go now!', + className: 'dismiss', + css: { + border: '', + height: '', + background: '', + 'font-size': '', + margin: '', + 'border-radius': '', + }, + onclick: (e) => { + location.href = '/Friendship'; + }, + }, + }); + }); + } + + eventManager.on('getVictory getDefeat', getFriendship); +}); diff --git a/src/base/game/@opponent.js b/src/base/game/@opponent.js new file mode 100644 index 00000000..17524c2e --- /dev/null +++ b/src/base/game/@opponent.js @@ -0,0 +1,14 @@ +onPage('Game', () => { + const regex = /(^| )@o\b/gi; + let toast = fn.infoToast('You can mention opponents with @o', 'underscript.notice.mention', '1'); + + function convert({ input }) { + if (toast) { + toast.close('processed'); + toast = null; + } + $(input).val($(input).val() + .replace(regex, `$1@${$('#enemyUsername').text()}`)); + } + eventManager.on('Chat:send', convert); +}); diff --git a/src/base/game/battleLog.js b/src/base/game/battleLog.js new file mode 100644 index 00000000..d13612b5 --- /dev/null +++ b/src/base/game/battleLog.js @@ -0,0 +1,413 @@ +/* eslint-disable no-use-before-define */ +settings.register({ + name: 'Disable Battle Log', + key: 'underscript.disable.logger', + page: 'Game', + onChange: (to, from) => { + if (!onPage('Game') && !onPage('Spectate')) return; + if (to) { + $('#history').hide(); + } else { + $('#history').show(); + } + }, +}); + +settings.register({ + name: 'Hide Dust Counter', + key: 'underscript.disable.dust', + type: 'select', + default: 'always', + options: ['never', 'playing', 'spectating', 'always'], + page: 'Game', +}); + +settings.register({ + name: 'Dust Counter Location', + key: 'underscript.dust.location', + type: 'select', + options: [], + disabled: true, + hidden: true, + page: 'Game', +}); + +eventManager.on('GameStart', function battleLogger() { + const ignoreEvents = Object.keys({ + getEmote: 'Player is using emote', + getConnectedFirst: '', + refreshTimer: 'Never need to know about this one', + getPlayableCards: 'On turn start, selects cards player can play', + getTurn: 'Turn update', + getCardDrawed: 'Add card to your hand', + updateSpell: '', + getFakeDeath: 'Card "died" and respawns 1 second later', + getMonsterTemp: 'You\'re about to play a monster', + getSpellTemp: 'You\'re about to play a spell', + getTempCancel: 'Temp card cancelled', + getShowMulligan: 'Switching out hands, ignore it', + getHideMulligan: 'Hide the mulligan, gets called twice', + getUpdateHand: 'Updates full hand', + getError: 'Takes you to "home" on errors, can be turned into a toast', + getGameError: 'Takes you to "play" on game errors, can be turned into a toast', + getBattleLog: 'In-game battle log', + getBotDelay: '...', + clearSpell: '', + getPlaySound: '', + getAnimation: '', + }); + const turnText = '>>> Turn'; + let baseLives = 1; + let turn = 0; + let currentTurn = 0; + const players = {}; + let monsters = {}; + let lastEffect; + const other = {}; + let yourDust; + let enemyDust; + let lastSP; + function addDust(player) { + if (!player || !players[player]) return; + const display = player === global('userId') ? yourDust : enemyDust; + const dust = typeof players[player].dust === 'undefined' ? players[player].dust = 0 : players[player].dust += 1; + display.html(dust); + } + const make = { + player: function makePlayer(player, title = false) { + const c = $(''); + c.append(``, ' ', fn.user.name(player)); + c.addClass(player.class); + if (!title) { + c.css('text-decoration', 'underline'); + // show lives, show health, show gold, show hand, possibly deck size as well + const data = `${player.hp} hp, ${player.gold} gold
    ${player.dust} dust`; + c.hover(hover.show(data, '2px solid white')); + } + return c; + }, + card: function makeCard(card) { + const c = $(''); + c.append(card.name); + c.css('text-decoration', 'underline'); + + const d = $('
    '); + const appendCard = global('appendCard'); + try { + appendCard(card, d); + } catch (e) { // if he ever decides to switch it again....... + appendCard(d, card); + } + c.hover(hover.show(d)); + return c; + }, + }; + + eventManager.on('connect', function initBattle(data) { + debug(data, 'debugging.raw.game'); + const you = JSON.parse(data.you); + const enemy = JSON.parse(data.enemy); + // Set gold + const gold = JSON.parse(data.golds); + you.gold = gold[you.id]; + enemy.gold = gold[enemy.id]; + // populate monsters + JSON.parse(data.board).forEach((card, i) => { + if (card === null) return; + // id, attack, hp, maxHp, originalattack, originalHp, typeCard, name, image, cost, originalCost, rarity, shiny, quantity + card.owner = i < 4 ? enemy.id : you.id; + monsters[card.id] = card; + }); + you.level = data.yourLevel; + you.class = data.yourSoul; + you.rank = data.yourRank; + enemy.level = data.enemyLevel; + enemy.class = data.enemySoul; + enemy.rank = data.enemyRank; + // yourArtifacts, yourAvatar {id, image, name, rarity, ucpCost}, division, oldDivision, profileSkin {id, name, image, ucpCost} + debug({ you, enemy }, 'debugging.game'); + turn = data.turn || 0; + players[you.id] = you; + players[enemy.id] = enemy; + // Display Dust + const disableDust = settings.value('underscript.disable.dust'); + yourDust = $(''); + enemyDust = $(''); + if (disableDust === 'never' || (disableDust !== 'always' && disableDust !== (this.event === 'getAllGameInfos' ? 'spectating' : 'playing'))) { + const dustImg = $(''); + $('.rightPart').append(dustImg, ' '); + $(`#user${global('opponentId')} .rightPart`).append(enemyDust, ' '); + const userId = global('userId'); + $(`#user${userId} .rightPart`).append(yourDust, ' ', $(`#user${userId} .rightPart > button:last`)); + } + // Set lives + if (data.lives) { + const lives = JSON.parse(data.lives); + you.lives = lives[you.id]; + enemy.lives = lives[enemy.id]; + } else { + baseLives = 0; + updateSoul({ + idPlayer: you.id, + soul: you.soul, + }); + updateSoul({ + idPlayer: enemy.id, + soul: enemy.soul, + }); + } + addDust(you.id); + addDust(enemy.id); + // Test changing ID's at endTurn instead of startTurn + other[you.id] = enemy.id; + other[enemy.id] = you.id; + // Initialize the log + log.init(); + if (settings.value('underscript.disable.logger')) { + $('#history').hide(); + } + $('div#history div.handle').html('').append(`[${data.gameType}] `, make.player(you), ' vs ', make.player(enemy)); + log.add(`${turnText} ${turn}`); + if (data.userTurn) { + currentTurn = data.userTurn; + log.add(make.player(players[data.userTurn]), '\'s turn'); + } + }); + eventManager.on('getFight getFightPlayer', function fight(data) { + const target = this.event === 'getFightPlayer' ? make.player(players[data.defendPlayer]) : make.card(monsters[data.defendMonster]); + log.add(make.card(monsters[data.attackMonster]), ' attacked ', target); + }); + eventManager.on('getUpdatePlayerHp', function updateHP(data) { + debug(data, 'debugging.raw.updateHP'); + const oHp = players[data.playerId].hp; + const hp = data.isDamage ? oHp - data.hp : data.hp - oHp; + players[data.playerId].hp = data.hp; + if (oHp !== data.hp) { // If the player isn't at 0 hp already + log.add(make.player(players[data.playerId]), ` ${data.isDamage ? 'lost' : 'gained'} ${hp} hp`); + } + // eslint-disable-next-line no-prototype-builtins + if (data.hp === 0 && players[data.playerId].lives > baseLives && !players[data.playerId].hasOwnProperty('lostLife')) { // If they have extra lives, and they didn't lose a life already + log.add(make.player(players[data.playerId]), ' lost a life'); + players[data.playerId].lostLife = true; + } + }); + eventManager.on('getDoingEffect', function doEffect(data) { + debug(data, 'debugging.raw.effect'); + if (data.card) { + const card = JSON.parse(data.card); + monsters[card.id] = card; + data.monsterId = card.id; + } + // affecteds: [ids]; monsters affected + // playerAffected1: id; player affected + // playerAffected2: id; player affected + // TODO: Figure out how to do this better + if (lastEffect === `m${data.monsterId}`) return; + lastEffect = `m${data.monsterId}`; + log.add(make.card(monsters[data.monsterId]), '\'s effect activated'); + }); + eventManager.on('getArtifactDoingEffect', function doEffect(data) { + debug(data, 'debugging.raw.effectArtifact'); + if (lastEffect === `a${data.playerId}`) return; + lastEffect = `a${data.playerId}`; + log.add(make.player(players[data.playerId]), '\'s artifact activated'); + }); + eventManager.on('getSoulDoingEffect', function soulEffect(data) { + debug(data, 'debugging.raw.effectSoul'); + if (lastEffect === `s${data.playerId}`) return; + lastEffect = `s${data.playerId}`; + log.add(make.player(players[data.playerId]), '\'s soul activated'); + // affecteds + // playerAffected1 + // playerAffected2 + }); + eventManager.on('getTurnStart', function turnStart(data) { + debug(data, 'debugging.raw.turnStart'); + lastEffect = 0; + if (data.numTurn !== turn) { + log.add(`${turnText} ${data.numTurn}`); + } + currentTurn = data.idPlayer; // It would (kindof) help to actually update who's turn it is + turn = data.numTurn; + log.add(make.player(players[currentTurn]), '\'s turn'); + }); + eventManager.on('getTurnEnd', function turnEnd(data) { + debug(data, 'debugging.raw.turnEnd'); + // Lets switch the turn NOW, rather than later, the purpose of this is currently unknown... It just sounded like a good idea, also delete the "lostLife" flag... + if (global('time') <= 0) { + log.add(make.player(players[currentTurn]), ' timed out'); + } + delete players[currentTurn].lostLife; + currentTurn = other[data.idPlayer]; + delete players[currentTurn].lostLife; + lastEffect = 0; + lastSP = 0; + }); + eventManager.on('getUpdateBoard', function updateGame(data) { + debug(data, 'debugging.raw.boardUpdate'); + // const oldMonsters = monsters; + monsters = {}; + // TOOD: stuff.... + JSON.parse(data.board).forEach((card, i) => { + if (card === null) return; + card.owner = global(i < 4 ? 'opponentId' : 'userId'); + monsters[card.id] = card; + }); + }); + eventManager.on('updateMonster updateCard', function updateCard(data) { + data.monster = JSON.parse(data.monster || data.card); + debug(data, 'debugging.raw.updateMonster'); + const card = data.monster; + monsters[card.id] = fn.merge(monsters[card.id], card); + }); + eventManager.on('getMonsterDestroyed', function monsterKilled(data) { + debug(data, 'debugging.raw.kill'); + // monsterId: # + log.add(make.card(monsters[data.monsterId]), ' was killed'); + addDust(monsters[data.monsterId].owner); + delete monsters[data.monsterId]; + }); + eventManager.on('getCardBoard getMonsterPlayed', function playCard(data) { // Adds card to X, Y (0(enemy), 1(you)) + debug(data, 'debugging.raw.boardAdd'); + const card = JSON.parse(data.card); + card.owner = data.idPlayer; + monsters[card.id] = card; + log.add(make.player(players[data.idPlayer]), ' played ', make.card(card)); + }); + eventManager.on('getSpellPlayed', function useSpell(data) { + debug(data, 'debugging.raw.spell'); + // immediately calls "getDoingEffect" and "getUpdateBoard" + const card = JSON.parse(data.card); + if (lastSP === card.id) return; + lastSP = card.id; + card.owner = data.idPlayer; + monsters[card.id] = card; + log.add(make.player(players[data.idPlayer]), ' used ', make.card(card)); + }); + eventManager.on('getShowCard', function showCard(data) { + const card = JSON.parse(data.card); + log.add(make.player(players[data.idPlayer]), ' exposed ', make.card(card)); + }); + eventManager.on('getCardDestroyedHandFull', function destroyCard(data) { + debug(data, 'debugging.raw.fullHand'); + const card = JSON.parse(data.card); + debug(data.card, 'debugging.destroyed.card'); + // This event gets called for *all* discards. Have to do smarter logic here (not just currentTurn!) + log.add(make.player(players[data.idPlayer || currentTurn]), ' discarded ', make.card(card)); + }); + eventManager.on('getPlayersStats', function updatePlayer(data) { // TODO: When does this get called? + debug(data, 'debugging.raw.stats'); + let temp = JSON.parse(data.handsSize); + Object.keys(temp).forEach((key) => { + // TODO: hand size monitoring + // players[key].hand + }); + // TODO: deck monitoring (decksSize) + temp = JSON.parse(data.golds); + Object.keys(temp).forEach((key) => { + players[key].gold = temp[key]; + }); + if (data.lives) { + temp = JSON.parse(data.lives); + Object.keys(temp).forEach((key) => { + players[key].lives = temp[key]; + }); + } + // data.artifcats + // data.turn + }); + eventManager.on('getVictory getDefeat', function gameEnd(data) { + debug(data, 'debugging.raw.end'); + const userId = global('userId'); + const opponentId = global('opponentId'); + const you = make.player(players[userId]); + const enemy = make.player(players[opponentId]); + if (this.event === 'getDefeat') { + log.add(enemy, ' beat ', you); + return; + } + if (data.disconnected) { + log.add(enemy.clone(), ' left the game.'); + } else if (players[opponentId].hp > 0) { + log.add(enemy.clone(), ' surrendered.'); + } + log.add(you, ' beat ', enemy); + }); + eventManager.on('getResult', function endSpectating(data) { + debug(data, 'debugging.raw.end'); + if (data.cause === 'game-end-surrender') { + log.add(`${data.looser} surrendered.`); + } else if (data.cause === 'game-end-disconnection') { + log.add(`${data.looser} left the game.`); + } + if (typeof music !== 'undefined') { + global('music').addEventListener('playing', () => { + if (localStorage.getItem('gameMusicDisabled')) { + global('music').pause(); + } + }); + } + // TODO: colorize + log.add(`${data.winner} beat ${data.looser}`); + }); + eventManager.on(ignoreEvents.join(' '), function ignore(data) { + debug(data, 'debugging.raw.ignore'); + debug(data, `debugging.raw.ignore.${this.event}`); + }); + eventManager.on('getUpdateSoul', function blah(data) { + updateSoul({ + idPlayer: data.idPlayer, + soul: JSON.parse(data.soul), + }); + }); + + function updateSoul({ idPlayer, soul = {} }) { + const player = players[idPlayer]; + player.lives = soul.lives || 0; + player.dodge = soul.dodge || 0; + } + + const log = { + init() { + const hi = $('
    '); + const ha = $('
    History
    '); + const lo = $('
    '); + // Positional math -- not working anymore?? + const mainContent = $('div.mainContent'); + mainContent.css('position', 'initial'); + const pos = parseInt(mainContent.css('width'), 10) + parseInt(mainContent.css('margin-left'), 10); + mainContent.css('position', ''); + hi.css({ + width: `${window.innerWidth - pos - 20}px`, + border: '2px solid white', + 'background-color': 'rgba(0,0,0,0.9)', + position: 'absolute', + right: 10, + top: 10, + 'z-index': 20, + }); + ha.css({ + 'border-bottom': '1px solid white', + 'text-align': 'center', + }); + lo.css({ + display: 'flex', + 'flex-direction': 'column-reverse', + 'align-items': 'flex-start', + 'overflow-y': 'auto', + 'max-height': '600px', + }); + hi.append(ha); + hi.append(lo); + $('body').append(hi); + }, + add(...args) { + const div = $('
    '); + args.forEach((a) => { + div.append(a); + }); + if (!div.html()) return; + $('div#history div#log').prepend(div); + }, + }; +}); diff --git a/src/base/game/commands/gg.js b/src/base/game/commands/gg.js new file mode 100644 index 00000000..4edc1714 --- /dev/null +++ b/src/base/game/commands/gg.js @@ -0,0 +1,21 @@ +eventManager.on('ChatDetected', function goodGame() { + const list = ['good game', 'gg', 'Good Game', 'Good game']; + const command = 'gg'; + const setting = settings.register({ + name: `Disable ${command} command`, + key: `underscript.command.${command}`, + note: `/${command}`, + page: 'Chat', + category: 'Commands', + }); + + if (!onPage('Game')) return; + eventManager.on('Chat:command', function ggCommand(data) { + if (this.canceled || data.command !== command || setting.value()) return; + if (typeof gameId === 'undefined') { + this.canceled = true; // Don't send text + return; + } + data.output = `@${$el.text.get(document.querySelector('#enemyUsername'))} ${list[fn.rand(list.length)]}`; // Change the output + }); +}); diff --git a/src/base/game/commands/spectate.js b/src/base/game/commands/spectate.js new file mode 100644 index 00000000..9eda8c65 --- /dev/null +++ b/src/base/game/commands/spectate.js @@ -0,0 +1,29 @@ +wrap(function spectate() { + const setting = settings.register({ + name: 'Disable spectate command', + key: 'underscript.command.spectate', + note: '/spectate [text (optional)]
    Output:
    You vs Enemy: url [text]', + page: 'Chat', + category: 'Commands', + }); + + let toast; + eventManager.on('Chat:command', function spectateCommand(data) { + if (this.canceled || data.command !== 'spectate' || setting.value()) return; + if (typeof gameId === 'undefined' || global('finish')) { + this.canceled = true; + return; + } + if (toast) toast.close(); + data.output = `${$('#yourUsername').text()} vs ${$('#enemyUsername').text()}: ${location.origin}/Spectate?gameId=${global('gameId')}&playerId=${global('userId')}${data.text ? ` - ${data.text}` : ''}`; + }); + + eventManager.on('GameStart', () => { + toast = fn.infoToast({ + text: 'You can send a spectate URL in chat by typing /specate', + onClose() { + toast = null; + }, + }, 'underscript.notice.spectatecommand', '1'); + }); +}); diff --git a/src/base/game/emotes.js b/src/base/game/emotes.js new file mode 100644 index 00000000..b5fb8458 --- /dev/null +++ b/src/base/game/emotes.js @@ -0,0 +1,59 @@ +wrap(function emoteManager() { + // let live = false; + let self; + const spectating = onPage('Spectate'); + const spectate = settings.register({ + name: 'Show when spectating', + key: 'underscript.emote.spectate', + default: true, + page: 'Game', + category: 'Emotes', + }); + const friends = settings.register({ + name: 'Friends only', + key: 'underscript.emote.friends', + page: 'Game', + category: 'Emotes', + }); + const enemy = settings.register({ + name: 'Disable enemy', + key: 'underscript.emote.enemy', + page: 'Game', + category: 'Emotes', + }); + + eventManager.on('GameStart', () => { + eventManager.on(':loaded', () => { + self = global('selfId'); + // live = true; + if (disableSpectating()) { + globalSet('gameEmotesEnabled', false); + debug('Hiding emotes (spectator)'); + } else { + const muteEnemy = enemy.value(); + globalSet('enemyMute', muteEnemy); + if (muteEnemy) { + debug('Hiding emotes (enemy)'); + $('#enemyMute').toggle(!spectating); + } + } + }); + }); + + eventManager.on('getEmote:before', function hideEmotes(data) { + // Do nothing if already disabled + if (this.canceled || !global('gameEmotesEnabled')) return; + if (friendsOnly(data.idUser)) { + debug('Hiding emote (friends)'); + this.canceled = true; + } + }); + + function disableSpectating() { + return spectating && !spectate.value(); + } + + function friendsOnly(id) { + return friends.value() && id !== self && !global('isFriend')(id); + } +}); diff --git a/src/base/game/endTurnDelay.js b/src/base/game/endTurnDelay.js new file mode 100644 index 00000000..3c5869e0 --- /dev/null +++ b/src/base/game/endTurnDelay.js @@ -0,0 +1,28 @@ +settings.register({ + name: 'Disable End Turn Waiting', + key: 'underscript.disable.endTurnDelay', + page: 'Game', +}); + +settings.register({ + name: 'End Turn Wait Time', + key: 'underscript.endTurnDelay', + type: 'select', + options: [], + disabled: true, + hidden: true, + page: 'Game', +}); + +eventManager.on('PlayingGame', function endTurnDelay() { + eventManager.on('getTurnStart', function checkDelay() { + if (global('userTurn') !== global('userId')) return; + if (global('turn') > 3 && !settings.value('underscript.disable.endTurnDelay')) { + debug('Waiting'); + $('#endTurnBtn').prop('disabled', true); + sleep(3000).then(() => { + $('#endTurnBtn').prop('disabled', false); + }); + } + }); +}); diff --git a/src/base/game/endTurnSafety.js b/src/base/game/endTurnSafety.js new file mode 100644 index 00000000..238e1a95 --- /dev/null +++ b/src/base/game/endTurnSafety.js @@ -0,0 +1,15 @@ +eventManager.on('PlayingGame', function fixEndTurn() { + eventManager.on(':load', () => { + let endedTurn = false; + globalSet('endTurn', function endTurn() { + if (endedTurn || $('#endTurnBtn').prop('disabled')) return; + endedTurn = true; + this.super(); + }); + + eventManager.on('getTurnStart', function turnStarted() { + if (global('userTurn') !== global('userId')) return; + endedTurn = false; + }); + }); +}); diff --git a/src/base/game/gameLog.js b/src/base/game/gameLog.js new file mode 100644 index 00000000..ba1ae159 --- /dev/null +++ b/src/base/game/gameLog.js @@ -0,0 +1,50 @@ +wrap(() => { + style.add( + '#game-history.left { width: 75px; left: -66px; top: 70px; overflow-y: auto; right: initial; height: 426px; }', + '#game-history.left::-webkit-scrollbar { width: 8px; background-color: unset; }', + '#game-history.left::-webkit-scrollbar-thumb { background-color: #555; }', + '#game-history.hidden { display: none; }', + '.timer.active { left: -65px; height: 26px; line-height: 22px; top: 497px; }', + // '.timer.active.ally { top: 526px; }', + // '.timer.active.enemy { top: 39px; }', + ); + + let gameActive = false; + const BattleLogSetting = 'underscript.disable.logger'; + const setting = settings.register({ + name: 'Disable Undercards Battle Log', + key: 'underscript.disable.gamelog', + page: 'Game', + onChange: (to) => { + if (gameActive) toggle(to); + }, + }); + + eventManager.on('GameStart', () => { + gameActive = true; + eventManager.on(':load', () => { + if (setting.value()) toggle(true); + if (!settings.value(BattleLogSetting)) { + toggle(true, 'left'); + timer(true); + } + }); + + settings.on(BattleLogSetting, ({ val: to }) => { + toggle(!to, 'left'); + timer(!to); + }); + + eventManager.on('getBattleLog', (data) => { + // appendBattleLog + }); + }); + + function toggle(to, clazz = 'hidden') { + $('#game-history').toggleClass(clazz, to); + } + + function timer(apply) { + $('div.timer').toggleClass('active', apply); + } +}); diff --git a/src/base/game/hideSpells.js b/src/base/game/hideSpells.js new file mode 100644 index 00000000..28ba356b --- /dev/null +++ b/src/base/game/hideSpells.js @@ -0,0 +1,8 @@ +eventManager.on('getTurnEnd getTurnStart getPlayableCards', function hideSpells() { + // Remove stale cards + const spells = $('.spellPlayed'); + if (spells.length) { + spells.remove(); + debug(`(${this.event}) Removed spell`); + } +}); diff --git a/src/base/game/hotkeys/endTurn.js b/src/base/game/hotkeys/endTurn.js new file mode 100644 index 00000000..5b4cb7d6 --- /dev/null +++ b/src/base/game/hotkeys/endTurn.js @@ -0,0 +1,61 @@ +wrap(() => { + const fullDisable = settings.register({ + name: 'Disable End Turn Hotkey', + key: 'underscript.disable.endTurn', + page: 'Game', + category: 'Hotkeys', + }); + const spaceDisable = settings.register({ + name: 'Disable End Turn with Space', + key: 'underscript.disable.endTurn.space', + disabled: () => fullDisable.value(), + refresh: () => typeof gameId !== 'undefined', + page: 'Game', + category: 'Hotkeys', + }); + const mouseDisable = settings.register({ + name: 'Disable End Turn with Middle Click', + key: 'underscript.disable.endTurn.middleClick', + disabled: () => fullDisable.value(), + refresh: () => typeof gameId !== 'undefined', + page: 'Game', + category: 'Hotkeys', + }); + + eventManager.on('PlayingGame', function bindHotkeys() { + // Binds to Space, Middle Click + const hotkey = new Hotkey('End turn').run((e) => { + if (fullDisable.value()) return; + if (!$(e.target).is('#endTurnBtn') && global('userTurn') === global('userId')) global('endTurn')(); + }); + if (!spaceDisable.value()) { + hotkey.bindKey(32); + } + if (!mouseDisable.value()) { + hotkey.bindClick(2); + } + hotkeys.push(hotkey); + + if (!fullDisable.value() && !spaceDisable.value() && !mouseDisable.value()) { + fn.infoToast({ + text: 'You can skip turns with space and middle mouse button. (These can be disabled in settings)', + className: 'dismissable', + buttons: { + text: 'Open Settings', + className: 'dismiss', + css: { + border: '', + height: '', + background: '', + 'font-size': '', + margin: '', + 'border-radius': '', + }, + onclick: (e) => { + settings.open('Game'); + }, + }, + }, 'underscript.notice.endTurn.hotkeys', '1'); + } + }); +}); diff --git a/src/base/game/persistBGM.js b/src/base/game/persistBGM.js new file mode 100644 index 00000000..0b8c0d8b --- /dev/null +++ b/src/base/game/persistBGM.js @@ -0,0 +1,33 @@ +wrap(() => { + const setting = settings.register({ + name: 'Persist Arena (Background and Music)', + key: 'underscript.persist.bgm', + default: true, + refresh: window.gameId !== undefined, + page: 'Game', + }); + + eventManager.on('GameStart', () => { + eventManager.on('connect', (data) => { + const val = sessionStorage.getItem(`underscript.bgm.${data.gameId}`); + if (setting.value() && val) { + $('body').css('background', `#000 url('images/backgrounds/${val}.png') no-repeat`); + } + }); + + eventManager.on(':loaded', () => { + globalSet('playBackgroundMusic', function playBackgroundMusic(sound) { + if (setting.value()) { + const key = `underscript.bgm.${global('gameId')}`; + const background = sessionStorage.getItem(key); + if (background) { + return this.super(background); + } + + sessionStorage.setItem(key, sound); + } + return this.super(sound); + }); + }); + }); +}); diff --git a/src/base/game/restoreSound.js b/src/base/game/restoreSound.js new file mode 100644 index 00000000..3456372c --- /dev/null +++ b/src/base/game/restoreSound.js @@ -0,0 +1,14 @@ +// Restore sound on refresh +eventManager.on('getReconnection connect', () => { + if (settings.value('gameMusicDisabled')) return; + let playing = false; + const music = global('music'); + music.addEventListener('play', () => { + playing = true; + }); + function restoreSound() { + if (playing) return; + music.play(); + } + document.addEventListener('click', restoreSound, { once: true, passive: true }); +}); diff --git a/src/base/game/resultToast.js b/src/base/game/resultToast.js new file mode 100644 index 00000000..c641520b --- /dev/null +++ b/src/base/game/resultToast.js @@ -0,0 +1,28 @@ +settings.register({ + name: 'Disable Result Toast', + key: 'underscript.disable.resultToast', + page: 'Game', +}); + +eventManager.on('getResult:before', function resultToast() { + if (settings.value('underscript.disable.resultToast')) return; + // We need to mark the game as finished (like the source does) + globalSet('finish', true); + this.canceled = true; + const toast = { + title: 'Game Finished', + text: 'Return Home', + buttons: { + className: 'skiptranslate', + text: '🏠', + }, + css: { + 'font-family': 'inherit', + button: { background: 'rgb(0, 0, 20)' }, + }, + onClose: () => { + document.location.href = '/'; + }, + }; + fn.toast(toast); +}); diff --git a/src/base/game/screenshake.js b/src/base/game/screenshake.js new file mode 100644 index 00000000..443955e8 --- /dev/null +++ b/src/base/game/screenshake.js @@ -0,0 +1,24 @@ +settings.register({ + name: 'Disable Screen Shake', + key: 'underscript.disable.rumble', + options: ['Never', 'Always', 'Spectate'], + type: 'select', + page: 'Game', +}); + +eventManager.on('GameStart', function rumble() { + eventManager.on(':loaded', () => { + const spectating = onPage('Spectate'); + globalSet('shakeScreen', function shakeScreen(...args) { + if (!disabled()) this.super(...args); + }); + + function disabled() { + switch (settings.value('underscript.disable.rumble')) { + case 'Spectate': return spectating; + case 'Always': return true; + default: return false; + } + } + }); +}); diff --git a/src/base/game/surrender.menu.js b/src/base/game/surrender.menu.js new file mode 100644 index 00000000..8db33c62 --- /dev/null +++ b/src/base/game/surrender.menu.js @@ -0,0 +1,25 @@ +onPage('Game', () => { + // Unbind the "surrender" hotkey + eventManager.on('jQuery', () => { + $(document).off('keyup'); + }); + function canSurrender() { + return global('turn') >= 5; + } + // Add the "surrender" menu button + menu.addButton({ + text: 'Surrender', + enabled: canSurrender, + top: true, + note: () => { + if (!canSurrender()) { + return `You can't surrender before turn 5.`; + } + }, + action: () => { + const socket = global('socketGame'); + if (socket.readyState !== WebSocket.OPEN) return; + socket.send(JSON.stringify({ action: 'surrender' })); + }, + }); +}); diff --git a/src/base/game/tag.opponent.js b/src/base/game/tag.opponent.js new file mode 100644 index 00000000..af1d5c03 --- /dev/null +++ b/src/base/game/tag.opponent.js @@ -0,0 +1,34 @@ +wrap(() => { + const tag = settings.register({ + name: 'Highlight opponents in chat', + key: 'underscript.tag.opponent', + default: true, + page: 'Chat', + }); + + style.add('.opponent { color: #d94f41 !important; }'); + + eventManager.on('PlayingGame', function tagOpponent() { + let toast; + function processMessage(message, room) { + if (message.user.id === global('opponentId') && tag.value()) { + if (!toast) { + toast = fn.infoToast('Opponents are now highlighted in chat.', 'underscript.notice.highlighting.opponent', '1'); + } + $(`#${room} #message-${message.id} .chat-user`).addClass('opponent'); + if (message.me) { // emotes + $(`#${room} #message-${message.id} .chat-message`).addClass('opponent'); + } + } + } + + eventManager.on('Chat:getHistory', (data) => { + JSON.parse(data.history).forEach((message) => { + processMessage(message, data.room); + }); + }); + eventManager.on('Chat:getMessage', function tagFriends(data) { + processMessage(JSON.parse(data.chatMessage), data.room); + }); + }); +}); diff --git a/src/base/hotkeys/menu.js b/src/base/hotkeys/menu.js new file mode 100644 index 00000000..b0a06a9f --- /dev/null +++ b/src/base/hotkeys/menu.js @@ -0,0 +1,12 @@ +hotkeys.push(new Hotkey('Open Menu') + .run((e) => { + if (typeof BootstrapDialog !== 'undefined' && Object.keys(BootstrapDialog.dialogs).length) { + return; + } + if (menu.isOpen()) { + menu.close(); + } else { + menu.open(); + } + }) + .bindKey(27)); diff --git a/src/base/hub/missingImport.js b/src/base/hub/missingImport.js new file mode 100644 index 00000000..e2bf9061 --- /dev/null +++ b/src/base/hub/missingImport.js @@ -0,0 +1,40 @@ +wrap(() => { + style.add( + '.missingArt { color: orange; }', + '.missing { color: red; }', + ); + + function init() { + globalSet('showPage', function showPage(page) { + this.super(page); + thing(page * 10); + }); + fn.dismissable({ + title: 'Did you know?', + text: `An orange arrow means you're missing artifact(s) and a red arrow means you're missing card(s)`, + key: 'underscript.notice.hubImport', + }); + } + + function thing(start) { + const pages = global('pages'); + for (let i = start; i < start + 10 && i < pages.length; i++) { + check(pages[i]); + } + } + + function check({ code, id }) { + const checkArt = global('ownArtifactHub'); + const deck = JSON.parse(atob(code)); + const missingCard = global('getOwnedCardsArrayHub')(deck).some((a) => !a); + const missingArt = deck.artifactIds.some((art) => !checkArt(art)); + + $(`#hub-deck-${id} .show-button`) + .toggleClass('missingArt', missingArt) + .toggleClass('missing', missingCard); + } + + onPage('Hub', () => { + eventManager.on(':loaded', init); + }); +}); diff --git a/src/base/ignorelist.js b/src/base/ignorelist.js new file mode 100644 index 00000000..462c2079 --- /dev/null +++ b/src/base/ignorelist.js @@ -0,0 +1,4 @@ +fn.each(localStorage, (name, key) => { + if (!key.startsWith('underscript.ignore.')) return; + fn.ignoreUser(name, key); +}); diff --git a/src/base/lastpass.js b/src/base/lastpass.js new file mode 100644 index 00000000..3f1bff7b --- /dev/null +++ b/src/base/lastpass.js @@ -0,0 +1,11 @@ +eventManager.on(':loaded', () => { + if (onPage('Settings') || onPage('SignUp') || onPage('SignIn')) return; + const type = 'input[type="text"]'; + [...document.querySelectorAll(type)].forEach((el) => { + el.dataset.lpignore = true; + }); + + eventManager.on('Chat:getHistory', (data) => { + document.querySelector(`#${data.room} ${type}`).dataset.lpignore = true; + }); +}); diff --git a/src/base/leaderboard/goto.js b/src/base/leaderboard/goto.js new file mode 100644 index 00000000..3c59f506 --- /dev/null +++ b/src/base/leaderboard/goto.js @@ -0,0 +1,68 @@ +wrap(() => { + if (!onPage('leaderboard')) return; + const data = getData(); + const skip = new VarStore(true); + let replacePage; + + function set(type, value, replace = true) { + if (history.state && + Object.prototype.hasOwnProperty.call(history.state, type) && + history.state[type] === value) return; + const func = replace && !userLast() ? history.replaceState : history.pushState; + const o = {}; + o[type] = value; + func.call(history, o, document.title, `?${type}=${value}`); + } + + window.addEventListener('popstate', () => { + if (!history.state) return; + if (document.readyState === 'complete') load(history.state); + else eventManager.on(':loaded', () => debug('!!!pop unready'), load(history.state)); + }); + + eventManager.on('Rankings:selectPage', () => { + replacePage = false; + }); + eventManager.on('Rankings:init', () => load(data)); + + eventManager.on(':loaded', () => { + globalSet('showPage', function showPage(page) { + this.super(page); + if (skip.get()) return; + set('page', page, replacePage); + replacePage = undefined; + }); + + globalSet('findUserRow', function findUserRow(user) { + const row = this.super(user); + skip.set(row !== -1); + set('user', user, false); + return row; + }); + }); + + eventManager.on('Rankings:selectPage', () => { + replacePage = false; + }); + + function load({ page, user } = {}) { + if (user) { + $('#searchInput').val(user).submit(); + } else if (page !== undefined) { + fn.changePage(page); + } + } + + function getData() { + const o = {}; + const d = decodeURIComponent; + location.search.substring(1).replace(/([^=&]+)=([^&]*)/g, (m, k, v) => { + o[d(k)] = d(v); + }); + return o; + } + + function userLast() { + return history.state && history.state.user; + } +}); diff --git a/src/base/leaderboard/notFound.js b/src/base/leaderboard/notFound.js new file mode 100644 index 00000000..84ac5d11 --- /dev/null +++ b/src/base/leaderboard/notFound.js @@ -0,0 +1,17 @@ +onPage('leaderboard', () => { + const toasts = {}; + eventManager.on(':loaded', () => { + globalSet('findUserRow', function findUserRow(user) { + const row = this.super(user); + if (row === -1) { + if (!toasts[user] || !toasts[user].exists()) { + toasts[user] = fn.toast({ + title: 'Not ranked', + text: `Unfortunately ${user} has not qualified to be ranked, or the user does not exist.`, + }); + } + } + return row; + }); + }); +}); diff --git a/src/base/leaderboard/page.js b/src/base/leaderboard/page.js new file mode 100644 index 00000000..fc79f06d --- /dev/null +++ b/src/base/leaderboard/page.js @@ -0,0 +1,42 @@ +wrap(() => { + if (!onPage('leaderboard')) return; + const select = document.createElement('select'); + select.value = 0; + select.id = 'selectPage'; + function init() { + $('#currentPage').after(select).hide(); + const local = $(select); + const maxPage = global('getMaxPage')(); + for (let i = 0; i <= maxPage; i++) { + local.append(``); + } + } + + function changePage(page) { + select.value = page; + if (typeof page !== 'number') page = parseInt(page, 10); + globalSet('currentPage', page); + global('showPage')(page); + $('#btnNext').prop('disabled', page === global('getMaxPage')()); + $('#btnPrevious').prop('disabled', page === 0); + $('#btnFirst').prop('disabled', page === 0); + } + + eventManager.on(':loaded', () => { + select.onchange = () => { + changePage(select.value); + eventManager.emit('Rankings:selectPage', select.value); + }; + globalSet('initLeaderboard', function initLeaderboard(...args) { + this.super(...args); + init(); + eventManager.emit('Rankings:init'); + }); + globalSet('showPage', function showPage(page) { + this.super(page); + select.value = page; + }); + }); + + fn.changePage = changePage; +}); diff --git a/src/base/lobby/customFriendsOnly.js b/src/base/lobby/customFriendsOnly.js new file mode 100644 index 00000000..2c28c3f0 --- /dev/null +++ b/src/base/lobby/customFriendsOnly.js @@ -0,0 +1,32 @@ +wrap(function friendsOnly() { + const setting = settings.register({ + name: 'Friends only', + key: 'underscript.custom.friendsOnly', + note: 'Setting this will only allow friends to join custom games by default.', + page: 'Lobby', + category: 'Custom', + }); + const container = document.createElement('span'); + let flag = setting.value(); + + function init() { + $(container) + .append($(``).prop('checked', flag).on('change', () => { + flag = !flag; + })) + .append(' ', $('