diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..4be6e160 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +dist/* \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 00000000..19f8f6b8 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,67 @@ +module.exports = { + ignorePatterns: ['**/*.ignore.js', '**/*.ignore/*'], + extends: 'airbnb-base', + env: { + node: true, + es6: true, + }, + parserOptions: { + ecmaVersion: 'latest', + }, + rules: { + camelcase: ['warn', { ignoreGlobals: true }], + // Allow this behavior, but want to be aware of any possible issues + 'consistent-return': 'warn', + 'lines-between-class-members': ['error', 'always', { + exceptAfterSingleLine: true, + }], + // 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': ['warn', { 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', + 'import/no-mutable-exports': 'warn', + 'no-continue': 'off', + 'object-curly-newline': ['error', { multiline: true, consistent: true }], + 'operator-linebreak': ['error', 'after'], + quotes: ['error', 'single', { allowTemplateLiterals: true, avoidEscape: true }], + 'no-extra-boolean-cast': 'warn', + 'import/extensions': ['error', 'ignorePackages', { + ts: 'always', + js: 'always', + json: 'always', + }], + 'import/no-extraneous-dependencies': ['error', { + devDependencies: ['./scripts/**', './test/**', '*'], + optionalDependencies: false, + peerDependencies: false, + bundledDependencies: false, + }], + 'import/no-unresolved': ['error', { + ignore: ['src/'], + }], + 'max-len': ['error', { + code: 120, + ignoreComments: true, + ignoreRegExpLiterals: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + tabWidth: 2, + }], + }, +}; 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/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..2a9affcd --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,75 @@ +name: Auto-publish +on: + push: + branches: + - master + - next +jobs: + check: + runs-on: ubuntu-latest + outputs: + changed: ${{ steps.check.outputs.changed }} + version: ${{ steps.check.outputs.version }} + commit: ${{ steps.check.outputs.commit }} + beta: ${{ startsWith(steps.check.outputs.type, 'pre') }} + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Check version changes + uses: EndBug/version-check@v2 + id: check + latest: + name: Publish Latest + runs-on: ubuntu-latest + needs: check + if: contains(github.ref, 'master') && needs.check.outputs.changed == 'true' && needs.check.outputs.beta != 'true' + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ needs.check.outputs.commit }} + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + registry-url: "https://registry.npmjs.org" + - name: Install dependencies + run: npm install --include=dev + - name: Parse Changelog # Exits if changelog not found + id: changelog + env: + INPUT_VERSION: ${{ needs.check.outputs.version }} + run: node ./scripts/changelog/index.cjs + - name: Publish to NPM + run: npm publish # Publish builds automatically + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + SENTRY_DSN: ${{ vars.SENTRY_DSN }} + - name: Tag and Release + uses: softprops/action-gh-release@v1 + with: + tag_name: ${{ needs.check.outputs.version }} + target_commitish: ${{ needs.check.outputs.commit }} + body: ${{ steps.changelog.outputs.changes }} + files: | + dist/* + changelog.md + beta: + name: Publish Beta + runs-on: ubuntu-latest + needs: check + if: contains(github.ref, 'next') && needs.check.outputs.changed == 'true' && needs.check.outputs.beta == 'true' + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ needs.check.outputs.commit }} + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + registry-url: "https://registry.npmjs.org" + - name: Install dependencies + run: npm install + - name: Publish to NPM + run: npm publish --tag next # Publish builds automatically + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/translation.yml b/.github/workflows/translation.yml new file mode 100644 index 00000000..5183d3b6 --- /dev/null +++ b/.github/workflows/translation.yml @@ -0,0 +1,29 @@ +name: Bundle Translations +on: + workflow_dispatch: + push: + paths: + - 'lang/**' + - '!lang/undercards.json' +jobs: + bundle: + name: Bundle + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + registry-url: "https://registry.npmjs.org" + - name: Install dependencies + run: npm install + - name: Bundle + run: npm run bundle + - name: Commit + uses: EndBug/add-and-commit@v9 + with: + message: "chore: update translation file" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + diff --git a/.gitignore b/.gitignore index 9785d0b6..6f8bb85a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,9 @@ -/_site +/docs/_site /node_modules /dist +**/*.ignore* +/_site /.vscode -/src - -*.ignore.* \ No newline at end of file +/_features +/_api +/assets diff --git a/.mocharc.cjs b/.mocharc.cjs new file mode 100644 index 00000000..41e4516f --- /dev/null +++ b/.mocharc.cjs @@ -0,0 +1,3 @@ +module.exports = { + recursive: true, +}; diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 00000000..d70266b6 --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,27 @@ +{ + "extends": "stylelint-config-standard", + "overrides": [{ + "customSyntax": "@linaria/postcss-linaria", + "files": ["*.js", "src/**/*.js"] + }], + "rules": { + "block-closing-brace-newline-after": "always", + "block-closing-brace-newline-before": "always", + "block-opening-brace-newline-after": "always", + "color-function-notation": "legacy", + "color-hex-case": "upper", + "comment-empty-line-before": null, + "declaration-block-semicolon-newline-after": "always", + "declaration-block-trailing-semicolon": "always", + "function-comma-space-after": "always", + "function-comma-space-before": "never", + "no-invalid-double-slash-comments": null, + "rule-empty-line-before": null, + "selector-class-pattern": null, + "selector-type-no-unknown": [true, { + "ignoreTypes": ["extended"] + }], + "selector-id-pattern": null, + "string-quotes": "single" + } +} 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..c812e68d --- /dev/null +++ b/changelog.md @@ -0,0 +1,897 @@ +# UnderScript Changelog + +## Version 0.63.5 (2025-08-01) +1. Added `underscript.item` +1. Added `underscript.priority` +1. Added priority to `plugin.addFilter()` +1. Removed extra spacing in deck storage +1. Fixed "Grand Prize" in battle log +1. Fixed searching for "Grand Prize" in collection + +## Version 0.63.4 (2025-07-11) +1. Improved Deck/Crafting filters +1. Added `results` to `addFilter` callback +1. Restored old rarity behavior on Crafting page + +## Version 0.63.3 (2025-07-06) +1. Added Shiny filter on Decks page back + +## Version 0.63.2 (2025-07-06) +1. Fixed a translation error with friendship rewards +1. Fixed end turn hotkey toast not showing correct setting + +## Version 0.63.1 (2025-07-02) +1. Reverted "reversed settings" + - They were completely broken + +## Version 0.63.0 (2025-07-01) +Over 5000 line changes~ (in 250 files) +### Features +1. Added custom translation files for UnderScript text + - Work in progress, there's a lot of text in UnderScript... +1. Added ability to `transform` setting values +1. Added new "update" utility + - Used with UnderScript (and plugin) updates +1. Added setting to change auto update frequency +1. Added setting to run auto updates silently + - Only shows a notification if updates are found +1. Added setting to `Disable Plugin Updates` + - You can disable updates for each plugin as well + - Plugins must opt-in to use the updater before you can see this setting +1. Added `Pending Updates` window +1. Added more vanilla settings +1. Reversed some settings that were "enabled" when checked rather than "disabled" when checked. +### Fixes +1. Fixed list setting defaults not using the correct values +1. Fixed issues with "matching" advanced map keys +1. DT's are now craftable +1. Fixed `events.one` not passing event metadata +1. Fixed issue with `async` events not being async +1. Fixed battle log card names not using the correct name +1. Fixed quick craft not using correct name +1. Fixed error where Daily Rewards could say you have one less day +1. Fixed some bugs with `AdvancedMap` settings +### Plugins +1. Pack Items are now valid when using `openPacks` +1. `underscript:ready` event + - Called when UnderScript assets are loaded +1. Added plugin update checker + - When creating plugins use `underscript.plugin(name, version)` + - You ***must*** pass version to get access to `updater` + - Basic: `plugin.updater(downloadUrl)` + - Supports `github.com`, `gist.github.com` + - Github Release: `plugin.updater({ updateURL: '@USER/REPO' })` + +1. Fixed events not returning the proper value +1. Improved `addStyle()` code + - Added error when style is malformed +1. You can now pass defaults to `AdvancedMap`s + +## Version 0.62.5 (2025-05-20) +1. Fixed (another) bug with advanced map +1. Fixed bug with chat + +## Version 0.62.4 (2025-04-14) +1. Fixed bug with advanced map + +## Version 0.62.3 (2025-04-09) +1. Fixed bugs with game sounds (including April fools) + +## Version 0.62.2 (2025-04-09) +1. Fixed April Fools setting being too aggressive +1. Fixed April Fools messing up persistent background + +## Version 0.62.1 (2025-04-04) +1. Fixed plugins breaking when providing custom settings + +## Version 0.62.0 (2025-04-03) +### Fixes +1. April fools setting is no longer so greedy +1. April fools setting properly applies when home page refreshes +1. Minor bug fixes related to settings +### Plugins +1. Added `keybind` setting type +1. Added `advancedMap` setting type + + 1. `type: { key?: SettingType, value?: SettingType },` + +1. Added `underscript.utils.translateText()` +```ts + translateText(text: string, { + args: string[], + fallback?: string, + locale?: string, // translate as a specific language + }); +``` + + +## Version 0.61.0 (2025-04-01) +Surprise! April fools update. +### Fixes +1. Manual updates now fix broken update announcements +1. Updated April fools settings to work for this year +### Plugins +1. Added support for plugins to provide their version +1. Added `Settings:open` event +1. Added `plugin.events.compound(...events, callback)` +1. Added `plugin.version` +1. Added `disabled` to setting creation + +## Version 0.60.4 (2025-03-18) +1. Fixed notification sound turning off permanently + +## Version 0.60.3 (2025-03-17) +1. Due to popular demand, you are now prompted to keep `@underscript` +1. Fixes some bugs with toasts + +## Version 0.60.2 (2025-03-16) +1. Fixed quest progress notification (probably) + +## Version 0.60.1 (2025-03-15) +The great plugin (& bug fix) update +### Fixes +1. Deck Storage now translates card names +1. The CSS for settings no longer do silly things +1. Setting "reset" now allows a default value of 0 +1. Settings now always properly encode before saving +1. Stopped an error from happening when logged out +1. Broken settings no longer completely break the setting window +### Plugins +1. You can now edit settings while the setting window is open +1. Added `map` setting type +1. Allow event listeners to be turned off +1. Renamed event `:loaded` to `:preload` +1. Added `name` to setting creation + +## Version 0.60.0 (2025-03-15) +- See v0.60.1 + +## Version 0.59.0 (2025-01-31) +New release for a new year. Enjoy~ +### Fixes +1. Find pack prices smartly +1. Fixed some debug messages +### Plugins +1. Added `Home:Refresh` event +1. Added new `Item` keywords + +## Version 0.58.3 (2024-06-19) +1. Fixed friendship shiny packs + +## Version 0.58.2 (2024-05-29) +1. Fixed broken pack buying API +1. Added more cases where chat will reconnect + +## Version 0.58.1 (2024-05-24) +1. Re-enabled smart disenchant + - This is still at your own risk, and you must manually enable it in settings. + +## Version 0.58.0 (2024-04-27) +### New Features +1. Automatically attempt to reconnect to chat +1. Ignore self legend messages +### Plugin +1. Added [script](https://raw.githubusercontent.com/UCProjects/UnderScript/master/src/checkerV2.js) to validate underscript for plugins to utilize in their code + - This is easier to use than the [old one](https://raw.githubusercontent.com/UCProjects/UnderScript/master/src/checker.js) + +## Version 0.57.2 (2024-04-10) +1. Fixed display bug with cosmetic confirmation purchases +1. Fixed bug loading all cards +1. Fixed bug loading plugin styles + +## Version 0.57.1 (2024-04-06) +1. Made filtered buttons dimmer +1. Made Shiny filtered button bigger +1. Fixed collection dropdown filter translation error + +## Version 0.57.0 (2024-04-01) +### New Features +1. Added filter for tribes +1. Added filters for crafting collection +1. Cleaned the filter buttons so it looks less cluttered +### Misc. +1. Adjust music volume while in settings +### Plugin +1. Added method for plugins to add own collection filters `plugin.addFilter()` + +## Version 0.56.3 (2024-03-31) +1. Removed broken googletagmanager +1. Fixed broken sound code +1. Fixed broken backgrounds + +## Version 0.56.1 (2024-01-21) +1. Add support for older browsers + +## Version 0.56.0 (2023-10-22) +### Plugins +1. Added a few more Constants +1. Added `plugin.settings().value(key)` lookup + +## Version 0.55.6 (2023-10-19) +1. Breaking quest stuff, CMD_God will need to update :sad: + +## Version 0.55.5 (2023-10-17) +1. More quest stuff (Thank CMD_God) + +## Version 0.55.4 (2023-10-17) +1. Fix quest reward bug + +## Version 0.55.3 (2023-10-16) +1. Fixed another quest bug + +## Version 0.55.1 (2023-10-16) +1. Fixed quest detection + +## Version 0.55.0 (2023-10-15) +### New Features +1. Implement Bug Tracker (Sentry.io) +1. Quest Progress Toast +### Misc. +1. Update google analytics +### Plugins +1. `player:endTurn` event (cancelable) +1. `plugin.quests.update()`: Updates quests, returns `Promise.then({ quests, previous }).catch(error)` +1. `plugin.quests.getQuests()`: Gets currently cached quests (empty if update is not called) + +## Version 0.54.1 (2023-08-19) +1. (Really) Fixed `Collect All` friendship button +1. Re-enable play queue after 10 seconds + +## Version 0.54.0 (2023-07-08) +### New Features +1. Import deck via URL +### Fixes +1. Fixed `Collect All` frienship button +### Misc. +1. Removed `Disable Quick Opening Packs` setting + +## Version 0.53.1 (2023-07-02) +1. Fixed changelog +1. Fixed friendship ranking not loading sometimes + +## Version 0.53.0 (2023-05-23) +### New Features +1. Added craft/disenchant protection to prevent double clicking +1. Added new ranks to board background priority +### Fixes +1. Fix background of `@autocomplete` + +## Version 0.52.1 (2023-04-05) +1. Fixed issue breaking sound in games + +## Version 0.52.0 (2023-04-03) +### New Features +1. Added setting to disable `Audio Override` (disables undercards Audio fixes) +1. Added setting to disable `April Fools Music` (if you get tired of it) +### Fixes +1. Fixed april fools music not working with underscript +1. Fixed translations thinking they weren't loaded when they were +### Misc. +1. BootstrapDialog `onhide()` return value is no longer ignored +### Plugins +1. EventEmitter is now extendable +1. Throw errors when failing to register settings +1. `appendCard()` is deprecated +1. Settings now have more dynamic values +1. Added [`checkUnderscript(pluginName)`](https://raw.githubusercontent.com/UCProjects/UnderScript/master/src/checker.js) for plugins to utilize in their code +1. `appendCard` events are now all called correctly + +## Version 0.51.3 (2022-12-13) +1. Fix appendCard data + +## Version 0.51.2 (2022-10-30) +1. Actually fix issue in all cases + +## Version 0.51.1 (2022-10-30) +1. Fix issue where PrettyCards would break descriptions + +## Version 0.51.0 (2022-10-29) +### New Features +1. Added events for ALL `appendCard` functions +1. Added `crafterror` event +1. Added user deck functions `user.getDecks`, `user.getCollection`, `user.getArtifacts` +1. Added `user.getUCP` function +1. Cards get marked as `new` if you don't currently have them in your collection +1. Translate various setting names/values +1. Added `user.getCardSkins` +### Fixes +1. Fixed plugin modules not loading properly when they depend on another module +1. Fixed `craftcard` event +1. Fixed some content toasts +1. Fixed delayed singleton data emittion +### Misc. +1. `emitter.one` alias for `emitter.once` +### Plugins +1. Added `plugin.settings.open` +1. Added plugin hotkey registration + +## Version 0.50.6 (2022-06-22) +1. Fixed error with script loading +1. Fix `undefined dust` +1. Spectate* +1. Fix persist bgm breaking skin themes +1. Allow music played by underscript to be cancelable +1. Fixed minigame playing when disabled +1. Possibly fixed friends list errors +1. `:loaded` event can't be delayed +1. Fixed a few issues with settings display + +## Version 0.50.4 (2022-04-06) +1. Fixed "ignore user" setting +1. Fixed "trust link" setting +1. Fixed "auto decline" setting +1. Changed icon for dragging list items +1. Added notification (with setting) when background is overridden +1. Fixed dust pile counter +1. Fixed note for buying packs + +## Version 0.50.3 (2022-03-29) +1. Fixed UnderScript being too fast for its own good + +## Version 0.50.2 (2022-03-29) +1. Fixed settings not showing sometimes +1. Fixed setting notes not showing +1. Added another alternate update link + +## Version 0.50.1 (2022-03-28) +1. Fixed boolean setting errors +1. Fixed board background setting not applying your background + 1. NOTE: If you changed this setting, Legend is now at the bottom of your list due to a bug. + +## Version 0.50.0 (2022-03-28) +### New Features +1. Colorized cards in deck storage +1. Added setting to show your preferred board background (Settings -> Game) +### Fixes +1. Fixed error toasts (red) ignoring their close events +1. Fixed storage not coloring correctly sometimes +1. Fixed player damage/healing not showing +1. Fixed a bug when hiding minigames +1. Fixed bug when chat is not loaded +### Misc +1. Pack opener tries a bit harder to open all packs +1. Check pending friend requests quicker +1. Settings code is much cleaner +### Plugins +1. Added `plugin.settings().addType(new YourSettingType())` +1. Added `underscript.utils.compoundEvent(...events, callback)` +1. Added `allCardsReady` event + +## Version 0.49.4 (2022-03-07) +1. Fixed some pack opening bugs +1. Fix import showing missing cards when you have a shiny to replace it +1. Fix /scroll bug +1. Fix multiple update notifications + +## Version 0.49.3 (2022-03-06) +1. Fixed craft border highlighting when not enough dust +1. Fixed max crafting without enough dust +1. Fixed CSS not loading at correct time +1. Fixed "trusted link" not opening the link +1. Fixed a small bug with chat + +## Version 0.49.2 (2022-03-02) +1. Fixed hub showing missing cards when you have the full deck +1. Fixed in-game emotes not being disabled (again) +1. Fixed "gaining -HP" +1. Fixed loading deck after switching souls + +## Version 0.49.1 (2022-02-26) +### New Features +1. Mark hub decks missing DT(s) +1. Mark missed quest days +1. Large Icon mode +1. Trusted domains (like in discord) +### Fixes +1. Fixed chat events not registering sometimes +1. Fixed dismissable toasts appearing when dismissed. +1. Fixed bug with spectating events +1. Fixed persistent arena background +1. Fixed in-game emotes not being disabled +1. Fixed some spectate events not working +1. Fixed a bug when spectating as a guest +1. Fixed hub display issues +### Misc +1. Battle log now shows artifact details +### Plugins +1. Added `pre:appendCard()` event + +## Version 0.48.0 (2022-01-23) +### New Features +1. Added settings to disable/hide individual emotes you own +1. Added a few new events + + 1. :loaded:PAGE + 1. :load:PAGE + 1. :unload:PAGE + +1. Added `async` and `delayed` to event meta +1. Added `canceled` to event emitter: sets initial canceled state to true +### Fixes +1. Fixed singletons being callable twice +1. Improved pack opening algorithm +1. Fixed a few issues with event emitter + +## Version 0.47.1 (2021-12-16) +### New Features +1. New display for underscript settings +1. Added audio settings +1. Game errors now show a notification instead of a window +### Plugins +1. Expose more `events` functions +1. Fix `user.ignore()` +1. Added `setting.show()` to open the settings window +1. Removed deprecated `underscript.addStyle()` + +## Version 0.46.4 (2021-10-31) +1. Fixed streamer mode chat +1. Sandboxed `underscript.addStyle` +1. Fixed randomly broken setting + +## Version 0.46.3 (2021-10-31) +1. Skipped on accident + +## Version 0.46.2 (2021-08-16) +1. Fixed minimizing chat +1. Added "alt" update button on update toast + +## Version 0.46.1 (2021-08-12) +1. Fixed script not working + +## Version 0.46.0 (2021-08-12) +### New Features +1. Added modes to "Random fill deck" button +1. Added "new card" toast +### Fixes +1. Fixed deck storage loading +1. Fixed chat not showing up with certain settings +### Plugins +1. Expose `underscript.utils` +1. Expose `underscript.lib` +1. BootstrapDialog events `BootstrapDialog:create|show|shown|hide|hidden` + +## Version 0.45.1 (2021-06-16) +1. Fixed import bug (what does testing mean?)\ + +## Version 0.45.0 (2021-06-16) +### New Features +1. Added ability to buy multiple packs +1. Added confirmation for buying packs with UCP +1. Added a setting to switch minigame controls to WASD (disabled by default) +1. Added a random avatar button +1. Added setting to prefer shiny on import (enabled by default) +1. Added "fill deck" button +1. Added confirmation for buying cosmetics +### Fixes +1. Fixed bug with base card skin setting +### Plugins +1. Added API to buy multiple packs +### Misc. +1. Added a 5th slot to the storage rows + +## Version 0.44.0 (2021-05-30) +### New Features +1. Now handles Quest Pass announcements +1. Added "outline card text" setting +1. Added "outline card tribe" setting +1. Added setting to disable *all* card skins +1. Added toast when kicking non-friends out of custom games +### Fixes +1. Fixed translation preview +1. Fixed crafting more than max (with CTRL) +### Misc. +1. Removed "smart disenchant" + +## Version 0.43.3 (2020-12-31) +1. Completely disabled smart disenchant, until it's remade. + +## Version 0.43.3 (2020-12-30) +1. Fixed issue where background tasks didn't run correctly + * This includes: Accepting friends, Deleting Friends, Refreshing the main page, Quest notifications... + +## Version 0.43.2 (2020-12-24) +Merry Christmas! +1. Fixed friendship bug +1. Fixed not being able to copy battle log text +1. Fixed a bug I missed in the last update +1. Changed how UnderScript loads 3rd party code + +## Version 0.43.1 (2020-12-24) +This update is broken! + +## Version 0.43.0 (2020-12-05) +### New Features +1. Added button to show your friend rankings on the leaderboard +1. Added setting to disable friend request notifications +1. Added option to show "breaking" art as "full" art +### Fixes +1. Fix page selection on leaderboard +1. Loading user links on leaderboard now load correctly +1. Fix deleting friends without reloading page +1. Error when loading deck correctly exits +### Plugins +1. Added "eventManager.once(event, function)" - Listens to event once +1. Added "eventManager.until(event, function)" - Listens to event until returns truthy + +## Version 0.42.0 (2020-11-01) +### New Features +1. Added setting to ignore pings from closed chats +1. Opponent now shows on autocomplete +1. Added external projects to Undercards Menu +1. Added option to only show online friends in autocomplete +### Fixes +1. Fixed user turn not showing in battle log +1. Fixed streamer mode chat errors +1. Fixed online friends not updating (thanks Onu) + +## Version 0.41.2 (2020-10-15) +1. Fixed Token not working in Craft page (again) + +## Version 0.41.1 (2020-10-15) +1. Fixed "Token" not working in Crafting page. +1. History pings no longer make sound +1. Ping toasts now use correct channel name + +## Version 0.41.0 (2020-10-12) +### New Features +1. Reload Cards menu item +### Fixes +1. Load storage more reliably +1. Don't show "turn start" twice +1. Load card name from storage +### Misc. +1. Changed @everyone to @underscript +1. Updated for next patch + +## Version 0.40.0 (2020-08-31) +### New Features +1. First/Last page shortcut now works on every valid webpage +1. Page selection now works on every valid webpage +1. Split Generated and Base rarities on the crafting screen. +1. Merge shiny and non-shiny in collection (default: Deck only) + 1. Settings -> Library -> Merge Shiny Cards +Note: When these filter settings are applied, the rarity icons are semi-transparent (making them look darker) + + +## Version 0.39.2 +1. Fixed battle log being inconsistent on game finish for players/spectators +1. Fixed some internal bugs +1. Fixed queue disabled message + +## Version 0.39.1 +1. Fixed broken avatars + +## Version 0.39.0 +### New Features +1. Minigames no longer take over your arrow keys while playing them +1. Friendship now displays rankings for each of your cards +### Fixes +1. Added setting to disable "collect all friendship" +1. Autocomplete no longer selects trailing text +1. Better translation preview support +### Plugins +1. Fixed some bugs +1. Deprecated "cancelable" events + +## 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/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/lang/en/general.json b/lang/en/general.json new file mode 100644 index 00000000..a1296f94 --- /dev/null +++ b/lang/en/general.json @@ -0,0 +1,69 @@ +{ + "bypass.shift": "SHIFT: Bypass confirmation", + "changelog": "UnderScript Change Log", + "changelog.loading": "Please wait", + "changelog.unavailable": "Unavailable at this time", + "cards.owned": "Owned cards", + "cards.unowned": "Unowned cards", + "cards.maxed": "Maxed cards", + "cards.surplus": "Surplus cards", + "cards.craftable": "Craftable cards", + "collect": "Collect All", + "collect.note": "Collect all rewards", + "disenchant": "Smart Disenchant", + "friend.block": "Block $1", + "friend.decline": "Decline all", + "match.found": "Match found!", + "message.hidden": "Message Ignored", + "message.removed": "$1 {{PLURAL:$1|Message|Messages}} Ignored", + "deck.average": "Average gold cost", + "deck.fill": [ + "Randomly fill deck", + "CTRL: Shiny mode", + "SHIFT: Non-shiny mode" + ], + "storage.load": "Click to load ($1)", + "storage.note": [ + "* Right Click to name deck", + "* Shift Click to re-save deck", + "* CTRL Click to erase deck" + ], + "storage.save": "Click to save current deck", + "time.local": "$1 local", + "error": "Error", + "go!": "Go now!", + "page.first": "CTRL Click: Go to first page", + "page.last": "CTRL Click: Go to last page", + "passive": "Passive", + "purchase.item": "Buy with UCP?", + "purchase.item.cost": "Buy for {{UCP:$1}} UCP?", + "purchase.pack.cost": "Buy $1 {{PLURAL:$1|pack|packs}} for {{UCP:$2}} UCP?", + "purchase.pack.note": [ + "CTRL: Buy MAX packs", + "ALT: Buy (up to) 10 packs" + ], + "reconnecting": "Reconnecting...", + "profile": "Profile", + "message": "Message", + "ignore": "Ignore", + "unignore": "Unignore", + "mention": "Mention", + "mute": "Mute", + "quest.pending": "Completed Quests", + "random": "Random", + "refresh": "Refresh Page", + "settings": "Open Settings", + "update.current": "Current: $1", + "update.new": "Update to $1", + "update.open": "Show Updates", + "update.skip": "Skip Update", + "updates": "Pending Updates", + "dismiss": "Dismiss", + "loading": "Loading", + "open": "Open", + "undo": "Undo", + "update": "Update", + "unknown": "Unknown", + "disable": "Disable", + "enable": "Enable" +} diff --git a/lang/en/menu.json b/lang/en/menu.json new file mode 100644 index 00000000..4b6d387a --- /dev/null +++ b/lang/en/menu.json @@ -0,0 +1,18 @@ +{ + "menu": "Menu", + "menu.title": "MENU", + "changelog": "UnderScript Change Log", + "changelog.note": "Unavailable on this page", + "update": "Check for updates", + "update.note": "Last Checked: $1", + "gamelog": "Game Patch Notes", + "reload": "Reload Cards", + "settings": "Settings", + "settings.note": "Settings temporarily unavailable", + "streamer.on": "Streamer Mode: On", + "streamer.off": "Streamer Mode: Off", + "surrender": "Surrender", + "surrender.note": "You can't surrender before turn 5.", + "update.checking.note": "Check for updats", + "update.pending": "Show Pending Updates" +} \ No newline at end of file diff --git a/lang/en/settings.json b/lang/en/settings.json new file mode 100644 index 00000000..c5f3dba1 --- /dev/null +++ b/lang/en/settings.json @@ -0,0 +1,155 @@ +{ + "announce": "Announcement", + "announce.friendsOnly": "Friends Only", + "announce.notSelf": "Ignore Self", + "autocomplete": "Visual Autocomplete", + "autocomplete.friends": "Autocomplete: Online Friends Only", + "broadcast": "Disable Broadcast Toast", + "card.name.english": "Force English for card names", + "card.text.outline": "Add Text Outline", + "card.tribe.outline": "Add Tribe Outline", + "category.announce.draw": "Legendary Draw", + "category.announce.user": "Legendary User", + "category.announce.winstreak": "Winstreak", + "category.autodecline": "Auto Decline", + "category.card.skins": "Card Skins", + "category.chat.commands": "Commands", + "category.chat.emotes": "Emotes", + "category.chat.ignored": "Ignored Users", + "category.chat.import": "Import", + "category.chat.links": "Trusted Domains", + "category.chat.ping": "Ping Me", + "category.custom": "Custom", + "category.filter": "Filter", + "category.friendship": "Friendship", + "category.home": "Home", + "category.hotkeys": "Hotkeys", + "category.library.crafting": "Crafting", + "category.minigames": "Minigames", + "category.outline": "Outline", + "category.plugins": "Plugins", + "category.streamer": "Streamer Mode", + "category.updates": "Updates", + "chat.rightclick": "Disable Chat Context (right click)", + "command": "Disable $1 command", + "craft.border": "Disable Crafting Highlight", + "craft.hotkey": "Disable craft max hotkey", + "custom.friends": "Friends only", + "custom.friends.note": "Setting this will only allow friends to join custom games by default.", + "deck.average": "Disable deck average counter", + "deck.preview": "Disable Deck Preview", + "disenchant": "Disable Smart Disenchanting", + "disenchant.note": "Enable at own risk", + "emote.disable": "Disable $1", + "endTurn": "Disable End Turn Hotkey", + "endTurn.mouse": "Disable End Turn with Space", + "endTurn.keyboard": "Disable End Turn with Middle Click", + "filter.collection": "Collection dropdown ", + "filter.disable": "Disable filter", + "filter.shiny": "Merge Shiny Cards", + "filter.shiny.option": [ + "Never", + "Deck (Vanilla)", + "Always" + ], + "filter.split": "Split Based and Token", + "filter.tribe": "Tribe button", + "filter.trim": "Trim filter buttons", + "filter.trim.option": [ + "Always", + "Deck", + "Crafting", + "Never" + ], + "fishday": "Disable April Fools Jokes", + "fishday.note": "Disables *almost* everything.", + "friend.add": "Add friends without refreshing", + "friend.auto": "Disable", + "friend.auto.ignore": "Include ignored chat users", + "friend.auto.silent": "Silent", + "friend.background": "Remove friends without refreshing", + "friend.decline": "Disable decline all button", + "friend.online": "Enable online friends", + "friend.request": "Disable Friend Request Notifications", + "friendship": "Disable Collect All", + "friendship.notification": "Disable Friendship Notification", + "friendship.rank": "Display Friendship Rankings", + "game.season": "Disable version toast", + "gamelist": "Disable Game List Resizing", + "gamelist.refresh": "Disable Game List Refresh", + "header.sticky": "Disable header scrolling", + "ignore": "Disable", + "ignore.how": "Behavior", + "ignore.option": [ + "Remove", + "Hide", + "None" + ], + "import.shiny": "Prefer Shiny", + "key.any": "Press Any Key...", + "key.bind": "Click to bind", + "large.avatar": "Large Icon mode", + "library.scrollwheel": "Disable Scrolling Collection with Mousewheel", + "links": "Use Original Link Detection", + "map.duplicate": "Duplicate value, not updated! Click here to reset.", + "minigame": "Disable", + "minigame.wasd": "Use WASD", + "note.refresh": "Will require you to refresh the page.", + "page.chat": "Chat", + "page.friends": "Friends", + "page.library": "Library", + "page.plugins": "Plugins", + "page.jump": "Disable First/Last Page Shortcut", + "page.select": "Disable Page Select", + "patches": "Disable Patch Notes", + "ping": "Disable Chat Ping {{STYLE:highlight|(highlighting)}}", + "ping.global": "Only open chats", + "ping.on": "On", + "ping.toast": "Enable ping toasts", + "quest.highlight": "Disable Quest Highlight", + "safelink": "Enabled", + "safelink.trust": "Trust $1", + "skins.basic": "Force Basic Card Skins", + "skins.breaking": "Breaking Card Art Behavior", + "skins.breaking.option": [ + "Breaking (Vanilla)", + "Covered (Transparent)", + "Covered" + ], + "skins.full": "Disable Full Card Art", + "streamer": "Enable?", + "streamer.note": "Enables a button on the menu, streamer mode is \"off\" by default.", + "streamer.option": [ + "Yes", + "Yes (silent)", + "No" + ], + "title": "UnderScript Configuration", + "toast.bundle": "Enable bundle toast", + "toast.cards": "Enable new Card toast", + "toast.emotes": "Enable emote toast", + "toast.pass": "Enable quest pass toast", + "toast.skins": "Enable skin toast", + "update": "Disable Auto Updates", + "update.frequency": "Update Frequency", + "update.frequency.option": [ + "Page Load (Not recommended)", + "Hourly", + "Daily" + ], + "update.plugin": "Disable Auto Updates", + "update.silent": "Run automatic updates in the background", + "vanilla.card.shiny": "Disable shiny card animation", + "vanilla.card.skin": "Disable breaking skins", + "vanilla.chat.avatar": "Disable chat avatars", + "vanilla.chat.rainbow": "Disable rainbow chat", + "vanilla.chat.sound": "Disable chat sounds", + "vanilla.game.music": "Disable game music", + "vanilla.game.sound": "Disable game sounds", + "vanilla.game.emote": "Disable emotes", + "vanilla.game.profile": "Disable profile skins", + "vanilla.game.shake": "Disable screen shake", + "vanilla.game.stats": "Disable stats", + "vanilla.game.vfx": "Disable VFX", + "volume.match.found": "Game Found Volume" +} diff --git a/lang/en/toast.json b/lang/en/toast.json new file mode 100644 index 00000000..7a8fcdee --- /dev/null +++ b/lang/en/toast.json @@ -0,0 +1,47 @@ +{ + "broadcast": "[INFO] Undercards Broadcast Message", + "craftable": "Craftable cards are highlighted in {{STYLE:highlight-green|green}}", + "custom.ban": "[Match] Banned User", + "custom.ban.user": "'$1' has been banned from custom match!", + "custom.enter": "You can now press enter on the Create Game window.", + "dismiss": "Dismiss", + "friend.delete": "Friends list will be updated upon refresh.", + "friend.delete.failed": "Failed to remove: $1", + "friend.request": "Pending Friend Request", + "friend.request.accept": "Accepted friend request from: $1", + "friend.request.auto": "Auto declined friend request from: $1", + "friend.request.decline": "Declined friend request from: $1", + "friend.request.failed": "{{STYLE:red|Failed to send friend request to $1}}", + "friend.request.sent": "{{STYLE:green|Sent friend request to $1}}", + "friendship": "Claimed Friendship Rewards", + "friendship.notification": "Pending Friendship Rewards", + "ignore": "You've ignored $1", + "ignore.info": "You can right click users in chat to display user options!", + "info": "Did you know?", + "login": "Try logging back in", + "menu": "UnderScript has a menu, press ESC to open it!", + "new.bundle": "New Bundle Available", + "new.card": "{{PLURAL:$1|New Card|New Cards}}", + "new.emotes": "New Emotes Available", + "new.pass": "New Quest Pass", + "new.skins": "New Skins or Avatars", + "note": "Please note:", + "patch.notes": "[UnderScript] Patch Notes", + "ping": "UnderScript has custom notifications! You can change them however you like.", + "ping.remove": "Remove @underscript!", + "ping.settings": "Open settings", + "streamer": "Streamer Mode Active", + "game.request": "Request Permission", + "game.request.allowed": "Notifications allowed", + "game.request.denied": "Notifications denied", + "game.request.message": "UnderScript would like to notify you when a game is found.", + "game.update": "Undercards Update", + "gamelist.refresh": "The game list now refreshes automatically, every 10 seconds.", + "undo": "Undo", + "update": "Update", + "update.available": "{{PLURAL:$1|Update|$1 updates|0=No updates}} available.", + "update.checking": "Checking for updates. Please wait.", + "update.title": "[UnderScript] Update Available!", + "update.text": "Version $1.", + "updater": "UnderScript updater" +} \ No newline at end of file diff --git a/lang/underscript.json b/lang/underscript.json new file mode 100644 index 00000000..64192f2f --- /dev/null +++ b/lang/underscript.json @@ -0,0 +1,285 @@ +{ + "en": { + "underscript.general.bypass.shift": "SHIFT: Bypass confirmation", + "underscript.general.cards.craftable": "Craftable cards", + "underscript.general.cards.maxed": "Maxed cards", + "underscript.general.cards.owned": "Owned cards", + "underscript.general.cards.surplus": "Surplus cards", + "underscript.general.cards.unowned": "Unowned cards", + "underscript.general.changelog": "UnderScript Change Log", + "underscript.general.changelog.loading": "Please wait", + "underscript.general.changelog.unavailable": "Unavailable at this time", + "underscript.general.collect": "Collect All", + "underscript.general.collect.note": "Collect all rewards", + "underscript.general.deck.average": "Average gold cost", + "underscript.general.deck.fill": [ + "Randomly fill deck", + "CTRL: Shiny mode", + "SHIFT: Non-shiny mode" + ], + "underscript.general.disable": "Disable", + "underscript.general.disenchant": "Smart Disenchant", + "underscript.general.dismiss": "Dismiss", + "underscript.general.enable": "Enable", + "underscript.general.error": "Error", + "underscript.general.friend.block": "Block $1", + "underscript.general.friend.decline": "Decline all", + "underscript.general.go!": "Go now!", + "underscript.general.ignore": "Ignore", + "underscript.general.loading": "Loading", + "underscript.general.match.found": "Match found!", + "underscript.general.mention": "Mention", + "underscript.general.message": "Message", + "underscript.general.message.hidden": "Message Ignored", + "underscript.general.message.removed": "$1 {{PLURAL:$1|Message|Messages}} Ignored", + "underscript.general.mute": "Mute", + "underscript.general.open": "Open", + "underscript.general.page.first": "CTRL Click: Go to first page", + "underscript.general.page.last": "CTRL Click: Go to last page", + "underscript.general.passive": "Passive", + "underscript.general.profile": "Profile", + "underscript.general.purchase.item": "Buy with UCP?", + "underscript.general.purchase.item.cost": "Buy for {{UCP:$1}} UCP?", + "underscript.general.purchase.pack.cost": "Buy $1 {{PLURAL:$1|pack|packs}} for {{UCP:$2}} UCP?", + "underscript.general.purchase.pack.note": [ + "CTRL: Buy MAX packs", + "ALT: Buy (up to) 10 packs" + ], + "underscript.general.quest.pending": "Completed Quests", + "underscript.general.random": "Random", + "underscript.general.reconnecting": "Reconnecting...", + "underscript.general.refresh": "Refresh Page", + "underscript.general.settings": "Open Settings", + "underscript.general.storage.load": "Click to load ($1)", + "underscript.general.storage.note": [ + "* Right Click to name deck", + "* Shift Click to re-save deck", + "* CTRL Click to erase deck" + ], + "underscript.general.storage.save": "Click to save current deck", + "underscript.general.time.local": "$1 local", + "underscript.general.undo": "Undo", + "underscript.general.unignore": "Unignore", + "underscript.general.unknown": "Unknown", + "underscript.general.update": "Update", + "underscript.general.update.current": "Current: $1", + "underscript.general.update.new": "Update to $1", + "underscript.general.update.open": "Show Updates", + "underscript.general.update.skip": "Skip Update", + "underscript.general.updates": "Pending Updates", + "underscript.menu.changelog": "UnderScript Change Log", + "underscript.menu.changelog.note": "Unavailable on this page", + "underscript.menu.gamelog": "Game Patch Notes", + "underscript.menu.menu": "Menu", + "underscript.menu.menu.title": "MENU", + "underscript.menu.reload": "Reload Cards", + "underscript.menu.settings": "Settings", + "underscript.menu.settings.note": "Settings temporarily unavailable", + "underscript.menu.streamer.off": "Streamer Mode: Off", + "underscript.menu.streamer.on": "Streamer Mode: On", + "underscript.menu.surrender": "Surrender", + "underscript.menu.surrender.note": "You can't surrender before turn 5.", + "underscript.menu.update": "Check for updates", + "underscript.menu.update.checking.note": "Check for updats", + "underscript.menu.update.note": "Last Checked: $1", + "underscript.menu.update.pending": "Show Pending Updates", + "underscript.settings.announce": "Announcement", + "underscript.settings.announce.friendsOnly": "Friends Only", + "underscript.settings.announce.notSelf": "Ignore Self", + "underscript.settings.autocomplete": "Visual Autocomplete", + "underscript.settings.autocomplete.friends": "Autocomplete: Online Friends Only", + "underscript.settings.broadcast": "Disable Broadcast Toast", + "underscript.settings.card.name.english": "Force English for card names", + "underscript.settings.card.text.outline": "Add Text Outline", + "underscript.settings.card.tribe.outline": "Add Tribe Outline", + "underscript.settings.category.announce.draw": "Legendary Draw", + "underscript.settings.category.announce.user": "Legendary User", + "underscript.settings.category.announce.winstreak": "Winstreak", + "underscript.settings.category.autodecline": "Auto Decline", + "underscript.settings.category.card.skins": "Card Skins", + "underscript.settings.category.chat.commands": "Commands", + "underscript.settings.category.chat.emotes": "Emotes", + "underscript.settings.category.chat.ignored": "Ignored Users", + "underscript.settings.category.chat.import": "Import", + "underscript.settings.category.chat.links": "Trusted Domains", + "underscript.settings.category.chat.ping": "Ping Me", + "underscript.settings.category.custom": "Custom", + "underscript.settings.category.filter": "Filter", + "underscript.settings.category.friendship": "Friendship", + "underscript.settings.category.home": "Home", + "underscript.settings.category.hotkeys": "Hotkeys", + "underscript.settings.category.library.crafting": "Crafting", + "underscript.settings.category.minigames": "Minigames", + "underscript.settings.category.outline": "Outline", + "underscript.settings.category.plugins": "Plugins", + "underscript.settings.category.streamer": "Streamer Mode", + "underscript.settings.category.updates": "Updates", + "underscript.settings.chat.rightclick": "Disable Chat Context (right click)", + "underscript.settings.command": "Disable $1 command", + "underscript.settings.craft.border": "Disable Crafting Highlight", + "underscript.settings.craft.hotkey": "Disable craft max hotkey", + "underscript.settings.custom.friends": "Friends only", + "underscript.settings.custom.friends.note": "Setting this will only allow friends to join custom games by default.", + "underscript.settings.deck.average": "Disable deck average counter", + "underscript.settings.deck.preview": "Disable Deck Preview", + "underscript.settings.disenchant": "Disable Smart Disenchanting", + "underscript.settings.disenchant.note": "Enable at own risk", + "underscript.settings.emote.disable": "Disable $1", + "underscript.settings.endTurn": "Disable End Turn Hotkey", + "underscript.settings.endTurn.keyboard": "Disable End Turn with Middle Click", + "underscript.settings.endTurn.mouse": "Disable End Turn with Space", + "underscript.settings.filter.collection": "Collection dropdown ", + "underscript.settings.filter.disable": "Disable filter", + "underscript.settings.filter.shiny": "Merge Shiny Cards", + "underscript.settings.filter.shiny.option": [ + "Never", + "Deck (Vanilla)", + "Always" + ], + "underscript.settings.filter.split": "Split Based and Token", + "underscript.settings.filter.tribe": "Tribe button", + "underscript.settings.filter.trim": "Trim filter buttons", + "underscript.settings.filter.trim.option": [ + "Always", + "Deck", + "Crafting", + "Never" + ], + "underscript.settings.fishday": "Disable April Fools Jokes", + "underscript.settings.fishday.note": "Disables *almost* everything.", + "underscript.settings.friend.add": "Add friends without refreshing", + "underscript.settings.friend.auto": "Disable", + "underscript.settings.friend.auto.ignore": "Include ignored chat users", + "underscript.settings.friend.auto.silent": "Silent", + "underscript.settings.friend.background": "Remove friends without refreshing", + "underscript.settings.friend.decline": "Disable decline all button", + "underscript.settings.friend.online": "Enable online friends", + "underscript.settings.friend.request": "Disable Friend Request Notifications", + "underscript.settings.friendship": "Disable Collect All", + "underscript.settings.friendship.notification": "Disable Friendship Notification", + "underscript.settings.friendship.rank": "Display Friendship Rankings", + "underscript.settings.game.season": "Disable version toast", + "underscript.settings.gamelist": "Disable Game List Resizing", + "underscript.settings.gamelist.refresh": "Disable Game List Refresh", + "underscript.settings.header.sticky": "Disable header scrolling", + "underscript.settings.ignore": "Disable", + "underscript.settings.ignore.how": "Behavior", + "underscript.settings.ignore.option": [ + "Remove", + "Hide", + "None" + ], + "underscript.settings.import.shiny": "Prefer Shiny", + "underscript.settings.key.any": "Press Any Key...", + "underscript.settings.key.bind": "Click to bind", + "underscript.settings.large.avatar": "Large Icon mode", + "underscript.settings.library.scrollwheel": "Disable Scrolling Collection with Mousewheel", + "underscript.settings.links": "Use Original Link Detection", + "underscript.settings.map.duplicate": "Duplicate value, not updated! Click here to reset.", + "underscript.settings.minigame": "Disable", + "underscript.settings.minigame.wasd": "Use WASD", + "underscript.settings.note.refresh": "Will require you to refresh the page.", + "underscript.settings.page.chat": "Chat", + "underscript.settings.page.friends": "Friends", + "underscript.settings.page.jump": "Disable First/Last Page Shortcut", + "underscript.settings.page.library": "Library", + "underscript.settings.page.plugins": "Plugins", + "underscript.settings.page.select": "Disable Page Select", + "underscript.settings.patches": "Disable Patch Notes", + "underscript.settings.ping": "Disable Chat Ping {{STYLE:highlight|(highlighting)}}", + "underscript.settings.ping.global": "Only open chats", + "underscript.settings.ping.on": "On", + "underscript.settings.ping.toast": "Enable ping toasts", + "underscript.settings.quest.highlight": "Disable Quest Highlight", + "underscript.settings.safelink": "Enabled", + "underscript.settings.safelink.trust": "Trust $1", + "underscript.settings.skins.basic": "Force Basic Card Skins", + "underscript.settings.skins.breaking": "Breaking Card Art Behavior", + "underscript.settings.skins.breaking.option": [ + "Breaking (Vanilla)", + "Covered (Transparent)", + "Covered" + ], + "underscript.settings.skins.full": "Disable Full Card Art", + "underscript.settings.streamer": "Enable?", + "underscript.settings.streamer.note": "Enables a button on the menu, streamer mode is \"off\" by default.", + "underscript.settings.streamer.option": [ + "Yes", + "Yes (silent)", + "No" + ], + "underscript.settings.title": "UnderScript Configuration", + "underscript.settings.toast.bundle": "Enable bundle toast", + "underscript.settings.toast.cards": "Enable new Card toast", + "underscript.settings.toast.emotes": "Enable emote toast", + "underscript.settings.toast.pass": "Enable quest pass toast", + "underscript.settings.toast.skins": "Enable skin toast", + "underscript.settings.update": "Disable Auto Updates", + "underscript.settings.update.frequency": "Update Frequency", + "underscript.settings.update.frequency.option": [ + "Page Load (Not recommended)", + "Hourly", + "Daily" + ], + "underscript.settings.update.plugin": "Disable Auto Updates", + "underscript.settings.update.silent": "Run automatic updates in the background", + "underscript.settings.vanilla.card.shiny": "Disable shiny card animation", + "underscript.settings.vanilla.card.skin": "Disable breaking skins", + "underscript.settings.vanilla.chat.avatar": "Disable chat avatars", + "underscript.settings.vanilla.chat.rainbow": "Disable rainbow chat", + "underscript.settings.vanilla.chat.sound": "Disable chat sounds", + "underscript.settings.vanilla.game.emote": "Disable emotes", + "underscript.settings.vanilla.game.music": "Disable game music", + "underscript.settings.vanilla.game.profile": "Disable profile skins", + "underscript.settings.vanilla.game.shake": "Disable screen shake", + "underscript.settings.vanilla.game.sound": "Disable game sounds", + "underscript.settings.vanilla.game.stats": "Disable stats", + "underscript.settings.vanilla.game.vfx": "Disable VFX", + "underscript.settings.volume.match.found": "Game Found Volume", + "underscript.toast.broadcast": "[INFO] Undercards Broadcast Message", + "underscript.toast.craftable": "Craftable cards are highlighted in {{STYLE:highlight-green|green}}", + "underscript.toast.custom.ban": "[Match] Banned User", + "underscript.toast.custom.ban.user": "'$1' has been banned from custom match!", + "underscript.toast.custom.enter": "You can now press enter on the Create Game window.", + "underscript.toast.dismiss": "Dismiss", + "underscript.toast.friend.delete": "Friends list will be updated upon refresh.", + "underscript.toast.friend.delete.failed": "Failed to remove: $1", + "underscript.toast.friend.request": "Pending Friend Request", + "underscript.toast.friend.request.accept": "Accepted friend request from: $1", + "underscript.toast.friend.request.auto": "Auto declined friend request from: $1", + "underscript.toast.friend.request.decline": "Declined friend request from: $1", + "underscript.toast.friend.request.failed": "{{STYLE:red|Failed to send friend request to $1}}", + "underscript.toast.friend.request.sent": "{{STYLE:green|Sent friend request to $1}}", + "underscript.toast.friendship": "Claimed Friendship Rewards", + "underscript.toast.friendship.notification": "Pending Friendship Rewards", + "underscript.toast.game.request": "Request Permission", + "underscript.toast.game.request.allowed": "Notifications allowed", + "underscript.toast.game.request.denied": "Notifications denied", + "underscript.toast.game.request.message": "UnderScript would like to notify you when a game is found.", + "underscript.toast.game.update": "Undercards Update", + "underscript.toast.gamelist.refresh": "The game list now refreshes automatically, every 10 seconds.", + "underscript.toast.ignore": "You've ignored $1", + "underscript.toast.ignore.info": "You can right click users in chat to display user options!", + "underscript.toast.info": "Did you know?", + "underscript.toast.login": "Try logging back in", + "underscript.toast.menu": "UnderScript has a menu, press ESC to open it!", + "underscript.toast.new.bundle": "New Bundle Available", + "underscript.toast.new.card": "{{PLURAL:$1|New Card|New Cards}}", + "underscript.toast.new.emotes": "New Emotes Available", + "underscript.toast.new.pass": "New Quest Pass", + "underscript.toast.new.skins": "New Skins or Avatars", + "underscript.toast.note": "Please note:", + "underscript.toast.patch.notes": "[UnderScript] Patch Notes", + "underscript.toast.ping": "UnderScript has custom notifications! You can change them however you like.", + "underscript.toast.ping.remove": "Remove @underscript!", + "underscript.toast.ping.settings": "Open settings", + "underscript.toast.streamer": "Streamer Mode Active", + "underscript.toast.undo": "Undo", + "underscript.toast.update": "Update", + "underscript.toast.update.available": "{{PLURAL:$1|Update|$1 updates|0=No updates}} available.", + "underscript.toast.update.checking": "Checking for updates. Please wait.", + "underscript.toast.update.text": "Version $1.", + "underscript.toast.update.title": "[UnderScript] Update Available!", + "underscript.toast.updater": "UnderScript updater" + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..0a38ad9d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5944 @@ +{ + "name": "underscript", + "version": "0.63.5", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "underscript", + "version": "0.63.5", + "license": "MIT", + "dependencies": { + "axios": "^0.21.4", + "luxon": "^1.28.0", + "popper.js": "^1.16.1", + "showdown": "^2.0.0", + "simpletoast": "github:feildmaster/SimpleToast#2.0.3", + "tippy.js": "^4.3.5" + }, + "devDependencies": { + "@actions/core": "^1.11.1", + "@linaria/postcss-linaria": "^4.1.5", + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^17.1.0", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-multi-entry": "^4.1.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^3.1.0", + "@rollup/plugin-typescript": "^12.1.2", + "@rollup/pluginutils": "^5.1.4", + "@types/jquery": "^2.0.68", + "chai": "^4.3.7", + "chai-as-promised": "^7.1.1", + "dotenv": "^16.3.1", + "eslint": "^8.31.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-import": "^2.26.0", + "fast-glob": "^3.3.3", + "mocha": "^10.2.0", + "replace": "^1.2.1", + "rollup": "^2.79.2", + "rollup-plugin-cleanup": "^3.2.1", + "rollup-plugin-external-globals": "^0.6.1", + "rollup-plugin-import-css": "^3.2.1", + "stylelint": "^14.16.1", + "stylelint-config-standard": "^29.0.0", + "tslib": "^2.8.1", + "typescript": "^5.8.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@actions/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz", + "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==", + "dev": true, + "dependencies": { + "@actions/exec": "^1.1.1", + "@actions/http-client": "^2.0.1" + } + }, + "node_modules/@actions/exec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", + "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", + "dev": true, + "dependencies": { + "@actions/io": "^1.0.1" + } + }, + "node_modules/@actions/http-client": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz", + "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==", + "dev": true, + "dependencies": { + "tunnel": "^0.0.6", + "undici": "^5.25.4" + } + }, + "node_modules/@actions/io": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz", + "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==", + "dev": true + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.26.10" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.10", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@linaria/postcss-linaria": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@linaria/postcss-linaria/-/postcss-linaria-4.5.1.tgz", + "integrity": "sha512-2On1OVLIcgrRAp5jzcYvRLdndK7HxKgXWshpmSWv1bkwmIRbTtE4vRixWZq19qE5tvR6HXlmxvwM4UW6YHM84g==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.22.9", + "@babel/parser": "^7.22.7", + "@babel/traverse": "^7.22.8", + "stylelint": "^14.11.0" + }, + "engines": { + "node": "^12.16.0 || >=13.7.0" + }, + "peerDependencies": { + "postcss": "^8.3.11" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/plugin-alias": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.1.1.tgz", + "integrity": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-17.1.0.tgz", + "integrity": "sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^2.30.0" + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@rollup/plugin-json": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.0.8" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/plugin-json/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-json/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@rollup/plugin-multi-entry": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-multi-entry/-/plugin-multi-entry-4.1.0.tgz", + "integrity": "sha512-nellK5pr50W0JA2+bDJbG8F79GBP802J40YRoC0wyfpTAeAn5mJ4eaFiB/MN+YoX9hgb/6RJoZl9leDjZnUFKw==", + "dev": true, + "dependencies": { + "@rollup/plugin-virtual": "^2.0.3", + "matched": "^5.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/plugin-multi-entry/node_modules/@rollup/plugin-virtual": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-virtual/-/plugin-virtual-2.1.0.tgz", + "integrity": "sha512-CPPAtlKT53HFqC8jFHb/V5WErpU8Hrq2TyCR0A7kPQMlF2wNUf0o1xuAc+Qxj8NCZM0Z3Yvl+FbUXfJjVWqDwA==", + "dev": true, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@rollup/plugin-replace": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-3.1.0.tgz", + "integrity": "sha512-pA3XRUrSKybVYqmH5TqWNZpGxF+VV+1GrYchKgCNIj2vsSOX7CVm2RCtx8p2nrC7xvkziYyK+lSi74T93MU3YA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@rollup/plugin-typescript": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.2.tgz", + "integrity": "sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/@types/jquery": { + "version": "2.0.68", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-2.0.68.tgz", + "integrity": "sha512-9E8HinL4D/VgWf6tci0/NWlkw8i8e5pL00yVmBpFaVmveSwMq3lEQcrRJVbu62Fprm3nBTHXkqkEByjGoQCpTA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "dev": true + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", + "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-functions-list": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "dev": true, + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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 + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-cleanup": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/js-cleanup/-/js-cleanup-1.2.0.tgz", + "integrity": "sha512-JeDD0yiiSt80fXzAVa/crrS0JDPQljyBG/RpOtaSbyDq03VHa9szJWMaWOYU/bcTn412uMN2MxApXq8v79cUiQ==", + "dev": true, + "dependencies": { + "magic-string": "^0.25.7", + "perf-regexes": "^1.0.1", + "skip-regex": "^1.0.2" + }, + "engines": { + "node": "^10.14.2 || >=12.0.0" + } + }, + "node_modules/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 + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/known-css-properties": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", + "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/luxon": { + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.1.tgz", + "integrity": "sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==", + "engines": { + "node": "*" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/matched": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/matched/-/matched-5.0.1.tgz", + "integrity": "sha512-E1fhSTPRyhAlNaNvGXAgZQlq1hL0bgYMTk/6bktVlIhzUnX/SZs7296ACdVeNJE8xFNGSuvd9IpI7vSnmcqLvw==", + "dev": true, + "dependencies": { + "glob": "^7.1.6", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.10.tgz", + "integrity": "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/perf-regexes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/perf-regexes/-/perf-regexes-1.0.1.tgz", + "integrity": "sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng==", + "dev": true, + "engines": { + "node": ">=6.14" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/replace": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/replace/-/replace-1.2.2.tgz", + "integrity": "sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==", + "dev": true, + "dependencies": { + "chalk": "2.4.2", + "minimatch": "3.0.5", + "yargs": "^15.3.1" + }, + "bin": { + "replace": "bin/replace.js", + "search": "bin/search.js" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/replace/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/replace/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/replace/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/replace/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/replace/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/replace/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/replace/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/replace/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace/node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/replace/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/replace/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/replace/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/replace/node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/replace/node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/replace/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/replace/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/replace/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-cleanup": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-cleanup/-/rollup-plugin-cleanup-3.2.1.tgz", + "integrity": "sha512-zuv8EhoO3TpnrU8MX8W7YxSbO4gmOR0ny06Lm3nkFfq0IVKdBUtHwhVzY1OAJyNCIAdLiyPnOrU0KnO0Fri1GQ==", + "dev": true, + "dependencies": { + "js-cleanup": "^1.2.0", + "rollup-pluginutils": "^2.8.2" + }, + "engines": { + "node": "^10.14.2 || >=12.0.0" + }, + "peerDependencies": { + "rollup": ">=2.0" + } + }, + "node_modules/rollup-plugin-external-globals": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-external-globals/-/rollup-plugin-external-globals-0.6.1.tgz", + "integrity": "sha512-mlp3KNa5sE4Sp9UUR2rjBrxjG79OyZAh/QC18RHIjM+iYkbBwNXSo8DHRMZWtzJTrH8GxQ+SJvCTN3i14uMXIA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^4.0.0", + "estree-walker": "^2.0.1", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^2.25.0" + } + }, + "node_modules/rollup-plugin-external-globals/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/rollup-plugin-import-css": { + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/rollup-plugin-import-css/-/rollup-plugin-import-css-3.5.8.tgz", + "integrity": "sha512-a3YsZnwHz66mRHCKHjaPCSfWczczvS/HTkgDc+Eogn0mt/0JZXz0WjK0fzM5WwBpVtOqHB4/gHdmEY40ILsaVg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "rollup": "^2.x.x || ^3.x.x || ^4.x.x" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/showdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz", + "integrity": "sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==", + "dependencies": { + "commander": "^9.0.0" + }, + "bin": { + "showdown": "bin/showdown.js" + }, + "funding": { + "type": "individual", + "url": "https://www.paypal.me/tiviesantos" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simpletoast": { + "resolved": "git+ssh://git@github.com/feildmaster/SimpleToast.git#1b1019ad8ad010a41677a0d0792f83cbf315c0d4" + }, + "node_modules/skip-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/skip-regex/-/skip-regex-1.0.2.tgz", + "integrity": "sha512-pEjMUbwJ5Pl/6Vn6FsamXHXItJXSRftcibixDmNCWbWhic0hzHrwkMZo0IZ7fMRH9KxcWDFSkzhccB4285PutA==", + "dev": true, + "engines": { + "node": ">=4.2" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", + "dev": true + }, + "node_modules/stylelint": { + "version": "14.16.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", + "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", + "dev": true, + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^7.1.0", + "css-functions-list": "^3.1.0", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^6.0.1", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.2.0", + "ignore": "^5.2.1", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.26.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.19", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "style-search": "^0.1.0", + "supports-hyperlinks": "^2.3.0", + "svg-tags": "^1.0.0", + "table": "^6.8.1", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^4.0.2" + }, + "bin": { + "stylelint": "bin/stylelint.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz", + "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==", + "dev": true, + "peerDependencies": { + "stylelint": "^14.10.0" + } + }, + "node_modules/stylelint-config-standard": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz", + "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==", + "dev": true, + "dependencies": { + "stylelint-config-recommended": "^9.0.0" + }, + "peerDependencies": { + "stylelint": "^14.14.0" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tippy.js": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-4.3.5.tgz", + "integrity": "sha512-NDq3efte8nGK6BOJ1dDN1/WelAwfmh3UtIYXXck6+SxLzbIQNZE/cmRSnwScZ/FyiKdIcvFHvYUgqmoGx8CcyA==", + "dependencies": { + "popper.js": "^1.14.7" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-compile-cache": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index 1aeeb3a1..7b4c5f69 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,78 @@ { - "name": "underscript-pages", - "private": true, + "name": "underscript", + "version": "0.63.5", + "description": "Script for Undercards. An undertale fan-made game.", + "homepage": "https://feildmaster.github.io/UnderScript/", + "repository": "UCProjects/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)" + ], + "engines": { + "node": ">= 18" + }, + "type": "module", "scripts": { - "start": "bundle exec jekyll serve" + "build": "rollup -c", + "prepack": "rollup -c", + "start": "rollup -c --watch --configDebug", + "lint": "eslint . --ignore-path .gitignore", + "css": "stylelint ./src/", + "test": "mocha", + "update": "npm version minor --m=\"chore(update): Release v%s\"", + "version": "node scripts/validate.cjs", + "bundle": "node scripts/lang.js", + "types": "tsc", + "//": "versioning scripts", + "patch": "npm version patch --m=\"chore(patch): Release v%s\"", + "nextpatch": "npm version prepatch --m=\"chore(next): Build patch v%s\"", + "prep": "npm version preminor --preid= --m=\"chore(%s): Prep next version\"", + "next": "npm version prerelease --m=\"chore(next): Build script v%s\"" + }, + "files": [ + "dist/*.js", + "changelog.md" + ], + "devDependencies": { + "@actions/core": "^1.11.1", + "@linaria/postcss-linaria": "^4.1.5", + "@rollup/plugin-alias": "^5.1.1", + "@rollup/plugin-commonjs": "^17.1.0", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-multi-entry": "^4.1.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^3.1.0", + "@rollup/plugin-typescript": "^12.1.2", + "@rollup/pluginutils": "^5.1.4", + "@types/jquery": "^2.0.68", + "chai": "^4.3.7", + "chai-as-promised": "^7.1.1", + "dotenv": "^16.3.1", + "eslint": "^8.31.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-import": "^2.26.0", + "fast-glob": "^3.3.3", + "mocha": "^10.2.0", + "replace": "^1.2.1", + "rollup": "^2.79.2", + "rollup-plugin-cleanup": "^3.2.1", + "rollup-plugin-external-globals": "^0.6.1", + "rollup-plugin-import-css": "^3.2.1", + "stylelint": "^14.16.1", + "stylelint-config-standard": "^29.0.0", + "tslib": "^2.8.1", + "typescript": "^5.8.2" + }, + "dependencies": { + "axios": "^0.21.4", + "luxon": "^1.28.0", + "popper.js": "^1.16.1", + "showdown": "^2.0.0", + "simpletoast": "github:feildmaster/SimpleToast#2.0.3", + "tippy.js": "^4.3.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/rollup.config.js b/rollup.config.js new file mode 100644 index 00000000..2ba9cae6 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,141 @@ +import { config } from 'dotenv'; +import { readFileSync } from 'fs'; +import commonjs from '@rollup/plugin-commonjs'; +import json from '@rollup/plugin-json'; +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import cleanup from 'rollup-plugin-cleanup'; +import multi from '@rollup/plugin-multi-entry'; +import externals from 'rollup-plugin-external-globals'; +import css from 'rollup-plugin-import-css'; +import replace from '@rollup/plugin-replace'; +import alias from '@rollup/plugin-alias'; +import path from 'path'; +import typescript from '@rollup/plugin-typescript'; + +import { version } from './package.json'; +import importString from './scripts/import-string.js'; +import bundle from './scripts/lang.js'; + +config(); + +const debug = process.argv.includes('--configDebug'); +const exclude = ['**/*.ignore/*', '**/*.ignore*']; + +if (!debug) { + exclude.push( + '**/*.local/*', + '**/*.local*', + ); +} + +const meta = readFileSync('./src/meta.js').toString().replace(/{{ version }}/g, version); +const { + SENTRY_DSN = '', +} = process.env; + +export default [{ + input: 'src/bundle/bundle.js', + treeshake: false, + watch: false, + output: { + file: 'dist/dependencies.js', + format: 'cjs', + }, + context: 'this', + plugins: [ + nodeResolve({ browser: true }), + commonjs(), + json(), + cleanup(), + ], +}, { + input: { + include: [ + 'src/utils/0.publicist.js', + 'src/base/**/*.js', + 'src/hooks/**/*.js', + ], + exclude, + }, + context: 'this', + output: [{ + name: 'ucs', + file: 'dist/undercards.user.js', + banner: meta, + format: 'iife', // module, iife + esModule: false, + exports: 'none', + preferConst: true, + }, { + name: 'ucs', + file: 'dist/underscript.js', + format: 'iife', // module, iife + esModule: false, + exports: 'none', + preferConst: true, + }], + external: ['luxon', 'showdown', 'axios', 'tippy.js'], + plugins: [ + { + name: 'bundle', + buildStart() { + if (!debug) return; + this.addWatchFile('lang/en'); + bundle('lang/underscript.ignore.json'); + }, + }, + alias({ + entries: [{ + find: 'src', + replacement: path.resolve('./src'), + }], + }), + replace({ + preventAssignment: true, + values: { + VERSION: `'${version}'`, + __SENTRY__: SENTRY_DSN, + __VERSION__: version, + __ENVIRONMENT__: process.env.GITHUB_ACTIONS ? 'production' : 'development', + }, + }), + nodeResolve({ browser: true }), + typescript({ + outDir: './dist', + target: 'ES2023', + tsconfig: path.resolve('./src/tsconfig.json'), + }), + css(), + importString({ + include: ['**/*.html'], + }), + multi({ + exports: false, + }), + cleanup(), + externals({ + luxon: 'luxon', + showdown: 'showdown', + axios: 'axios', + 'tippy.js': 'tippy', + }), + { + name: 'Meta saver', + generateBundle() { + this.emitFile({ + type: 'asset', + fileName: 'undercards.meta.js', + source: meta, + }); + }, + }, + { + name: 'Watch src', + buildStart() { + // Look for new files in base/hooks + this.addWatchFile('src/base'); + this.addWatchFile('src/hooks'); + }, + }, + ], +}]; diff --git a/scripts/.eslintrc.cjs b/scripts/.eslintrc.cjs new file mode 100644 index 00000000..3b138d85 --- /dev/null +++ b/scripts/.eslintrc.cjs @@ -0,0 +1,12 @@ +module.exports = { + env: { + node: true, + }, + rules: { + 'import/extensions': ['error', { + js: 'always', + json: 'always', + }], + 'no-console': 'off', + }, +}; diff --git a/scripts/changelog/entries.cjs b/scripts/changelog/entries.cjs new file mode 100644 index 00000000..aeb65dc2 --- /dev/null +++ b/scripts/changelog/entries.cjs @@ -0,0 +1,38 @@ +const versionSeparator = '\n## '; +const regex = /^Version/; +const unreleased = /\[unreleased\]/i; +const titleRegex = / - | \(/; +const idRegex = /[0-9][a-z0-9.\-+]+|unreleased/i; +const dateRegex = /[0-9-/]+/; + +exports.getVersionById = (data, id) => { + const versions = getEntries(data).map(parseEntry); + + if (id) { + return versions.find((v) => v.id === id); + } + + return versions + .filter((v) => !unreleased.test(v.id)) + .shift(); +}; + +function getEntries(data) { + return String(data) + .split(versionSeparator) + .filter((e) => regex.test(e) || unreleased.test(e)); +} + +function parseEntry(entry = '') { + const [title, ...rest] = entry.trim().split('\n'); + + const [first, last] = title.split(titleRegex); + const [id] = first.trim().match(idRegex); + const [date] = last && last.trim().match(dateRegex) || []; + + return { + id, + date, + text: rest.join('\n'), + }; +} diff --git a/scripts/changelog/index.cjs b/scripts/changelog/index.cjs new file mode 100644 index 00000000..3e4abefd --- /dev/null +++ b/scripts/changelog/index.cjs @@ -0,0 +1,22 @@ +const { getInput, setOutput } = require('@actions/core'); +const fs = require('fs'); +const { getVersionById } = require('./entries.cjs'); + +const changelog = getInput('path') || './changelog.md'; +const target = getInput('version'); + +if (!target) { + console.log('No version provided, will retrieve latest available'); +} + +fs.readFile(changelog, (_, data) => { + const version = getVersionById(data, target); + + if (!version) { + throw new Error('Version not found'); + } + + setOutput('version', version.id); + setOutput('date', version.date); + setOutput('changes', version.text); +}); 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 < Object.entries(obj).forEach( + ([key, value]) => { + // Check if key exists in "en" + if (!Object.hasOwn(data.en, key)) { + console.warn(`${lang} has unknown key "${key}"`); + // assign(data, lang, `???${key}`, value); + // return; + } + assign(data, lang, key, value); + }, + ), + ); + + const file = JSON.stringify(sortKeys(data), null, 2); + if (!file) return; + + await writeFile(filePath, file); +} + +/** + * Bundle all files into a single object + * @returns {Promise>>} + */ +async function bundle(files = []) { + const ret = {}; + await Promise.all(files.map(async (file) => { + const [lang, name] = getFileParts(file); + + Object.entries(await readJSON(file)).forEach( + ([key, value]) => { + if (key.startsWith('//')) return; + const fullKey = name === 'vanilla' ? key : `underscript.${name}.${key}`; + assign(ret, lang, fullKey, value); + }, + ); + })); + return ret; +} + +// Split file path into [lang, name] +function getFileParts(file = '') { + const [/* dir */, lang, name] = file.split('/'); + return [lang, name.substring(0, name.lastIndexOf('.'))]; +} + +// Only automatically run if main script... +if (isMain(import.meta)) { + main(); +} diff --git a/scripts/utils.js b/scripts/utils.js new file mode 100644 index 00000000..5d3d1f7b --- /dev/null +++ b/scripts/utils.js @@ -0,0 +1,66 @@ +import fs from 'node:fs/promises'; +import nodePath from 'node:path'; + +export function assign(obj = {}, lang = '', key = '', value = '') { + // Only add key if value exists + if (!value) return; + obj[lang] ??= {}; // Does lang exist? + obj[lang][key] = value; +} + +export async function readJSON(file) { + const content = await fs.readFile(file); + return JSON.parse(content); +} + +export async function fileExists(path) { + try { + await fs.access(path); + return true; + } catch { + return false; + } +} + +export async function writeFile(path, data) { + const dir = nodePath.dirname(path); + await fs.mkdir(dir, { recursive: true }); + return fs.writeFile(path, data); +} + +export function sortKeys(obj = {}) { + const keys = Object.keys(obj); + if (!keys.length) return undefined; + const sorted = {}; + keys.sort( + (a, b) => uncomment(a).localeCompare(uncomment(b)), + ).forEach( + (key) => { + const value = obj[key]; + if (Array.isArray(value)) { + sorted[key] = value; + // value.forEach((val, index) => { + // sorted[`${key}.${index + 1}`] = val; + // }); + return; + } + sorted[key] = typeof value === 'object' ? sortKeys(value) : value; + }, + ); + return sorted; +} + +/** + * Checks if module is the main module + * @param {ImportMeta} meta + */ +export function isMain({ url }) { + return nodePath.normalize(url).endsWith(process.argv[1]); +} + +function uncomment(string = '') { + if (string.startsWith('//')) { + return string.substring(2); + } + return string; +} diff --git a/scripts/validate.cjs b/scripts/validate.cjs new file mode 100644 index 00000000..82117183 --- /dev/null +++ b/scripts/validate.cjs @@ -0,0 +1,13 @@ +const fs = require('fs'); +const { exec } = require('child_process'); +const { getVersionById } = require('./changelog/entries.cjs'); +const { version: target } = require('../package.json'); + +fs.readFile('./changelog.md', (_, data) => { + if (!getVersionById(data, target)) { + console.error('Missing version:', target); + exec('git reset --hard', () => { + process.exit(1); + }); + } +}); diff --git a/scripts/versioning.cjs b/scripts/versioning.cjs new file mode 100644 index 00000000..948f2022 --- /dev/null +++ b/scripts/versioning.cjs @@ -0,0 +1,9 @@ +const replace = require('replace'); +const pkg = require('../package.json'); + +replace({ + regex: '// @version .*', + replacement: `// @version ${pkg.version}`, + paths: ['./src/meta.js'], + silent: true, +}); diff --git a/src/.eslintrc.cjs b/src/.eslintrc.cjs new file mode 100644 index 00000000..e9c2829b --- /dev/null +++ b/src/.eslintrc.cjs @@ -0,0 +1,24 @@ +/* eslint-env node */ +module.exports = { + env: { + es6: true, + browser: true, + jquery: true, + greasemonkey: true, + node: false, + }, + globals: { + BootstrapDialog: 'readonly', + SimpleToast: 'readonly', + VERSION: 'readonly', + Sentry: 'readonly', + globalThis: 'readonly', + window: 'off', + }, + parserOptions: { + sourceType: 'module', + ecmaFeatures: { + globalReturn: true, + }, + }, +}; diff --git a/src/base/api/constants.js b/src/base/api/constants.js new file mode 100644 index 00000000..6705e59f --- /dev/null +++ b/src/base/api/constants.js @@ -0,0 +1,18 @@ +import * as api from 'src/utils/4.api.js'; +import Item from 'src/structures/constants/item.js'; +import Priority from 'src/structures/constants/priority'; + +const constants = api.mod.constants; +Object.entries(Item).forEach((([key, value]) => { + Object.defineProperty(constants, key, { + get() { + console.warn(`'underscript.constants.${key}' is deprecated, use 'underscript.items.${key}' instead.`); + return value; + }, + }); +})); + +constants.getItem = (value) => Item.find(value); +constants.isItem = (other) => Item.find(other) !== undefined; +constants.getPriority = (value) => Priority.find(value); +constants.isPriority = (other) => Priority.find(other) !== undefined; diff --git a/src/base/api/ignore.js b/src/base/api/ignore.js new file mode 100644 index 00000000..607b1e5f --- /dev/null +++ b/src/base/api/ignore.js @@ -0,0 +1,35 @@ +import * as settings from 'src/utils/settings/index.js'; +import * as api from 'src/utils/4.api.js'; +import ignoreUser from 'src/utils/ignoreUser.js'; + +const ignorePrefix = 'underscript.ignore.'; + +function ignore(user) { + const name = user.username || user.name; + const id = user.id || user.idUser; + if (!name || !id) throw new Error('Invalid user'); + if (isIgnored(user)) return; + const key = `${ignorePrefix}${id}`; + ignoreUser(name, key, true); +} + +function unignore(user) { + const name = user.username || user.name; + const id = user.id || user.idUser; + if (!name || !id) throw new Error('Invalid user'); + const key = `${ignorePrefix}${id}`; + settings.remove(key); +} + +function isIgnored(user) { + const name = user.username || user.name; + const id = user.id || user.idUser; + if (!name || !id) throw new Error('Invalid user'); + const key = `${ignorePrefix}${id}`; + return !!settings.value(key); +} + +const user = api.mod.user; +user.ignore = ignore; +user.unIgnore = unignore; +user.isIgnored = isIgnored; diff --git a/src/base/api/libraries.js b/src/base/api/libraries.js new file mode 100644 index 00000000..bd7e6cd4 --- /dev/null +++ b/src/base/api/libraries.js @@ -0,0 +1,11 @@ +import luxon from 'luxon'; +import tippy from 'tippy.js'; +import axios from 'axios'; +import showdown from 'showdown'; +import * as api from 'src/utils/4.api.js'; + +const lib = api.mod.lib; +lib.tippy = tippy; +lib.axios = axios; +lib.luxon = luxon; +lib.showdown = showdown; diff --git a/src/base/api/utils.js b/src/base/api/utils.js new file mode 100644 index 00000000..bc38a11b --- /dev/null +++ b/src/base/api/utils.js @@ -0,0 +1,42 @@ +import * as api from 'src/utils/4.api.js'; +import eventEmitter from 'src/utils/eventEmitter.js'; +import each from 'src/utils/each.js'; +import sleep from 'src/utils/sleep.js'; +import VarStore from 'src/utils/VarStore.js'; +import { global, globalSet } from 'src/utils/global.js'; +import Hotkey from 'src/utils/hotkey.class.js'; +import { hide, show, tip } from 'src/utils/hover.js'; +import notify from 'src/utils/notifications.js'; +import shuffle from 'src/utils/shuffle.js'; +import some from 'src/utils/some.js'; +import TabManager from 'src/utils/tabbedView.js'; +import rand from 'src/utils/rand.js'; +import SettingType from 'src/utils/settings/types/setting.js'; +import { translateText } from 'src/utils/translate.js'; + +const utils = api.mod.utils; + +utils.each = each; +utils.eventEmitter = eventEmitter; +utils.sleep = sleep; +utils.global = global; +utils.globalSet = globalSet; +utils.Hotkey = Hotkey; +utils.hover = { + hide, + show, + tip, + new: (...args) => { + // eslint-disable-next-line no-console + console.error('Deprecation warning: Use `tip` instead!'); + return tip(...args); + }, +}; +utils.notify = notify; +utils.shuffle = shuffle; +utils.some = some; +utils.tabManager = TabManager; +utils.translateText = translateText; +utils.VarStore = VarStore; +utils.rand = rand; +utils.SettingType = SettingType; diff --git a/src/base/chat/autocomplete.friends.js b/src/base/chat/autocomplete.friends.js new file mode 100644 index 00000000..7a1dc021 --- /dev/null +++ b/src/base/chat/autocomplete.friends.js @@ -0,0 +1,18 @@ +import eventManager from 'src/utils/eventManager.js'; +import * as settings from 'src/utils/settings/index.js'; +import { global } from 'src/utils/global.js'; +import * as user from 'src/utils/user.js'; +import Translation from 'src/structures/constants/translation.ts'; + +const setting = settings.register({ + name: Translation.Setting('autocomplete.friends'), + key: 'underscript.autocomplete.friends.online', + page: 'Chat', +}); + +eventManager.on('@autocomplete', ({ list }) => { + list.splice(0, 0, ...global('selfFriends') + .filter(({ online }) => !setting.value() || online) + .map(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..d0d367a2 --- /dev/null +++ b/src/base/chat/autocomplete.js @@ -0,0 +1,210 @@ +import eventManager from 'src/utils/eventManager.js'; +import * as settings from 'src/utils/settings/index.js'; +import { global, globalSet } from 'src/utils/global.js'; +import style from 'src/utils/style.js'; +import * as fnUser from 'src/utils/user.js'; +import { debug } from 'src/utils/debug.js'; +import Translation from 'src/structures/constants/translation.js'; + +const setting = settings.register({ + name: Translation.Setting('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, 90%); + 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 (!list || 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(fnUser.name(user), list)); + autocomplete($(`#${room} input.chat-text`)[0], room); +}); +eventManager.on('Chat:getMessage', ({ room, chatMessage }) => { + add(fnUser.name(JSON.parse(chatMessage).user), lists[room]); +}); +eventManager.on('ChatDetected', () => { + globalSet('autoComplete', function autoComplete(...args) { + if (setting.value()) return; + this.super(...args); + }, { + throws: false, + }); +}); diff --git a/src/base/chat/broadcast.js b/src/base/chat/broadcast.js new file mode 100644 index 00000000..fd4d6bda --- /dev/null +++ b/src/base/chat/broadcast.js @@ -0,0 +1,19 @@ +import eventManager from 'src/utils/eventManager.js'; +import * as settings from 'src/utils/settings/index.js'; +import { infoToast } from 'src/utils/2.toasts.js'; +import Translation from 'src/structures/constants/translation.ts'; + +const setting = settings.register({ + name: Translation.Setting('broadcast'), + key: 'underscript.disable.broadcast', + page: 'Chat', +}); + +eventManager.on('Chat:getMessageBroadcast', function broadcast({ message }) { + if (setting.value()) return; + infoToast({ + title: Translation.Toast('broadcast'), + 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..98d85875 --- /dev/null +++ b/src/base/chat/closed.js @@ -0,0 +1,8 @@ +import eventManager from 'src/utils/eventManager.js'; +import { global } from 'src/utils/global.js'; + +eventManager.on('Chat:Disconnected', () => { + $('.chat-box').each((i, e) => { + global('scroll')($(e), true); + }); +}); diff --git a/src/base/chat/commands/scroll.js b/src/base/chat/commands/scroll.js new file mode 100644 index 00000000..a26b2863 --- /dev/null +++ b/src/base/chat/commands/scroll.js @@ -0,0 +1,22 @@ +import eventManager from 'src/utils/eventManager.js'; +import * as settings from 'src/utils/settings/index.js'; +import { global } from 'src/utils/global.js'; +import { debug } from 'src/utils/debug.js'; +import Translation from 'src/structures/constants/translation.ts'; + +const command = 'scroll'; +const setting = settings.register({ + name: Translation.DISABLE_COMMAND_SETTING.withArgs(command), + key: `underscript.command.${command}`, + note: `/${command}`, + page: 'Chat', + category: Translation.CATEGORY_CHAT_COMMAND, +}); + +eventManager.on('Chat:command', function process(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..a38eaea0 --- /dev/null +++ b/src/base/chat/context.js @@ -0,0 +1,257 @@ +import eventManager from 'src/utils/eventManager.js'; +import * as settings from 'src/utils/settings/index.js'; +import { global } from 'src/utils/global.js'; +import style from 'src/utils/style.js'; +import { toast as simpleToast, infoToast } from 'src/utils/2.toasts.js'; +import each from 'src/utils/each.js'; +import * as fnUser from 'src/utils/user.js'; +import ignoreUser from 'src/utils/ignoreUser.js'; +import decode from 'src/utils/decode.js'; +import { buttonCSS, window } from 'src/utils/1.variables.js'; +import Translation from 'src/structures/constants/translation.ts'; + +const setting = settings.register({ + name: Translation.Setting('chat.rightclick'), + key: 'underscript.disable.chatContext', + page: 'Chat', +}); + +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: 0 5px; + height: auto; + } + /* TODO: Why is this !important? */ + .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: #036; + color: #F2F2F2; + } + .chatContext > :last-child { + border-radius: 0 0 10px 10px; + } +`); +let toast; + +eventManager.on('jQuery', () => { + 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)}
    +
    ${Translation.General('storage.load').translate(deck.length)}
    +
    ${cards(deck)}
    +
    + ${getTranslationArray(note).join('
    ')} +
    + `; + } else { + text = ` +
    ${SOUL}
    +
    ${Translation.General('storage.save')}
    `; + } + } + hover.show(text)(e); + } + fixClass(!!localStorage.getItem(deckKey)) + .on('click.script.deckStorage', (e) => { + if (!localStorage.getItem(deckKey)) { + saveButton(); + return; + } + if (e.ctrlKey && e.shiftKey) { // Crazy people... + return; + } + if (e.ctrlKey) { // ERASE + localStorage.removeItem(nameKey); + localStorage.removeItem(deckKey); + refreshHover(); // Update + } else if (e.shiftKey) { // Re-save + saveButton(); + } 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(); + refreshHover(); + } + display.hide(); + input.show() + .focus() + .select() + // eslint-disable-next-line no-shadow + .on('keydown.script.deckStorage', (e) => { + if (e.key === 'Escape' || e.key === 'Enter') { + e.preventDefault(); + storeInput(); + } + }) + .on('focusout.script.deckStorage', () => { + storeInput(); + }); + }); + eventManager.on('underscript:ready', () => { + button.hover(hoverButton); + }); + } + + compound('Deck:Loaded', 'Chat:Connected', loadStorage); + $('#yourCardList > button[onclick="removeAllCards();"]').on('click', () => { + deckLoader.clear(); + }); + eventManager.on('Deck:Soul', () => deckLoader.clear()); + }); +}); diff --git a/src/base/library/filter.js b/src/base/library/filter.js new file mode 100644 index 00000000..ac38f179 --- /dev/null +++ b/src/base/library/filter.js @@ -0,0 +1,248 @@ +import eventManager from 'src/utils/eventManager.js'; +import * as settings from 'src/utils/settings/index.js'; +import { global, globalSet } from 'src/utils/global.js'; +import style from 'src/utils/style.js'; +import onPage from 'src/utils/onPage.js'; +import { max } from 'src/utils/cardHelper.js'; +import Translation from 'src/structures/constants/translation.ts'; +import Priority from 'src/structures/constants/priority.js'; +import extractImageName from 'src/utils/extractImageName'; +import { getTranslationArray } from '../underscript/translation.js'; + +export const crafting = onPage('Crafting'); +export const decks = onPage('Decks'); +export const filters = [ + /** + * @param {Card} card + * @param {boolean} removed + * @returns {boolean | undefined} + */ + function templateFilter(card, removed) { + return removed; + }, +]; + +filters.shift(); // Remove template + +const base = { + onChange: () => applyLook(), + category: Translation.Setting('category.filter'), + page: 'Library', + default: true, +}; + +const setting = settings.register({ + ...base, + default: false, + name: Translation.Setting('filter.disable'), + key: 'underscript.deck.filter.disable', +}); + +const tribe = settings.register({ + ...base, + name: Translation.Setting('filter.tribe'), + key: 'underscript.deck.filter.tribe', +}); + +const owned = settings.register({ + ...base, + name: Translation.Setting('filter.collection'), + key: 'underscript.deck.filter.collection', +}); + +const shiny = settings.register({ + ...base, + name: Translation.Setting('filter.shiny'), + key: 'underscript.deck.filter.shiny', + options: () => { + const { key } = Translation.Setting('filter.shiny.option'); + const options = getTranslationArray(key); + return ['Never (default)', 'Deck', 'Always'].map((val, i) => [ + options[i], + val, + ]); + }, + default: 'Deck', +}); + +style.add( + '#collectionType { margin-bottom: 10px; }', + '.filter input+* { opacity: 0.4; }', + '.filter input:checked+* { opacity: 1; }', + '.filter input:disabled, .filter input:disabled+* { display: none; }', +); + +function applyLook(refresh = decks || crafting) { + $('input[onchange^="applyFilters();"]').parent().parent().toggleClass('filter', !setting.value()); + if (crafting && !setting.value()) { + $('input[rarity]:checked').prop('checked', false); + } + + // Tribe filter + if (setting.value()) { + $('#allTribeInput').parent().remove(); + } else if (!$('#allTribeInput').length) { + $('#monsterInput').parent().before(allTribeButton(), ' '); + } + $('#allTribeInput').prop('disabled', !tribe.value()); + + const allCardsElement = $('[data-i18n="[html]crafting-all-cards"]'); + if (setting.value() || !owned.value()) { + $('#collectionType').remove(); + allCardsElement.removeClass('invisible'); + } else if (!$('#collectionType').length) { + eventManager.on('underscript:ready', () => { + allCardsElement.addClass('invisible') + .after(ownSelect()); + }); + } + + // Re-add shiny filter + if (!$('#shinyInput').length) { + $('#utyInput').parent().after(shinyButton()); + } + $('#shinyInput').prop('disabled', mergeShiny()); + + if (refresh) { + global('applyFilters')(); + global('showPage')(0); + } +} + +eventManager.on(':preload:Decks :preload:Crafting', () => { + // Update filter visuals + applyLook(false); + globalSet('isRemoved', function newFilter(card) { + if (setting.value()) return this.super(card); + const results = new Map(); + return filters.reduce((removed, func) => { + if (typeof func !== 'function') return removed; + const val = func.call(this, card, removed, Object.fromEntries(results)); + const key = func.displayName || func.name; + if (typeof val === 'boolean') { + results.set(key, val !== removed); + return val; + } + results.set(key, null); + return removed; + }, false); + }); +}); + +function mergeShiny() { + return shiny.value() === 'Always' || (decks && shiny.value() === 'Deck'); +} + +function allTribeButton() { + return $(` + `); +} + +function shinyButton() { + return $(` + `); +} + +function ownSelect() { + return $(` + + `); +} + +filters.push( + Priority.FIRST, + // function isRemoved(card) { + // // Shiny, Rarity, Type, Extension, Search + // return this.super(card); + // }, + // eslint-disable-next-line no-shadow + function shiny(card, removed) { + if (removed) return null; + if (mergeShiny()) return false; + return card.shiny !== $('#shinyInput').prop('checked'); + }, + function rarity(card, removed) { + if (removed) return null; + const rarities = $('.rarityInput:checked').map(function getRarity() { + return this.getAttribute('rarity'); + }).get(); + return rarities.length > 0 && !rarities.includes(card.rarity); + }, + function type(card, removed) { + if (removed) return null; + const monster = $('#monsterInput').prop('checked'); + const spell = $('#spellInput').prop('checked'); + const cardType = monster ? 0 : 1; + return monster !== spell && card.typeCard !== cardType; + }, + function extension(card, removed) { + if (removed) return null; + const extensions = []; + if ($('#undertaleInput').prop('checked')) { + extensions.push('BASE'); + } + if ($('#deltaruneInput').prop('checked')) { + extensions.push('DELTARUNE'); + } + if ($('#utyInput').prop('checked')) { + extensions.push('UTY'); + } + return extensions.length > 0 && !extensions.includes(card.extension); + }, + function search(card, removed) { + if (removed) return null; + const text = $('#searchInput').val().toLowerCase(); + if (!text.length) return false; + function includes(dirty) { + return dirty.replace(/(<.*?>)/g, '').toLowerCase().includes(text); + } + extractImageName(true); + const result = ( + !includes($.i18n(`card-name-${card.id}`, 1)) && + !includes($.i18n(`card-${card.id}`)) && + !(card.soul?.name && includes($.i18n(`soul-${card.soul.name.toLowerCase().replace(/_/g, '-')}`))) && + !card.tribes.some((t) => includes($.i18n(`tribe-${t.toLowerCase().replace(/_/g, '-')}`))) + ); + extractImageName(false); + return result; + }, + Priority.HIGHEST, + Priority.HIGH, + crafting && function baseGenFilter(card, removed) { + if (removed || $('.rarityInput:checked').length) return null; + return ['BASE', 'TOKEN'].includes(card.rarity); + }, + function tribeFilter(card, removed) { + if (removed || !tribe.value()) return null; + return $('#allTribeInput').prop('checked') && !card.tribes.length; + }, + crafting && function ownedFilter(card, removed) { + if (removed || !owned.value()) return null; + switch ($('#collectionType').val()) { + case 'owned': return !card.quantity; + case 'unowned': return card.quantity > 0; + case 'maxed': return card.quantity < max(card.rarity); + case 'surplus': return card.quantity <= max(card.rarity); + case 'craftable': return card.quantity >= max(card.rarity); + case 'all': + default: return false; + } + }, + Priority.NORMAL, + Priority.LOW, + Priority.LOWEST, + Priority.LAST, +); diff --git a/src/base/library/hideCheckboxes.js b/src/base/library/hideCheckboxes.js new file mode 100644 index 00000000..09279ace --- /dev/null +++ b/src/base/library/hideCheckboxes.js @@ -0,0 +1,47 @@ +import eventManager from 'src/utils/eventManager.js'; +import * as settings from 'src/utils/settings/index.js'; +import style from 'src/utils/style.js'; +import Translation from 'src/structures/constants/translation.ts'; +import { crafting, decks } from './filter.js'; +import { getTranslationArray } from '../underscript/translation.js'; + +const setting = settings.register({ + key: 'underscript.library.hidebuttons', + name: Translation.Setting('filter.trim'), + options() { + const { key } = Translation.Setting('filter.trim.option'); + const array = getTranslationArray(key); + return ['Always', 'Deck', 'Crafting', 'Never'].map( + (val, i) => [array[i], val], + ); + }, + page: 'Library', + category: Translation.Setting('category.filter'), + onChange: refresh, +}); + +const styles = style.add(); + +function apply() { + switch (setting.value()) { + case 'Always': return decks || crafting; + case 'Deck': return decks; + case 'Crafting': return crafting; + case 'Never': + default: return false; + } +} + +function refresh() { + if (apply()) { + styles.replace( + '.filter input { display: none; }', + '.filter input+* { margin: 0 2px; opacity: 0.2; }', + '.filter .rainbowText { padding: 0px 5px; font-size: 22px; }', + ); + } else { + styles.remove(); + } +} + +eventManager.on(':preload:Decks :preload:Crafting', refresh); diff --git a/src/base/library/scrollwheel.js b/src/base/library/scrollwheel.js new file mode 100644 index 00000000..af4236b3 --- /dev/null +++ b/src/base/library/scrollwheel.js @@ -0,0 +1,20 @@ +import eventManager from 'src/utils/eventManager.js'; +import * as settings from 'src/utils/settings/index.js'; +import { globalSet } from 'src/utils/global.js'; +import onPage from 'src/utils/onPage.js'; +import Translation from 'src/structures/constants/translation.ts'; + +const setting = settings.register({ + name: Translation.Setting('library.scrollwheel'), + key: 'underscript.disable.scrolling', + refresh: onPage('Decks') || onPage('Crafting'), + page: 'Library', + category: Translation.CATEGORY_HOTKEYS, +}); + +eventManager.on(':preload:Decks :preload:Crafting', function scrollwheelLoaded() { + globalSet('onload', function onload() { + this.super?.(); + if (setting.value()) $('#collection').off('mousewheel DOMMouseScroll'); + }); +}); diff --git a/src/base/lobby/customFriendsOnly.js b/src/base/lobby/customFriendsOnly.js new file mode 100644 index 00000000..a0103e7b --- /dev/null +++ b/src/base/lobby/customFriendsOnly.js @@ -0,0 +1,46 @@ +import eventManager from 'src/utils/eventManager.js'; +import * as settings from 'src/utils/settings/index.js'; +import { global } from 'src/utils/global.js'; +import { errorToast } from 'src/utils/2.toasts.js'; +import { debug } from 'src/utils/debug.js'; +import isFriend from 'src/utils/isFriend.js'; +import Translation from 'src/structures/constants/translation.ts'; + +const name = Translation.Setting('custom.friends'); +const setting = settings.register({ + name, + key: 'underscript.custom.friendsOnly', + note: Translation.Setting('custom.friends.note'), + page: 'Lobby', + category: Translation.CATEGORY_CUSTOM, +}); +const container = document.createElement('span'); +let flag = setting.value(); + +function init() { + $(container) + .append($(``).prop('checked', flag).on('change', () => { + flag = !flag; + })) + .append(' ', $('