From f1ccd8484840444af78c4e9d4588556290ce5554 Mon Sep 17 00:00:00 2001 From: Max <9123069+Mondrethos@users.noreply.github.com> Date: Fri, 18 Sep 2026 10:01:20 -0500 Subject: [PATCH 1/2] DEV: Update lint configuration for standard Discourse CI --- .gitignore | 1 + .husky/pre-commit | 2 +- .npmrc | 3 +- .template-lintrc.cjs | 1 - Gemfile.lock | 125 +- .../bb_code/admin/refresh_controller.rb | 4 +- assets/stylesheets/common/accordion.scss | 4 +- assets/stylesheets/common/block.scss | 14 +- assets/stylesheets/common/border-bg.scss | 3 +- assets/stylesheets/common/divide.scss | 1 + assets/stylesheets/common/fieldset.scss | 2 +- assets/stylesheets/common/heightrestrict.scss | 2 +- assets/stylesheets/common/imagefloat.scss | 2 + assets/stylesheets/common/index.scss | 56 +- assets/stylesheets/common/mail.scss | 10 +- assets/stylesheets/common/markdown-shims.scss | 1 - assets/stylesheets/common/newspaper.scss | 11 +- assets/stylesheets/common/note.scss | 25 +- assets/stylesheets/common/ooc.scss | 1 + assets/stylesheets/common/print.scss | 2 + assets/stylesheets/common/rowcolumn.scss | 10 +- assets/stylesheets/common/side.scss | 3 +- assets/stylesheets/common/size.scss | 6 + assets/stylesheets/common/spoiler.scss | 10 +- assets/stylesheets/common/tabs.scss | 1 + assets/stylesheets/common/textmessage.scss | 16 +- package.json | 26 +- pnpm-lock.yaml | 4005 ++++++++++++++++ stylint.config.mjs => stylelint.config.mjs | 0 yarn.lock | 4081 ----------------- 30 files changed, 4198 insertions(+), 4230 deletions(-) delete mode 100644 .template-lintrc.cjs create mode 100644 pnpm-lock.yaml rename stylint.config.mjs => stylelint.config.mjs (100%) delete mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index 74cad9d..905a073 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules /gems /auto_generated +.eslintcache diff --git a/.husky/pre-commit b/.husky/pre-commit index 3723623..cb2c84d 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1 @@ -yarn lint-staged +pnpm lint-staged diff --git a/.npmrc b/.npmrc index 4fd0219..89ddd35 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ -engine-strict=true \ No newline at end of file +engine-strict = true +auto-install-peers = false diff --git a/.template-lintrc.cjs b/.template-lintrc.cjs deleted file mode 100644 index 5355ea0..0000000 --- a/.template-lintrc.cjs +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@discourse/lint-configs/template-lint"); diff --git a/Gemfile.lock b/Gemfile.lock index faa0e14..23bbbc5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,80 +1,99 @@ GEM remote: https://rubygems.org/ specs: - activesupport (7.1.3.3) + activesupport (8.1.3) base64 bigdecimal - concurrent-ruby (~> 1.0, >= 1.0.2) + concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) + json + logger (>= 1.4.2) minitest (>= 5.1) - mutex_m - tzinfo (~> 2.0) - ast (2.4.2) - base64 (0.2.0) - bigdecimal (3.1.8) - concurrent-ruby (1.2.3) - connection_pool (2.4.1) - drb (2.2.1) - i18n (1.14.5) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) + ast (2.4.3) + base64 (0.3.0) + bigdecimal (4.1.2) + concurrent-ruby (1.3.7) + connection_pool (3.0.2) + drb (2.2.3) + i18n (1.15.2) concurrent-ruby (~> 1.0) - json (2.7.2) - language_server-protocol (3.17.0.3) - minitest (5.23.1) - mutex_m (0.2.0) - parallel (1.24.0) - parser (3.3.1.0) + json (2.20.0) + language_server-protocol (3.17.0.6) + lint_roller (1.1.0) + logger (1.7.0) + minitest (6.0.6) + drb (~> 2.0) + prism (~> 1.5) + parallel (2.1.0) + parser (3.3.11.1) ast (~> 2.4.1) racc prettier_print (1.2.1) - racc (1.8.0) - rack (3.0.12) + prism (1.9.0) + racc (1.8.1) + rack (3.2.6) rainbow (3.1.1) - regexp_parser (2.9.2) - rexml (3.3.9) - rubocop (1.64.0) + regexp_parser (2.12.0) + rubocop (1.88.2) json (~> 2.3) - language_server-protocol (>= 3.17.0) - parallel (~> 1.10) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) + parallel (>= 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) - rexml (>= 3.2.5, < 4.0) - rubocop-ast (>= 1.31.1, < 2.0) + regexp_parser (>= 2.9.3, < 3.0) + rubocop-ast (>= 1.49.0, < 2.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.31.3) - parser (>= 3.3.1.0) - rubocop-capybara (2.20.0) - rubocop (~> 1.41) - rubocop-discourse (3.8.0) + unicode-display_width (>= 2.4.0, < 4.0) + rubocop-ast (1.50.0) + parser (>= 3.3.7.2) + prism (~> 1.7) + rubocop-capybara (3.0.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-discourse (3.18.0) activesupport (>= 6.1) - rubocop (>= 1.59.0) - rubocop-capybara (>= 2.0.0) - rubocop-factory_bot (>= 2.0.0) - rubocop-rails (>= 2.25.0) - rubocop-rspec (>= 2.25.0) - rubocop-factory_bot (2.25.1) - rubocop (~> 1.41) - rubocop-rails (2.25.0) + lint_roller (>= 1.1.0) + rubocop-capybara (>= 2.23.0) + rubocop-discourse-base (>= 1.0.0) + rubocop-factory_bot (>= 2.27.0) + rubocop-rails (>= 2.30.3) + rubocop-rspec (>= 3.0.1) + rubocop-rspec_rails (>= 2.31.0) + rubocop-discourse-base (1.0.0) + rubocop (>= 1.80.0) + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rails (2.35.5) activesupport (>= 4.2.0) + lint_roller (~> 1.1) rack (>= 1.1) - rubocop (>= 1.33.0, < 2.0) - rubocop-ast (>= 1.31.1, < 2.0) - rubocop-rspec (2.29.2) - rubocop (~> 1.40) - rubocop-capybara (~> 2.17) - rubocop-factory_bot (~> 2.22) - rubocop-rspec_rails (~> 2.28) - rubocop-rspec_rails (2.28.3) - rubocop (~> 1.40) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.44.0, < 2.0) + rubocop-rspec (3.10.2) + lint_roller (~> 1.1) + regexp_parser (>= 2.0) + rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) ruby-progressbar (1.13.0) - syntax_tree (6.2.0) + securerandom (0.4.1) + syntax_tree (6.3.0) prettier_print (>= 1.2.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - unicode-display_width (2.5.0) + unicode-display_width (3.2.0) + unicode-emoji (~> 4.1) + unicode-emoji (4.2.0) + uri (1.1.1) PLATFORMS ruby @@ -84,4 +103,4 @@ DEPENDENCIES syntax_tree BUNDLED WITH - 2.5.10 + 4.0.15 diff --git a/app/controllers/bb_code/admin/refresh_controller.rb b/app/controllers/bb_code/admin/refresh_controller.rb index 99e87ac..a0f4c38 100644 --- a/app/controllers/bb_code/admin/refresh_controller.rb +++ b/app/controllers/bb_code/admin/refresh_controller.rb @@ -9,10 +9,10 @@ def index begin # Skip warmup in development mode - it makes boot take ~2s longer PrettyText.cook("warm up **pretty text**") - render json: nil, status: 200 + render json: nil, status: :ok rescue => e Rails.logger.error("Failed to warm up pretty text: #{e}") - render json: nil, status: 500 + render json: nil, status: :internal_server_error end end end diff --git a/assets/stylesheets/common/accordion.scss b/assets/stylesheets/common/accordion.scss index b1b7061..7395623 100644 --- a/assets/stylesheets/common/accordion.scss +++ b/assets/stylesheets/common/accordion.scss @@ -32,10 +32,12 @@ div.bb-accordion { &:hover { background: $title-hover-bg-color; } + &::before { display: none; } } + &[open=""] summary.bb-slide-title { border-bottom: 1px solid $border-color; } @@ -46,9 +48,9 @@ div.bb-accordion { background-color: $content-bg-color; border-right: 1px solid $border-color; border-left: 1px solid $border-color; - padding: 6px; } + &:last-child { border-bottom: unset; } diff --git a/assets/stylesheets/common/block.scss b/assets/stylesheets/common/block.scss index 2b48413..173af3f 100644 --- a/assets/stylesheets/common/block.scss +++ b/assets/stylesheets/common/block.scss @@ -74,6 +74,7 @@ table.bb-block { td.bb-block-content { border-color: $color; } + td.bb-block-icon { background-image: url($image); @@ -90,62 +91,51 @@ table.bb-block { } @include block-builder("dice", "Dice", #0a941d, "/plugins/bbcode/images/colordice.png"); - @include block-builder("dice10", "Dice", #0a941d, "/plugins/bbcode/images/colordice10.png"); - @include block-builder("setting", "Setting", #0a941d, "/plugins/bbcode/images/colorsetting.png"); - @include block-builder( "important", "Important", #94920a, "/plugins/bbcode/images/colorexclaim.png" ); - @include block-builder( "treasure", "Treasure", #cbc939, "/plugins/bbcode/images/colortreasure.png" ); - @include block-builder( "announcement", "Announcement", #940a0a, "/plugins/bbcode/images/colorannounce.png" ); - @include block-builder("warning", "Warning", #940a0a, "/plugins/bbcode/images/colorwarning.png"); - @include block-builder( "encounter", "Encounter", #940a0a, "/plugins/bbcode/images/colorencounter.png" ); - @include block-builder( "storyteller", "Storyteller", #bf7e00, "/plugins/bbcode/images/colorpencil.png" ); - @include block-builder( "question", "Question", #5e0a94, "/plugins/bbcode/images/colorquestion.png" ); - @include block-builder( "information", "Information", #0a1694, "/plugins/bbcode/images/colorinfo.png" ); - @include block-builder( "character", "Character", @@ -154,7 +144,7 @@ table.bb-block { ); } -@media screen and (max-width: 600px) { +@media screen and (width <= 600px) { table.bb-block td.bb-block-icon { height: 75px; background-size: 50px; diff --git a/assets/stylesheets/common/border-bg.scss b/assets/stylesheets/common/border-bg.scss index b6d0bc7..8fd2f6f 100644 --- a/assets/stylesheets/common/border-bg.scss +++ b/assets/stylesheets/common/border-bg.scss @@ -3,6 +3,7 @@ border-style: solid; border-width: 1px; border-color: var(--tertiary); + > .bb-background { margin: -10px; } @@ -10,5 +11,5 @@ .bb-background { padding: 10px; - color: currentColor; + color: currentcolor; } diff --git a/assets/stylesheets/common/divide.scss b/assets/stylesheets/common/divide.scss index 9f072c2..84a7936 100644 --- a/assets/stylesheets/common/divide.scss +++ b/assets/stylesheets/common/divide.scss @@ -5,6 +5,7 @@ span.bb-divide { width: 100%; display: block; text-align: center; + &[data-type="thick"] { border-bottom: 3px solid var(--tertiary); } diff --git a/assets/stylesheets/common/fieldset.scss b/assets/stylesheets/common/fieldset.scss index c2940b0..f98a0e4 100644 --- a/assets/stylesheets/common/fieldset.scss +++ b/assets/stylesheets/common/fieldset.scss @@ -16,7 +16,7 @@ color: var(--tertiary); } - @media screen and (max-width: 800px) { + @media screen and (width <= 800px) { width: 90%; } } diff --git a/assets/stylesheets/common/heightrestrict.scss b/assets/stylesheets/common/heightrestrict.scss index 64291c9..8b83b4d 100644 --- a/assets/stylesheets/common/heightrestrict.scss +++ b/assets/stylesheets/common/heightrestrict.scss @@ -4,7 +4,7 @@ div.bb-height-restrict { .image-wrapper, .lightbox-wrapper, img { - height: 100% !important; //this is needed in order to overcome the sizing that discourse does on its own to images + height: 100% !important; // this is needed in order to overcome the sizing that discourse does on its own to images width: auto !important; } } diff --git a/assets/stylesheets/common/imagefloat.scss b/assets/stylesheets/common/imagefloat.scss index cccf512..3085f65 100644 --- a/assets/stylesheets/common/imagefloat.scss +++ b/assets/stylesheets/common/imagefloat.scss @@ -4,10 +4,12 @@ margin: 10px; max-width: calc(50% + 40px); } + .bb-float-left { float: left; margin-left: 0; } + .bb-float-right { float: right; margin-right: 10px; diff --git a/assets/stylesheets/common/index.scss b/assets/stylesheets/common/index.scss index cc73ae1..782fa6e 100644 --- a/assets/stylesheets/common/index.scss +++ b/assets/stylesheets/common/index.scss @@ -1,31 +1,31 @@ -@import "accordion.scss"; -@import "alignment.scss"; -@import "block.scss"; -@import "blockquote.scss"; -@import "border-bg.scss"; -@import "check.scss"; -@import "divide.scss"; -@import "fieldset.scss"; -@import "heightrestrict.scss"; -@import "highlight.scss"; -@import "img.scss"; -@import "imagefloat.scss"; -@import "justify.scss"; -@import "mail.scss"; -@import "markdown-shims.scss"; -@import "newspaper.scss"; -@import "note.scss"; -@import "ooc.scss"; -@import "pindent.scss"; -@import "print.scss"; -@import "progress.scss"; -@import "rowcolumn.scss"; -@import "scroll.scss"; -@import "side.scss"; -@import "size.scss"; -@import "spoiler.scss"; -@import "tabs.scss"; -@import "textmessage.scss"; +@import "accordion"; +@import "alignment"; +@import "block"; +@import "blockquote"; +@import "border-bg"; +@import "check"; +@import "divide"; +@import "fieldset"; +@import "heightrestrict"; +@import "highlight"; +@import "img"; +@import "imagefloat"; +@import "justify"; +@import "mail"; +@import "markdown-shims"; +@import "newspaper"; +@import "note"; +@import "ooc"; +@import "pindent"; +@import "print"; +@import "progress"; +@import "rowcolumn"; +@import "scroll"; +@import "side"; +@import "size"; +@import "spoiler"; +@import "tabs"; +@import "textmessage"; .d-editor-preview { position: relative; diff --git a/assets/stylesheets/common/mail.scss b/assets/stylesheets/common/mail.scss index 086be4e..63a4bee 100644 --- a/assets/stylesheets/common/mail.scss +++ b/assets/stylesheets/common/mail.scss @@ -17,21 +17,24 @@ .bb-email-address, .bb-email-subject { - color: currentColor; + color: currentcolor; height: 35px; line-height: 35px; padding: 0 10px; border-bottom: 1px solid var(--tertiary); + &::before { color: var(--tertiary); } } + .bb-email-address::after { content: "Cc Bcc"; position: absolute; right: 10px; color: var(--tertiary); } + .bb-email-subject::before { content: "Subject: "; } @@ -44,20 +47,25 @@ .bb-email-header::before { content: "Send New Email"; } + .bb-email-address::before { content: "To: "; } + .bb-email-button::before { content: "Send"; } } + &[data-bb-email="receive"] { .bb-email-header::before { content: "New Email Received"; } + .bb-email-address::before { content: "From: "; } + .bb-email-button::before { content: "Reply"; } diff --git a/assets/stylesheets/common/markdown-shims.scss b/assets/stylesheets/common/markdown-shims.scss index f02beb7..d6417ce 100644 --- a/assets/stylesheets/common/markdown-shims.scss +++ b/assets/stylesheets/common/markdown-shims.scss @@ -1,6 +1,5 @@ // This file is used to fix some of the issues with the way markdown and bbob interact // This is usually a hack to remove the extra line break after a block to respect tight spacing - pre:has(> code) + br { display: none; } diff --git a/assets/stylesheets/common/newspaper.scss b/assets/stylesheets/common/newspaper.scss index 368fb70..4bad764 100644 --- a/assets/stylesheets/common/newspaper.scss +++ b/assets/stylesheets/common/newspaper.scss @@ -1,22 +1,17 @@ .bb-newspaper { font-family: "Times New Roman", Georgia, Serif; text-align: justify; - -webkit-column-count: 3; /* Chrome, Safari, Opera */ - -moz-column-count: 3; /* Firefox */ column-count: 3; padding: 10px; background: url("/plugins/bbcode/images/paper.jpg"); border: 1px solid var(--tertiary); color: black; - @media screen and (max-width: 1000px) { - -webkit-column-count: 2; /* Chrome, Safari, Opera */ - -moz-column-count: 2; /* Firefox */ + @media screen and (width <= 1000px) { column-count: 2; } - @media screen and (max-width: 750px) { - -webkit-column-count: 1; /* Chrome, Safari, Opera */ - -moz-column-count: 1; /* Firefox */ + + @media screen and (width <= 750px) { column-count: 1; } } diff --git a/assets/stylesheets/common/note.scss b/assets/stylesheets/common/note.scss index 68e1376..51bf00d 100644 --- a/assets/stylesheets/common/note.scss +++ b/assets/stylesheets/common/note.scss @@ -12,6 +12,7 @@ .bb-note-content { overflow: hidden; } + .bb-note-footer { height: 50px; width: 50px; @@ -19,19 +20,19 @@ } .bb-note-tape { - background-color: hsla(0, 0%, 100%, 0.5); - box-shadow: inset 0 0 1em 0.5em hsla(0, 0%, 100%, 0.1); + background-color: hsl(0deg, 0%, 100%, 0.5); + box-shadow: inset 0 0 1em 0.5em hsl(0deg, 0%, 100%, 0.1); height: 3em; position: absolute; transform: rotate(-4deg); width: 9em; - -webkit-filter: drop-shadow(0 1px 1px hsla(0, 0%, 0%, 0.3)); + filter: drop-shadow(0 1px 1px hsl(0deg, 0%, 0%, 0.3)); top: -1.5em; left: 50%; margin-left: -4.5em; - &:after, - &:before { + &::after, + &::before { background-size: 0.4em 0.4em; bottom: 0; content: ""; @@ -39,17 +40,19 @@ top: 0; width: 0.2em; } - &:after { + + &::after { background-image: - linear-gradient(45deg, transparent 50%, hsla(0, 0%, 100%, 0.3) 50%), - linear-gradient(-45deg, transparent 50%, hsla(0, 0%, 100%, 0.3) 50%); + linear-gradient(45deg, transparent 50%, hsl(0deg, 0%, 100%, 0.3) 50%), + linear-gradient(-45deg, transparent 50%, hsl(0deg, 0%, 100%, 0.3) 50%); background-position: 0 100%; left: -0.2em; } - &:before { + + &::before { background-image: - linear-gradient(135deg, transparent 50%, hsla(0, 0%, 100%, 0.3) 50%), - linear-gradient(-135deg, transparent 50%, hsla(0, 0%, 100%, 0.3) 50%); + linear-gradient(135deg, transparent 50%, hsl(0deg, 0%, 100%, 0.3) 50%), + linear-gradient(-135deg, transparent 50%, hsl(0deg, 0%, 100%, 0.3) 50%); background-position: 100% 100%; right: -0.2em; } diff --git a/assets/stylesheets/common/ooc.scss b/assets/stylesheets/common/ooc.scss index c151ef0..e6b386d 100644 --- a/assets/stylesheets/common/ooc.scss +++ b/assets/stylesheets/common/ooc.scss @@ -3,6 +3,7 @@ div.bb-ooc { font-style: italic; padding: 0; border: 1px solid var(--tertiary-low); + &::before { font-style: normal; font-weight: 600; diff --git a/assets/stylesheets/common/print.scss b/assets/stylesheets/common/print.scss index 30a4804..ba0c92e 100644 --- a/assets/stylesheets/common/print.scss +++ b/assets/stylesheets/common/print.scss @@ -24,12 +24,14 @@ div.bb-print { url("/plugins/bbcode/images/paper-top3.png"), url("/plugins/bbcode/images/paper-bottom3.png"), url("/plugins/bbcode/images/paperlined.jpg"); } + &-graph { @extend .bb-print; background-image: url("/plugins/bbcode/images/paper-top3.png"), url("/plugins/bbcode/images/paper-bottom3.png"), url("/plugins/bbcode/images/papergraph.jpg"); } + &-parchment { @extend .bb-print; background-image: diff --git a/assets/stylesheets/common/rowcolumn.scss b/assets/stylesheets/common/rowcolumn.scss index 373c503..bbcdbed 100644 --- a/assets/stylesheets/common/rowcolumn.scss +++ b/assets/stylesheets/common/rowcolumn.scss @@ -14,33 +14,41 @@ margin: 0 0.5%; padding: 0 0.5%; float: left; + &[data-span="column-width-span1"] { width: 10.5%; } + &[data-span="column-width-span2"] { width: 23%; } + &[data-span="column-width-span3"] { width: 35.5%; } + &[data-span="column-width-span4"] { width: 48%; } + &[data-span="column-width-span5"] { width: 60.5%; } + &[data-span="column-width-span6"] { width: 73%; } + &[data-span="column-width-span7"] { width: 85.5%; } + &[data-span="column-width-span8"] { width: 98%; } } -@media screen and (max-width: 900px) { +@media screen and (width <= 900px) { .bb-row { &[data-span="column-width-span1"], &[data-span="column-width-span2"], diff --git a/assets/stylesheets/common/side.scss b/assets/stylesheets/common/side.scss index 0e7d393..e0202a2 100644 --- a/assets/stylesheets/common/side.scss +++ b/assets/stylesheets/common/side.scss @@ -1,5 +1,4 @@ div.bb-side { - clear: both; width: 21%; border-left: 3px dotted var(--tertiary); border-right: 3px dotted var(--tertiary); @@ -21,7 +20,7 @@ div.bb-side { clear: right; } - @media screen and (max-width: 800px) { + @media screen and (width <= 800px) { width: 80%; float: none; clear: both; diff --git a/assets/stylesheets/common/size.scss b/assets/stylesheets/common/size.scss index 6469706..e3fe3f2 100644 --- a/assets/stylesheets/common/size.scss +++ b/assets/stylesheets/common/size.scss @@ -2,21 +2,27 @@ span { &[data-size="1"] { font-size: 9px; } + &[data-size="2"] { font-size: 10px; } + &[data-size="3"] { font-size: 12px; } + &[data-size="4"] { font-size: 15px; } + &[data-size="5"] { font-size: 18px; } + &[data-size="6"] { font-size: 22px; } + &[data-size="7"] { font-size: 26px; } diff --git a/assets/stylesheets/common/spoiler.scss b/assets/stylesheets/common/spoiler.scss index ef693b3..782b4a7 100644 --- a/assets/stylesheets/common/spoiler.scss +++ b/assets/stylesheets/common/spoiler.scss @@ -7,10 +7,6 @@ details.bb-spoiler { text-decoration: none; cursor: pointer; border: 1px solid transparent; - border-top-color: transparent; - border-right-color: transparent; - border-bottom-color: transparent; - border-left-color: transparent; font-size: 12px; border-radius: 4px; padding-top: 7px; @@ -22,11 +18,12 @@ details.bb-spoiler { background: var(--tertiary); overflow: hidden; white-space: nowrap; - word-wrap: normal; + overflow-wrap: normal; text-overflow: ellipsis; max-width: 100%; display: inline-block; border-color: var(--tertiary-low); + &::before { display: none; } @@ -44,8 +41,9 @@ details.bb-spoiler { span.bb-inline-spoiler { display: inline; - background-color: currentColor; + background-color: currentcolor; cursor: pointer; + &[data-displayed="true"] { background-color: var(--tertiary-hover); } diff --git a/assets/stylesheets/common/tabs.scss b/assets/stylesheets/common/tabs.scss index ff7eb90..62ffe83 100644 --- a/assets/stylesheets/common/tabs.scss +++ b/assets/stylesheets/common/tabs.scss @@ -32,6 +32,7 @@ div.bb-tabs { input[type="radio"] { position: absolute; left: -200vw; + &:focus-visible + label.bb-tab-label { outline: 2px solid var(--tertiary); } diff --git a/assets/stylesheets/common/textmessage.scss b/assets/stylesheets/common/textmessage.scss index 986b8ce..248d75a 100644 --- a/assets/stylesheets/common/textmessage.scss +++ b/assets/stylesheets/common/textmessage.scss @@ -61,10 +61,10 @@ float: left; } -.bb-textmessage .bb-textmessage-content .bb-message-right:before, -.bb-textmessage .bb-textmessage-content .bb-message-left:before, -.bb-textmessage .bb-textmessage-content .bb-message-me:before, -.bb-textmessage .bb-textmessage-content .bb-message-them:before { +.bb-textmessage .bb-textmessage-content .bb-message-right::before, +.bb-textmessage .bb-textmessage-content .bb-message-left::before, +.bb-textmessage .bb-textmessage-content .bb-message-me::before, +.bb-textmessage .bb-textmessage-content .bb-message-them::before { content: ""; height: 10px; width: 9px; @@ -72,14 +72,14 @@ bottom: 0; } -.bb-textmessage .bb-textmessage-content .bb-message-right:before, -.bb-textmessage .bb-textmessage-content .bb-message-me:before { +.bb-textmessage .bb-textmessage-content .bb-message-right::before, +.bb-textmessage .bb-textmessage-content .bb-message-me::before { background: url("/plugins/bbcode/images/textmessagecolorarrow.png"); right: -4px; } -.bb-textmessage .bb-textmessage-content .bb-message-left:before, -.bb-textmessage .bb-textmessage-content .bb-message-them:before { +.bb-textmessage .bb-textmessage-content .bb-message-left::before, +.bb-textmessage .bb-textmessage-content .bb-message-them::before { background: url("/plugins/bbcode/images/textmessagegreyarrow.png"); left: -4px; } diff --git a/package.json b/package.json index 66cdaec..b4b81b5 100644 --- a/package.json +++ b/package.json @@ -8,26 +8,29 @@ "scripts": { "start": "rollup -c -w", "build": "rollup -c", - "prepare": "husky install", - "lint": "eslint" + "prepare": "husky", + "lint": "pnpm lint:js && pnpm lint:css && pnpm lint:prettier", + "lint:js": "eslint {assets,admin/assets,test}/javascripts --cache --no-error-on-unmatched-pattern", + "lint:css": "pnpm stylelint 'assets/stylesheets/**/*.scss' --allow-empty-input", + "lint:prettier": "pnpm prettier 'assets/stylesheets/**/*.scss' '{assets,admin/assets,test}/javascripts/**/*.{js,gjs,ts,gts,mts,cts,hbs}' --check --no-error-on-unmatched-pattern" }, "devDependencies": { "@bbob/types": "^4.2.0", - "@discourse/lint-configs": "2.12.0", + "@discourse/lint-configs": "3.2.0", "@rollup/plugin-node-resolve": "^15.1.0", "@rollup/plugin-replace": "^5.0.7", "@rollup/plugin-terser": "^0.4.3", - "ember-template-lint": "7.0.4", - "eslint": "9.24.0", + "eslint": "10.6.0", "husky": ">=6", "lint-staged": ">=10", - "prettier": "3.5.3", + "prettier": "3.8.1", "rollup": "^4.30.1", - "stylelint": "16.16.0" + "stylelint": "17.5.0" }, "dependencies": { "@bbob/core": "^4.2.0", "@bbob/html": "^4.2.0", + "@bbob/plugin-helper": "^4.2.0", "@bbob/preset": "^4.2.0", "@bbob/preset-html5": "^4.2.0" }, @@ -36,6 +39,11 @@ "*.{js,css,md}": "prettier --write" }, "engines": { - "node": ">=18.0.0" - } + "node": ">= 22", + "npm": "please-use-pnpm", + "yarn": "please-use-pnpm", + "pnpm": "^10" + }, + "private": true, + "packageManager": "pnpm@10.28.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..997f67d --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4005 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: false + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@bbob/core': + specifier: ^4.2.0 + version: 4.2.0 + '@bbob/html': + specifier: ^4.2.0 + version: 4.2.0 + '@bbob/plugin-helper': + specifier: ^4.2.0 + version: 4.2.0 + '@bbob/preset': + specifier: ^4.2.0 + version: 4.2.0 + '@bbob/preset-html5': + specifier: ^4.2.0 + version: 4.2.0 + devDependencies: + '@bbob/types': + specifier: ^4.2.0 + version: 4.2.0 + '@discourse/lint-configs': + specifier: 3.2.0 + version: 3.2.0(@typescript-eslint/parser@8.70.0(eslint@10.6.0)(typescript@5.9.3))(eslint@10.6.0)(postcss@8.5.28)(prettier@3.8.1)(stylelint@17.5.0(typescript@5.9.3)) + '@rollup/plugin-node-resolve': + specifier: ^15.1.0 + version: 15.3.1(rollup@4.41.0) + '@rollup/plugin-replace': + specifier: ^5.0.7 + version: 5.0.7(rollup@4.41.0) + '@rollup/plugin-terser': + specifier: ^0.4.3 + version: 0.4.4(rollup@4.41.0) + eslint: + specifier: 10.6.0 + version: 10.6.0 + husky: + specifier: '>=6' + version: 9.1.7 + lint-staged: + specifier: '>=10' + version: 16.0.0 + prettier: + specifier: 3.8.1 + version: 3.8.1 + rollup: + specifier: ^4.30.1 + version: 4.41.0 + stylelint: + specifier: 17.5.0 + version: 17.5.0(typescript@5.9.3) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@8.0.6': + resolution: {integrity: sha512-uMHhvmDmwFiLuiozaoRYTZHqMFuu3fem/X9JY78lohAuLoh8LSGGC8JqUzo2cVuBsBxkjMZNk56CE7ock8Xxkw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/compat-data@7.27.2': + resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@8.0.5': + resolution: {integrity: sha512-YLsYoQMvL8l8WrGpN3Zj7O1wK5LEBN+cQtux7BcuHyxIXve724XG+zuJ1n3U1cUweRtTzQOA4IHbuQw3N34SZw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/core@7.27.1': + resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@8.0.6': + resolution: {integrity: sha512-5zwYt1V4ji3mXKKRIAkohSJ29WepxNwxQi+7y7P5AcVPh1dcxnZBU2cfxHnPwS+u9+lZnXPsv30TQaF2xg+Tfg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/eslint-parser@8.0.6': + resolution: {integrity: sha512-mXx93HLovamLnDDLQ4i48gm4HHtaoqJrbMAuJqrMfpCGJkJ5M4sXhRgKGTrxykg1P8tAN5myrJxsRZuMuTq+OQ==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + eslint: ^9.0.0 || ^10.0.0 + + '@babel/generator@7.27.1': + resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@8.0.6': + resolution: {integrity: sha512-/pcanjdRsonCexCuxgGD8fKnBLLzk2i9uM4kmcmGyyev2R5YDs+rafMYZ89RvaGY1mW8T7C5au0TyYaEeHBGng==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-annotate-as-pure@7.27.1': + resolution: {integrity: sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@8.0.0': + resolution: {integrity: sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@8.0.6': + resolution: {integrity: sha512-HTrtZ4+iA0+kzdbCgvdSk1U4pEl3BvpGnlUbualCGNbrVhhQvhgBzurTUmqpWyvyHbWYWaIfdx2mOlL9LJjsew==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-class-features-plugin@8.0.6': + resolution: {integrity: sha512-Hy7wG2Pk1LnAkFMq0CbBk789XMTYVzYGxR7tKgk+TOpZckQRME3Tdou4mMT/8DFjJFxFZ8R6UsS4DR/duBKlVA==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@8.0.6': + resolution: {integrity: sha512-OdnA/N52LhzFpeUuVz5YGuSWjc7TPHiFmVYZbPlSgExocO2GwbxVpSni9MVs5wwW+wZ4kPuwBEBN9pIPDYz1mA==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@8.0.5': + resolution: {integrity: sha512-GLe05QD98BkNFTkjaqeqF9QSRoHLKrrB4tpoplyQuuPrQJ72rtmkM4wvqJLX/sjZPqkbK5MUYSsuUTqdJoOVjA==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.1': + resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-optimise-call-expression@8.0.0': + resolution: {integrity: sha512-3W6satvtPuCUkUx63S2jMoW9EQNYkADgs1HTfufmL7gCmAulHMKupA/12WNz4A0GMMFn/YnWWwqOT9IZrJHQjg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@8.0.1': + resolution: {integrity: sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@8.0.1': + resolution: {integrity: sha512-B1SZADIcy3tmH8CmWvj4SHi/oAPom4UL3uknTc2QRNsPVLFk/sPnZvQL/8kj7Y5omvjMqie0vklvs6XM4OLW5Q==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@8.0.0': + resolution: {integrity: sha512-xmCA9kP3IhySsqhzwIdWGlDN/1A4cCKNBO/uwZx/3YzmDoMePwno2Q5/Bq0q+tYaKbeF940YiKV/kaW8Mzvpjw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@8.0.6': + resolution: {integrity: sha512-+6HYEBnsDRZHJtUTAEfMQd0zMDqdFHS7C+5vAsEZqBUr3vEMWOWlHJ0Jz1gS8jJIlCvLsuA6ivmeoqzH936YcA==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@8.0.6': + resolution: {integrity: sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@8.0.0': + resolution: {integrity: sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helpers@7.27.1': + resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@8.0.5': + resolution: {integrity: sha512-fQtPOXjYOYv85PIdwotp2TJGVYOycX0PQq+l844fFAxOULtBy8BVF35GyeueX0r4KvDthqPH5xAI1clQPk/2uA==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/parser@7.27.2': + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.29.9': + resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@8.0.6': + resolution: {integrity: sha512-LpGDIYJAzc3Y3PT9x+FxBrGYu2PlWxLmyN7SwPTzaX0LSwEmFJBsRnPBqmaXF2r1v+Zhz6lNiEJ+7yKtM5+Ugg==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true + + '@babel/plugin-proposal-decorators@7.27.1': + resolution: {integrity: sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-decorators@8.0.2': + resolution: {integrity: sha512-+C6O6KKXU7BBq1GNaIkFJxrALUVGRcr+WeWm4OcuRl3h+l/CmNfcTLMrT2Lm3uvGBimBH/8pEBRrXJFLoO67Gg==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + + '@babel/plugin-syntax-decorators@7.27.1': + resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@8.0.1': + resolution: {integrity: sha512-NI+0S/6MvR6GlcQFwjDZ+WIc2qvG6TXN534lYs9llNldwW4b7Dh6KTtk030FA0xWdYGs4t1lWo+OEWN8wGB+Nw==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/template@8.0.0': + resolution: {integrity: sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/traverse@7.27.1': + resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@8.0.6': + resolution: {integrity: sha512-ilYV+qLStGzSKLipJlETdvdtpK3rAuwfCmCoGKv15MU4EoeIuLkespSNoNLFGOPSciEHx9TLWtN5mv0fz5w5mQ==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/types@7.27.1': + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@babel/types@8.0.6': + resolution: {integrity: sha512-c+xgSWboV2pdwXP67BUWDVRHi2BO5Q3KwxyFVs7taVTY+fsK47/L51ZXQoV9rozHJDNHvJ4v4WEsI/IlxV2l2A==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@bbob/core@4.2.0': + resolution: {integrity: sha512-i5VUIO6xx+TCrBE8plQF9KpW1z+0QcCh9GawCCWYG9KcZrEsyRy57my5/kem0a2lFxXjh0o+tgjQY9sCP5b3bw==} + + '@bbob/html@4.2.0': + resolution: {integrity: sha512-mZG7MmE/YluH1/FNCr2Jv/Vz3Mq5stZ5tFAjBmYpVVN6Ndus4+FA84vKoHFdUHDiuU1p/e2/o/VUrwsWwLdoIA==} + + '@bbob/parser@4.2.0': + resolution: {integrity: sha512-l8BppXjdQClrUiv+qIN0Oe6aS/vlH7CEduMreDaxYDadUPC0RMzxj9lXVjO0xTbFEVEIUJCGc53qnpiApLbx2g==} + + '@bbob/plugin-helper@4.2.0': + resolution: {integrity: sha512-Uxs/UJROnkpcq5EJfz/8NCEYAcme8l6oAgMeWLX1nxWeieUhRgpY8BWQ9eQwUOXEKa0tsKVPnlmbUAjFhppVPw==} + + '@bbob/preset-html5@4.2.0': + resolution: {integrity: sha512-X2EIeb2vqTz/n34KWQXEL5IC0SuB6i2/ltRpEaMTyK7IoDEs0XGIWcqVpenb7Z2d4eNA3gTWhkoUUkKlZmfQRQ==} + + '@bbob/preset@4.2.0': + resolution: {integrity: sha512-IA+kxlrRcYBXE634B8W6uU2DO7VvrxeOqWUzIDKV2CgzTMpmCG875ihGp+Q3T+QxGwzG5S0L4GdmCIULTbzC4A==} + + '@bbob/types@4.2.0': + resolution: {integrity: sha512-bSCZnNg0VrPosBBUVkjBDYVKNEqwT0jTNuzvAuNrZkuILgUKtLYI9GHuT8rY4lZecCb7UqGDsHsYt0YJO36eJg==} + + '@cacheable/memory@2.2.0': + resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} + + '@cacheable/utils@2.5.0': + resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} + + '@csstools/css-calc@3.4.0': + resolution: {integrity: sha512-XQKj5B7QiZcHiegCOCAzcAOJdhGgWOHbbu62h5e5mkHnn8lWcfiJhllkqWmxu5zWR9jucPHuo1iTB56P033hcg==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.14': + resolution: {integrity: sha512-HpbVXyrofRXpHpgkNIjU/3EWR4WJvOkO3emNK/L6X/mTJU7bGUI3AkkpoTNXznQLp0KRjLHELTGeKI5dIkI9JQ==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + + '@csstools/css-tokenizer@4.0.1': + resolution: {integrity: sha512-bPlN9S9O1A0euCpEWE4qnvB5YDuyYVsUTrxSgmAM1Is0j4tICHoVyOVAXfWMP/kS9ZrjvyIXWV2PmomiAXXqOw==} + engines: {node: '>=20.19.0'} + + '@csstools/media-query-list-parser@5.0.0': + resolution: {integrity: sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/selector-resolve-nested@4.0.1': + resolution: {integrity: sha512-j3vdQu0XwLME5qOTWxm8cnmvsf423R2YL6DbKklCHZwkDm7UdKNu6RPlw4REIJhSlKBICY3B70/7QZdicLqZgg==} + engines: {node: '>=20.19.0'} + peerDependencies: + postcss-selector-parser: ^7.1.1 + + '@csstools/selector-specificity@6.0.0': + resolution: {integrity: sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==} + engines: {node: '>=20.19.0'} + peerDependencies: + postcss-selector-parser: ^7.1.1 + + '@discourse/lint-configs@3.2.0': + resolution: {integrity: sha512-mEZYPNlGyf+Jq6i6QKzi2mXw9ofgcEh1XARoQKQS1Y+SsclJgGHT33MUxn5QwWEaGpSYA67/0hdPVL+HEW29gw==} + peerDependencies: + eslint: 10.6.0 + prettier: 3.8.1 + stylelint: 17.5.0 + + '@ember-data/rfc395-data@0.0.4': + resolution: {integrity: sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ==} + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.3': + resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@glimmer/env@0.1.7': + resolution: {integrity: sha512-JKF/a9I9jw6fGoz8kA7LEQslrwJ5jms5CXhu/aqkBWk+PmZ6pTl8mlb/eJ/5ujBGTiQzBhy5AIWF712iA+4/mw==} + + '@glimmer/interfaces@0.94.6': + resolution: {integrity: sha512-sp/1WePvB/8O+jrcUHwjboNPTKrdGicuHKA9T/lh0vkYK2qM5Xz4i25lQMQ38tEMiw7KixrjHiTUiaXRld+IwA==} + + '@glimmer/syntax@0.95.0': + resolution: {integrity: sha512-W/PHdODnpONsXjbbdY9nedgIHpglMfOzncf/moLVrKIcCfeQhw2vG07Rs/YW8KeJCgJRCLkQsi+Ix7XvrurGAg==} + + '@glimmer/util@0.94.8': + resolution: {integrity: sha512-HfCKeZ74clF9BsPDBOqK/yRNa/ke6niXFPM6zRn9OVYw+ZAidLs7V8He/xljUHlLRL322kaZZY8XxRW7ALEwyg==} + + '@glimmer/wire-format@0.94.8': + resolution: {integrity: sha512-A+Cp5m6vZMAEu0Kg/YwU2dJZXyYxVJs2zI57d3CP6NctmX7FsT8WjViiRUmt5abVmMmRH5b8BUovqY6GSMAdrw==} + + '@handlebars/parser@2.2.2': + resolution: {integrity: sha512-n/SZW+12rwikx/f8YcSv9JCi5p9vn1Bnts9ZtVvfErG4h0gbjHI1H1ZMhVUnaOC7yzFc6PtsCKIK8XeTnL90Gw==} + engines: {node: ^18 || ^20 || ^22 || >=24} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/gen-mapping@0.4.0-beta.0': + resolution: {integrity: sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.6.0 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + + '@napi-rs/wasm-runtime@1.2.4': + resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@one-ini/wasm@0.2.1': + resolution: {integrity: sha512-TUqERXGNTifZ9y2g3wPxQrw3HpHv/02DsW3D90T9x0hhonrL1ZqpSmNrU2XkoIq0fP1N6gZfVQzy2Fw1ZvGBNg==} + + '@oxc-parser/binding-android-arm-eabi@0.130.0': + resolution: {integrity: sha512-h/xYU8/7ADWzVSf5I+YalLpj33LOy9CI/zgbJNIZ5eunRBG+Czqa3lZsvuPHHf3rOt6z1c5+UzoxjbAzAvhwVw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.130.0': + resolution: {integrity: sha512-oFWFJrsGv9siFM4HjMqKNB7IuIZD/SMmZdCXl8xyx7lDplGvPKyewpOo272rSWgMXe2Wx7bWI0Yj+gkHv4qbeg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.130.0': + resolution: {integrity: sha512-sGUzupdTplK9jQg7eJZ878HfEgQjJNBc6dAYVWJ9W5aU+J8rLfRJhTVsKThiu1pNwm6Y1qKCcbC6WhNWSXR3Ig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.130.0': + resolution: {integrity: sha512-PsB4cdCISbC00Uy8eiD8bc2AkGWjZqrSrJnkBFuG2ptrrf6mZ2F5gLFSjOAVMMgZPg8B1D7OydJwLWSfyI2Plg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.130.0': + resolution: {integrity: sha512-DgABp3l38hS77JbXCV4qk1+n6DPym5u8zzwuweokezm2tX194nDSJDENbDRECxVsiNbprKATLbk+Z5wlHT0OHw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.130.0': + resolution: {integrity: sha512-4Kn3CTEmwFrzhTSC/JuUW16qovmaMdX7jeSKbL8w0pLtLww7To1a2XJi9Z5uD8QWUkfUHhqfV+VD6dVzBnWzoA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.130.0': + resolution: {integrity: sha512-D35KZM3F4rRu1uAFKyBlg3Gaf/ybCjyaPR1hfgvk5ex8NtcTmRgc0JgSighEyNg96TPrFhemFba68SZuxaha8w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.130.0': + resolution: {integrity: sha512-Q9o7oVlo955KHwS8l1u0bCzIx+JsZUA3XToLXC+MsMhye/9LeBQbt84nh120cl2XLy+TEzvugYDiHShg5yaX6Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.130.0': + resolution: {integrity: sha512-EiJ/gC0ljbcwVpycC8YWw6ggMbtsPX8XMOt0mPx0aqWeMsNR+L9m05Flbvd5T+GlivG+GkSWQL7tM9SRFpM/dw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-ppc64-gnu@0.130.0': + resolution: {integrity: sha512-b+h/lsLLurp756dMGizNs5uPaJfyEdWrTcV5t8M609jWm1DEHB1StpRXCkyvwtkJx3m+qL5BNQ0dEKan/4yGFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-gnu@0.130.0': + resolution: {integrity: sha512-O19Cil83XAyjEFfo8WhkMwY58ALqZ7ckjGL+25mjMIuF84urWBeANH0FC8B8BsSSygWU3/1aY3ADdDbp+wlBnw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-musl@0.130.0': + resolution: {integrity: sha512-BgXRVC0+83n3YzCscLQjj6nbyeBIVeZYPTI4fFMAE4WNm2+4RXhWp03IVizL7esIz36kgmT48aebk1iM+cs8sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-s390x-gnu@0.130.0': + resolution: {integrity: sha512-6tJz0xvnGhsokE7N1WlUSBXibpYmT9xSJFS1Ce41Km/+8gQvdlW8MLhRv8PD0L7ix8vRG0FDDepp3jdOFzdVdw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.130.0': + resolution: {integrity: sha512-9aCWj83dp3heTQGmGnZGdIWgxjZrr/7VQ0TGFHH5PKByxJKF2Hcr4qvaSUHhhGEa3MSsDjTL1YDP8RAgdL5/Cg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.130.0': + resolution: {integrity: sha512-afXt87aZBqrUVli8TB/I8H1G50RDWcwirjWtXGXYqJ2ZqWEiErH7V72j3LUSDZaivmtu2OLX0KQ/mbhP81mr7A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-openharmony-arm64@0.130.0': + resolution: {integrity: sha512-I0NCrZV/YZuCGWgqwNN/GO/iXlLF2z+Wgc7u+Aa9N4P51oYeIa0XT+zVBUne4csO9GqxskXgI4g8JzzWGRpfOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-wasm32-wasi@0.130.0': + resolution: {integrity: sha512-sJgQkGaBX0WJvPUDfwciex6IcTk5O5NLQ1bhEb6f3nBruh1GshKMRSMt2bxZlYrgBzjyBbJzsnO+InPG0bg+fA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.130.0': + resolution: {integrity: sha512-bjcma99sQrNh6RY4mPO9yTkfxql6TDFoN3HWdK31RCKXwNhcDgJXW/l8PUtzKNiQ+9vpKJfJtQq+LklBuxSOBA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.130.0': + resolution: {integrity: sha512-hRYbv6HhpSTzT4xTiIkadLI7upLQxuOdLPR/9nL1fTjwhgutBTPXrwaAPb/jTFVx6/8C7Jb5HcUKhmNwloTbFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.130.0': + resolution: {integrity: sha512-RBpA9TsRucJq6HNVNCFF1iKg+QeTkLdZf7hi4xaOGCPvMZWvDHjQgSOEZMUpuW4JNciHbxNhLEYmz5CVygjVGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.130.0': + resolution: {integrity: sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==} + + '@rollup/plugin-node-resolve@15.3.1': + resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@5.0.7': + resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.41.0': + resolution: {integrity: sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.41.0': + resolution: {integrity: sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.41.0': + resolution: {integrity: sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.41.0': + resolution: {integrity: sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.41.0': + resolution: {integrity: sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.41.0': + resolution: {integrity: sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.41.0': + resolution: {integrity: sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.41.0': + resolution: {integrity: sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.41.0': + resolution: {integrity: sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.41.0': + resolution: {integrity: sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.41.0': + resolution: {integrity: sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': + resolution: {integrity: sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.41.0': + resolution: {integrity: sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.41.0': + resolution: {integrity: sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.41.0': + resolution: {integrity: sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.41.0': + resolution: {integrity: sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.41.0': + resolution: {integrity: sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.41.0': + resolution: {integrity: sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.41.0': + resolution: {integrity: sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.41.0': + resolution: {integrity: sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==} + cpu: [x64] + os: [win32] + + '@simple-dom/interface@1.4.0': + resolution: {integrity: sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/gensync@1.0.5': + resolution: {integrity: sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==} + + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@typescript-eslint/eslint-plugin@8.70.0': + resolution: {integrity: sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.70.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.70.0': + resolution: {integrity: sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.70.0': + resolution: {integrity: sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.70.0': + resolution: {integrity: sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.70.0': + resolution: {integrity: sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.70.0': + resolution: {integrity: sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.70.0': + resolution: {integrity: sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.70.0': + resolution: {integrity: sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.70.0': + resolution: {integrity: sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.70.0': + resolution: {integrity: sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-regex@6.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} + engines: {node: 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.5: + resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + cacheable@2.5.0: + resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001718: + resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + content-tag@4.2.0: + resolution: {integrity: sha512-f/o+F3qSa4gg23I7RWy6cMDxP2nPo99YWusxw2bjne7ZC6Acqqf4uB/+87AekOq1ehTocHH7b7nMd2X4S3NHVw==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-functions-list@3.3.3: + resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} + engines: {node: '>=12'} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + editorconfig@3.0.2: + resolution: {integrity: sha512-T0ix8GhtxyKVfUFEcvdNDt3YGqlwkFHbD4/5bgFUDgFmxhI/cSRAeJ87/Sz//Cq8Eam6JX/e23RkoFO71P7aAA==} + engines: {node: '>=20'} + hasBin: true + + electron-to-chromium@1.5.155: + resolution: {integrity: sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==} + + ember-eslint-parser@0.14.6: + resolution: {integrity: sha512-Z4fA1E/3uGZeBLPcz5aCiic3OoZ9YVxQBkImgGXdtgHLLuF/51drGor/FCwT9cCs1XZqY8HWRy4aarl+MZCfwQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@babel/eslint-parser': ^7.28.6 || ^8.0.0 + '@typescript-eslint/parser': '*' + peerDependenciesMeta: + '@babel/eslint-parser': + optional: true + '@typescript-eslint/parser': + optional: true + + ember-estree@0.6.11: + resolution: {integrity: sha512-aZyheQGUXyHu8GARPd1YyjbDMGkvqBYKzPj6RVp8qqMqA1L1MbkWKsljWE3K1CwiJcHwTPgm/O3oxS0TY1AX9Q==} + + ember-rfc176-data@0.3.18: + resolution: {integrity: sha512-JtuLoYGSjay1W3MQAxt3eINWXNYYQliK90tLwtb8aeCuQK8zKGCRbBodVIrkcTqshULMnRuTOS6t1P7oQk3g6Q==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + engines: {node: '>=14'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-decorator-position@6.1.1: + resolution: {integrity: sha512-ubUyPxDvD/bnnZdeTFiP6cOYPFk9hYPR73jTaz/iXJ6iqpP8xGBYnFVjMj+dkObD5/HLTxxYA4pkn1ndt9dXSg==} + engines: {node: '>=14'} + peerDependencies: + '@babel/eslint-parser': ^7.18.2 || ^8.0.0 + eslint: ^7.31.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + '@babel/eslint-parser': + optional: true + + eslint-plugin-ember@13.5.0: + resolution: {integrity: sha512-q1s/irrc2l1KeE1l5S1UiO7ZrvGF5aYm903CMQ7lHFc09F/78/uvgzvA4wPZ9TFMl07r2ttoIINrEOFy05RtGg==} + engines: {node: '>= 20.19'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '>= 8.40.0' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-qunit@8.2.6: + resolution: {integrity: sha512-S1jC/DIW9J8VtNX4uG1vlf5FZVrfQFlcuiYmvTHR2IICUhubHqpWA5o+qS1tujh+81Gs39omKV2D4OXfbSJE5g==} + engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} + peerDependencies: + eslint: '>=8.38.0' + + eslint-plugin-simple-import-sort@13.0.0: + resolution: {integrity: sha512-McAc+/Nlvcg4byY/CABGH8kqnefWBj8s3JA2okEtz8ixbECQgU46p0HkTUKa4YS7wvgGceimlc34p1nXqbWqtA==} + peerDependencies: + eslint: '>=5.0.0' + + eslint-plugin-sort-class-members@1.22.1: + resolution: {integrity: sha512-TC76+m06fjpiAYPrEcyyvvWzp1aMHNBVGROLu9ijQuPDZPWJjhNTheha4f6f7eUTWabloczLZagoZ+mb6Cv0ZQ==} + engines: {node: '>=4.0.0'} + peerDependencies: + eslint: '>=0.8.0' + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.6.0: + resolution: {integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@11.1.5: + resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flat-cache@6.1.23: + resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} + + flru@1.0.2: + resolution: {integrity: sha512-kWyh8ADvHBFz6ua5xYOPnUroZTT/bwWfrCeL0Wj1dzG4/YOmOcfJ99W8dOVyyynJN35rZ9aCOtHChqQovV7yog==} + engines: {node: '>=6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-east-asian-width@1.7.0: + resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} + engines: {node: '>=18'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@17.12.0: + resolution: {integrity: sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==} + engines: {node: '>=18'} + + globby@16.2.4: + resolution: {integrity: sha512-c8B/VNLmxRcmqqenRA9t+9IyOjf9+V6lTxPaUJLqOCONdQkWZ0ETYgX0qbtJqPsgCNusT9MZ5Jeidw8Eb9tn2g==} + engines: {node: '>=20'} + + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + + has-flag@5.0.1: + resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} + engines: {node: '>=12'} + + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} + engines: {node: '>=20'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} + + hookified@2.2.0: + resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + html-tags@5.1.0: + resolution: {integrity: sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==} + engines: {node: '>=20.10'} + + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.9: + resolution: {integrity: sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.1.0: + resolution: {integrity: sha512-bUi/yjmtKYcRVUtWRGr0UA6xEFh2I6zWUwMrUXB3s7bmYCaZ8a+0ZsTRkrawh/mzlSD1Y0Ph8bp/U+TvBpWDNw==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@16.0.0: + resolution: {integrity: sha512-sUCprePs6/rbx4vKC60Hez6X10HPkpDJaGcy3D1NdwR7g1RcNkWL8q9mJMreOqmHBTs+1sNFp+wOiX9fr+hoOQ==} + engines: {node: '>=20.18'} + hasBin: true + + listr2@8.3.3: + resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} + engines: {node: '>=18.0.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + mathml-tag-names@4.0.0: + resolution: {integrity: sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + meow@14.1.0: + resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==} + engines: {node: '>=20'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nano-spawn@1.0.2: + resolution: {integrity: sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==} + engines: {node: '>=20.17'} + + nanoid@3.3.19: + resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + oxc-parser@0.130.0: + resolution: {integrity: sha512-X0PJ+NmOok8qP3vK9uaW431ngkdM9UPEK7KG466urtIL2+EYTEgbZK2yqe2MWKJKBjRlFweP/pJPx0x9muMEVw==} + engines: {node: ^20.19.0 || >=22.12.0} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@7.1.6: + resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-ember-template-tag@2.1.8: + resolution: {integrity: sha512-ioLdBFoZ11kuiuFF9/bGwHgzjiU3vQVOF1rQhcuEqGc1jmKBH+G3i3BL2yHGum2Z2IQOE/7MPstYo5iAU0Uhlw==} + engines: {node: 18.* || >= 20} + peerDependencies: + prettier: '>= 3.0.0' + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qified@0.10.1: + resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} + engines: {node: '>=20'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requireindex@1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.41.0: + resolution: {integrity: sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-html-tokenizer@0.5.11: + resolution: {integrity: sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og==} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + smob@1.5.0: + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.2.2: + resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} + engines: {node: '>=20'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + stylelint-config-recommended-scss@17.0.1: + resolution: {integrity: sha512-x5DVehzJudcwF0od3sGpgkln2PLLranFE7twwbp7dqDINCyZvwzFkMc6TLhNOvazRiVBJYATQLouJY0xPGB8WA==} + engines: {node: '>=20'} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^17.0.0 + peerDependenciesMeta: + postcss: + optional: true + + stylelint-config-recommended@18.0.0: + resolution: {integrity: sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg==} + engines: {node: '>=20.19.0'} + peerDependencies: + stylelint: ^17.0.0 + + stylelint-config-standard-scss@17.0.0: + resolution: {integrity: sha512-uLJS6xgOCBw5EMsDW7Ukji8l28qRoMnkRch15s0qwZpskXvWt9oPzMmcYM307m9GN4MxuWLsQh4I6hU9yI53cQ==} + engines: {node: '>=20'} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^17.0.0 + peerDependenciesMeta: + postcss: + optional: true + + stylelint-config-standard@40.0.0: + resolution: {integrity: sha512-EznGJxOUhtWck2r6dJpbgAdPATIzvpLdK9+i5qPd4Lx70es66TkBPljSg4wN3Qnc6c4h2n+WbUrUynQ3fanjHw==} + engines: {node: '>=20.19.0'} + peerDependencies: + stylelint: ^17.0.0 + + stylelint-scss@7.3.0: + resolution: {integrity: sha512-FBz075AUFoEJ1WQKsgsRr6EJKcjy7jxQjV8xsAqbPcnhNiXnJ7C489vqUyDZccBy1GorewlshERkaMuCyOKXaw==} + engines: {node: '>=20.19.0'} + peerDependencies: + stylelint: ^16.8.2 || ^17.0.0 + + stylelint@17.5.0: + resolution: {integrity: sha512-o/NS6zhsPZFmgUm5tXX4pVNg1XDOZSlucLdf2qow/lVn4JIyzZIQ5b3kad1ugqUj3GSIgr2u5lQw7X8rjqw33g==} + engines: {node: '>=20.19.0'} + hasBin: true + + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + + supports-hyperlinks@4.5.0: + resolution: {integrity: sha512-ZW2OvfeCXrNTbLakPUzjQG922EeGCOteFSVoek5DKStTh898wf7zgtuFlzQN8HfZCxC3Eh02yJVrRW51hADf+w==} + engines: {node: '>=20'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + + terser@5.39.2: + resolution: {integrity: sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==} + engines: {node: '>=10'} + hasBin: true + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typescript-eslint@8.70.0: + resolution: {integrity: sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + unicorn-magic@0.4.0: + resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} + engines: {node: '>=20'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + verkit@0.3.2: + resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} + engines: {node: '>=18.12.0'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + write-file-atomic@7.0.1: + resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} + engines: {node: ^20.17.0 || >=22.9.0} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} + hasBin: true + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/code-frame@8.0.6': + dependencies: + '@babel/helper-validator-identifier': 8.0.6 + js-tokens: 10.0.0 + + '@babel/compat-data@7.27.2': {} + + '@babel/compat-data@8.0.5': {} + + '@babel/core@7.27.1': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helpers': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@8.0.6': + dependencies: + '@babel/code-frame': 8.0.6 + '@babel/generator': 8.0.6 + '@babel/helper-compilation-targets': 8.0.6 + '@babel/helpers': 8.0.5 + '@babel/parser': 8.0.6 + '@babel/template': 8.0.0 + '@babel/traverse': 8.0.6 + '@babel/types': 8.0.6 + '@types/gensync': 1.0.5 + convert-source-map: 2.0.0 + empathic: 2.0.1 + gensync: 1.0.0-beta.2 + import-meta-resolve: 4.2.0 + json5: 2.2.3 + obug: 2.2.1 + verkit: 0.3.2 + + '@babel/eslint-parser@8.0.6(@babel/core@8.0.6)(eslint@10.6.0)': + dependencies: + '@babel/core': 8.0.6 + eslint: 10.6.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + verkit: 0.3.2 + + '@babel/generator@7.27.1': + dependencies: + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/generator@7.29.8': + dependencies: + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/generator@8.0.6': + dependencies: + '@babel/parser': 8.0.6 + '@babel/types': 8.0.6 + '@jridgewell/gen-mapping': 0.4.0-beta.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.1': + dependencies: + '@babel/types': 7.27.1 + + '@babel/helper-annotate-as-pure@8.0.0': + dependencies: + '@babel/types': 8.0.6 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.27.2 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.5 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-compilation-targets@8.0.6': + dependencies: + '@babel/compat-data': 8.0.5 + '@babel/helper-validator-option': 8.0.0 + browserslist: 4.24.5 + flru: 1.0.2 + verkit: 0.3.2 + + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-class-features-plugin@8.0.6(@babel/core@8.0.6)': + dependencies: + '@babel/core': 8.0.6 + '@babel/helper-annotate-as-pure': 8.0.0 + '@babel/helper-member-expression-to-functions': 8.0.5 + '@babel/helper-optimise-call-expression': 8.0.0 + '@babel/helper-replace-supers': 8.0.1(@babel/core@8.0.6) + '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 + '@babel/traverse': 8.0.6 + verkit: 0.3.2 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-globals@8.0.6': {} + + '@babel/helper-member-expression-to-functions@7.27.1': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@8.0.5': + dependencies: + '@babel/traverse': 8.0.6 + '@babel/types': 8.0.6 + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.27.1 + + '@babel/helper-optimise-call-expression@8.0.0': + dependencies: + '@babel/types': 8.0.6 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-plugin-utils@8.0.1(@babel/core@8.0.6)': + dependencies: + '@babel/core': 8.0.6 + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@8.0.1(@babel/core@8.0.6)': + dependencies: + '@babel/core': 8.0.6 + '@babel/helper-member-expression-to-functions': 8.0.5 + '@babel/helper-optimise-call-expression': 8.0.0 + '@babel/traverse': 8.0.6 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@8.0.0': + dependencies: + '@babel/traverse': 8.0.6 + '@babel/types': 8.0.6 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-string-parser@8.0.6': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-identifier@8.0.6': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-validator-option@8.0.0': {} + + '@babel/helpers@7.27.1': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + + '@babel/helpers@8.0.5': + dependencies: + '@babel/template': 8.0.0 + '@babel/types': 8.0.6 + + '@babel/parser@7.27.2': + dependencies: + '@babel/types': 7.27.1 + + '@babel/parser@7.29.9': + dependencies: + '@babel/types': 7.29.8 + + '@babel/parser@8.0.6': + dependencies: + '@babel/types': 8.0.6 + + '@babel/plugin-proposal-decorators@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.27.1) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-decorators@8.0.2(@babel/core@8.0.6)': + dependencies: + '@babel/core': 8.0.6 + '@babel/helper-create-class-features-plugin': 8.0.6(@babel/core@8.0.6) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.6) + '@babel/plugin-syntax-decorators': 8.0.1(@babel/core@8.0.6) + + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-decorators@8.0.1(@babel/core@8.0.6)': + dependencies: + '@babel/core': 8.0.6 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.6) + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/types': 7.29.8 + + '@babel/template@8.0.0': + dependencies: + '@babel/code-frame': 8.0.6 + '@babel/parser': 8.0.6 + '@babel/types': 8.0.6 + + '@babel/traverse@7.27.1': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + debug: 4.4.1 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.29.8': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.9 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@8.0.6': + dependencies: + '@babel/code-frame': 8.0.6 + '@babel/generator': 8.0.6 + '@babel/helper-globals': 8.0.6 + '@babel/parser': 8.0.6 + '@babel/template': 8.0.0 + '@babel/types': 8.0.6 + obug: 2.2.1 + + '@babel/types@7.27.1': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@babel/types@8.0.6': + dependencies: + '@babel/helper-string-parser': 8.0.6 + '@babel/helper-validator-identifier': 8.0.6 + + '@bbob/core@4.2.0': + dependencies: + '@bbob/parser': 4.2.0 + '@bbob/plugin-helper': 4.2.0 + '@bbob/types': 4.2.0 + + '@bbob/html@4.2.0': + dependencies: + '@bbob/core': 4.2.0 + '@bbob/plugin-helper': 4.2.0 + '@bbob/types': 4.2.0 + + '@bbob/parser@4.2.0': + dependencies: + '@bbob/plugin-helper': 4.2.0 + '@bbob/types': 4.2.0 + + '@bbob/plugin-helper@4.2.0': + dependencies: + '@bbob/types': 4.2.0 + + '@bbob/preset-html5@4.2.0': + dependencies: + '@bbob/plugin-helper': 4.2.0 + '@bbob/preset': 4.2.0 + '@bbob/types': 4.2.0 + + '@bbob/preset@4.2.0': + dependencies: + '@bbob/plugin-helper': 4.2.0 + '@bbob/types': 4.2.0 + + '@bbob/types@4.2.0': {} + + '@cacheable/memory@2.2.0': + dependencies: + '@cacheable/utils': 2.5.0 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 + + '@cacheable/utils@2.5.0': + dependencies: + hashery: 1.5.1 + keyv: 5.6.0 + + '@csstools/css-calc@3.4.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.1) + '@csstools/css-tokenizer': 4.0.1 + + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1)': + dependencies: + '@csstools/css-tokenizer': 4.0.1 + + '@csstools/css-syntax-patches-for-csstree@1.1.14(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.1': {} + + '@csstools/media-query-list-parser@5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.1) + '@csstools/css-tokenizer': 4.0.1 + + '@csstools/selector-resolve-nested@4.0.1(postcss-selector-parser@7.1.6)': + dependencies: + postcss-selector-parser: 7.1.6 + + '@csstools/selector-specificity@6.0.0(postcss-selector-parser@7.1.6)': + dependencies: + postcss-selector-parser: 7.1.6 + + '@discourse/lint-configs@3.2.0(@typescript-eslint/parser@8.70.0(eslint@10.6.0)(typescript@5.9.3))(eslint@10.6.0)(postcss@8.5.28)(prettier@3.8.1)(stylelint@17.5.0(typescript@5.9.3))': + dependencies: + '@babel/core': 8.0.6 + '@babel/eslint-parser': 8.0.6(@babel/core@8.0.6)(eslint@10.6.0) + '@babel/plugin-proposal-decorators': 8.0.2(@babel/core@8.0.6) + '@eslint/js': 10.0.1(eslint@10.6.0) + ember-eslint-parser: 0.14.6(@babel/eslint-parser@8.0.6(@babel/core@8.0.6)(eslint@10.6.0))(@typescript-eslint/parser@8.70.0(eslint@10.6.0)(typescript@5.9.3))(typescript@5.9.3) + eslint: 10.6.0 + eslint-plugin-decorator-position: 6.1.1(@babel/eslint-parser@8.0.6(@babel/core@8.0.6)(eslint@10.6.0))(eslint@10.6.0) + eslint-plugin-ember: 13.5.0(@babel/eslint-parser@8.0.6(@babel/core@8.0.6)(eslint@10.6.0))(@typescript-eslint/parser@8.70.0(eslint@10.6.0)(typescript@5.9.3))(eslint@10.6.0)(typescript@5.9.3) + eslint-plugin-qunit: 8.2.6(eslint@10.6.0) + eslint-plugin-simple-import-sort: 13.0.0(eslint@10.6.0) + eslint-plugin-sort-class-members: 1.22.1(eslint@10.6.0) + globals: 17.12.0 + prettier: 3.8.1 + prettier-plugin-ember-template-tag: 2.1.8(prettier@3.8.1) + stylelint: 17.5.0(typescript@5.9.3) + stylelint-config-standard: 40.0.0(stylelint@17.5.0(typescript@5.9.3)) + stylelint-config-standard-scss: 17.0.0(postcss@8.5.28)(stylelint@17.5.0(typescript@5.9.3)) + stylelint-scss: 7.3.0(stylelint@17.5.0(typescript@5.9.3)) + typescript: 5.9.3 + typescript-eslint: 8.70.0(eslint@10.6.0)(typescript@5.9.3) + transitivePeerDependencies: + - '@typescript-eslint/parser' + - postcss + - supports-color + + '@ember-data/rfc395-data@0.0.4': {} + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.10.1(eslint@10.6.0)': + dependencies: + eslint: 10.6.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.7.0(eslint@10.6.0)': + dependencies: + eslint: 10.6.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.1 + minimatch: 10.2.6 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.6.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/js@10.0.1(eslint@10.6.0)': + optionalDependencies: + eslint: 10.6.0 + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.3': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + + '@glimmer/env@0.1.7': {} + + '@glimmer/interfaces@0.94.6': + dependencies: + '@simple-dom/interface': 1.4.0 + type-fest: 4.41.0 + + '@glimmer/syntax@0.95.0': + dependencies: + '@glimmer/interfaces': 0.94.6 + '@glimmer/util': 0.94.8 + '@glimmer/wire-format': 0.94.8 + '@handlebars/parser': 2.2.2 + simple-html-tokenizer: 0.5.11 + + '@glimmer/util@0.94.8': + dependencies: + '@glimmer/interfaces': 0.94.6 + + '@glimmer/wire-format@0.94.8': + dependencies: + '@glimmer/interfaces': 0.94.6 + + '@handlebars/parser@2.2.2': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/gen-mapping@0.4.0-beta.0': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/sourcemap-codec@1.6.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@keyv/bigmap@1.3.1(keyv@5.6.0)': + dependencies: + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 + + '@keyv/serialize@1.1.1': {} + + '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.4 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@one-ini/wasm@0.2.1': {} + + '@oxc-parser/binding-android-arm-eabi@0.130.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.130.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.130.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.130.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.130.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.130.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.130.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.130.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.130.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.130.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.130.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.130.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.130.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.130.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.130.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.130.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.130.0': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.130.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.130.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.130.0': + optional: true + + '@oxc-project/types@0.130.0': {} + + '@rollup/plugin-node-resolve@15.3.1(rollup@4.41.0)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.41.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.10 + optionalDependencies: + rollup: 4.41.0 + + '@rollup/plugin-replace@5.0.7(rollup@4.41.0)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.41.0) + magic-string: 0.30.17 + optionalDependencies: + rollup: 4.41.0 + + '@rollup/plugin-terser@0.4.4(rollup@4.41.0)': + dependencies: + serialize-javascript: 6.0.2 + smob: 1.5.0 + terser: 5.39.2 + optionalDependencies: + rollup: 4.41.0 + + '@rollup/pluginutils@5.1.4(rollup@4.41.0)': + dependencies: + '@types/estree': 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.41.0 + + '@rollup/rollup-android-arm-eabi@4.41.0': + optional: true + + '@rollup/rollup-android-arm64@4.41.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.41.0': + optional: true + + '@rollup/rollup-darwin-x64@4.41.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.41.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.41.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.41.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.41.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.41.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.41.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.41.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.41.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.41.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.41.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.41.0': + optional: true + + '@simple-dom/interface@1.4.0': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@tybys/wasm-util@0.10.4': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.7': {} + + '@types/estree@1.0.9': {} + + '@types/gensync@1.0.5': {} + + '@types/jsesc@2.5.1': {} + + '@types/json-schema@7.0.15': {} + + '@types/resolve@1.20.2': {} + + '@typescript-eslint/eslint-plugin@8.70.0(@typescript-eslint/parser@8.70.0(eslint@10.6.0)(typescript@5.9.3))(eslint@10.6.0)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.70.0(eslint@10.6.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/type-utils': 8.70.0(eslint@10.6.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.70.0(eslint@10.6.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.70.0 + eslint: 10.6.0 + ignore: 7.0.9 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.70.0(eslint@10.6.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.70.0 + debug: 4.4.3 + eslint: 10.6.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.70.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.70.0': + dependencies: + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/visitor-keys': 8.70.0 + + '@typescript-eslint/tsconfig-utils@8.70.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.70.0(eslint@10.6.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.70.0(eslint@10.6.0)(typescript@5.9.3) + debug: 4.4.3 + eslint: 10.6.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.70.0': {} + + '@typescript-eslint/typescript-estree@8.70.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.70.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@5.9.3) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/visitor-keys': 8.70.0 + debug: 4.4.3 + minimatch: 10.2.6 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.70.0(eslint@10.6.0)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.6.0) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(typescript@5.9.3) + eslint: 10.6.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.70.0': + dependencies: + '@typescript-eslint/types': 8.70.0 + eslint-visitor-keys: 5.0.1 + + acorn-jsx@5.3.2(acorn@8.18.0): + dependencies: + acorn: 8.18.0 + + acorn@8.14.1: {} + + acorn@8.18.0: {} + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-regex@6.3.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + astral-regex@2.0.0: {} + + axobject-query@4.1.0: {} + + balanced-match@4.0.4: {} + + brace-expansion@5.0.12: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.5: + dependencies: + caniuse-lite: 1.0.30001718 + electron-to-chromium: 1.5.155 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.5) + + buffer-from@1.1.2: {} + + cacheable@2.5.0: + dependencies: + '@cacheable/memory': 2.2.0 + '@cacheable/utils': 2.5.0 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.10.1 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001718: {} + + chalk@5.4.1: {} + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colord@2.9.3: {} + + colorette@2.0.20: {} + + commander@13.1.0: {} + + commander@14.0.3: {} + + commander@2.20.3: {} + + content-tag@4.2.0: {} + + convert-source-map@2.0.0: {} + + cosmiconfig@9.0.2(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-functions-list@3.3.3: {} + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + cssesc@3.0.0: {} + + debug@4.4.1: + dependencies: + ms: 2.1.3 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + editorconfig@3.0.2: + dependencies: + '@one-ini/wasm': 0.2.1 + commander: 14.0.3 + minimatch: 10.2.6 + semver: 7.8.5 + + electron-to-chromium@1.5.155: {} + + ember-eslint-parser@0.14.6(@babel/eslint-parser@8.0.6(@babel/core@8.0.6)(eslint@10.6.0))(@typescript-eslint/parser@8.70.0(eslint@10.6.0)(typescript@5.9.3))(typescript@5.9.3): + dependencies: + '@glimmer/syntax': 0.95.0 + '@typescript-eslint/tsconfig-utils': 8.70.0(typescript@5.9.3) + content-tag: 4.2.0 + ember-estree: 0.6.11 + eslint-scope: 9.1.2 + html-tags: 5.1.0 + mathml-tag-names: 4.0.0 + svg-tags: 1.0.0 + optionalDependencies: + '@babel/eslint-parser': 8.0.6(@babel/core@8.0.6)(eslint@10.6.0) + '@typescript-eslint/parser': 8.70.0(eslint@10.6.0)(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + ember-estree@0.6.11: + dependencies: + '@glimmer/env': 0.1.7 + '@glimmer/syntax': 0.95.0 + content-tag: 4.2.0 + oxc-parser: 0.130.0 + + ember-rfc176-data@0.3.18: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + empathic@2.0.1: {} + + env-paths@2.2.1: {} + + environment@1.1.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-decorator-position@6.1.1(@babel/eslint-parser@8.0.6(@babel/core@8.0.6)(eslint@10.6.0))(eslint@10.6.0): + dependencies: + '@babel/core': 7.27.1 + '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.1) + '@ember-data/rfc395-data': 0.0.4 + ember-rfc176-data: 0.3.18 + eslint: 10.6.0 + snake-case: 3.0.4 + optionalDependencies: + '@babel/eslint-parser': 8.0.6(@babel/core@8.0.6)(eslint@10.6.0) + transitivePeerDependencies: + - supports-color + + eslint-plugin-ember@13.5.0(@babel/eslint-parser@8.0.6(@babel/core@8.0.6)(eslint@10.6.0))(@typescript-eslint/parser@8.70.0(eslint@10.6.0)(typescript@5.9.3))(eslint@10.6.0)(typescript@5.9.3): + dependencies: + '@ember-data/rfc395-data': 0.0.4 + aria-query: 5.3.2 + axobject-query: 4.1.0 + css-tree: 3.1.0 + editorconfig: 3.0.2 + ember-eslint-parser: 0.14.6(@babel/eslint-parser@8.0.6(@babel/core@8.0.6)(eslint@10.6.0))(@typescript-eslint/parser@8.70.0(eslint@10.6.0)(typescript@5.9.3))(typescript@5.9.3) + ember-rfc176-data: 0.3.18 + eslint: 10.6.0 + eslint-utils: 3.0.0(eslint@10.6.0) + estraverse: 5.3.0 + html-tags: 3.3.1 + language-tags: 1.0.9 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + mathml-tag-names: 4.0.0 + requireindex: 1.2.0 + snake-case: 3.0.4 + svg-tags: 1.0.0 + optionalDependencies: + '@typescript-eslint/parser': 8.70.0(eslint@10.6.0)(typescript@5.9.3) + transitivePeerDependencies: + - '@babel/eslint-parser' + - typescript + + eslint-plugin-qunit@8.2.6(eslint@10.6.0): + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@10.6.0) + eslint: 10.6.0 + requireindex: 1.2.0 + + eslint-plugin-simple-import-sort@13.0.0(eslint@10.6.0): + dependencies: + eslint: 10.6.0 + + eslint-plugin-sort-class-members@1.22.1(eslint@10.6.0): + dependencies: + eslint: 10.6.0 + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@3.0.0(eslint@10.6.0): + dependencies: + eslint: 10.6.0 + eslint-visitor-keys: 2.1.0 + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.6.0: + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.6.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.3 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.7 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.1 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.6 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@11.2.0: + dependencies: + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + eventemitter3@5.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.6: {} + + fastest-levenshtein@1.0.16: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + file-entry-cache@11.1.5: + dependencies: + flat-cache: 6.1.23 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flat-cache@6.1.23: + dependencies: + cacheable: 2.5.0 + flatted: 3.4.4 + hookified: 1.15.1 + + flatted@3.3.3: {} + + flatted@3.4.4: {} + + flru@1.0.2: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-east-asian-width@1.3.0: {} + + get-east-asian-width@1.7.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + globals@11.12.0: {} + + globals@17.12.0: {} + + globby@16.2.4: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + fast-glob: 3.3.3 + ignore: 7.0.9 + is-path-inside: 4.0.0 + micromatch: 4.0.8 + slash: 5.1.0 + unicorn-magic: 0.4.0 + + globjoin@0.1.4: {} + + has-flag@5.0.1: {} + + hashery@1.5.1: + dependencies: + hookified: 1.15.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hookified@1.15.1: {} + + hookified@2.2.0: {} + + html-tags@3.3.1: {} + + html-tags@5.1.0: {} + + husky@9.1.7: {} + + ignore@5.3.2: {} + + ignore@7.0.9: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.2.0: {} + + imurmurhash@0.1.4: {} + + ini@1.3.8: {} + + is-arrayish@0.2.1: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.3.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-module@1.0.0: {} + + is-number@7.0.0: {} + + is-path-inside@4.0.0: {} + + is-plain-object@5.0.0: {} + + is-plain-object@5.1.0: {} + + isexe@2.0.0: {} + + js-tokens@10.0.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + keyv@5.6.0: + dependencies: + '@keyv/serialize': 1.1.1 + + kind-of@6.0.3: {} + + known-css-properties@0.37.0: {} + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + lint-staged@16.0.0: + dependencies: + chalk: 5.4.1 + commander: 13.1.0 + debug: 4.4.1 + lilconfig: 3.1.3 + listr2: 8.3.3 + micromatch: 4.0.8 + nano-spawn: 1.0.2 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.8.0 + transitivePeerDependencies: + - supports-color + + listr2@8.3.3: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.camelcase@4.3.0: {} + + lodash.kebabcase@4.1.1: {} + + lodash.truncate@4.4.2: {} + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + mathml-tag-names@4.0.0: {} + + mdn-data@2.12.2: {} + + mdn-data@2.27.1: {} + + meow@14.1.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-function@5.0.1: {} + + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.12 + + ms@2.1.3: {} + + nano-spawn@1.0.2: {} + + nanoid@3.3.19: {} + + natural-compare@1.4.0: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-releases@2.0.19: {} + + normalize-path@3.0.0: {} + + obug@2.2.1: {} + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + oxc-parser@0.130.0: + dependencies: + '@oxc-project/types': 0.130.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.130.0 + '@oxc-parser/binding-android-arm64': 0.130.0 + '@oxc-parser/binding-darwin-arm64': 0.130.0 + '@oxc-parser/binding-darwin-x64': 0.130.0 + '@oxc-parser/binding-freebsd-x64': 0.130.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.130.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.130.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.130.0 + '@oxc-parser/binding-linux-arm64-musl': 0.130.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.130.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.130.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.130.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.130.0 + '@oxc-parser/binding-linux-x64-gnu': 0.130.0 + '@oxc-parser/binding-linux-x64-musl': 0.130.0 + '@oxc-parser/binding-openharmony-arm64': 0.130.0 + '@oxc-parser/binding-wasm32-wasi': 0.130.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.130.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.130.0 + '@oxc-parser/binding-win32-x64-msvc': 0.130.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + picomatch@4.0.7: {} + + pidtree@0.6.0: {} + + postcss-media-query-parser@0.2.3: {} + + postcss-resolve-nested-selector@0.1.6: {} + + postcss-safe-parser@7.0.1(postcss@8.5.28): + dependencies: + postcss: 8.5.28 + + postcss-scss@4.0.9(postcss@8.5.28): + dependencies: + postcss: 8.5.28 + + postcss-selector-parser@7.1.6: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.28: + dependencies: + nanoid: 3.3.19 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-plugin-ember-template-tag@2.1.8(prettier@3.8.1): + dependencies: + '@babel/traverse': 7.29.8 + content-tag: 4.2.0 + prettier: 3.8.1 + transitivePeerDependencies: + - supports-color + + prettier@3.8.1: {} + + punycode@2.3.1: {} + + qified@0.10.1: + dependencies: + hookified: 2.2.0 + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + require-from-string@2.0.2: {} + + requireindex@1.2.0: {} + + resolve-from@4.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rollup@4.41.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.41.0 + '@rollup/rollup-android-arm64': 4.41.0 + '@rollup/rollup-darwin-arm64': 4.41.0 + '@rollup/rollup-darwin-x64': 4.41.0 + '@rollup/rollup-freebsd-arm64': 4.41.0 + '@rollup/rollup-freebsd-x64': 4.41.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.41.0 + '@rollup/rollup-linux-arm-musleabihf': 4.41.0 + '@rollup/rollup-linux-arm64-gnu': 4.41.0 + '@rollup/rollup-linux-arm64-musl': 4.41.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.41.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.41.0 + '@rollup/rollup-linux-riscv64-gnu': 4.41.0 + '@rollup/rollup-linux-riscv64-musl': 4.41.0 + '@rollup/rollup-linux-s390x-gnu': 4.41.0 + '@rollup/rollup-linux-x64-gnu': 4.41.0 + '@rollup/rollup-linux-x64-musl': 4.41.0 + '@rollup/rollup-win32-arm64-msvc': 4.41.0 + '@rollup/rollup-win32-ia32-msvc': 4.41.0 + '@rollup/rollup-win32-x64-msvc': 4.41.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + semver@6.3.1: {} + + semver@7.8.5: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + simple-html-tokenizer@0.5.11: {} + + slash@5.1.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + smob@1.5.0: {} + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + + string-width@8.2.2: + dependencies: + get-east-asian-width: 1.7.0 + strip-ansi: 7.2.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.3.0 + + stylelint-config-recommended-scss@17.0.1(postcss@8.5.28)(stylelint@17.5.0(typescript@5.9.3)): + dependencies: + postcss-scss: 4.0.9(postcss@8.5.28) + stylelint: 17.5.0(typescript@5.9.3) + stylelint-config-recommended: 18.0.0(stylelint@17.5.0(typescript@5.9.3)) + stylelint-scss: 7.3.0(stylelint@17.5.0(typescript@5.9.3)) + optionalDependencies: + postcss: 8.5.28 + + stylelint-config-recommended@18.0.0(stylelint@17.5.0(typescript@5.9.3)): + dependencies: + stylelint: 17.5.0(typescript@5.9.3) + + stylelint-config-standard-scss@17.0.0(postcss@8.5.28)(stylelint@17.5.0(typescript@5.9.3)): + dependencies: + stylelint: 17.5.0(typescript@5.9.3) + stylelint-config-recommended-scss: 17.0.1(postcss@8.5.28)(stylelint@17.5.0(typescript@5.9.3)) + stylelint-config-standard: 40.0.0(stylelint@17.5.0(typescript@5.9.3)) + optionalDependencies: + postcss: 8.5.28 + + stylelint-config-standard@40.0.0(stylelint@17.5.0(typescript@5.9.3)): + dependencies: + stylelint: 17.5.0(typescript@5.9.3) + stylelint-config-recommended: 18.0.0(stylelint@17.5.0(typescript@5.9.3)) + + stylelint-scss@7.3.0(stylelint@17.5.0(typescript@5.9.3)): + dependencies: + '@csstools/css-calc': 3.4.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.1) + '@csstools/css-syntax-patches-for-csstree': 1.1.14(css-tree@3.2.1) + '@csstools/css-tokenizer': 4.0.1 + css-tree: 3.2.1 + is-plain-object: 5.1.0 + known-css-properties: 0.37.0 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.6 + postcss-selector-parser: 7.1.6 + postcss-value-parser: 4.2.0 + stylelint: 17.5.0(typescript@5.9.3) + + stylelint@17.5.0(typescript@5.9.3): + dependencies: + '@csstools/css-calc': 3.4.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.1) + '@csstools/css-syntax-patches-for-csstree': 1.1.14(css-tree@3.2.1) + '@csstools/css-tokenizer': 4.0.1 + '@csstools/media-query-list-parser': 5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1) + '@csstools/selector-resolve-nested': 4.0.1(postcss-selector-parser@7.1.6) + '@csstools/selector-specificity': 6.0.0(postcss-selector-parser@7.1.6) + colord: 2.9.3 + cosmiconfig: 9.0.2(typescript@5.9.3) + css-functions-list: 3.3.3 + css-tree: 3.2.1 + debug: 4.4.3 + fast-glob: 3.3.3 + fastest-levenshtein: 1.0.16 + file-entry-cache: 11.1.5 + global-modules: 2.0.0 + globby: 16.2.4 + globjoin: 0.1.4 + html-tags: 5.1.0 + ignore: 7.0.9 + import-meta-resolve: 4.2.0 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + mathml-tag-names: 4.0.0 + meow: 14.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.28 + postcss-safe-parser: 7.0.1(postcss@8.5.28) + postcss-selector-parser: 7.1.6 + postcss-value-parser: 4.2.0 + string-width: 8.2.2 + supports-hyperlinks: 4.5.0 + svg-tags: 1.0.0 + table: 6.9.0 + write-file-atomic: 7.0.1 + transitivePeerDependencies: + - supports-color + - typescript + + supports-color@10.2.2: {} + + supports-hyperlinks@4.5.0: + dependencies: + has-flag: 5.0.1 + supports-color: 10.2.2 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-tags@1.0.0: {} + + table@6.9.0: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + terser@5.39.2: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.1 + commander: 2.20.3 + source-map-support: 0.5.21 + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@4.41.0: {} + + typescript-eslint@8.70.0(eslint@10.6.0)(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0(eslint@10.6.0)(typescript@5.9.3))(eslint@10.6.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.70.0(eslint@10.6.0)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.70.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.70.0(eslint@10.6.0)(typescript@5.9.3) + eslint: 10.6.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} + + unicorn-magic@0.4.0: {} + + update-browserslist-db@1.1.3(browserslist@4.24.5): + dependencies: + browserslist: 4.24.5 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + verkit@0.3.2: {} + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + write-file-atomic@7.0.1: + dependencies: + signal-exit: 4.1.0 + + yallist@3.1.1: {} + + yaml@2.8.0: {} + + yocto-queue@0.1.0: {} diff --git a/stylint.config.mjs b/stylelint.config.mjs similarity index 100% rename from stylint.config.mjs rename to stylelint.config.mjs diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index b9d2c58..0000000 --- a/yarn.lock +++ /dev/null @@ -1,4081 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" - integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== - dependencies: - "@babel/helper-validator-identifier" "^7.27.1" - js-tokens "^4.0.0" - picocolors "^1.1.1" - -"@babel/compat-data@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.2.tgz#4183f9e642fd84e74e3eea7ffa93a412e3b102c9" - integrity sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ== - -"@babel/core@^7.18.6", "@babel/core@^7.23.6", "@babel/core@^7.26.10": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.27.1.tgz#89de51e86bd12246003e3524704c49541b16c3e6" - integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.27.1" - "@babel/helper-compilation-targets" "^7.27.1" - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helpers" "^7.27.1" - "@babel/parser" "^7.27.1" - "@babel/template" "^7.27.1" - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/eslint-parser@^7.23.10", "@babel/eslint-parser@^7.26.10": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.27.1.tgz#e146fb2facef62c6c5d1a6fd07cfd79ee9f7b0f1" - integrity sha512-q8rjOuadH0V6Zo4XLMkJ3RMQ9MSBqwaDByyYB0izsYdaIWGNLmEblbCOf1vyFHICcg16CD7Fsi51vcQnYxmt6Q== - dependencies: - "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" - eslint-visitor-keys "^2.1.0" - semver "^6.3.1" - -"@babel/generator@^7.26.9", "@babel/generator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.1.tgz#862d4fad858f7208edd487c28b58144036b76230" - integrity sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w== - dependencies: - "@babel/parser" "^7.27.1" - "@babel/types" "^7.27.1" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - -"@babel/helper-annotate-as-pure@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz#4345d81a9a46a6486e24d069469f13e60445c05d" - integrity sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow== - dependencies: - "@babel/types" "^7.27.1" - -"@babel/helper-compilation-targets@^7.27.1": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" - integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== - dependencies: - "@babel/compat-data" "^7.27.2" - "@babel/helper-validator-option" "^7.27.1" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz#5bee4262a6ea5ddc852d0806199eb17ca3de9281" - integrity sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-member-expression-to-functions" "^7.27.1" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/traverse" "^7.27.1" - semver "^6.3.1" - -"@babel/helper-member-expression-to-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz#ea1211276be93e798ce19037da6f06fbb994fa44" - integrity sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-module-imports@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" - integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-module-transforms@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz#e1663b8b71d2de948da5c4fb2a20ca4f3ec27a6f" - integrity sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g== - dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/helper-optimise-call-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" - integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== - dependencies: - "@babel/types" "^7.27.1" - -"@babel/helper-plugin-utils@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" - integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== - -"@babel/helper-replace-supers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz#b1ed2d634ce3bdb730e4b52de30f8cccfd692bc0" - integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.27.1" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" - integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== - -"@babel/helper-validator-identifier@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" - integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== - -"@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== - -"@babel/helpers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.1.tgz#ffc27013038607cdba3288e692c3611c06a18aa4" - integrity sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ== - dependencies: - "@babel/template" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/parser@^7.21.8", "@babel/parser@^7.27.1", "@babel/parser@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.2.tgz#577518bedb17a2ce4212afd052e01f7df0941127" - integrity sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw== - dependencies: - "@babel/types" "^7.27.1" - -"@babel/plugin-proposal-decorators@^7.18.6", "@babel/plugin-proposal-decorators@^7.25.9": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.27.1.tgz#3686f424b2f8b2fee7579aa4df133a4f5244a596" - integrity sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-syntax-decorators" "^7.27.1" - -"@babel/plugin-syntax-decorators@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz#ee7dd9590aeebc05f9d4c8c0560007b05979a63d" - integrity sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-syntax-typescript@^7.25.9", "@babel/plugin-syntax-typescript@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18" - integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-typescript@^7.26.8": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz#d3bb65598bece03f773111e88cc4e8e5070f1140" - integrity sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-syntax-typescript" "^7.27.1" - -"@babel/template@^7.27.1": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" - integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/parser" "^7.27.2" - "@babel/types" "^7.27.1" - -"@babel/traverse@^7.22.8", "@babel/traverse@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.1.tgz#4db772902b133bbddd1c4f7a7ee47761c1b9f291" - integrity sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.27.1" - "@babel/parser" "^7.27.1" - "@babel/template" "^7.27.1" - "@babel/types" "^7.27.1" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.1.tgz#9defc53c16fc899e46941fc6901a9eea1c9d8560" - integrity sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - -"@bbob/core@*", "@bbob/core@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@bbob/core/-/core-4.2.0.tgz#5e56cdbbc1988dc837842c9c34679bf36eabb5f5" - integrity sha512-i5VUIO6xx+TCrBE8plQF9KpW1z+0QcCh9GawCCWYG9KcZrEsyRy57my5/kem0a2lFxXjh0o+tgjQY9sCP5b3bw== - dependencies: - "@bbob/parser" "*" - "@bbob/plugin-helper" "*" - "@bbob/types" "*" - -"@bbob/html@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@bbob/html/-/html-4.2.0.tgz#f91d1dff989f9ef8cba0e98a959eac3c6c487baa" - integrity sha512-mZG7MmE/YluH1/FNCr2Jv/Vz3Mq5stZ5tFAjBmYpVVN6Ndus4+FA84vKoHFdUHDiuU1p/e2/o/VUrwsWwLdoIA== - dependencies: - "@bbob/core" "*" - "@bbob/plugin-helper" "*" - "@bbob/types" "*" - -"@bbob/parser@*": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@bbob/parser/-/parser-4.2.0.tgz#0b93898a43db50950f25a7bb05b0816ab6d9dc29" - integrity sha512-l8BppXjdQClrUiv+qIN0Oe6aS/vlH7CEduMreDaxYDadUPC0RMzxj9lXVjO0xTbFEVEIUJCGc53qnpiApLbx2g== - dependencies: - "@bbob/plugin-helper" "*" - "@bbob/types" "*" - -"@bbob/plugin-helper@*": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@bbob/plugin-helper/-/plugin-helper-4.2.0.tgz#d998d5d76b00f1589763fec6246502d7ea0f7bcf" - integrity sha512-Uxs/UJROnkpcq5EJfz/8NCEYAcme8l6oAgMeWLX1nxWeieUhRgpY8BWQ9eQwUOXEKa0tsKVPnlmbUAjFhppVPw== - dependencies: - "@bbob/types" "*" - -"@bbob/preset-html5@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@bbob/preset-html5/-/preset-html5-4.2.0.tgz#2ebbbcdd988c8aaac49342143e5497d83f2f16f4" - integrity sha512-X2EIeb2vqTz/n34KWQXEL5IC0SuB6i2/ltRpEaMTyK7IoDEs0XGIWcqVpenb7Z2d4eNA3gTWhkoUUkKlZmfQRQ== - dependencies: - "@bbob/plugin-helper" "*" - "@bbob/preset" "*" - "@bbob/types" "*" - -"@bbob/preset@*", "@bbob/preset@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@bbob/preset/-/preset-4.2.0.tgz#316634a5a144d8f3a0533fb268e83adc56cb52ca" - integrity sha512-IA+kxlrRcYBXE634B8W6uU2DO7VvrxeOqWUzIDKV2CgzTMpmCG875ihGp+Q3T+QxGwzG5S0L4GdmCIULTbzC4A== - dependencies: - "@bbob/plugin-helper" "*" - "@bbob/types" "*" - -"@bbob/types@*", "@bbob/types@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@bbob/types/-/types-4.2.0.tgz#f3da1ca6eea134984f4ed2173bbfa4427560df28" - integrity sha512-bSCZnNg0VrPosBBUVkjBDYVKNEqwT0jTNuzvAuNrZkuILgUKtLYI9GHuT8rY4lZecCb7UqGDsHsYt0YJO36eJg== - -"@csstools/css-parser-algorithms@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz#74426e93bd1c4dcab3e441f5cc7ba4fb35d94356" - integrity sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A== - -"@csstools/css-tokenizer@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz#a5502c8539265fecbd873c1e395a890339f119c2" - integrity sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw== - -"@csstools/media-query-list-parser@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz#e80e17eba1693fceafb8d6f2cfc68c0e7a9ab78a" - integrity sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A== - -"@csstools/selector-specificity@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz#037817b574262134cabd68fc4ec1a454f168407b" - integrity sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw== - -"@discourse/lint-configs@2.12.0": - version "2.12.0" - resolved "https://registry.yarnpkg.com/@discourse/lint-configs/-/lint-configs-2.12.0.tgz#d166f9399e3b725388e0a18ea56127ff8575ccc6" - integrity sha512-5VFk4wCIhJ/CcfytNCnsMZnzQ30MtOtNHff4suGu/Bgw+WLvtVupp0SxmcU4sNIz4IQRsS1q0dKn50crEcUcBQ== - dependencies: - "@babel/core" "^7.26.10" - "@babel/eslint-parser" "^7.26.10" - "@babel/plugin-proposal-decorators" "^7.25.9" - ember-template-lint "^7.0.1" - eslint "^9.22.0" - eslint-plugin-decorator-position "^6.0.0" - eslint-plugin-ember "^12.5.0" - eslint-plugin-import "^2.31.0" - eslint-plugin-qunit "^8.1.2" - eslint-plugin-simple-import-sort "^12.1.1" - eslint-plugin-sort-class-members "^1.21.0" - globals "^16.0.0" - prettier "^3.5.3" - prettier-plugin-ember-template-tag "^2.0.4" - stylelint "^16.16.0" - stylelint-config-standard "^37.0.0" - stylelint-config-standard-scss "^14.0.0" - typescript "^5.8.2" - -"@dual-bundle/import-meta-resolve@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#519c1549b0e147759e7825701ecffd25e5819f7b" - integrity sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg== - -"@ember-data/rfc395-data@^0.0.4": - version "0.0.4" - resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" - integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ== - -"@eslint-community/eslint-utils@^4.2.0": - version "4.7.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" - integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.12.1": - version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== - -"@eslint/config-array@^0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.0.tgz#7a1232e82376712d3340012a2f561a2764d1988f" - integrity sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ== - dependencies: - "@eslint/object-schema" "^2.1.6" - debug "^4.3.1" - minimatch "^3.1.2" - -"@eslint/config-helpers@^0.2.0", "@eslint/config-helpers@^0.2.1": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.2.tgz#3779f76b894de3a8ec4763b79660e6d54d5b1010" - integrity sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg== - -"@eslint/core@^0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.12.0.tgz#5f960c3d57728be9f6c65bd84aa6aa613078798e" - integrity sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/core@^0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.13.0.tgz#bf02f209846d3bf996f9e8009db62df2739b458c" - integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/core@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.14.0.tgz#326289380968eaf7e96f364e1e4cf8f3adf2d003" - integrity sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/eslintrc@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" - integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.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" - -"@eslint/js@9.24.0": - version "9.24.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.24.0.tgz#685277980bb7bf84ecc8e4e133ccdda7545a691e" - integrity sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA== - -"@eslint/js@9.27.0": - version "9.27.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.27.0.tgz#181a23460877c484f6dd03890f4e3fa2fdeb8ff0" - integrity sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA== - -"@eslint/object-schema@^2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" - integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== - -"@eslint/plugin-kit@^0.2.7": - version "0.2.8" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz#47488d8f8171b5d4613e833313f3ce708e3525f8" - integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA== - dependencies: - "@eslint/core" "^0.13.0" - levn "^0.4.1" - -"@eslint/plugin-kit@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz#b71b037b2d4d68396df04a8c35a49481e5593067" - integrity sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w== - dependencies: - "@eslint/core" "^0.14.0" - levn "^0.4.1" - -"@glimmer/env@0.1.7", "@glimmer/env@^0.1.7": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" - integrity sha512-JKF/a9I9jw6fGoz8kA7LEQslrwJ5jms5CXhu/aqkBWk+PmZ6pTl8mlb/eJ/5ujBGTiQzBhy5AIWF712iA+4/mw== - -"@glimmer/global-context@0.84.3": - version "0.84.3" - resolved "https://registry.yarnpkg.com/@glimmer/global-context/-/global-context-0.84.3.tgz#f8bf2cda9562716f2ddf3f96837e7559600635c4" - integrity sha512-8Oy9Wg5IZxMEeAnVmzD2NkObf89BeHoFSzJgJROE/deutd3rxg83mvlOez4zBBGYwnTb+VGU2LYRpet92egJjA== - dependencies: - "@glimmer/env" "^0.1.7" - -"@glimmer/interfaces@0.84.3": - version "0.84.3" - resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.84.3.tgz#629777a4abe373b0785656f6c8d08989f5784805" - integrity sha512-dk32ykoNojt0mvEaIW6Vli5MGTbQo58uy3Epj7ahCgTHmWOKuw/0G83f2UmFprRwFx689YTXG38I/vbpltEjzg== - dependencies: - "@simple-dom/interface" "^1.4.0" - -"@glimmer/interfaces@0.92.3": - version "0.92.3" - resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.92.3.tgz#dd2e8d9df59fcebf2fa35a78cc2353738b09d762" - integrity sha512-QwQeA01N+0h+TAi/J7iUnZtRuJy+093hNyagxDQBA6b1wCBw+q+al9+O6gmbWlkWE7EifzmNE1nnrgcecJBlJQ== - dependencies: - "@simple-dom/interface" "^1.4.0" - -"@glimmer/reference@^0.84.3": - version "0.84.3" - resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.84.3.tgz#6420ad9c102633ac83939fd1b2457269d21fb632" - integrity sha512-lV+p/aWPVC8vUjmlvYVU7WQJsLh319SdXuAWoX/SE3pq340BJlAJiEcAc6q52y9JNhT57gMwtjMX96W5Xcx/qw== - dependencies: - "@glimmer/env" "^0.1.7" - "@glimmer/global-context" "0.84.3" - "@glimmer/interfaces" "0.84.3" - "@glimmer/util" "0.84.3" - "@glimmer/validator" "0.84.3" - -"@glimmer/syntax@^0.84.3": - version "0.84.3" - resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.84.3.tgz#4045a1708cef7fd810cff42fe6deeba40c7286d0" - integrity sha512-ioVbTic6ZisLxqTgRBL2PCjYZTFIwobifCustrozRU2xGDiYvVIL0vt25h2c1ioDsX59UgVlDkIK4YTAQQSd2A== - dependencies: - "@glimmer/interfaces" "0.84.3" - "@glimmer/util" "0.84.3" - "@handlebars/parser" "~2.0.0" - simple-html-tokenizer "^0.5.11" - -"@glimmer/syntax@^0.92.0": - version "0.92.3" - resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.92.3.tgz#0b0923d37469509fcc46243678c7ef8cb41a17de" - integrity sha512-7wPKQmULyXCYf0KvbPmfrs/skPISH2QGR9atCnmDWnHyLv5SSZVLm1P0Ctrpta6+Ci3uGQb7hGk0IjsLEavcYQ== - dependencies: - "@glimmer/interfaces" "0.92.3" - "@glimmer/util" "0.92.3" - "@glimmer/wire-format" "0.92.3" - "@handlebars/parser" "~2.0.0" - simple-html-tokenizer "^0.5.11" - -"@glimmer/util@0.84.3": - version "0.84.3" - resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.84.3.tgz#9ae0166982c0b48aa94b02d6ba8c2c81976ade4b" - integrity sha512-qFkh6s16ZSRuu2rfz3T4Wp0fylFj3HBsONGXQcrAdZjdUaIS6v3pNj6mecJ71qRgcym9Hbaq/7/fefIwECUiKw== - dependencies: - "@glimmer/env" "0.1.7" - "@glimmer/interfaces" "0.84.3" - "@simple-dom/interface" "^1.4.0" - -"@glimmer/util@0.92.3": - version "0.92.3" - resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.92.3.tgz#ac97cf68118d9868b405a2078e3b28603d0ccf57" - integrity sha512-K1oH93gGU36slycxJ9CcFpUTsdOc4XQ6RuZFu5oRsxFYtEF5PSu7ik11h58fyeoaWOr1ebfkyAMawbeI2AJ5GA== - dependencies: - "@glimmer/env" "0.1.7" - "@glimmer/interfaces" "0.92.3" - -"@glimmer/validator@0.84.3", "@glimmer/validator@^0.84.3": - version "0.84.3" - resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.84.3.tgz#cd83b7f9ab78953f23cc11a32d83d7f729c54df2" - integrity sha512-RTBV4TokUB0vI31UC7ikpV7lOYpWUlyqaKV//pRC4pexYMlmqnVhkFrdiimB/R1XyNdUOQUmnIAcdic39NkbhQ== - dependencies: - "@glimmer/env" "^0.1.7" - "@glimmer/global-context" "0.84.3" - -"@glimmer/wire-format@0.92.3": - version "0.92.3" - resolved "https://registry.yarnpkg.com/@glimmer/wire-format/-/wire-format-0.92.3.tgz#0d6d51d657193c806763fa059c0345e6376f461f" - integrity sha512-gFz81Q9+V7Xs0X8mSq6y8qacHm0dPaGJo2/Bfcsdow1hLOKNgTCLr4XeDBhRML8f6I6Gk9ugH4QDxyIOXOpC4w== - dependencies: - "@glimmer/interfaces" "0.92.3" - "@glimmer/util" "0.92.3" - -"@handlebars/parser@~2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-2.0.0.tgz#5e8b7298f31ff8f7b260e6b7363c7e9ceed7d9c5" - integrity sha512-EP9uEDZv/L5Qh9IWuMUGJRfwhXJ4h1dqKTT4/3+tY0eu7sPis7xh23j61SYUnNF4vqCQvvUXpDo9Bh/+q1zASA== - -"@humanfs/core@^0.19.1": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" - integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== - -"@humanfs/node@^0.16.6": - version "0.16.6" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" - integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== - dependencies: - "@humanfs/core" "^0.19.1" - "@humanwhocodes/retry" "^0.3.0" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/retry@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" - integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== - -"@humanwhocodes/retry@^0.4.2": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" - integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" - integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/source-map@^0.3.3": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" - integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@keyv/serialize@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@keyv/serialize/-/serialize-1.0.3.tgz#e0fe3710e2a379cb0490cd41e5a5ffa2bab58bf6" - integrity sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g== - dependencies: - buffer "^6.0.3" - -"@lint-todo/utils@^13.1.1": - version "13.1.1" - resolved "https://registry.yarnpkg.com/@lint-todo/utils/-/utils-13.1.1.tgz#5c054d61ee037b9e552add118264771122cc1166" - integrity sha512-F5z53uvRIF4dYfFfJP3a2Cqg+4P1dgJchJsFnsZE0eZp0LK8X7g2J0CsJHRgns+skpXOlM7n5vFGwkWCWj8qJg== - dependencies: - "@types/eslint" "^8.4.9" - find-up "^5.0.0" - fs-extra "^9.1.0" - proper-lockfile "^4.1.2" - slash "^3.0.0" - tslib "^2.4.1" - upath "^2.0.1" - -"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": - version "5.1.1-v1" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" - integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== - dependencies: - eslint-scope "5.1.1" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@rollup/plugin-node-resolve@^15.1.0": - version "15.3.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz#66008953c2524be786aa319d49e32f2128296a78" - integrity sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA== - dependencies: - "@rollup/pluginutils" "^5.0.1" - "@types/resolve" "1.20.2" - deepmerge "^4.2.2" - is-module "^1.0.0" - resolve "^1.22.1" - -"@rollup/plugin-replace@^5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz#150c9ee9db8031d9e4580a61a0edeaaed3d37687" - integrity sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ== - dependencies: - "@rollup/pluginutils" "^5.0.1" - magic-string "^0.30.3" - -"@rollup/plugin-terser@^0.4.3": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz#15dffdb3f73f121aa4fbb37e7ca6be9aeea91962" - integrity sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A== - dependencies: - serialize-javascript "^6.0.1" - smob "^1.0.0" - terser "^5.17.4" - -"@rollup/pluginutils@^5.0.1": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a" - integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^2.0.2" - picomatch "^4.0.2" - -"@rollup/rollup-android-arm-eabi@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz#9145b38faf3fbfe3ec557130110e772f797335aa" - integrity sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A== - -"@rollup/rollup-android-arm64@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz#d73d641c59e9d7827e5ce0af9dfbc168b95cce0f" - integrity sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ== - -"@rollup/rollup-darwin-arm64@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz#45d9d71d941117c98e7a5e77f60f0bc682d27e82" - integrity sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw== - -"@rollup/rollup-darwin-x64@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz#8d72fb5f81714cb43e90f263fb1674520cce3f2a" - integrity sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ== - -"@rollup/rollup-freebsd-arm64@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz#a52b58852c9cec9255e382a2f335b08bc8c6111d" - integrity sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg== - -"@rollup/rollup-freebsd-x64@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz#104511dc64612789ddda41d164ab07cdac84a6c1" - integrity sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg== - -"@rollup/rollup-linux-arm-gnueabihf@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz#643e3ad19c93903201fde89abd76baaee725e6c2" - integrity sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA== - -"@rollup/rollup-linux-arm-musleabihf@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz#fdc6a595aec7b20c5bfdac81412028c56d734e63" - integrity sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg== - -"@rollup/rollup-linux-arm64-gnu@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz#c28620bcd385496bdbbc24920b21f9fcca9ecbfa" - integrity sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw== - -"@rollup/rollup-linux-arm64-musl@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz#a6b71b1e8fa33bac9f65b6f879e8ed878035d120" - integrity sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ== - -"@rollup/rollup-linux-loongarch64-gnu@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz#b06374601ce865a1110324b2f06db574d3a1b0e1" - integrity sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w== - -"@rollup/rollup-linux-powerpc64le-gnu@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz#8a2a1f6058c920889c2aff3753a20fead7a8cc26" - integrity sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg== - -"@rollup/rollup-linux-riscv64-gnu@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz#8ef6f680d011b95a2f6546c6c31a37a33138035f" - integrity sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A== - -"@rollup/rollup-linux-riscv64-musl@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz#9f4884c5955a7cd39b396f6e27aa59b3269988eb" - integrity sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A== - -"@rollup/rollup-linux-s390x-gnu@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz#5619303cc51994e3df404a497f42c79dc5efd6eb" - integrity sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw== - -"@rollup/rollup-linux-x64-gnu@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz#c3e42b66c04e25ad0f2a00beec42ede96ccc8983" - integrity sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ== - -"@rollup/rollup-linux-x64-musl@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.0.tgz#8d3452de42aa72fc5fc3e5ad1eb0b68030742a25" - integrity sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg== - -"@rollup/rollup-win32-arm64-msvc@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz#3b7bbd9f43f1c380061f306abce6f3f64de20306" - integrity sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg== - -"@rollup/rollup-win32-ia32-msvc@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz#e27ef5c40bbec49fac3d4e4b1618fbe4597b40e5" - integrity sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ== - -"@rollup/rollup-win32-x64-msvc@4.41.0": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz#b0b595ad4720259bbb81600750d26a655cac06be" - integrity sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA== - -"@rtsao/scc@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" - integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== - -"@simple-dom/interface@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f" - integrity sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA== - -"@sindresorhus/merge-streams@^2.1.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958" - integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg== - -"@types/eslint@^8.4.9": - version "8.56.12" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.12.tgz#1657c814ffeba4d2f84c0d4ba0f44ca7ea1ca53a" - integrity sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@1.0.7", "@types/estree@^1.0.0", "@types/estree@^1.0.6": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" - integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== - -"@types/json-schema@*", "@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/resolve@1.20.2": - version "1.20.2" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" - integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.14.0: - version "8.14.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" - integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - 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" - -ajv@^8.0.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ansi-escapes@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" - integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== - dependencies: - environment "^1.0.0" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.0.0, ansi-styles@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.3.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" - integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== - -array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" - integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== - dependencies: - call-bound "^1.0.3" - is-array-buffer "^3.0.5" - -array-includes@^3.1.8: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - 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" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlastindex@^1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" - integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== - 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" - -array.prototype.flat@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" - integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.flatmap@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" - integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" - integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== - 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" - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-function@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" - integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== - -async-promise-queue@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.5.tgz#cb23bce9fce903a133946a700cc85f27f09ea49d" - integrity sha512-xi0aQ1rrjPWYmqbwr18rrSKbSaXIeIwSd1J4KAgVfkq8utNbdZoht7GfvfY6swFUAMJ9obkc4WPJmtGwl+B8dw== - dependencies: - async "^2.4.1" - debug "^2.6.8" - -async@^2.4.1: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -balanced-match@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" - integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.24.0: - version "4.24.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.5.tgz#aa0f5b8560fe81fde84c6dcb38f759bafba0e11b" - integrity sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw== - dependencies: - caniuse-lite "^1.0.30001716" - electron-to-chromium "^1.5.149" - node-releases "^2.0.19" - update-browserslist-db "^1.1.3" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -cacheable@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/cacheable/-/cacheable-1.9.0.tgz#57e3565c311d66371eeb5f2070b6615d43b89711" - integrity sha512-8D5htMCxPDUULux9gFzv30f04Xo3wCnik0oOxKoRTPIBoqA7HtOcJ87uBhQTs3jCfZZTrUBGsYIZOgE0ZRgMAg== - dependencies: - hookified "^1.8.2" - keyv "^5.3.3" - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.7, call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - 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" - -call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -caniuse-lite@^1.0.30001716: - version "1.0.30001718" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz#dae13a9c80d517c30c6197515a96131c194d8f82" - integrity sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw== - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^5.3.0, chalk@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" - integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== - -ci-info@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.2.0.tgz#cbd21386152ebfe1d56f280a3b5feccbd96764c7" - integrity sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-cursor@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" - integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== - dependencies: - restore-cursor "^5.0.0" - -cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cli-truncate@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" - integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== - dependencies: - slice-ansi "^5.0.0" - string-width "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colord@^2.9.3: - version "2.9.3" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -colorette@^2.0.20: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -colors@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -commander@^13.1.0: - version "13.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" - integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -content-tag-utils@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/content-tag-utils/-/content-tag-utils-0.3.1.tgz#a3e79d2eebc3587ecb4518e35e2c631cb0806c26" - integrity sha512-uBAmklAxqmem7WX/F7YA4eWBTegGLJ93MOPSJaJliAuzTNgF3u/H9YLlJ6Nae9/FwV+037OuXc75hvcmub1qww== - dependencies: - content-tag "^3.1.0" - -content-tag@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/content-tag/-/content-tag-2.0.3.tgz#52b72285256ae0aa49e86b1b5923764df472d61c" - integrity sha512-htLIdtfhhKW2fHlFLnZH7GFzHSdSpHhDLrWVswkNiiPMZ5uXq5JfrGboQKFhNQuAAFF8VNB2EYUj3MsdJrKKpg== - -content-tag@^3.1.0, content-tag@^3.1.1, content-tag@^3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/content-tag/-/content-tag-3.1.3.tgz#4ef462f459a81ba73945dd661a8041bf8062cc03" - integrity sha512-4Kiv9mEroxuMXfWUNUHcljVJgxThCNk7eEswdHMXdzJnkBBaYDqDwzHkoh3F74JJhfU3taJOsgpR6oEGIDg17g== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cosmiconfig@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" - integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== - dependencies: - env-paths "^2.2.1" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - -cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-functions-list@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.2.3.tgz#95652b0c24f0f59b291a9fc386041a19d4f40dbe" - integrity sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA== - -css-tree@^3.0.1, css-tree@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-3.1.0.tgz#7aabc035f4e66b5c86f54570d55e05b1346eb0fd" - integrity sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w== - dependencies: - mdn-data "2.12.2" - source-map-js "^1.0.1" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -data-view-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" - integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" - integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-offset@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" - integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -date-fns@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" - integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== - -debug@^2.6.8: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.7, debug@^4.4.0: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dunder-proto@^1.0.0, dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -electron-to-chromium@^1.5.149: - version "1.5.155" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz#809dd0ae9ae1db87c358e0c0c17c09a2ffc432d1" - integrity sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng== - -ember-eslint-parser@^0.5.9: - version "0.5.9" - resolved "https://registry.yarnpkg.com/ember-eslint-parser/-/ember-eslint-parser-0.5.9.tgz#f942c4863866e24a6243c390f743cbe0354d68a6" - integrity sha512-IW4/3cEiFp49M2LiKyzi7VcT1egogOe8UxQ9eUKTooenC7Q4qNhzTD6rOZ8j51m8iJC+8hCzjbNCa3K4CN0Hhg== - dependencies: - "@babel/eslint-parser" "^7.23.10" - "@glimmer/syntax" "^0.92.0" - content-tag "^2.0.1" - eslint-scope "^7.2.2" - html-tags "^3.3.1" - mathml-tag-names "^2.1.3" - svg-tags "^1.0.0" - -ember-rfc176-data@^0.3.17, ember-rfc176-data@^0.3.18: - version "0.3.18" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.18.tgz#bb6fdcef49999981317ea81b6cc9210fb4108d65" - integrity sha512-JtuLoYGSjay1W3MQAxt3eINWXNYYQliK90tLwtb8aeCuQK8zKGCRbBodVIrkcTqshULMnRuTOS6t1P7oQk3g6Q== - -ember-template-lint@7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-7.0.4.tgz#e03a024b525f0b176689b769a9e0fb740fadfb54" - integrity sha512-60TAoopPzfSpfCEQawnOFUTxizFAZkar6f/0Nsa1FeAIxif6oBqY+tVVrqwcOSenVLjWZLMGxm4iARlQz2aagg== - dependencies: - "@babel/generator" "^7.26.9" - "@babel/parser" "^7.21.8" - "@babel/plugin-syntax-typescript" "^7.25.9" - "@babel/plugin-transform-typescript" "^7.26.8" - "@babel/traverse" "^7.22.8" - "@lint-todo/utils" "^13.1.1" - aria-query "^5.3.0" - chalk "^5.3.0" - ci-info "^4.0.0" - content-tag "^3.1.1" - content-tag-utils "^0.3.0" - date-fns "^3.6.0" - ember-template-recast "^6.1.5" - eslint-formatter-kakoune "^1.0.0" - find-up "^7.0.0" - fuse.js "^7.0.0" - get-stdin "^9.0.0" - globby "^14.0.1" - is-glob "^4.0.3" - language-tags "^1.0.8" - micromatch "^4.0.5" - resolve "^1.22.3" - v8-compile-cache "^2.3.0" - yargs "^17.7.2" - -ember-template-lint@^7.0.1: - version "7.7.0" - resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-7.7.0.tgz#2ed6b00f1552c7c7e019f2b15bf946a482b9333c" - integrity sha512-KVQNeCdZHglpMm0YY4itu18xzw+IYeLLceWlL9tplCNcsQLSDYynyOvkzuQQH+y4JYN7aFnlxlxSGPyCOpBLZg== - dependencies: - "@babel/generator" "^7.26.9" - "@babel/parser" "^7.21.8" - "@babel/plugin-syntax-typescript" "^7.25.9" - "@babel/plugin-transform-typescript" "^7.26.8" - "@babel/traverse" "^7.22.8" - "@lint-todo/utils" "^13.1.1" - aria-query "^5.3.0" - chalk "^5.3.0" - ci-info "^4.0.0" - content-tag "^3.1.1" - content-tag-utils "^0.3.0" - date-fns "^3.6.0" - ember-template-recast "^6.1.5" - eslint-formatter-kakoune "^1.0.0" - find-up "^7.0.0" - fuse.js "^7.0.0" - get-stdin "^9.0.0" - globby "^14.0.1" - is-glob "^4.0.3" - language-tags "^1.0.8" - micromatch "^4.0.5" - resolve "^1.22.3" - v8-compile-cache "^2.3.0" - yargs "^17.7.2" - -ember-template-recast@^6.1.5: - version "6.1.5" - resolved "https://registry.yarnpkg.com/ember-template-recast/-/ember-template-recast-6.1.5.tgz#0f6423ddc8d4fa6306495b1d889205f637945801" - integrity sha512-VnRN8FzEHQnw/5rCv6Wnq8MVYXbGQbFY+rEufvWV+FO/IsxMahGEud4MYWtTA2q8iG+qJFrDQefNvQ//7MI7Qw== - dependencies: - "@glimmer/reference" "^0.84.3" - "@glimmer/syntax" "^0.84.3" - "@glimmer/validator" "^0.84.3" - async-promise-queue "^1.0.5" - colors "^1.4.0" - commander "^8.3.0" - globby "^11.0.3" - ora "^5.4.0" - slash "^3.0.0" - tmp "^0.2.1" - workerpool "^6.4.0" - -emoji-regex@^10.3.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" - integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -env-paths@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -environment@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" - integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9: - version "1.23.9" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.9.tgz#5b45994b7de78dada5c1bebf1379646b32b9d606" - integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA== - 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" - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" - integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== - dependencies: - hasown "^2.0.2" - -es-to-primitive@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" - integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== - dependencies: - is-callable "^1.2.7" - is-date-object "^1.0.5" - is-symbol "^1.0.4" - -escalade@^3.1.1, escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-formatter-kakoune@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-formatter-kakoune/-/eslint-formatter-kakoune-1.0.0.tgz#a95cc4fe1fbc06b84e0f2397e83f5f0b68340125" - integrity sha512-Uk/TVLt6Nf6Xoz7C1iYuZjOSdJxe5aaauGRke8JhKeJwD66Y61/pY2FjtLP04Ooq9PwV34bzrkKkU2UZ5FtDRA== - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.12.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" - integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== - dependencies: - debug "^3.2.7" - -eslint-plugin-decorator-position@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-decorator-position/-/eslint-plugin-decorator-position-6.0.0.tgz#edbdeb491a5e5ebfbd98725bfb2820564a3ffd3b" - integrity sha512-AUbZbt3JXnmP7Typfba4BIEFkSCc2rA6BkutsYiywIcEoX/yRL7jzqAp4UMpSDNhCMUUAfGt48k3141PhKC07w== - dependencies: - "@babel/core" "^7.18.6" - "@babel/plugin-proposal-decorators" "^7.18.6" - "@ember-data/rfc395-data" "^0.0.4" - ember-rfc176-data "^0.3.17" - snake-case "^3.0.4" - -eslint-plugin-ember@^12.5.0: - version "12.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-12.5.0.tgz#23bc7300f1a32a6af6db4d876553d2891df1f4fe" - integrity sha512-DBUzsaKWDVXsujAZPpRir0O7owdlCoVzZmtaJm7g7iQeSrNtcRWI7AItsTqKSsws1XeAySH0sPsQItMdDCb9Fg== - dependencies: - "@ember-data/rfc395-data" "^0.0.4" - css-tree "^3.0.1" - ember-eslint-parser "^0.5.9" - ember-rfc176-data "^0.3.18" - eslint-utils "^3.0.0" - estraverse "^5.3.0" - lodash.camelcase "^4.3.0" - lodash.kebabcase "^4.1.1" - requireindex "^1.2.0" - snake-case "^3.0.3" - -eslint-plugin-import@^2.31.0: - version "2.31.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" - integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== - 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" - -eslint-plugin-qunit@^8.1.2: - version "8.1.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.2.tgz#ac740615e73377dd531429da02769dc2ca205fe1" - integrity sha512-2gDQdHlQW8GVXD7YYkO8vbm9Ldc60JeGMuQN5QlD48OeZ8znBvvoHWZZMeXjvoDPReGaLEvyuWrDtrI8bDbcqw== - dependencies: - eslint-utils "^3.0.0" - requireindex "^1.2.0" - -eslint-plugin-simple-import-sort@^12.1.1: - version "12.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz#e64bfdaf91c5b98a298619aa634a9f7aa43b709e" - integrity sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA== - -eslint-plugin-sort-class-members@^1.21.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-sort-class-members/-/eslint-plugin-sort-class-members-1.21.0.tgz#e0ee1e5eddf698d5c997a071133b0cc51bb3de34" - integrity sha512-QKV4jvGMu/ge1l4s1TUBC6rqqV/fbABWY7q2EeNpV3FRikoX6KuLhiNvS8UuMi+EERe0hKGrNU9e6ukFDxNnZQ== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-scope@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" - integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" - integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== - -eslint@9.24.0: - version "9.24.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.24.0.tgz#9a7f2e6cb2de81c405ab244b02f4584c79dc6bee" - integrity sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.20.0" - "@eslint/config-helpers" "^0.2.0" - "@eslint/core" "^0.12.0" - "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.24.0" - "@eslint/plugin-kit" "^0.2.7" - "@humanfs/node" "^0.16.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.2" - "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.6" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.3.0" - eslint-visitor-keys "^4.2.0" - espree "^10.3.0" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - json-stable-stringify-without-jsonify "^1.0.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - -eslint@^9.22.0: - version "9.27.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.27.0.tgz#a587d3cd5b844b68df7898944323a702afe38979" - integrity sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.20.0" - "@eslint/config-helpers" "^0.2.1" - "@eslint/core" "^0.14.0" - "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.27.0" - "@eslint/plugin-kit" "^0.3.1" - "@humanfs/node" "^0.16.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.2" - "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.6" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.3.0" - eslint-visitor-keys "^4.2.0" - espree "^10.3.0" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - json-stable-stringify-without-jsonify "^1.0.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - -espree@^10.0.1, espree@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" - integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== - dependencies: - acorn "^8.14.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.2.0" - -esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eventemitter3@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9, fast-glob@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - 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" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-uri@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" - integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== - -fastest-levenshtein@^1.0.16: - version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" - integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== - -fastq@^1.6.0: - version "1.19.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" - integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^10.0.7, file-entry-cache@^10.0.8: - version "10.1.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-10.1.0.tgz#54c0117fe76425e9f08a44a3a08bedde0cd93fe8" - integrity sha512-Et/ex6smi3wOOB+n5mek+Grf7P2AxZR5ueqRUvAAn4qkyatXi3cUC1cuQXVkX0VlzBVsN4BkWJFmY/fYiRTdww== - dependencies: - flat-cache "^6.1.9" - -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-7.0.0.tgz#e8dec1455f74f78d888ad65bf7ca13dd2b4e66fb" - integrity sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g== - dependencies: - locate-path "^7.2.0" - path-exists "^5.0.0" - unicorn-magic "^0.1.0" - -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - -flat-cache@^6.1.9: - version "6.1.9" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-6.1.9.tgz#6f512c4ab81c2057577fdb30c2f64022d43db2e7" - integrity sha512-DUqiKkTlAfhtl7g78IuwqYM+YqvT+as0mY+EVk6mfimy19U79pJCzDZQsnqk3Ou/T6hFXWLGbwbADzD/c8Tydg== - dependencies: - cacheable "^1.9.0" - flatted "^3.3.3" - hookified "^1.8.2" - -flatted@^3.2.9, flatted@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -for-each@^0.3.3, for-each@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" - integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== - dependencies: - is-callable "^1.2.7" - -fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" - integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== - 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" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -fuse.js@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-7.1.0.tgz#306228b4befeee11e05b027087c2744158527d09" - integrity sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-east-asian-width@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" - integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== - -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - 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" - -get-proto@^1.0.0, get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-stdin@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" - integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== - -get-symbol-description@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" - integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - -globals@^16.0.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-16.1.0.tgz#ee6ab147d41c64e9f2beaaaf66572d18df8e1e60" - integrity sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g== - -globalthis@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globby@^11.0.3, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - 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" - -globby@^14.0.1: - version "14.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-14.1.0.tgz#138b78e77cf5a8d794e327b15dce80bf1fb0a73e" - integrity sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA== - dependencies: - "@sindresorhus/merge-streams" "^2.1.0" - fast-glob "^3.3.3" - ignore "^7.0.3" - path-type "^6.0.0" - slash "^5.1.0" - unicorn-magic "^0.3.0" - -globjoin@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" - integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -has-bigints@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" - integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" - integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== - dependencies: - dunder-proto "^1.0.0" - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hookified@^1.8.2: - version "1.9.0" - resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.9.0.tgz#271211f61c63b3a68a8ead9d9fddd72b5806c004" - integrity sha512-2yEEGqphImtKIe1NXWEhu6yD3hlFR4Mxk4Mtp3XEyScpSt4pQ4ymmXA1zzxZpj99QkFK+nN0nzjeb2+RUi/6CQ== - -html-tags@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" - integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== - -husky@>=6: - version "9.1.7" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" - integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -ignore@^7.0.3: - version "7.0.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.4.tgz#a12c70d0f2607c5bf508fb65a40c75f037d7a078" - integrity sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A== - -import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.5: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-slot@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" - integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.2" - side-channel "^1.1.0" - -is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" - integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-async-function@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" - integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== - 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" - -is-bigint@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" - integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== - dependencies: - has-bigints "^1.0.2" - -is-boolean-object@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" - integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-data-view@^1.0.1, is-data-view@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" - integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== - dependencies: - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - is-typed-array "^1.1.13" - -is-date-object@^1.0.5, is-date-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" - integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== - dependencies: - call-bound "^1.0.2" - has-tostringtag "^1.0.2" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" - integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== - dependencies: - call-bound "^1.0.3" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-fullwidth-code-point@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" - integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== - dependencies: - get-east-asian-width "^1.0.0" - -is-generator-function@^1.0.10: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" - integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== - dependencies: - call-bound "^1.0.3" - get-proto "^1.0.0" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== - -is-number-object@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" - integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-regex@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" - integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== - dependencies: - call-bound "^1.0.2" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" - integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== - dependencies: - call-bound "^1.0.3" - -is-string@^1.0.7, is-string@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" - integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-symbol@^1.0.4, is-symbol@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" - integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== - dependencies: - call-bound "^1.0.2" - has-symbols "^1.1.0" - safe-regex-test "^1.1.0" - -is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" - integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== - dependencies: - which-typed-array "^1.1.16" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2, is-weakref@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" - integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== - dependencies: - call-bound "^1.0.3" - -is-weakset@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" - integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== - dependencies: - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -keyv@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.3.3.tgz#ec2d723fbd7b908de5ee7f56b769d46dbbeaf8ba" - integrity sha512-Rwu4+nXI9fqcxiEHtbkvoes2X+QfkTRo1TMkPfwzipGsJlJO/z69vqB4FNl9xJ3xCpAcbkvmEabZfPzrwN3+gQ== - dependencies: - "@keyv/serialize" "^1.0.3" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -known-css-properties@^0.35.0: - version "0.35.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.35.0.tgz#f6f8e40ab4e5700fa32f5b2ef5218a56bc853bd6" - integrity sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A== - -known-css-properties@^0.36.0: - version "0.36.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.36.0.tgz#5c4365f3c9549ca2e813d2e729e6c47ef6a6cb60" - integrity sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA== - -language-subtag-registry@^0.3.20: - version "0.3.23" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" - integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== - -language-tags@^1.0.8: - version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" - integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== - dependencies: - language-subtag-registry "^0.3.20" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" - integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lint-staged@>=10: - version "16.0.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-16.0.0.tgz#31826709bde6a62542431da3055f038e386a20db" - integrity sha512-sUCprePs6/rbx4vKC60Hez6X10HPkpDJaGcy3D1NdwR7g1RcNkWL8q9mJMreOqmHBTs+1sNFp+wOiX9fr+hoOQ== - dependencies: - chalk "^5.4.1" - commander "^13.1.0" - debug "^4.4.0" - lilconfig "^3.1.3" - listr2 "^8.3.3" - micromatch "^4.0.8" - nano-spawn "^1.0.0" - pidtree "^0.6.0" - string-argv "^0.3.2" - yaml "^2.7.1" - -listr2@^8.3.3: - version "8.3.3" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.3.3.tgz#815fc8f738260ff220981bf9e866b3e11e8121bf" - integrity sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ== - dependencies: - cli-truncate "^4.0.0" - colorette "^2.0.20" - eventemitter3 "^5.0.1" - log-update "^6.1.0" - rfdc "^1.4.1" - wrap-ansi "^9.0.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -locate-path@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" - integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== - dependencies: - p-locate "^6.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@^4.17.14: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" - integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== - dependencies: - ansi-escapes "^7.0.0" - cli-cursor "^5.0.0" - slice-ansi "^7.1.0" - strip-ansi "^7.1.0" - wrap-ansi "^9.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -magic-string@^0.30.3: - version "0.30.17" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" - integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -mathml-tag-names@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" - integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== - -mdn-data@2.12.2: - version "2.12.2" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.12.2.tgz#9ae6c41a9e65adf61318b32bff7b64fbfb13f8cf" - integrity sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA== - -mdn-data@^2.21.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.21.0.tgz#f3a495e8b1e60cb4fbeaf9136aefba2f987a56e1" - integrity sha512-+ZKPQezM5vYJIkCxaC+4DTnRrVZR1CgsKLu5zsQERQx6Tea8Y+wMx5A24rq8A8NepCeatIQufVAekKNgiBMsGQ== - -meow@^13.2.0: - version "13.2.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" - integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.5, micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-function@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" - integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== - -minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nano-spawn@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nano-spawn/-/nano-spawn-1.0.2.tgz#9853795681f0e96ef6f39104c2e4347b6ba79bf6" - integrity sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg== - -nanoid@^3.3.8: - version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" - integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-inspect@^1.13.3: - version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" - integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.7: - version "4.1.7" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" - integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== - 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" - -object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" - integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" - integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== - dependencies: - mimic-function "^5.0.0" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - 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" - -ora@^5.4.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -own-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" - integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== - dependencies: - get-intrinsic "^1.2.6" - object-keys "^1.1.1" - safe-push-apply "^1.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== - dependencies: - yocto-queue "^1.0.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-locate@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" - integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== - dependencies: - p-limit "^4.0.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - 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" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-exists@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" - integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -path-type@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-6.0.0.tgz#2f1bb6791a91ce99194caede5d6c5920ed81eb51" - integrity sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - -pidtree@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - -possible-typed-array-names@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" - integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== - -postcss-media-query-parser@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" - integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== - -postcss-resolve-nested-selector@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz#3d84dec809f34de020372c41b039956966896686" - integrity sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw== - -postcss-safe-parser@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz#36e4f7e608111a0ca940fd9712ce034718c40ec0" - integrity sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A== - -postcss-scss@^4.0.9: - version "4.0.9" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685" - integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A== - -postcss-selector-parser@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" - integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.5.3: - version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" - integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== - dependencies: - nanoid "^3.3.8" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-plugin-ember-template-tag@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/prettier-plugin-ember-template-tag/-/prettier-plugin-ember-template-tag-2.0.5.tgz#3a436771bb24b2d6a4e0c7e42972c254632f6aee" - integrity sha512-G9lbK3wmryIBSzqBKKoy254v7hIjqzqYpqWxi9NvOxcxNtwLyrC1u9NLJJFm+x9blzqHQOzKGOseVnbLtEwEbg== - dependencies: - "@babel/core" "^7.23.6" - content-tag "^3.1.2" - prettier "^3.1.1" - -prettier@3.5.3, prettier@^3.1.1, prettier@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5" - integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== - -proper-lockfile@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" - integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== - dependencies: - graceful-fs "^4.2.4" - retry "^0.12.0" - signal-exit "^3.0.2" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" - integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== - 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" - -regexp.prototype.flags@^1.5.3: - version "1.5.4" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" - integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== - 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" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requireindex@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" - integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve@^1.22.1, resolve@^1.22.3, resolve@^1.22.4: - version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -restore-cursor@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" - integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== - dependencies: - onetime "^7.0.0" - signal-exit "^4.1.0" - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - -reusify@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" - integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== - -rfdc@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" - integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== - -rollup@^4.30.1: - version "4.41.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.41.0.tgz#17476835d2967759e3ffebe5823ed15fc4b7d13e" - integrity sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg== - dependencies: - "@types/estree" "1.0.7" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.41.0" - "@rollup/rollup-android-arm64" "4.41.0" - "@rollup/rollup-darwin-arm64" "4.41.0" - "@rollup/rollup-darwin-x64" "4.41.0" - "@rollup/rollup-freebsd-arm64" "4.41.0" - "@rollup/rollup-freebsd-x64" "4.41.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.41.0" - "@rollup/rollup-linux-arm-musleabihf" "4.41.0" - "@rollup/rollup-linux-arm64-gnu" "4.41.0" - "@rollup/rollup-linux-arm64-musl" "4.41.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.41.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.41.0" - "@rollup/rollup-linux-riscv64-gnu" "4.41.0" - "@rollup/rollup-linux-riscv64-musl" "4.41.0" - "@rollup/rollup-linux-s390x-gnu" "4.41.0" - "@rollup/rollup-linux-x64-gnu" "4.41.0" - "@rollup/rollup-linux-x64-musl" "4.41.0" - "@rollup/rollup-win32-arm64-msvc" "4.41.0" - "@rollup/rollup-win32-ia32-msvc" "4.41.0" - "@rollup/rollup-win32-x64-msvc" "4.41.0" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" - integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== - 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" - -safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-push-apply@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" - integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== - dependencies: - es-errors "^1.3.0" - isarray "^2.0.5" - -safe-regex-test@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" - integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-regex "^1.2.1" - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -serialize-javascript@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - 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" - -set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -set-proto@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" - integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== - dependencies: - dunder-proto "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - 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" - -side-channel@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - 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" - -signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1, signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-html-tokenizer@^0.5.11: - version "0.5.11" - resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz#4c5186083c164ba22a7b477b7687ac056ad6b1d9" - integrity sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" - integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -slice-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" - integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== - dependencies: - ansi-styles "^6.2.1" - is-fullwidth-code-point "^5.0.0" - -smob@^1.0.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/smob/-/smob-1.5.0.tgz#85d79a1403abf128d24d3ebc1cdc5e1a9548d3ab" - integrity sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig== - -snake-case@^3.0.3, snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -source-map-js@^1.0.1, source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -string-argv@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" - integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== - dependencies: - emoji-regex "^10.3.0" - get-east-asian-width "^1.0.0" - strip-ansi "^7.1.0" - -string.prototype.trim@^1.2.10: - version "1.2.10" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" - integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== - 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" - -string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" - integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -stylelint-config-recommended-scss@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz#1a5855655cddcb5f77c10f38c76567adf2bb9aa3" - integrity sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg== - dependencies: - postcss-scss "^4.0.9" - stylelint-config-recommended "^14.0.1" - stylelint-scss "^6.4.0" - -stylelint-config-recommended@^14.0.1: - version "14.0.1" - resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz#d25e86409aaf79ee6c6085c2c14b33c7e23c90c6" - integrity sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg== - -stylelint-config-recommended@^15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-15.0.0.tgz#93d48db401215708b724f078533864e52085a07b" - integrity sha512-9LejMFsat7L+NXttdHdTq94byn25TD+82bzGRiV1Pgasl99pWnwipXS5DguTpp3nP1XjvLXVnEJIuYBfsRjRkA== - -stylelint-config-standard-scss@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-standard-scss/-/stylelint-config-standard-scss-14.0.0.tgz#d2a3dde0eeae3601ccdd734a63a0e3be12430a7e" - integrity sha512-6Pa26D9mHyi4LauJ83ls3ELqCglU6VfCXchovbEqQUiEkezvKdv6VgsIoMy58i00c854wVmOw0k8W5FTpuaVqg== - dependencies: - stylelint-config-recommended-scss "^14.1.0" - stylelint-config-standard "^36.0.1" - -stylelint-config-standard@^36.0.1: - version "36.0.1" - resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-36.0.1.tgz#727cbb2a1ef3e210f5ce8329cde531129f156609" - integrity sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw== - dependencies: - stylelint-config-recommended "^14.0.1" - -stylelint-config-standard@^37.0.0: - version "37.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-37.0.0.tgz#55e75c7215d5398b096d2f75af6a16693c18532d" - integrity sha512-+6eBlbSTrOn/il2RlV0zYGQwRTkr+WtzuVSs1reaWGObxnxLpbcspCUYajVQHonVfxVw2U+h42azGhrBvcg8OA== - dependencies: - stylelint-config-recommended "^15.0.0" - -stylelint-scss@^6.4.0: - version "6.12.0" - resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-6.12.0.tgz#38cf41c3b8a76f34cd7267e4c30e7e66d35619c2" - integrity sha512-U7CKhi1YNkM1pXUXl/GMUXi8xKdhl4Ayxdyceie1nZ1XNIdaUgMV6OArpooWcDzEggwgYD0HP/xIgVJo9a655w== - dependencies: - css-tree "^3.0.1" - is-plain-object "^5.0.0" - known-css-properties "^0.36.0" - mdn-data "^2.21.0" - postcss-media-query-parser "^0.2.3" - postcss-resolve-nested-selector "^0.1.6" - postcss-selector-parser "^7.1.0" - postcss-value-parser "^4.2.0" - -stylelint@16.16.0: - version "16.16.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.16.0.tgz#ebecf27becd277aaf752e75de324023a1e13e486" - integrity sha512-40X5UOb/0CEFnZVEHyN260HlSSUxPES+arrUphOumGWgXERHfwCD0kNBVILgQSij8iliYVwlc0V7M5bcLP9vPg== - dependencies: - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/media-query-list-parser" "^4.0.2" - "@csstools/selector-specificity" "^5.0.0" - "@dual-bundle/import-meta-resolve" "^4.1.0" - balanced-match "^2.0.0" - colord "^2.9.3" - cosmiconfig "^9.0.0" - css-functions-list "^3.2.3" - css-tree "^3.1.0" - debug "^4.3.7" - fast-glob "^3.3.3" - fastest-levenshtein "^1.0.16" - file-entry-cache "^10.0.7" - global-modules "^2.0.0" - globby "^11.1.0" - globjoin "^0.1.4" - html-tags "^3.3.1" - ignore "^7.0.3" - imurmurhash "^0.1.4" - is-plain-object "^5.0.0" - known-css-properties "^0.35.0" - mathml-tag-names "^2.1.3" - meow "^13.2.0" - micromatch "^4.0.8" - normalize-path "^3.0.0" - picocolors "^1.1.1" - postcss "^8.5.3" - postcss-resolve-nested-selector "^0.1.6" - postcss-safe-parser "^7.0.1" - postcss-selector-parser "^7.1.0" - postcss-value-parser "^4.2.0" - resolve-from "^5.0.0" - string-width "^4.2.3" - supports-hyperlinks "^3.2.0" - svg-tags "^1.0.0" - table "^6.9.0" - write-file-atomic "^5.0.1" - -stylelint@^16.16.0: - version "16.19.1" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.19.1.tgz#486b95fa7518a3077ee2802bc6dda2174bc097bb" - integrity sha512-C1SlPZNMKl+d/C867ZdCRthrS+6KuZ3AoGW113RZCOL0M8xOGpgx7G70wq7lFvqvm4dcfdGFVLB/mNaLFChRKw== - dependencies: - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/media-query-list-parser" "^4.0.2" - "@csstools/selector-specificity" "^5.0.0" - "@dual-bundle/import-meta-resolve" "^4.1.0" - balanced-match "^2.0.0" - colord "^2.9.3" - cosmiconfig "^9.0.0" - css-functions-list "^3.2.3" - css-tree "^3.1.0" - debug "^4.3.7" - fast-glob "^3.3.3" - fastest-levenshtein "^1.0.16" - file-entry-cache "^10.0.8" - global-modules "^2.0.0" - globby "^11.1.0" - globjoin "^0.1.4" - html-tags "^3.3.1" - ignore "^7.0.3" - imurmurhash "^0.1.4" - is-plain-object "^5.0.0" - known-css-properties "^0.36.0" - mathml-tag-names "^2.1.3" - meow "^13.2.0" - micromatch "^4.0.8" - normalize-path "^3.0.0" - picocolors "^1.1.1" - postcss "^8.5.3" - postcss-resolve-nested-selector "^0.1.6" - postcss-safe-parser "^7.0.1" - postcss-selector-parser "^7.1.0" - postcss-value-parser "^4.2.0" - resolve-from "^5.0.0" - string-width "^4.2.3" - supports-hyperlinks "^3.2.0" - svg-tags "^1.0.0" - table "^6.9.0" - write-file-atomic "^5.0.1" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz#b8e485b179681dea496a1e7abdf8985bd3145461" - integrity sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-tags@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" - integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== - -table@^6.9.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5" - integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== - 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" - -terser@^5.17.4: - version "5.39.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.39.2.tgz#5a1626030724a672e2e5b5c9cd9070308c20e8f9" - integrity sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.14.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -tmp@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" - integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.0.3, tslib@^2.4.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -typed-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" - integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-typed-array "^1.1.14" - -typed-array-byte-length@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" - integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== - 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" - -typed-array-byte-offset@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" - integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== - 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" - -typed-array-length@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" - integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== - 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" - -typescript@^5.8.2: - version "5.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" - integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== - -unbox-primitive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" - integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== - dependencies: - call-bound "^1.0.3" - has-bigints "^1.0.2" - has-symbols "^1.1.0" - which-boxed-primitive "^1.1.1" - -unicorn-magic@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" - integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== - -unicorn-magic@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104" - integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -upath@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" - integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== - -update-browserslist-db@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" - integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -v8-compile-cache@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" - integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" - integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== - 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" - -which-builtin-type@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" - integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== - 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" - -which-collection@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.16, which-typed-array@^1.1.18: - version "1.1.19" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" - integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== - 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" - -which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -workerpool@^6.4.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" - integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" - integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== - dependencies: - ansi-styles "^6.2.1" - string-width "^7.0.0" - strip-ansi "^7.1.0" - -write-file-atomic@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" - integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^4.0.1" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yaml@^2.7.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.0.tgz#15f8c9866211bdc2d3781a0890e44d4fa1a5fff6" - integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yocto-queue@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.1.tgz#36d7c4739f775b3cbc28e6136e21aa057adec418" - integrity sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg== From 03a7fe0ed2649de81917cc5b8c702045e71aec00 Mon Sep 17 00:00:00 2001 From: Max <9123069+Mondrethos@users.noreply.github.com> Date: Thu, 17 Sep 2026 15:42:29 -0500 Subject: [PATCH 2/2] FIX: Integrate BBCode with the native Discourse Markdown pipeline --- INTEGRATION_NOTES.md | 194 ++++++++++ README.md | 40 +- assets/bundled/bbcode-parser.min.js | 2 +- assets/bundled/bbcode-parser.min.js.map | 2 +- .../initializers/bbcode-parser-init.js | 15 - .../discourse/initializers/fontawesome.js | 2 +- .../discourse/initializers/google-font.js | 8 +- .../discourse/initializers/highlight.js | 4 + .../lib/discourse-markdown/bbcode-plugin.js | 176 ++++----- bbcode-src/index.js | 22 +- bbcode-src/utils/common.js | 6 +- bbcode-src/utils/postprocess.js | 8 +- plugin.rb | 11 +- spec/lib/pretty_text_spec.rb | 359 ++++++++++++++++++ 14 files changed, 706 insertions(+), 143 deletions(-) create mode 100644 INTEGRATION_NOTES.md delete mode 100644 assets/javascripts/discourse/initializers/bbcode-parser-init.js create mode 100644 spec/lib/pretty_text_spec.rb diff --git a/INTEGRATION_NOTES.md b/INTEGRATION_NOTES.md new file mode 100644 index 0000000..de67c7c --- /dev/null +++ b/INTEGRATION_NOTES.md @@ -0,0 +1,194 @@ +# Discourse integration review — September 2026 + +## Direction + +Use Discourse's native Markdown and core formatting where possible. Keep custom +BBCode for the additional layout and interaction features. Compatibility fixes +are split into focused pull requests; this document describes the work under +review and does not mean every change has merged or been deployed. + +The local compatibility work targets Discourse core revision `c9d27d5d2e`. +Selected public examples from the saved XenForo snapshot are local fixtures, +not part of this repository: the BBCode guide, BBCode+ guide, and Sock Pile. +Their original credits remain visible. The full XenForo database was not +restored and the migration importer was not run. + +## Markdown and imported source + +- Ordinary Markdown and Discourse's `[b]`, `[i]`, `[u]`, and `[s]` formatting use + the native parser when no custom BBCode is present. These tags use Discourse's + existing `bbcode-b`, `bbcode-i`, `bbcode-u`, and `bbcode-s` classes. +- Lists and tables use native Markdown. The proposed XenForo `[list]`, `[*]`, + `[table]`, `[tr]`, `[td]`, `[th]`, and `[tf]` handlers have been removed from the + compatibility update. Convert imported source to supported syntax, preserving + cell contents and checking complex tables individually. +- Markdown headings remain active inside `[div]` and `[nobr]`. Use `\# label` + for a literal hash at the beginning of a line. Old layouts that relied on + XenForo treating those lines literally need their source converted; rebaking + alone cannot infer which headings an author intended. +- The proposed automatic repair of missing or misnested closing tags has been + removed. Correct malformed source before expecting it to render reliably. + The underlying BBob parser can drop content from malformed nested tags, so + inspect those posts during migration rather than relying on a successful + rebake command as proof of faithful output. +- Custom layout posts still use the plugin's legacy line-break and whitespace + conventions, including paragraph suppression and handling of indented layout + markup. They are not a fully native Markdown document model. Core inline + formatting also has local replacement handlers when nested in a custom layout. + +HTML escaping applies only when restoring text hoisted from code or `[plain]` +examples. For example, `[code=html]
Example
[/code]` displays the +HTML as source. Allowed raw HTML outside examples, including `
`, still +passes through Discourse's normal rendering and sanitizer; HTML comments remain +hidden. This does not grant permission for arbitrary HTML or script execution. + +## Changes under review + +The integration work registers BBCode through Discourse's Markdown pipeline, +uses the same parser bundle for server cooking and browser previews, and +respects the plugin setting and feature overrides used by chat. Spoilers and +accordions use native disclosure elements, with animation and decoration +behavior covered separately. Event-handler cleanup and repeated decoration are +also reviewed independently from parser behavior. + +The admin update replaces the obsolete Handlebars template with `.gjs` and uses +an authenticated POST request to refresh the parser. Optional BBScript remains +disabled by default; event-handler cleanup is not a complete security review of +that interpreter. + +Layout fixes form separate review work: + +- Parse complete default BBCode options with single or double outer quotes, + preserving interior CSS quotes and equals signs in URLs. +- Align tab labels and their controls while allowing long labels to wrap and + retaining keyboard focus. +- Keep positioned artwork in the author's horizontal scroll container on small + screens without adding a second scroll area around the entire post. + +These are shared parser or layout fixes, without fixture-specific substitutions. +Their tests do not establish that every historical design renders faithfully. + +## Deployment and rebaking + +1. Build the parser bundle after changing `bbcode-src`: + + ```sh + pnpm install --frozen-lockfile + pnpm build + ``` + +2. Deploy the full plugin, including its regenerated bundles. Restart Discourse + web processes and Sidekiq so both use the new renderer. Restart the frontend + development build when adding or removing plugin modules. +3. Correct unsupported or malformed imported source before rebuilding it. Check + representative posts in the preview and after saving. +4. Rebuild existing posts on the destination server. Discourse's standard task, + run from its application environment, is: + + ```sh + RAILS_ENV=production bundle exec rake posts:rebake + ``` + + For imported posts, follow the [importer's verified rebake instructions](https://github.com/RpNation/discourse_xf_importer#readme), + including a fresh run ID after renderer changes. Do not reuse a completed + checkpoint as evidence that the new renderer has processed those posts. +5. Check failed post IDs and Sidekiq retry/dead jobs. Background post-processing + must finish too. Inspect representative rendered posts; job completion alone + does not validate a layout's appearance. + +These are server deployment instructions. The full import and site-wide rebake +must not be run on the local development computer. + +## HTML/CSS alternatives + +### Constrained layouts inside normal posts + +This fits Discourse's normal selection, quoting, links, image handling, and +document sizing most closely. It needs a deliberately restricted language: + +1. Parse HTML and allow selected layout/formatting elements and attributes. + Remove executable markup, event handlers, forms, and unapproved embeds. + Validate URL schemes as well as element names. +2. Parse CSS, validate class/ID tokens, and rewrite every selector and animation + reference into a generated wrapper the author cannot alter. Random suffixes + or regular-expression stripping alone are not sufficient. +3. Limit properties/values and resource URLs. Prevent viewport positioning, + global selectors, imports, and rules that target Discourse controls. +4. Protect layout and paint containment on the wrapper. Containment is useful + for positioning/clipping, but does not replace HTML/CSS sanitization. +5. Preserve readable text for search, email, quoting, and moderation, and test + desktop/mobile preview parity. + +These restrictions need a compatibility inventory: authors' existing free-form +designs may depend on CSS that the constrained renderer would reject. A shared +rendering layer could eventually support both BBCode and constrained HTML input. + +### Sandboxed HTML/CSS frames + +For substantially freer CSS, an iframe provides a separate document boundary. +Start with no user scripts, forms, top-level navigation, or same-origin access; +sanitize the content and apply a restrictive content security policy as well. +If frames are served from a URL, use a dedicated origin so opening that URL +directly does not bypass the intended isolation. + +This requires more Discourse integration: frame sizing, search and email +fallbacks, selection/quoting, lightboxes, theme colors, responsive behavior, +accessibility, and performance with many posts. Any resizing bridge must be +controlled by the plugin and must not grant arbitrary user scripts access to +the forum. Avoid treating unrestricted iframes as a drop-in post renderer. + +## Current boundaries + +The legacy plugin's free-form inline styles and custom class styles are not a +security boundary. CSS can affect layout outside the intended content area; +optional `@scope` and random class suffixes do not establish complete isolation. +The BBScript engines also contain global selector and HTML-construction paths +that need a dedicated review before expanding their use. + +This compatibility work does not introduce unrestricted user HTML or claim that +the existing BBCode+ language is sandboxed. Optional integrations, such as Font +Awesome kits and remote image/font hosts, need their normal configuration and +available resources. Missing BBCode+ features need separate implementation and +regression coverage. + +The copied BBCode+ guide contains script-driven examples that remain inactive +while BBScript is disabled, and its legacy `[input]` control is not implemented. +Use the composer's Markdown mode to author and edit BBCode; this work does not +add a rich-text BBCode editor. + +Earlier local screenshots and fixture checks included compatibility behavior +that was removed during review, including literal hash labels and malformed-tag +repair. They are not validation of the revised parser. Recheck affected designs +after source conversion and deployment. + +## References + +- [HTML iframe sandbox rules](https://html.spec.whatwg.org/multipage/iframe-embed-object.html#attr-iframe-sandbox) +- [Iframe behavior and tradeoffs](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe) +- [CSS paint containment](https://drafts.csswg.org/css-contain/#paint-containment) +- [Shadow DOM encapsulation](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM) + +## Focused tests + +Inside a Discourse checkout with the relevant plugin changes installed and +frontend assets built: + +```sh +RAILS_ENV=test LOAD_PLUGINS=1 bundle exec rspec plugins/bbcode/spec/lib/pretty_text_spec.rb +bundle exec ruby bin/qunit --target bbcode --rails-port 3000 --filter BBCode +``` + +Run the admin request specs when testing the separate admin update. Run the +JavaScript, Ruby, and stylesheet lint checks for the files changed in each pull +request. + +Parser regressions cover native Markdown headings, paragraphs, lists, tables, +core inline formatting, code examples, allowed raw HTML, and sanitization. Layout +regressions cover generic attributes rather than copies of user designs. +Browser unit tests cover interactions and repeated decoration for the modules +included in each change. + +The server tests use synthetic inputs. Real-source fixture content stays outside +the plugin checkout and should not be committed as test data. Browser unit +checks and emulated mobile viewports do not establish Safari/iOS compatibility or +replace a fresh visual review of the affected local fixtures. diff --git a/README.md b/README.md index 7db9050..1a2dcb8 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,18 @@ RpNation's Official BBCode Implementation for Discourse -See: [https://www.rpnation.com] +See [RpNation](https://www.rpnation.com). -The goal of this repo and plugin is to provide users with the BBCode suite that they have grown accustomed to when it comes to using our site before our migration to Discourse and make sure that old posts rebake correctly. Above in the chart is marked our status on each BBCode which will hopefully co-exist in tandom even with the markdown/htlm versions provided in the box experience by the Discourse Software. +This plugin adds RpNation's custom BBCode to Discourse while using native +Discourse formatting where it already exists. Use Markdown for lists and tables, +and Discourse's own inline bold, italic, underline, and strikethrough tags. +Custom layout tags remain available for designs that need them. + +Imported XenForo posts may need source conversion before rebaking: this plugin +does not add XenForo list/table syntax or automatically repair malformed tags. +Markdown headings also work inside layout tags; write `\# label` when the hash +should be literal. See the [integration notes](INTEGRATION_NOTES.md) for migration +and rendering boundaries. ## Features/Planned @@ -52,7 +61,8 @@ The goal of this repo and plugin is to provide users with the BBCode suite that - [x] Sides - [x] Tabs - [x] Accordions -- [x] ~~Tables~~ now using markdown tables +- [x] Native Discourse Markdown tables +- [x] Native Discourse numbered and bulleted lists - [x] Center Block - [x] Background - [x] Border @@ -105,6 +115,24 @@ For more, see the [Discourse Docker Guide](https://meta.discourse.org/docs?topic ## Architecture -The architecture of this project is for all BBCode Parser related code to be contained in `/bbcode-src`, which would then be minified into a module and added to the appropriate location in `/assets/javascripts` to be used by the discourse plugin proper. This is to work around the weird way discourse requires libraries to be loaded in. There will be a Rollup config and github action setup to automate minifying and moving the module. - -Honestly, if anyone has a better solution, please send help. +Parser and tag implementations live in `bbcode-src`. Run +`pnpm install --frozen-lockfile` and `pnpm build` to regenerate the checked-in parser bundles +and source maps before deploying source changes. Install the full plugin in +Discourse's `plugins/bbcode` directory and restart Discourse and its frontend +build when adding or removing plugin modules. + +The parser is registered for both server cooking and browser previews through +Discourse's Markdown plugin pipeline. Ordinary Markdown and core inline +formatting stay on the native path. Custom layout posts retain the plugin's +legacy whitespace conventions. Rendered content still passes through Discourse's +sanitizer; allowed raw HTML remains available outside literal code examples. + +After deploying a parser change, restart both Discourse web processes and +Sidekiq before rebuilding existing posts. A changed parser does not automatically +refresh saved cooked HTML. Follow the [deployment and rebake instructions](INTEGRATION_NOTES.md#deployment-and-rebaking) +on the destination server, and check failed jobs as well as the command's final +message. + +The [integration notes](INTEGRATION_NOTES.md) describe the changes under review, +focused tests, remaining boundaries, and the tradeoffs of a future contained +HTML/CSS editor. BBScript remains optional and disabled by default. diff --git a/assets/bundled/bbcode-parser.min.js b/assets/bundled/bbcode-parser.min.js index 6b3dff1..2deb07c 100644 --- a/assets/bundled/bbcode-parser.min.js +++ b/assets/bundled/bbcode-parser.min.js @@ -1,3 +1,3 @@ /* Source code in bbcode-src */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).bbcodeParser={})}(this,(function(t){"use strict";const e="\n",n="\t",s="=",r='"',o=" ",a="[",i="]",c="/",l="\\";function u(t){return"object"==typeof t&&null!==t&&"tag"in t}function d(t){return"string"==typeof t}function g(t){return t===e}function h(t,e,n){return Object.keys(t).reduce(((n,s)=>e(n,s,t)),n)}function p(t){return u(t)&&Array.isArray(t.content)?t.content.reduce(((t,e)=>t+p(e)),0):d(t)?String(t).length:0}function f(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/(javascript|data|vbscript):/gi,"$1%3A")}function b(t,e){switch(typeof e){case"boolean":return e?`${t}`:"";case"number":return`${t}="${e}"`;case"string":return`${t}="${f(e)}"`;case"object":return`${t}="${f(JSON.stringify(e))}"`;default:return""}}function m(t){return null==t?"":h(t,((t,e,n)=>[...t,b(e,n[e])]),[""]).join(" ")}const w=(t,e)=>{const n=h(e||{},((t,e,n)=>n[e]===e?n[e]:null),null);if(n){const s=b(t,n),r={...e};delete r[String(n)];return`${s}${m(r)}`}return`${t}${m(e)}`};class y{attr(t,e){return void 0!==e&&(this.attrs[t]=e),this.attrs[t]}append(t){return function(t,e){Array.isArray(t.content)&&t.content.push(e)}(this,t)}setStart(t){this.start=t}setEnd(t){this.end=t}get length(){return p(this)}toTagStart({openTag:t=a,closeTag:e=i}={}){return`${t}${w(String(this.tag),this.attrs)}${e}`}toTagEnd({openTag:t=a,closeTag:e=i}={}){return`${t}${c}${this.tag}${e}`}toTagNode(){const t=new y(String(this.tag).toLowerCase(),this.attrs,this.content);return this.start&&t.setStart(this.start),this.end&&t.setEnd(this.end),t}toString({openTag:t=a,closeTag:e=i}={}){const n=this.content?((t,e,n)=>{const s=t=>u(t)?t.toString({openTag:e,closeTag:n}):String(t);return Array.isArray(t)?t.reduce(((t,e)=>null!==e?t+s(e):t),""):t?s(t):null})(this.content,t,e):"",s=this.toTagStart({openTag:t,closeTag:e});return null===this.content||Array.isArray(this.content)&&0===this.content.length?s:`${s}${n}${this.toTagEnd({openTag:t,closeTag:e})}`}static create(t,e={},n=null,s){const r=new y(t,e,n);return s&&r.setStart(s),r}static isOf(t,e){return t.tag===e}constructor(t,e,n){this.tag=t,this.attrs=e,this.content=n}}const v="t",x=t=>t&&void 0!==t.v?t.v:"",$=t=>x(t).charCodeAt(0)===c.charCodeAt(0);class k{get type(){return this[v]}isEmpty(){return 0===this[v]||isNaN(this[v])}isText(){return!(!(t=this)||void 0===t[v]||5!==t[v]&&6!==t[v]&&1!==t[v]);var t}isTag(){return!(!(t=this)||void 0===t[v])&&2===t[v];var t}isAttrName(){return!(!(t=this)||void 0===t[v])&&3===t[v];var t}isAttrValue(){return!(!(t=this)||void 0===t[v])&&4===t[v];var t}isStart(){return!$(this)}isEnd(){return $(this)}getName(){return(t=>{const e=x(t);return $(t)?e.slice(1):e})(this)}getValue(){return x(this)}getLine(){return(t=this)&&t.l||0;var t}getColumn(){return(t=this)&&t.r||0;var t}getStart(){return(t=this)&&t.s||0;var t}getEnd(){return(t=this)&&t.e||0;var t}toString({openTag:t=a,closeTag:e=i}={}){return((t,e=a,n=i)=>{let s=e;return s+=x(t),s+=n,s})(this,t,e)}constructor(t,e,n=0,s=0,r=0,o=0){this.l=n,this.r=s,this[v]=t||0,this.v=String(e),this.s=r,this.e=o}}class T{skip(t=1,e){this.c.pos+=t,this.o&&this.o.onSkip&&!e&&this.o.onSkip()}hasNext(){return this.c.len>this.c.pos}getCurr(){return void 0===this.s[this.c.pos]?"":this.s[this.c.pos]}getPos(){return this.c.pos}getLength(){return this.c.len}getRest(){return this.s.substring(this.c.pos)}getNext(){const t=this.c.pos+1;return t<=this.s.length-1?this.s[t]:null}getPrev(){const t=this.c.pos-1;return void 0===this.s[t]?null:this.s[t]}isLast(){return this.c.pos===this.c.len}includes(t){return this.s.indexOf(t,this.c.pos)>=0}grabWhile(t,e){let n=0;if(this.hasNext())for(n=this.c.pos;this.hasNext()&&t(this.getCurr());)this.skip(1,e);return this.s.substring(n,this.c.pos)}grabN(t=0){return this.s.substring(this.c.pos,this.c.pos+t)}substrUntilChar(t){const{pos:e}=this.c,n=this.s.indexOf(t,e);return n>=0?this.s.substring(e,n):""}constructor(t,e={}){this.s=t,this.c={pos:0,len:t.length},this.o=e}}const A=(t,e)=>new T(t,e);const C=[o,n],S=[s,o,n],_=t=>C.indexOf(t)>=0,j=t=>t===l,L=t=>((t,e)=>{for(;t.charAt(0)===e;)t=t.substring(1);for(;t.charAt(t.length-1)===e;)t=t.substring(0,t.length-1);return t})(t,r).replace(l+r,r);function O(t,u={}){let d=0,g=0,h=0,p=-1,f=0,b=0,m="";const w=new Array(Math.floor(t.length)),y=u.openTag||a,v=u.closeTag||i,x=!!u.enableEscapeTags,$=(u.contextFreeTags||[]).filter(Boolean).map((t=>t.toLowerCase())),T=u.caseFreeTags||!1,C=new Map,O=u.onToken||(()=>{}),E=[v,y,r,l,o,n,s,e,"!"],N=[y,o,n,e],W=t=>-1===N.indexOf(t),I=()=>{h++},V=(t,e)=>{""!==m&&e&&(m=""),""===m&&$.includes(t.toLowerCase())&&(m=t)},U=A(t,{onSkip:I});function q(t,e,n,s){const r=function(t,e,n=0,s=0,r=0,o=0){return new k(t,e,n,s,r,o)}(t,e,d,g,n,s);O(r),g=h,p+=1,w[p]=r}function D(t,e,n){if(1===b){const e=t=>!(t===s||_(t)),n=t.grabWhile(e),r=t.isLast(),o=t.getCurr()!==s;return t.skip(),r||o?q(4,L(n)):q(3,n),r?0:o?1:2}if(2===b){let n=!1;const o=o=>{const a=o===r,i=t.getPrev(),c=t.getNext(),u=i===l,d=c===s,g=_(o),h=c&&_(c);return!(!n||!(t=>S.indexOf(t)>=0)(o))||!!(!a||u||(n=!n,n||d||h))&&(!!e||!g)},a=t.grabWhile(o);return t.skip(),q(4,L(a)),t.getPrev()===r&&g++,t.isLast()?0:1}const o=n+t.getPos()-1,a=t.grabWhile((e=>!(e===s||_(e)||t.isLast())));if(q(2,a,o,n+t.getLength()+1),V(a),t.skip(),g++,e)return 2;return t.includes(s)?1:2}function G(){const t=U.getCurr(),e=U.getNext();U.skip();const n=U.substrUntilChar(v),r=0===n.length||n.indexOf(y)>=0;if(e&&(o=e,E.indexOf(o)>=0)||r||U.isLast())return q(1,t),0;var o;const a=-1===n.indexOf(s),i=n[0]===c;if(a||i){const t=U.getPos()-1,e=U.grabWhile((t=>t!==v)),n=t+e.length+2;return U.skip(),q(2,e,t,n),V(e,i),0}return 2}function z(){const t=U.getPos(),e=U.grabWhile((t=>t!==v),!0),n=A(e,{onSkip:I}),s=n.includes(o);for(b=0;n.hasNext();)b=D(n,!s,t);return U.skip(),0}function P(){if(U.getCurr()===e)return q(6,U.getCurr()),U.skip(),h=0,g=0,d++,0;if(_(U.getCurr())){return q(5,U.grabWhile(_)),0}if(U.getCurr()===y){if(m){const t=y.length+1+m.length,e=`${y}${c}${m}`;if(U.grabN(t)===e)return 1}else if(U.includes(v))return 1;return q(1,U.getCurr()),U.skip(),g++,0}if(x){if(j(U.getCurr())){const t=U.getCurr(),e=U.getNext();return U.skip(),e&&(t=>t===y||t===v||t===l)(e)?(U.skip(),q(1,e),0):(q(1,t),0)}const t=t=>W(t)&&!j(t);return q(1,U.grabWhile(t)),0}return q(1,U.grabWhile(W)),0}return{tokenize:function(){for(f=0;U.hasNext();)switch(f){case 1:f=G();break;case 2:f=z();break;default:f=P()}return w.length=p+1,w},isTokenNested:function(e){const n=y+c+e;if(C.has(n))return!!C.get(n);{const e=T?t.toLowerCase().indexOf(n.toLowerCase())>-1:t.indexOf(n)>-1;return C.set(n,e),e}}}}class E{last(){return Array.isArray(this.n)&&this.n.length>0&&void 0!==this.n[this.n.length-1]?this.n[this.n.length-1]:null}flush(){return!!this.n.length&&this.n.pop()}push(t){this.n.push(t)}toArray(){return this.n}constructor(){this.n=[]}}const N=()=>new E;function W(t,e={}){const n=e,s=n.openTag||a,r=n.closeTag||i,o=(n.onlyAllowTags||[]).filter(Boolean).map((t=>t.toLowerCase())),c=n.caseFreeTags||!1;let l=null;const d=N(),g=N(),h=N(),p=N(),f=new Set;function b(t){return Boolean(f.has(c?t.toLowerCase():t))}function m(){h.flush()&&p.flush()}function w(){const t=g.last();return t&&u(t)?t.content:d.toArray()}function v(t,e,n=!0){Array.isArray(t)&&void 0!==e&&(t.push(e.toTagStart({openTag:s,closeTag:r})),Array.isArray(e.content)&&e.content.length&&(e.content.forEach((e=>{t.push(e)})),n&&t.push(e.toTagEnd({openTag:s,closeTag:r}))))}function x(t,e){var n;Array.isArray(t)&&void 0!==e&&(u(e)?(n=e.tag,!o.length||o.indexOf(n.toLowerCase())>=0?t.push(e.toTagNode()):v(t,e)):t.push(e))}function $(t){m();const e=y.create(t.getValue(),{},[],{from:t.getStart(),to:t.getEnd()}),n=function(t){const e=t.getValue(),n=c?e.toLowerCase():e,{isTokenNested:s}=l||{};return!f.has(n)&&s&&s(n)?(f.add(n),!0):f.has(n)}(t);if(h.push(e),n)g.push(e);else{x(w(),e)}}function k(t){t.isStart()&&$(t),t.isEnd()&&function(t){const e=t.getValue().slice(1),o=g.flush();if(m(),o){const e=w();u(o)&&o.setEnd({from:t.getStart(),to:t.getEnd()}),x(e,o)}else if(b(e)){if("function"==typeof n.onError){const e=t.getValue(),s=t.getLine(),r=t.getColumn();n.onError({tagName:e,lineNumber:s,columnNumber:r})}}else x(w(),t.toString({openTag:s,closeTag:r}))}(t)}const T=e.createTokenizer?e.createTokenizer:O;l=T(t,{onToken:function(t){t.isTag()?k(t):function(t){const e=h.last(),n=t.getValue(),o=b(t.toString()),a=w();if(null!==e)if(t.isAttrName()){p.push(n);const t=p.last();t&&e.attr(t,"")}else if(t.isAttrValue()){const t=p.last();t?(e.attr(t,n),p.flush()):e.attr(n,n)}else t.isText()?o?e.append(n):x(a,n):t.isTag()&&x(a,t.toString({openTag:s,closeTag:r}));else t.isText()?x(a,n):t.isTag()&&x(a,t.toString({openTag:s,closeTag:r}))}(t)},openTag:s,closeTag:r,onlyAllowTags:n.onlyAllowTags,contextFreeTags:n.contextFreeTags,caseFreeTags:n.caseFreeTags,enableEscapeTags:n.enableEscapeTags}),l.tokenize();const A=g.flush();return null!==A&&A&&u(A)&&b(A.tag)&&v(w(),A,!1),d.toArray()}const I=t=>"object"==typeof t&&null!==t;function V(t,e){const n=t;if(Array.isArray(n))for(let t=0;t[].some.call(e,(e=>U(t,e))))):!(!I(t)||!I(e))&&Object.keys(t).every((n=>{const s=e[n],r=t[n];return I(r)&&I(s)?U(r,s):"boolean"==typeof r?r!==(null===s):s===r})):t===e)}function q(t,e){const n=t;return n.messages=[...n.messages||[]],n.options={...e,...n.options},n.walk=function(t){return V(this,t)},n.match=function(t,e){return function(t,e,n){return Array.isArray(e)?V(t,(t=>{for(let s=0;sU(e,t)?n(t):t))}(this,t,e)},n}function D(t,e){const{stripTags:n=!1}=e||{};if(null==t)return"";if("string"==typeof t||"number"==typeof t)return String(t);if(Array.isArray(t))return G(t,e);if(u(t)){if(n)return G(t.content,e);const s=m(t.attrs);return null===t.content?"<"+t.tag+s+"/>":"<"+t.tag+s+">"+G(t.content,e)+""}return""}function G(t,e){return t&&Array.isArray(t)?t.reduce(((t,n)=>t+D(n,e)),""):t?D(t,e):""}const z=(t,e,n=[])=>({tag:t,attrs:e,content:n,gen:!0}),P=(t,e)=>{const n=Object.keys(t.attrs).join(" "),s=Object.values(t.attrs).join(" ");if(n!==s)return t.attrs;if(!e||!t.start)return{_default:s};const r=e.substring(t.start.from,t.start.to);if(!r.includes("="))return t.attrs;const o=r.split("=");if(2!==o.length)return t.attrs;let a=o[1].slice(0,-1).trim();return a.startsWith('"')&&a.endsWith('"')&&(a=a.slice(1,-1)),{_default:a}},M=(t,e)=>{if(t.start)return e.substring(t.start.from,t.start.to);if(!t.attrs)return`[${t.tag}]`;const n=P(t,e);return n._default?`[${t.tag}=${n._default}]`:t.toTagStart()},F=(t,e)=>t.end?e.substring(t.end.from,t.end.to):t.toTagEnd(),B=(t,e)=>t.end?[M(t,e),...t.content,F(t,e)]:M(t,e),R=(t,e,n)=>{const s=t.substring(n||0).search(e);return s>=0?s+(n||0):s},J="\x3c!-- bbcode injected newlines --\x3e\n\n",Z="\n\n\x3c!-- bbcode pre injected newlines --\x3e",H="\x3c!-- bbcode injected newlines --\x3e",K=new RegExp(`^${/(http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])/.source}|${/\!?\[.*\]\((http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])\)/.source}$`),Q=/((\n|^)(?```+|~~~+)(?.*\n))|(?\[(?i?code|plain)(=.*)?\])|(?(?`{1,2})(.*)(?\k))/im,X=/^(\|[^\n]+\|\r?\n)((?:\| ?:?[-]+:? ?)+\|)(\n(?:\|[^\n]+\|\r?\n?)*)?$/m;function Y(){let t=(new Date).getTime();return window.performance&&"function"==typeof window.performance.now&&(t+=performance.now()),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){const n=(t+16*Math.random())%16|0;return t=Math.floor(t/16),("x"===e?n:3&n|8).toString(16)}))}const tt=t=>"object"==typeof t,et=t=>"string"==typeof t,nt=(t,e=!1)=>{const n=t;if(Array.isArray(n)){st(n),n.some(et)&&(n.unshift(J),n.push(J));for(let t=0;t{let e=t.findLastIndex((t=>et(t)&&!g(t)))+1;for(let n=e-1;n>=0;n--)et(t[n])&&!g(t[n])||(g(t[n])||tt(t[n]))&&(n!==e-1&&t.splice(n+1,e-n-1,t.slice(n+1,e).join("")),e=n);0!==e&&t.splice(0,e,t.slice(0,e).join(""))},rt=t=>{const e=t;if(Array.isArray(e))for(let t=0;t1&&" "===e[0]){let t=e.length;return[String.fromCharCode(160).repeat(t)]}return e},ot=/\n{2,}/gm,at=t=>t.walk((t=>(u(t)&&t.attrs&&Object.keys(t.attrs).forEach((e=>{"string"==typeof t.attrs[e]&&(t.attrs[e]=t.attrs[e].replace(ot,"\n"))})),t)));function it(t,e,n,s){return e.walk((e=>{if(u(e)){const r=e.tag,o=t[r];if("function"==typeof o)return o(e,n,s)}return e}))}const ct=Symbol("slide-title-open"),lt=Symbol("slide-title-close"),ut=Symbol("slide-close"),dt=/(?\{slide=)|(?\})|(?\{\/slide\})/i;function gt(t){switch(t){case ct:return"{slide=";case lt:return"}";case ut:return"{/slide}";default:return t}}const ht={accordion:(t,e)=>{const n=Y(),s=function(t){t=[...t];const e=[];for(;t.length>0;){const n=t[0];if(u(n)){e.push(t.shift());continue}const s=R(n,dt);if(-1===s){e.push(t.shift());continue}const r=n.match(dt),o=n.slice(0,s),a=n.slice(s+r[0].length);o.length&&e.push(o),r.groups.slideTitleOpen&&e.push(ct),r.groups.slideTitleClose&&e.push(lt),r.groups.slideClose&&e.push(ut),a.length?t[0]=a:t.shift()}return e}(t.content),r=function(t){const e=[];let n=null,s=null;for(const r of t)if(r===ct&&null===s)n=y.create("slide"),n.content=[],n.customTitle=[],s=ct;else{if(r===lt&&s===ct){s=lt;continue}r===ut&&n&&s===lt?(e.push(n),n=null,s=null):n?s===ct?n.customTitle.push(gt(r)):n.content.push(gt(r)):e.push(gt(r))}return e}(s),o=r.filter((t=>u(t)&&"slide"===t.tag)).map((t=>(t.isValid=!0,t.groupId=n,t)));if(!o.length)return[M(t,e.data.raw),...t.content,F(t,e.data.raw)];const a=P(t,e.data.raw);if(a._default){const t=a._default.split("|").map((t=>t.trim())),e=t.filter((t=>["bright","bcenter","bleft","fleft","fright"].includes(t))).pop();e&&(a.align??=e),(t.some((t=>t.endsWith("px")))||t.some((t=>t.endsWith("%"))))&&(a.width??=t.find((t=>t.endsWith("px")||t.endsWith("%"))))}let i=a.align?.toLowerCase()||"",c="";return(a.width?.endsWith("px")||a.width?.endsWith("%"))&&(c=`width: ${a.width};`),z("div",{class:"bb-accordion "+i,"data-group-id":n,style:c},o)},slide:(t,e)=>{if(!t.isValid)return[M(t,e.data.raw),...t.content,F(t,e.data.raw)];const n=P(t,e.data.raw);let s=[n.title||n._default||"Slide"],r=!!n.open||!1,o=n.left?"left":n.right?"right":n.center?"center":"left";if(t.customTitle?.length){s=t.customTitle;const e=s.filter((t=>"string"==typeof t)).join("").toLowerCase().split("|").map((t=>t.trim()));e.includes("open")&&(r=!0),e.includes("right")&&(o="right"),e.includes("center")&&(o="center"),e.includes("left")&&(o="left"),s=s.map((t=>(d(t)&&(t=t.replace(/\|(open|right|center|left)/gi,"")),t)))}return[z("details",{class:"bb-slide",open:r},[z("summary",{class:"bb-slide-title",style:`text-align: ${o}; ${n.style||""}`},s),z("div",{class:"bb-slide-content"},t.content)])]}},pt={left:t=>z("div",{class:"bb-left"},t.content),center:t=>z("div",{class:"bb-center"},t.content),right:t=>z("div",{class:"bb-right"},t.content)},ft={a:(t,e)=>{const n=P(t,e.data.raw)._default||"";return z("a",{id:`user-anchor-${n.trim()}`,name:`user-anchor-${n.trim()}`},t.content)},goto:(t,e)=>{const n=P(t,e.data.raw)._default||"";return z("a",{href:`#user-anchor-${n.trim()}`},t.content)}},bt=["arial","book antiqua","courier new","georgia","tahoma","times new roman","trebuchet ms","verdana"],mt={thin:"100",extralight:"200",light:"300",regular:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"},wt=["ital","opsz","slnt","wdth","wght"],yt=/(?[a-zA-Z]*)?\s?(?[0-9]*)?\s?(?italic)?/;const vt=z("div",{class:"bb-email-header"},""),xt=z("div",{class:"bb-email-footer"},z("div",{class:"bb-email-button"},"")),$t={row:t=>z("div",{class:"bb-row"},t.content),column:(t,e)=>{const n=P(t,e.data.raw)._default||"8",s=n.startsWith("span")?`column-width-${n}`:`column-width-span${n}`;return z("div",{class:"bb-column","data-span":s},t.content)}},kt=["init","click","change","input","dblclick","mouseenter","mouseleave","scroll"];const Tt=["me","them","right","left"],At={textmessage:(t,e)=>{const n=t.content.filter((t=>u(t)&&"message"===t.tag));if(n.forEach((t=>{t.isValid=!0})),!n.length)return B(t,e.data.raw);const s=P(t,e.data.raw)._default||"Recipient",r=""!==s.trim()?s:"Recipient";return z("div",{class:"bb-textmessage"},[z("div",{class:"bb-textmessage-name"},r),z("div",{class:"bb-textmessage-overflow"},[z("div",{class:"bb-textmessage-content"},t.content)])])},message:(t,e)=>{if(!t.isValid)return B(t,e.data.raw);let n=P(t,e?.data?.raw)?._default?.toLowerCase();Tt.includes(n)&&"right"!==n||(n="me"),"left"===n&&(n="them");return z("div",{class:"me"===n?"bb-message-me":"bb-message-them"},[z("div",{class:"bb-message-content"},t.content)])}},Ct={...ht,...pt,...ft,animation:(t,e)=>{e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const n=e.data.previewing?"preview":e.data.commonGUID,s=P(t,e.data.raw)?._default||"",r=t.content.filter((t=>u(t)&&"keyframe"===t.tag)).map((t=>{t.isValid=!0;const n=P(t,e.data.raw)._default||"";t.ident=n+(n.match(/^\d+$/)?"%":"");const s=t.content.filter(d).join("").replaceAll(/[\[\]\{\}]/g,"");return t.formatted=`${t.ident}{ ${s} }`,t})),o=`@keyframes ${n}${s} { ${r.map((t=>t.formatted)).join("\n")} }`;return e.data.styles.push(o),[]},bg:(t,e)=>{const n=P(t,e.data.raw)._default;return z("div",{style:`background-color: ${n};`,class:"bb-background"},t.content)},block:(t,e)=>{const n="block",s=(P(t,e.data.raw)._default||n).toLowerCase(),r=["block","dice","dice10","setting","warning","storyteller","announcement","important","question","encounter","information","character","treasure"].includes(s)?s:n;return z("table",{class:"bb-block","data-bb-block":r},[z("tbody",[z("tr",[z("td",{class:"bb-block-icon"}),z("td",{class:"bb-block-content"},t.content)])])])},blockquote:(t,e)=>{const n=P(t,e.data.raw)._default||"";return z("div",{class:"bb-blockquote"},[z("div",{class:"bb-blockquote-left"}),z("div",{class:"bb-blockquote-content"},[t.content,z("div",{class:"bb-blockquote-speaker"},""!==n?`- ${n}`:"")]),z("div",{class:"bb-blockquote-right"})])},border:(t,e)=>{const n=P(t,e.data.raw)._default;return z("div",{style:`border: ${n};`,class:"bb-border"},t.content)},br:()=>z("br",{},null),centerblock:(t,e)=>{const n=P(t,e.data.raw)._default||"50";return z("div",{style:`margin: 0 auto; width: ${n}%`},t.content)},check:(t,e)=>{const n=P(t,e.data.raw)._default||"dot";return z("div",{class:"bb-check","data-type":n},t.content)},class:(t,e)=>{const n=P(t),s=n.name||n._default;e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const r=e.data.previewing?"preview":e.data.commonGUID,o=s+"__"+r,a=t.content.filter(d).map((t=>t.replaceAll("{post_id}",r).replaceAll(/[\[\]\{\}]/g,"")));let i="";const c=[];return["hover","focus","active","focus-within","focus-visible"].includes(n.state?.toLowerCase())&&(i=":"+n.state.toLowerCase()),n.selector&&(i=n.selector.replace(/[,{}\\\n]/g,"")),n.minWidth?.match(/^[0-9]+[a-z]+$/)&&c.push(`(min-width: ${n.minWidth})`),n.maxWidth?.match(/^[0-9]+[a-z]+$/)&&c.push(`(max-width: ${n.maxWidth})`),a.unshift(`.${o}${i} {`),a.push("}"),c.length&&(a.unshift(`@media ${c.join(" and ")} {`),a.push("}")),e.data.styles.push(a.join("")),[]},code:t=>({isWhitespaceSensitive:!0,content:["```"+(P(t)._default||"bbcode")+"\n",t.content,"\n```\n"]}),color:t=>{const e=P(t)._default||"";return""===e.trim()?t.content:z("span",{style:`color: ${e}`},t.content)},comment:t=>z("span",{class:"hidden"},t.content),div:(t,e)=>{if(t.gen)return t;const n=P(t,e.data.raw),s=n.style||n._default,r=n.class;if(!r?.trim())return z("div",{style:s},t.content);e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const o=e.data.previewing?"preview":e.data.commonGUID,a=r.split(" ").map((t=>t+"__"+o)).join(" ");return z("div",{class:a,style:s},t.content)},divide:t=>{const e=(P(t)._default||"").toLowerCase();return z("span",{class:"bb-divide","data-type":e},t.content)},fieldset:(t,e)=>{const n=P(t,e.data.raw)._default||"";return z("fieldset",{class:"bb-fieldset"},[z("legend",{class:"bb-fieldset-legend"},n),z("div",{class:"bb-fieldset"},t.content)])},fa:t=>{const e=t.attrs;let n=e.style||"";return n+=e["primary-color"]?`--fa-primary-color: ${e["primary-color"]};`:"",n+=e["secondary-color"]?`--fa-secondary-color: ${e["secondary-color"]};`:"",n+=e["primary-opacity"]?`--fa-primary-opacity: ${e["primary-opacity"]};`:"",n+=e["secondary-opacity"]?`--fa-secondary-opacity: ${e["secondary-opacity"]};`:"",n+=e["rotate-angle"]?`--fa-rotate-angle: ${e["rotate-angle"]};`:"",z("i",{"data-bbcode-fa":null},[z("i",{class:(t.content||[]).join(""),style:n,"data-fa-transform":e["fa-transform"]||""},[])])},font:(t,e)=>{const n=P(t,e.data.raw),s=n?._default||n?.family||n?.name;if(!s||""===s.trim())return t.content;if(bt.includes(s.trim().toLowerCase()))return z("span",{style:`font-family: '${s}'`},t.content);const r=(t=>{let e={ital:0,wght:400};if(t?.style){const n=t.style.trim().toLowerCase(),s=yt.exec(n).groups||{};s?.italic&&(e.ital=1);const r=s.weight;r&&r>=0&&r<=900?e.wght=r:Object.keys(mt).includes(s.named_weight||"")&&(e.wght=mt[s.named_weight]),e={...e,...Object.fromEntries(Object.entries(t).filter((([t])=>wt.includes(t))))}}return e})(n),o=((t,e)=>(t=t.replaceAll(" ","+"),e=Object.keys(e).sort().reduce(((t,n)=>(t[n]=e[n],t)),{}),"https://fonts.googleapis.com/css2?family="+t+":"+Object.keys(e).join(",")+"@"+Object.values(e).join(",")))(s,r);e.data.fonts.add(o);const a=1===r.ital?"italic":"normal",i=Object.entries(r).filter((([t])=>"wght"!==t&&"ital"!==t));let c="";return i.length&&(c="font-variation-settings: "+i.map((([t,e])=>`'${t}' ${e}`)).join(", ")+";"),z("span",{style:`font-family: '${s}'; font-weight: ${r.wght}; font-style: ${a}; ${c}`,"data-font":o},t.content)},h:t=>z("h1",{},t.content),h1:t=>z("h1",{},t.content),h2:t=>z("h2",{},t.content),h3:t=>z("h3",{},t.content),h4:t=>z("h4",{},t.content),h5:t=>z("h5",{},t.content),h6:t=>z("h6",{},t.content),heightrestrict:t=>{const e=function(t){const e=t&&""!==t.trim()?t.replace(/[^\d.]/g,""):0;return e&&e>=0&&e<=700?e:0===e?0:700}(P(t)._default).toString();return z("div","0"===e?{class:"bb-height-restrict"}:{class:"bb-height-restrict",style:`height: ${e}px;`},t.content)},highlight:t=>z("span",{class:"bb-highlight"},t.content),icode:t=>({isWhitespaceSensitive:!0,content:["`",t.content,"`"]}),imagefloat:t=>{const e=P(t)._default||"";return z("div",{class:`bb-float-${e}`},t.content)},inlinespoiler:t=>z("span",{class:"bb-inline-spoiler"},t.content),justify:t=>z("div",{class:"bb-justify"},t.content),keyframe:(t,e)=>t.isValid?[]:[M(t,e.data.raw),...t.content,F(t,e.data.raw)],mail:t=>{const e=t.attrs;let n={mailOption:(e.type||"send").toLowerCase(),person:e.person||"Unknown",subject:e.subject||"Empty"};return z("div",{class:"bb-email","data-bb-email":n.mailOption},[vt,(o=n.person,z("div",{class:"bb-email-address"},o)),(r=n.subject,z("div",{class:"bb-email-subject"},r)),(s=t.content,z("div",{class:"bb-email-content"},s)),xt]);var s,r,o},newspaper:t=>z("div",{class:"bb-newspaper"},t.content),nobr:t=>({disableLineBreakConversion:!0,content:t.content}),note:t=>z("div",{class:"bb-note"},[z("div",{class:"bb-note-tape"},""),z("div",{class:"bb-note-content"},[t.content,z("div",{class:"bb-note-footer"},"")])]),ooc:t=>z("div",{class:"bb-ooc"},t.content),pindent:t=>z("span",{class:"bb-pindent"},t.content),plain:t=>t.content,print:t=>{const e="print",n=(P(t)._default||e).toLowerCase(),s=["print","line","graph","parchment"].includes(n)?n:e;return z("div",{class:s===e?"bb-print":`bb-print-${s}`},t.content)},progress:t=>{const e=P(t)._default;return z("div",{class:"bb-progress"},[z("div",{class:"bb-progress-text"},t.content),z("div",{class:"bb-progress-bar",style:`width: calc(${e}% - 6px)`},""),z("div",{class:"bb-progress-bar-other"},"")])},quote:(t,e)=>{const n=P(t,e.data.raw);return"\n"===t.content[0]&&t.content.shift(),[`\n[${t.tag}="${n._default}"]\n\n`,...t.content,"\n\n[/quote]\n"]},...$t,thinprogress:(t,e)=>{const n=P(t,e.data.raw)._default;return z("div",{class:"bb-progress-thin"},[z("div",{class:"bb-progress-text"},t.content),z("div",{class:"bb-progress-bar",style:`width: calc(${n}% - 6px)`},""),z("div",{class:"bb-progress-bar-other"},"")])},savenl:t=>({isWhitespaceSensitive:!0,content:t.content}),sh:t=>z("h2",{},t.content),script:(t,e)=>{const n=P(t,e.data.raw);e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const s=e.data.previewing?"preview":e.data.commonGUID,r=kt.includes(n.on?.toLowerCase()||"init")&&n.on?.toLowerCase()||"init",o={id:s,class:n.class||"",on:r,version:n.version||"",content:t.content.join("")};return e.data.bbscripts.push(o),[]},scroll:(t,e)=>{const n=function(t){const e=t&&""!==t.trim()?t.replace(/[^\d.]/g,""):0;return e&&e>=0&&e<=700?e:0===e?0:700}(P(t,e.data.raw)._default);return z("div",{class:"bb-scroll",style:`height: ${n}px`},t.content)},side:t=>{const e=P(t)._default||"left";return z("div",{class:"bb-side","data-side":e},t.content)},size:t=>{const e=function(t){let e,n={valid:!0};const s=/(\d+\.?\d?)(px|rem)?/i.exec(t),r=36,o=8,a=3,i=.2,c=7,l=1;if(s&&(e=s[1])){switch(n.unit=(s[2]||"").toLowerCase(),n.unit){case"px":e>r?e=r:ea?e=a:ec?e=c:e{const n=P(t,e.data.raw)._default;return z("details",{class:"bb-spoiler"},[z("summary",{},"Spoiler"+(n?`: ${n}`:"")),z("div",{class:"bb-spoiler-content"},t.content)])},sub:t=>z("sub",{},t.content),sup:t=>z("sup",{},t.content),tab:(t,e)=>{if(!t.isValid)return B(t,e.data.raw);const n=P(t,e.data.raw),s=n?._default||n?.name||"Tab",r=`tab-${s.replace(/\W/g,"_")}-${Y()}`;return[z("input",{type:"radio",id:r,name:"tab-group-"+t.groupId,class:"bb-tab",checked:t.open}),z("label",{class:"bb-tab-label",for:r,style:n.style},s),z("div",{class:"bb-tab-content"},t.content)]},tabs:(t,e)=>{const n=t.content.filter((t=>u(t)&&"tab"===t.tag)),s=Y();return n.forEach((t=>{t.isValid=!0,t.groupId=s})),n.length?(n[0].open=!0,z("div",{class:"bb-tabs"},n)):B(t,e.data.raw)},...At,b:t=>z("span",{class:"bbcode-b"},t.content),i:t=>t.gen?t:z("span",{class:"bbcode-i"},t.content),u:t=>z("span",{class:"bbcode-u"},t.content),s:t=>z("span",{class:"bbcode-s"},t.content)},St=Object.keys(Ct),_t=function t(e,n=it){const s=t=>{function r(t,r){return n(e,t,r,s.options||{})}return s.options=Object.assign(s.options||{},t),r.options=s.options,r};return s.extend=function(r){return t(r(e,s.options),n)},s}(Ct);function jt(t){return t.replaceAll(J,"").replaceAll(Z,"").replaceAll("\n"+H,"").replaceAll(H+"\n","").replaceAll(H,"")}function Lt(t){return t.replaceAll("\n
    ","").replaceAll("\n
      ","").replaceAll("\n
      ","")}function Ot(t,e){const n=e.hoistMap;for(const[e,s]of Object.entries(n))t=t.replaceAll(e,s);return t}function Et(t,e){if(0===e.styles.length)return t;return'"+t}function Nt(t,e){if(0===e.bbscripts.length)return t;return e.bbscripts.map((t=>``)).join("")+t}function Wt(t,e){const n={};let s=0;const r=(e,s,r,o=!1)=>{const a=Y();return-1!==s?(n[a]=t.substring(e,s),t=t.substring(0,e)+a+t.substring(s)):(n[a]=t.substring(e),t=t.substring(0,e)+a+r),o&&(n[a].startsWith("\n")&&(n[a]=n[a].substring(1)),n[a].endsWith("\n")&&(n[a]=n[a].substring(0,n[a].length-1))),e+a.length+r.length};for(;-1!==(s=R(t,Q,s));){const e=Q.exec(t.substring(s));if(e.groups?.fence){const r=e.groups.fence,o=e.groups.fenceInfo;"\n"===t[s]&&(s+=1);const a=new RegExp("\n"+r+"(\n|$)"),i=R(t,a,s+r.length),c=Y();n[c]=-1!==i?t.substring(s+r.length+o.length,i):t.substring(s+r.length+o.length);const l=`[saveNL]\n${r}${o}${c}\n${r}\n[/saveNL]`;t=t.substring(0,s)+l+(-1!==i?t.substring(i+1+r.length):""),s+=l.length}else if(e.groups?.bbcode){const n=e.groups.bbcode,o=`[/${e.groups.bbcodeTag.toLowerCase()}]`,a=t.toLowerCase().indexOf(o,s+1);s=r(s+n.length,a,o,!0)}else if(e.groups.backtick){const t=e.groups.backtick,n=e.groups.tickStart,o=e.groups.tickEnd;s=r(s+n.length,s+t.length-o.length,o)}}return e.hoistMap=n,[t,e]}function It(t,e){let n=0;for(;-1!==(n=R(t,X,n));){const e=X.exec(t.substring(n))[0],s=`[saveNL]\n${e}\n[/saveNL]`;t=t.substring(0,n)+s+t.substring(n+e.length),n+=s.length}return[t,e]}const Vt={onlyAllowTags:[...St],caseFreeTags:!0,contextFreeTags:["plain","code","icode","class","fa"],enableEscapeTags:!0,onError:t=>{Vt.previewing&&console.warn(t.message,t.lineNumber,t.columnNumber)}},Ut=_t();t.RpNBBCode=(t,e)=>{const n=[Ut];e.preserveWhitespace&&n.push((t=>rt(t))),n.push((t=>nt(t)),at);const[s,r]=function(t){let e={};const n=[Wt,It];for(const s of n)[t,e]=s(t,e);return[t,e]}(t);return function(t){const e="function"==typeof t?[t]:t||[],n=()=>"";return{process(t,s){const r=s||{skipParse:!1,parser:W,render:n,data:null},o=r.parser||W,a=r.render,i=r.data||null;if("function"!=typeof o)throw new Error("C1");const c=r.skipParse&&Array.isArray(t)?t:o(t,r);let l=r.skipParse&&Array.isArray(t)?q(t||[],r):q(c,r);for(let t=0;te(n,s,t)),n)}function p(t){return u(t)&&Array.isArray(t.content)?t.content.reduce(((t,e)=>t+p(e)),0):d(t)?String(t).length:0}function f(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/(javascript|data|vbscript):/gi,"$1%3A")}function b(t,e){switch(typeof e){case"boolean":return e?`${t}`:"";case"number":return`${t}="${e}"`;case"string":return`${t}="${f(e)}"`;case"object":return`${t}="${f(JSON.stringify(e))}"`;default:return""}}function m(t){return null==t?"":h(t,((t,e,n)=>[...t,b(e,n[e])]),[""]).join(" ")}const w=(t,e)=>{const n=h(e||{},((t,e,n)=>n[e]===e?n[e]:null),null);if(n){const s=b(t,n),r={...e};delete r[String(n)];return`${s}${m(r)}`}return`${t}${m(e)}`};class y{attr(t,e){return void 0!==e&&(this.attrs[t]=e),this.attrs[t]}append(t){return function(t,e){Array.isArray(t.content)&&t.content.push(e)}(this,t)}setStart(t){this.start=t}setEnd(t){this.end=t}get length(){return p(this)}toTagStart({openTag:t=a,closeTag:e=i}={}){return`${t}${w(String(this.tag),this.attrs)}${e}`}toTagEnd({openTag:t=a,closeTag:e=i}={}){return`${t}${c}${this.tag}${e}`}toTagNode(){const t=new y(String(this.tag).toLowerCase(),this.attrs,this.content);return this.start&&t.setStart(this.start),this.end&&t.setEnd(this.end),t}toString({openTag:t=a,closeTag:e=i}={}){const n=this.content?((t,e,n)=>{const s=t=>u(t)?t.toString({openTag:e,closeTag:n}):String(t);return Array.isArray(t)?t.reduce(((t,e)=>null!==e?t+s(e):t),""):t?s(t):null})(this.content,t,e):"",s=this.toTagStart({openTag:t,closeTag:e});return null===this.content||Array.isArray(this.content)&&0===this.content.length?s:`${s}${n}${this.toTagEnd({openTag:t,closeTag:e})}`}static create(t,e={},n=null,s){const r=new y(t,e,n);return s&&r.setStart(s),r}static isOf(t,e){return t.tag===e}constructor(t,e,n){this.tag=t,this.attrs=e,this.content=n}}const v="t",x=t=>t&&void 0!==t.v?t.v:"",$=t=>x(t).charCodeAt(0)===c.charCodeAt(0);class k{get type(){return this[v]}isEmpty(){return 0===this[v]||isNaN(this[v])}isText(){return!(!(t=this)||void 0===t[v]||5!==t[v]&&6!==t[v]&&1!==t[v]);var t}isTag(){return!(!(t=this)||void 0===t[v])&&2===t[v];var t}isAttrName(){return!(!(t=this)||void 0===t[v])&&3===t[v];var t}isAttrValue(){return!(!(t=this)||void 0===t[v])&&4===t[v];var t}isStart(){return!$(this)}isEnd(){return $(this)}getName(){return(t=>{const e=x(t);return $(t)?e.slice(1):e})(this)}getValue(){return x(this)}getLine(){return(t=this)&&t.l||0;var t}getColumn(){return(t=this)&&t.r||0;var t}getStart(){return(t=this)&&t.s||0;var t}getEnd(){return(t=this)&&t.e||0;var t}toString({openTag:t=a,closeTag:e=i}={}){return((t,e=a,n=i)=>{let s=e;return s+=x(t),s+=n,s})(this,t,e)}constructor(t,e,n=0,s=0,r=0,o=0){this.l=n,this.r=s,this[v]=t||0,this.v=String(e),this.s=r,this.e=o}}class T{skip(t=1,e){this.c.pos+=t,this.o&&this.o.onSkip&&!e&&this.o.onSkip()}hasNext(){return this.c.len>this.c.pos}getCurr(){return void 0===this.s[this.c.pos]?"":this.s[this.c.pos]}getPos(){return this.c.pos}getLength(){return this.c.len}getRest(){return this.s.substring(this.c.pos)}getNext(){const t=this.c.pos+1;return t<=this.s.length-1?this.s[t]:null}getPrev(){const t=this.c.pos-1;return void 0===this.s[t]?null:this.s[t]}isLast(){return this.c.pos===this.c.len}includes(t){return this.s.indexOf(t,this.c.pos)>=0}grabWhile(t,e){let n=0;if(this.hasNext())for(n=this.c.pos;this.hasNext()&&t(this.getCurr());)this.skip(1,e);return this.s.substring(n,this.c.pos)}grabN(t=0){return this.s.substring(this.c.pos,this.c.pos+t)}substrUntilChar(t){const{pos:e}=this.c,n=this.s.indexOf(t,e);return n>=0?this.s.substring(e,n):""}constructor(t,e={}){this.s=t,this.c={pos:0,len:t.length},this.o=e}}const A=(t,e)=>new T(t,e);const C=[o,n],S=[s,o,n],_=t=>C.indexOf(t)>=0,j=t=>t===l,L=t=>((t,e)=>{for(;t.charAt(0)===e;)t=t.substring(1);for(;t.charAt(t.length-1)===e;)t=t.substring(0,t.length-1);return t})(t,r).replace(l+r,r);function E(t,u={}){let d=0,g=0,h=0,p=-1,f=0,b=0,m="";const w=new Array(Math.floor(t.length)),y=u.openTag||a,v=u.closeTag||i,x=!!u.enableEscapeTags,$=(u.contextFreeTags||[]).filter(Boolean).map((t=>t.toLowerCase())),T=u.caseFreeTags||!1,C=new Map,E=u.onToken||(()=>{}),O=[v,y,r,l,o,n,s,e,"!"],N=[y,o,n,e],W=t=>-1===N.indexOf(t),I=()=>{h++},V=(t,e)=>{""!==m&&e&&(m=""),""===m&&$.includes(t.toLowerCase())&&(m=t)},U=A(t,{onSkip:I});function q(t,e,n,s){const r=function(t,e,n=0,s=0,r=0,o=0){return new k(t,e,n,s,r,o)}(t,e,d,g,n,s);E(r),g=h,p+=1,w[p]=r}function D(t,e,n){if(1===b){const e=t=>!(t===s||_(t)),n=t.grabWhile(e),r=t.isLast(),o=t.getCurr()!==s;return t.skip(),r||o?q(4,L(n)):q(3,n),r?0:o?1:2}if(2===b){let n=!1;const o=o=>{const a=o===r,i=t.getPrev(),c=t.getNext(),u=i===l,d=c===s,g=_(o),h=c&&_(c);return!(!n||!(t=>S.indexOf(t)>=0)(o))||!!(!a||u||(n=!n,n||d||h))&&(!!e||!g)},a=t.grabWhile(o);return t.skip(),q(4,L(a)),t.getPrev()===r&&g++,t.isLast()?0:1}const o=n+t.getPos()-1,a=t.grabWhile((e=>!(e===s||_(e)||t.isLast())));if(q(2,a,o,n+t.getLength()+1),V(a),t.skip(),g++,e)return 2;return t.includes(s)?1:2}function G(){const t=U.getCurr(),e=U.getNext();U.skip();const n=U.substrUntilChar(v),r=0===n.length||n.indexOf(y)>=0;if(e&&(o=e,O.indexOf(o)>=0)||r||U.isLast())return q(1,t),0;var o;const a=-1===n.indexOf(s),i=n[0]===c;if(a||i){const t=U.getPos()-1,e=U.grabWhile((t=>t!==v)),n=t+e.length+2;return U.skip(),q(2,e,t,n),V(e,i),0}return 2}function z(){const t=U.getPos(),e=U.grabWhile((t=>t!==v),!0),n=A(e,{onSkip:I}),s=n.includes(o);for(b=0;n.hasNext();)b=D(n,!s,t);return U.skip(),0}function P(){if(U.getCurr()===e)return q(6,U.getCurr()),U.skip(),h=0,g=0,d++,0;if(_(U.getCurr())){return q(5,U.grabWhile(_)),0}if(U.getCurr()===y){if(m){const t=y.length+1+m.length,e=`${y}${c}${m}`;if(U.grabN(t)===e)return 1}else if(U.includes(v))return 1;return q(1,U.getCurr()),U.skip(),g++,0}if(x){if(j(U.getCurr())){const t=U.getCurr(),e=U.getNext();return U.skip(),e&&(t=>t===y||t===v||t===l)(e)?(U.skip(),q(1,e),0):(q(1,t),0)}const t=t=>W(t)&&!j(t);return q(1,U.grabWhile(t)),0}return q(1,U.grabWhile(W)),0}return{tokenize:function(){for(f=0;U.hasNext();)switch(f){case 1:f=G();break;case 2:f=z();break;default:f=P()}return w.length=p+1,w},isTokenNested:function(e){const n=y+c+e;if(C.has(n))return!!C.get(n);{const e=T?t.toLowerCase().indexOf(n.toLowerCase())>-1:t.indexOf(n)>-1;return C.set(n,e),e}}}}class O{last(){return Array.isArray(this.n)&&this.n.length>0&&void 0!==this.n[this.n.length-1]?this.n[this.n.length-1]:null}flush(){return!!this.n.length&&this.n.pop()}push(t){this.n.push(t)}toArray(){return this.n}constructor(){this.n=[]}}const N=()=>new O;function W(t,e={}){const n=e,s=n.openTag||a,r=n.closeTag||i,o=(n.onlyAllowTags||[]).filter(Boolean).map((t=>t.toLowerCase())),c=n.caseFreeTags||!1;let l=null;const d=N(),g=N(),h=N(),p=N(),f=new Set;function b(t){return Boolean(f.has(c?t.toLowerCase():t))}function m(){h.flush()&&p.flush()}function w(){const t=g.last();return t&&u(t)?t.content:d.toArray()}function v(t,e,n=!0){Array.isArray(t)&&void 0!==e&&(t.push(e.toTagStart({openTag:s,closeTag:r})),Array.isArray(e.content)&&e.content.length&&(e.content.forEach((e=>{t.push(e)})),n&&t.push(e.toTagEnd({openTag:s,closeTag:r}))))}function x(t,e){var n;Array.isArray(t)&&void 0!==e&&(u(e)?(n=e.tag,!o.length||o.indexOf(n.toLowerCase())>=0?t.push(e.toTagNode()):v(t,e)):t.push(e))}function $(t){m();const e=y.create(t.getValue(),{},[],{from:t.getStart(),to:t.getEnd()}),n=function(t){const e=t.getValue(),n=c?e.toLowerCase():e,{isTokenNested:s}=l||{};return!f.has(n)&&s&&s(n)?(f.add(n),!0):f.has(n)}(t);if(h.push(e),n)g.push(e);else{x(w(),e)}}function k(t){t.isStart()&&$(t),t.isEnd()&&function(t){const e=t.getValue().slice(1),o=g.flush();if(m(),o){const e=w();u(o)&&o.setEnd({from:t.getStart(),to:t.getEnd()}),x(e,o)}else if(b(e)){if("function"==typeof n.onError){const e=t.getValue(),s=t.getLine(),r=t.getColumn();n.onError({tagName:e,lineNumber:s,columnNumber:r})}}else x(w(),t.toString({openTag:s,closeTag:r}))}(t)}const T=e.createTokenizer?e.createTokenizer:E;l=T(t,{onToken:function(t){t.isTag()?k(t):function(t){const e=h.last(),n=t.getValue(),o=b(t.toString()),a=w();if(null!==e)if(t.isAttrName()){p.push(n);const t=p.last();t&&e.attr(t,"")}else if(t.isAttrValue()){const t=p.last();t?(e.attr(t,n),p.flush()):e.attr(n,n)}else t.isText()?o?e.append(n):x(a,n):t.isTag()&&x(a,t.toString({openTag:s,closeTag:r}));else t.isText()?x(a,n):t.isTag()&&x(a,t.toString({openTag:s,closeTag:r}))}(t)},openTag:s,closeTag:r,onlyAllowTags:n.onlyAllowTags,contextFreeTags:n.contextFreeTags,caseFreeTags:n.caseFreeTags,enableEscapeTags:n.enableEscapeTags}),l.tokenize();const A=g.flush();return null!==A&&A&&u(A)&&b(A.tag)&&v(w(),A,!1),d.toArray()}const I=t=>"object"==typeof t&&null!==t;function V(t,e){const n=t;if(Array.isArray(n))for(let t=0;t[].some.call(e,(e=>U(t,e))))):!(!I(t)||!I(e))&&Object.keys(t).every((n=>{const s=e[n],r=t[n];return I(r)&&I(s)?U(r,s):"boolean"==typeof r?r!==(null===s):s===r})):t===e)}function q(t,e){const n=t;return n.messages=[...n.messages||[]],n.options={...e,...n.options},n.walk=function(t){return V(this,t)},n.match=function(t,e){return function(t,e,n){return Array.isArray(e)?V(t,(t=>{for(let s=0;sU(e,t)?n(t):t))}(this,t,e)},n}function D(t,e){const{stripTags:n=!1}=e||{};if(null==t)return"";if("string"==typeof t||"number"==typeof t)return String(t);if(Array.isArray(t))return G(t,e);if(u(t)){if(n)return G(t.content,e);const s=m(t.attrs);return null===t.content?"<"+t.tag+s+"/>":"<"+t.tag+s+">"+G(t.content,e)+""}return""}function G(t,e){return t&&Array.isArray(t)?t.reduce(((t,n)=>t+D(n,e)),""):t?D(t,e):""}const z=(t,e,n=[])=>({tag:t,attrs:e,content:n,gen:!0}),P=(t,e)=>{const n=Object.keys(t.attrs).join(" "),s=Object.values(t.attrs).join(" ");if(n!==s)return t.attrs;if(!e||!t.start)return{_default:s};const r=e.substring(t.start.from,t.start.to);if(!r.includes("="))return t.attrs;const o=r.split("=");if(2!==o.length)return t.attrs;let a=o[1].slice(0,-1).trim();return a.startsWith('"')&&a.endsWith('"')&&(a=a.slice(1,-1)),{_default:a}},M=(t,e)=>{if(t.start)return e.substring(t.start.from,t.start.to);if(!t.attrs)return`[${t.tag}]`;const n=P(t,e);return n._default?`[${t.tag}=${n._default}]`:t.toTagStart()},B=(t,e)=>t.end?e.substring(t.end.from,t.end.to):t.toTagEnd(),F=(t,e)=>t.end?[M(t,e),...t.content,B(t,e)]:M(t,e),R=(t,e,n)=>{const s=t.substring(n||0).search(e);return s>=0?s+(n||0):s},J="\x3c!-- bbcode injected newlines --\x3e\n\n",Z="\n\n\x3c!-- bbcode pre injected newlines --\x3e",H="\x3c!-- bbcode injected newlines --\x3e",K=new RegExp(`^${/(http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])/.source}|${/\!?\[.*\]\((http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])\)/.source}$`),Q=/((\n|^)(?```+|~~~+)(?.*\n))|(?\[(?i?code|plain)(=[^\]\r\n]*)?\])|(?(?`+)(?!`)([\s\S]*?)(?(?)(?!`))/im,X=/^(\|[^\n]+\|\r?\n)((?:\| ?:?[-]+:? ?)+\|)(\n(?:\|[^\n]+\|\r?\n?)*)?$/m;function Y(){let t=(new Date).getTime();return window.performance&&"function"==typeof window.performance.now&&(t+=performance.now()),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){const n=(t+16*Math.random())%16|0;return t=Math.floor(t/16),("x"===e?n:3&n|8).toString(16)}))}const tt=t=>"object"==typeof t,et=t=>"string"==typeof t,nt=(t,e=!1)=>{const n=t;if(Array.isArray(n)){st(n),n.some(et)&&(n.unshift(J),n.push(J));for(let t=0;t{let e=t.findLastIndex((t=>et(t)&&!g(t)))+1;for(let n=e-1;n>=0;n--)et(t[n])&&!g(t[n])||(g(t[n])||tt(t[n]))&&(n!==e-1&&t.splice(n+1,e-n-1,t.slice(n+1,e).join("")),e=n);0!==e&&t.splice(0,e,t.slice(0,e).join(""))},rt=t=>{const e=t;if(Array.isArray(e))for(let t=0;t1&&" "===e[0]){let t=e.length;return[String.fromCharCode(160).repeat(t)]}return e},ot=/\n{2,}/gm,at=t=>t.walk((t=>(u(t)&&t.attrs&&Object.keys(t.attrs).forEach((e=>{"string"==typeof t.attrs[e]&&(t.attrs[e]=t.attrs[e].replace(ot,"\n"))})),t)));function it(t,e,n,s){return e.walk((e=>{if(u(e)){const r=e.tag,o=t[r];if("function"==typeof o)return o(e,n,s)}return e}))}const ct=Symbol("slide-title-open"),lt=Symbol("slide-title-close"),ut=Symbol("slide-close"),dt=/(?\{slide=)|(?\})|(?\{\/slide\})/i;function gt(t){switch(t){case ct:return"{slide=";case lt:return"}";case ut:return"{/slide}";default:return t}}const ht={accordion:(t,e)=>{const n=Y(),s=function(t){t=[...t];const e=[];for(;t.length>0;){const n=t[0];if(u(n)){e.push(t.shift());continue}const s=R(n,dt);if(-1===s){e.push(t.shift());continue}const r=n.match(dt),o=n.slice(0,s),a=n.slice(s+r[0].length);o.length&&e.push(o),r.groups.slideTitleOpen&&e.push(ct),r.groups.slideTitleClose&&e.push(lt),r.groups.slideClose&&e.push(ut),a.length?t[0]=a:t.shift()}return e}(t.content),r=function(t){const e=[];let n=null,s=null;for(const r of t)if(r===ct&&null===s)n=y.create("slide"),n.content=[],n.customTitle=[],s=ct;else{if(r===lt&&s===ct){s=lt;continue}r===ut&&n&&s===lt?(e.push(n),n=null,s=null):n?s===ct?n.customTitle.push(gt(r)):n.content.push(gt(r)):e.push(gt(r))}return e}(s),o=r.filter((t=>u(t)&&"slide"===t.tag)).map((t=>(t.isValid=!0,t.groupId=n,t)));if(!o.length)return[M(t,e.data.raw),...t.content,B(t,e.data.raw)];const a=P(t,e.data.raw);if(a._default){const t=a._default.split("|").map((t=>t.trim())),e=t.filter((t=>["bright","bcenter","bleft","fleft","fright"].includes(t))).pop();e&&(a.align??=e),(t.some((t=>t.endsWith("px")))||t.some((t=>t.endsWith("%"))))&&(a.width??=t.find((t=>t.endsWith("px")||t.endsWith("%"))))}let i=a.align?.toLowerCase()||"",c="";return(a.width?.endsWith("px")||a.width?.endsWith("%"))&&(c=`width: ${a.width};`),z("div",{class:"bb-accordion "+i,"data-group-id":n,style:c},o)},slide:(t,e)=>{if(!t.isValid)return[M(t,e.data.raw),...t.content,B(t,e.data.raw)];const n=P(t,e.data.raw);let s=[n.title||n._default||"Slide"],r=!!n.open||!1,o=n.left?"left":n.right?"right":n.center?"center":"left";if(t.customTitle?.length){s=t.customTitle;const e=s.filter((t=>"string"==typeof t)).join("").toLowerCase().split("|").map((t=>t.trim()));e.includes("open")&&(r=!0),e.includes("right")&&(o="right"),e.includes("center")&&(o="center"),e.includes("left")&&(o="left"),s=s.map((t=>(d(t)&&(t=t.replace(/\|(open|right|center|left)/gi,"")),t)))}return[z("details",{class:"bb-slide",open:r},[z("summary",{class:"bb-slide-title",style:`text-align: ${o}; ${n.style||""}`},s),z("div",{class:"bb-slide-content"},t.content)])]}},pt={left:t=>z("div",{class:"bb-left"},t.content),center:t=>z("div",{class:"bb-center"},t.content),right:t=>z("div",{class:"bb-right"},t.content)},ft={a:(t,e)=>{const n=P(t,e.data.raw)._default||"";return z("a",{id:`user-anchor-${n.trim()}`,name:`user-anchor-${n.trim()}`},t.content)},goto:(t,e)=>{const n=P(t,e.data.raw)._default||"";return z("a",{href:`#user-anchor-${n.trim()}`},t.content)}},bt=["arial","book antiqua","courier new","georgia","tahoma","times new roman","trebuchet ms","verdana"],mt={thin:"100",extralight:"200",light:"300",regular:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"},wt=["ital","opsz","slnt","wdth","wght"],yt=/(?[a-zA-Z]*)?\s?(?[0-9]*)?\s?(?italic)?/;const vt=z("div",{class:"bb-email-header"},""),xt=z("div",{class:"bb-email-footer"},z("div",{class:"bb-email-button"},"")),$t={row:t=>z("div",{class:"bb-row"},t.content),column:(t,e)=>{const n=P(t,e.data.raw)._default||"8",s=n.startsWith("span")?`column-width-${n}`:`column-width-span${n}`;return z("div",{class:"bb-column","data-span":s},t.content)}},kt=["init","click","change","input","dblclick","mouseenter","mouseleave","scroll"];const Tt=["me","them","right","left"],At={textmessage:(t,e)=>{const n=t.content.filter((t=>u(t)&&"message"===t.tag));if(n.forEach((t=>{t.isValid=!0})),!n.length)return F(t,e.data.raw);const s=P(t,e.data.raw)._default||"Recipient",r=""!==s.trim()?s:"Recipient";return z("div",{class:"bb-textmessage"},[z("div",{class:"bb-textmessage-name"},r),z("div",{class:"bb-textmessage-overflow"},[z("div",{class:"bb-textmessage-content"},t.content)])])},message:(t,e)=>{if(!t.isValid)return F(t,e.data.raw);let n=P(t,e?.data?.raw)?._default?.toLowerCase();Tt.includes(n)&&"right"!==n||(n="me"),"left"===n&&(n="them");return z("div",{class:"me"===n?"bb-message-me":"bb-message-them"},[z("div",{class:"bb-message-content"},t.content)])}},Ct={...ht,...pt,...ft,animation:(t,e)=>{e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const n=e.data.previewing?"preview":e.data.commonGUID,s=P(t,e.data.raw)?._default||"",r=t.content.filter((t=>u(t)&&"keyframe"===t.tag)).map((t=>{t.isValid=!0;const n=P(t,e.data.raw)._default||"";t.ident=n+(n.match(/^\d+$/)?"%":"");const s=t.content.filter(d).join("").replaceAll(/[\[\]\{\}]/g,"");return t.formatted=`${t.ident}{ ${s} }`,t})),o=`@keyframes ${n}${s} { ${r.map((t=>t.formatted)).join("\n")} }`;return e.data.styles.push(o),[]},bg:(t,e)=>{const n=P(t,e.data.raw)._default;return z("div",{style:`background-color: ${n};`,class:"bb-background"},t.content)},block:(t,e)=>{const n="block",s=(P(t,e.data.raw)._default||n).toLowerCase(),r=["block","dice","dice10","setting","warning","storyteller","announcement","important","question","encounter","information","character","treasure"].includes(s)?s:n;return z("table",{class:"bb-block","data-bb-block":r},[z("tbody",[z("tr",[z("td",{class:"bb-block-icon"}),z("td",{class:"bb-block-content"},t.content)])])])},blockquote:(t,e)=>{const n=P(t,e.data.raw)._default||"";return z("div",{class:"bb-blockquote"},[z("div",{class:"bb-blockquote-left"}),z("div",{class:"bb-blockquote-content"},[t.content,z("div",{class:"bb-blockquote-speaker"},""!==n?`- ${n}`:"")]),z("div",{class:"bb-blockquote-right"})])},border:(t,e)=>{const n=P(t,e.data.raw)._default;return z("div",{style:`border: ${n};`,class:"bb-border"},t.content)},br:()=>z("br",{},null),centerblock:(t,e)=>{const n=P(t,e.data.raw)._default||"50";return z("div",{style:`margin: 0 auto; width: ${n}%`},t.content)},check:(t,e)=>{const n=P(t,e.data.raw)._default||"dot";return z("div",{class:"bb-check","data-type":n},t.content)},class:(t,e)=>{const n=P(t),s=n.name||n._default;e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const r=e.data.previewing?"preview":e.data.commonGUID,o=s+"__"+r,a=t.content.filter(d).map((t=>t.replaceAll("{post_id}",r).replaceAll(/[\[\]\{\}]/g,"")));let i="";const c=[];return["hover","focus","active","focus-within","focus-visible"].includes(n.state?.toLowerCase())&&(i=":"+n.state.toLowerCase()),n.selector&&(i=n.selector.replace(/[,{}\\\n]/g,"")),n.minWidth?.match(/^[0-9]+[a-z]+$/)&&c.push(`(min-width: ${n.minWidth})`),n.maxWidth?.match(/^[0-9]+[a-z]+$/)&&c.push(`(max-width: ${n.maxWidth})`),a.unshift(`.${o}${i} {`),a.push("}"),c.length&&(a.unshift(`@media ${c.join(" and ")} {`),a.push("}")),e.data.styles.push(a.join("")),[]},code:t=>({isWhitespaceSensitive:!0,content:["```"+(P(t)._default||"bbcode")+"\n",t.content,"\n```\n"]}),color:t=>{const e=P(t)._default||"";return""===e.trim()?t.content:z("span",{style:`color: ${e}`},t.content)},comment:t=>z("span",{class:"hidden"},t.content),div:(t,e)=>{if(t.gen)return t;const n=P(t,e.data.raw),s=n.style||n._default,r=n.class;if(!r?.trim())return z("div",{style:s},t.content);e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const o=e.data.previewing?"preview":e.data.commonGUID,a=r.split(" ").map((t=>t+"__"+o)).join(" ");return z("div",{class:a,style:s},t.content)},divide:t=>{const e=(P(t)._default||"").toLowerCase();return z("span",{class:"bb-divide","data-type":e},t.content)},fieldset:(t,e)=>{const n=P(t,e.data.raw)._default||"";return z("fieldset",{class:"bb-fieldset"},[z("legend",{class:"bb-fieldset-legend"},n),z("div",{class:"bb-fieldset"},t.content)])},fa:t=>{const e=t.attrs;let n=e.style||"";return n+=e["primary-color"]?`--fa-primary-color: ${e["primary-color"]};`:"",n+=e["secondary-color"]?`--fa-secondary-color: ${e["secondary-color"]};`:"",n+=e["primary-opacity"]?`--fa-primary-opacity: ${e["primary-opacity"]};`:"",n+=e["secondary-opacity"]?`--fa-secondary-opacity: ${e["secondary-opacity"]};`:"",n+=e["rotate-angle"]?`--fa-rotate-angle: ${e["rotate-angle"]};`:"",z("i",{"data-bbcode-fa":null},[z("i",{class:(t.content||[]).join(""),style:n,"data-fa-transform":e["fa-transform"]||""},[])])},font:(t,e)=>{const n=P(t,e.data.raw),s=n?._default||n?.family||n?.name;if(!s||""===s.trim())return t.content;if(bt.includes(s.trim().toLowerCase()))return z("span",{style:`font-family: '${s}'`},t.content);const r=(t=>{let e={ital:0,wght:400};if(t?.style){const n=t.style.trim().toLowerCase(),s=yt.exec(n).groups||{};s?.italic&&(e.ital=1);const r=s.weight;r&&r>=0&&r<=900?e.wght=r:Object.keys(mt).includes(s.named_weight||"")&&(e.wght=mt[s.named_weight]),e={...e,...Object.fromEntries(Object.entries(t).filter((([t])=>wt.includes(t))))}}return e})(n),o=((t,e)=>(t=t.replaceAll(" ","+"),e=Object.keys(e).sort().reduce(((t,n)=>(t[n]=e[n],t)),{}),"https://fonts.googleapis.com/css2?family="+t+":"+Object.keys(e).join(",")+"@"+Object.values(e).join(",")))(s,r);e.data.fonts.add(o);const a=1===r.ital?"italic":"normal",i=Object.entries(r).filter((([t])=>"wght"!==t&&"ital"!==t));let c="";return i.length&&(c="font-variation-settings: "+i.map((([t,e])=>`'${t}' ${e}`)).join(", ")+";"),z("span",{style:`font-family: '${s}'; font-weight: ${r.wght}; font-style: ${a}; ${c}`,"data-font":o},t.content)},h:t=>z("h1",{},t.content),h1:t=>z("h1",{},t.content),h2:t=>z("h2",{},t.content),h3:t=>z("h3",{},t.content),h4:t=>z("h4",{},t.content),h5:t=>z("h5",{},t.content),h6:t=>z("h6",{},t.content),heightrestrict:t=>{const e=function(t){const e=t&&""!==t.trim()?t.replace(/[^\d.]/g,""):0;return e&&e>=0&&e<=700?e:0===e?0:700}(P(t)._default).toString();return z("div","0"===e?{class:"bb-height-restrict"}:{class:"bb-height-restrict",style:`height: ${e}px;`},t.content)},highlight:t=>z("span",{class:"bb-highlight"},t.content),icode:t=>({isWhitespaceSensitive:!0,content:["`",t.content,"`"]}),imagefloat:t=>{const e=P(t)._default||"";return z("div",{class:`bb-float-${e}`},t.content)},inlinespoiler:t=>z("span",{class:"bb-inline-spoiler"},t.content),justify:t=>z("div",{class:"bb-justify"},t.content),keyframe:(t,e)=>t.isValid?[]:[M(t,e.data.raw),...t.content,B(t,e.data.raw)],mail:t=>{const e=t.attrs;let n={mailOption:(e.type||"send").toLowerCase(),person:e.person||"Unknown",subject:e.subject||"Empty"};return z("div",{class:"bb-email","data-bb-email":n.mailOption},[vt,(o=n.person,z("div",{class:"bb-email-address"},o)),(r=n.subject,z("div",{class:"bb-email-subject"},r)),(s=t.content,z("div",{class:"bb-email-content"},s)),xt]);var s,r,o},newspaper:t=>z("div",{class:"bb-newspaper"},t.content),nobr:t=>({disableLineBreakConversion:!0,content:t.content}),note:t=>z("div",{class:"bb-note"},[z("div",{class:"bb-note-tape"},""),z("div",{class:"bb-note-content"},[t.content,z("div",{class:"bb-note-footer"},"")])]),ooc:t=>z("div",{class:"bb-ooc"},t.content),pindent:t=>z("span",{class:"bb-pindent"},t.content),plain:t=>t.content,print:t=>{const e="print",n=(P(t)._default||e).toLowerCase(),s=["print","line","graph","parchment"].includes(n)?n:e;return z("div",{class:s===e?"bb-print":`bb-print-${s}`},t.content)},progress:t=>{const e=P(t)._default;return z("div",{class:"bb-progress"},[z("div",{class:"bb-progress-text"},t.content),z("div",{class:"bb-progress-bar",style:`width: calc(${e}% - 6px)`},""),z("div",{class:"bb-progress-bar-other"},"")])},quote:(t,e)=>{const n=P(t,e.data.raw);return"\n"===t.content[0]&&t.content.shift(),[`\n[${t.tag}="${n._default}"]\n\n`,...t.content,"\n\n[/quote]\n"]},...$t,thinprogress:(t,e)=>{const n=P(t,e.data.raw)._default;return z("div",{class:"bb-progress-thin"},[z("div",{class:"bb-progress-text"},t.content),z("div",{class:"bb-progress-bar",style:`width: calc(${n}% - 6px)`},""),z("div",{class:"bb-progress-bar-other"},"")])},savenl:t=>({isWhitespaceSensitive:!0,content:t.content}),sh:t=>z("h2",{},t.content),script:(t,e)=>{const n=P(t,e.data.raw);e.data.previewing||e.data.commonGUID||(e.data.commonGUID="post-"+Math.random().toString(36).substring(2,7));const s=e.data.previewing?"preview":e.data.commonGUID,r=kt.includes(n.on?.toLowerCase()||"init")&&n.on?.toLowerCase()||"init",o={id:s,class:n.class||"",on:r,version:n.version||"",content:t.content.join("")};return e.data.bbscripts.push(o),[]},scroll:(t,e)=>{const n=function(t){const e=t&&""!==t.trim()?t.replace(/[^\d.]/g,""):0;return e&&e>=0&&e<=700?e:0===e?0:700}(P(t,e.data.raw)._default);return z("div",{class:"bb-scroll",style:`height: ${n}px`},t.content)},side:t=>{const e=P(t)._default||"left";return z("div",{class:"bb-side","data-side":e},t.content)},size:t=>{const e=function(t){let e,n={valid:!0};const s=/(\d+\.?\d?)(px|rem)?/i.exec(t),r=36,o=8,a=3,i=.2,c=7,l=1;if(s&&(e=s[1])){switch(n.unit=(s[2]||"").toLowerCase(),n.unit){case"px":e>r?e=r:ea?e=a:ec?e=c:e{const n=P(t,e.data.raw)._default;return z("details",{class:"bb-spoiler"},[z("summary",{},"Spoiler"+(n?`: ${n}`:"")),z("div",{class:"bb-spoiler-content"},t.content)])},sub:t=>z("sub",{},t.content),sup:t=>z("sup",{},t.content),tab:(t,e)=>{if(!t.isValid)return F(t,e.data.raw);const n=P(t,e.data.raw),s=n?._default||n?.name||"Tab",r=`tab-${s.replace(/\W/g,"_")}-${Y()}`;return[z("input",{type:"radio",id:r,name:"tab-group-"+t.groupId,class:"bb-tab",checked:t.open}),z("label",{class:"bb-tab-label",for:r,style:n.style},s),z("div",{class:"bb-tab-content"},t.content)]},tabs:(t,e)=>{const n=t.content.filter((t=>u(t)&&"tab"===t.tag)),s=Y();return n.forEach((t=>{t.isValid=!0,t.groupId=s})),n.length?(n[0].open=!0,z("div",{class:"bb-tabs"},n)):F(t,e.data.raw)},...At,b:t=>z("span",{class:"bbcode-b"},t.content),i:t=>t.gen?t:z("span",{class:"bbcode-i"},t.content),u:t=>z("span",{class:"bbcode-u"},t.content),s:t=>z("span",{class:"bbcode-s"},t.content)},St=Object.keys(Ct),_t=function t(e,n=it){const s=t=>{function r(t,r){return n(e,t,r,s.options||{})}return s.options=Object.assign(s.options||{},t),r.options=s.options,r};return s.extend=function(r){return t(r(e,s.options),n)},s}(Ct);function jt(t){return t.replaceAll(J,"").replaceAll(Z,"").replaceAll("\n"+H,"").replaceAll(H+"\n","").replaceAll(H,"")}function Lt(t){return t.replaceAll("
\n
    ","").replaceAll("\n
      ","").replaceAll("\n
      ","")}function Et(t,e){const n=e.hoistMap;for(const[e,s]of Object.entries(n)){const n=s.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">");t=t.replaceAll(e,n)}return t}function Ot(t,e){if(0===e.styles.length)return t;return'"+t}function Nt(t,e){if(0===e.bbscripts.length)return t;return e.bbscripts.map((t=>``)).join("")+t}function Wt(t,e){const n={};let s=0;const r=(e,s,r,o=!1)=>{const a=Y();return-1!==s?(n[a]=t.substring(e,s),t=t.substring(0,e)+a+t.substring(s)):(n[a]=t.substring(e),t=t.substring(0,e)+a+r),o&&(n[a].startsWith("\n")&&(n[a]=n[a].substring(1)),n[a].endsWith("\n")&&(n[a]=n[a].substring(0,n[a].length-1))),e+a.length+r.length};for(;-1!==(s=R(t,Q,s));){const e=Q.exec(t.substring(s));if(e.groups?.fence){const r=e.groups.fence,o=e.groups.fenceInfo;"\n"===t[s]&&(s+=1);const a=new RegExp("\n"+r+"(\n|$)"),i=R(t,a,s+r.length),c=Y();n[c]=-1!==i?t.substring(s+r.length+o.length,i):t.substring(s+r.length+o.length);const l=`[saveNL]\n${r}${o}${c}\n${r}\n[/saveNL]`;t=t.substring(0,s)+l+(-1!==i?t.substring(i+1+r.length):""),s+=l.length}else if(e.groups?.bbcode){const n=e.groups.bbcode,o=`[/${e.groups.bbcodeTag.toLowerCase()}]`,a=t.toLowerCase().indexOf(o,s+1);s=r(s+n.length,a,o,!0)}else if(e.groups.backtick){const t=e.groups.backtick,n=e.groups.tickStart,o=e.groups.tickEnd;s=r(s+n.length,s+t.length-o.length,o)}}return e.hoistMap=n,[t,e]}function It(t,e){let n=0;for(;-1!==(n=R(t,X,n));){const e=X.exec(t.substring(n))[0],s=`[saveNL]\n${e}\n[/saveNL]`;t=t.substring(0,n)+s+t.substring(n+e.length),n+=s.length}return[t,e]}function Vt(t){let e={};const n=[Wt,It];for(const s of n)[t,e]=s(t,e);return[t,e]}const Ut={onlyAllowTags:[...St],caseFreeTags:!0,contextFreeTags:["plain","code","icode","class","fa"],enableEscapeTags:!0,onError:t=>{Ut.previewing&&console.warn(t.message,t.lineNumber,t.columnNumber)}},qt=_t(),Dt=new Set(["b","i","u","s"]),Gt=new RegExp(`\\[(?:${St.filter((t=>"savenl"!==t&&!Dt.has(t))).join("|")})(?=[\\s=\\]])`,"i");t.RpNBBCode=(t,e)=>{const n=[qt];e.preserveWhitespace&&n.push((t=>rt(t))),n.push((t=>nt(t)),at);const[s,r]=Vt(t);return function(t){const e="function"==typeof t?[t]:t||[],n=()=>"";return{process(t,s){const r=s||{skipParse:!1,parser:W,render:n,data:null},o=r.parser||W,a=r.render,i=r.data||null;if("function"!=typeof o)throw new Error("C1");const c=r.skipParse&&Array.isArray(t)?t:o(t,r);let l=r.skipParse&&Array.isArray(t)?q(t||[],r):q(c,r);for(let t=0;treduce(acc, key, obj), def);\n}\nfunction getNodeLength(node) {\n if (isTagNode(node) && Array.isArray(node.content)) {\n return node.content.reduce((count, contentNode)=>{\n return count + getNodeLength(contentNode);\n }, 0);\n }\n if (isStringNode(node)) {\n return String(node).length;\n }\n return 0;\n}\nfunction appendToNode(node, value) {\n if (Array.isArray(node.content)) {\n node.content.push(value);\n }\n}\n/**\n * Replaces \" to &qquot;\n * @param {string} value\n */ function escapeAttrValue(value) {\n return value.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"').replace(/'/g, ''')// eslint-disable-next-line no-script-url\n .replace(/(javascript|data|vbscript):/gi, '$1%3A');\n}\n/**\n * @deprecated use escapeAttrValue\n */ const escapeHTML = escapeAttrValue;\n/**\n * Accept name and value and return valid html5 attribute string\n */ function attrValue(name, value) {\n // in case of performance\n switch(typeof value){\n case 'boolean':\n return value ? `${name}` : '';\n case 'number':\n return `${name}=\"${value}\"`;\n case 'string':\n return `${name}=\"${escapeAttrValue(value)}\"`;\n case 'object':\n return `${name}=\"${escapeAttrValue(JSON.stringify(value))}\"`;\n default:\n return '';\n }\n}\n/**\n * Transforms attrs to html params string\n * @example\n * attrsToString({ 'foo': true, 'bar': bar' }) => 'foo=\"true\" bar=\"bar\"'\n */ function attrsToString(values) {\n // To avoid some malformed attributes\n if (values == null) {\n return '';\n }\n return keysReduce(values, (arr, key, obj)=>[\n ...arr,\n attrValue(key, obj[key])\n ], [\n ''\n ]).join(' ');\n}\n/**\n * Gets value from\n * @example\n * getUniqAttr({ 'foo': true, 'bar': bar' }) => 'bar'\n */ function getUniqAttr(attrs) {\n return keysReduce(attrs || {}, (res, key, obj)=>obj[key] === key ? obj[key] : null, null);\n}\nexport { attrsToString, attrValue, appendToNode, escapeHTML, escapeAttrValue, getNodeLength, getUniqAttr, isTagNode, isStringNode, isEOL };\n","import { OPEN_BRAKET, CLOSE_BRAKET, SLASH } from './char';\nimport { getUniqAttr, getNodeLength, appendToNode, attrsToString, attrValue, isTagNode } from './helpers';\nconst getTagAttrs = (tag, params)=>{\n const uniqAttr = getUniqAttr(params);\n if (uniqAttr) {\n const tagAttr = attrValue(tag, uniqAttr);\n const attrs = {\n ...params\n };\n delete attrs[String(uniqAttr)];\n const attrsStr = attrsToString(attrs);\n return `${tagAttr}${attrsStr}`;\n }\n return `${tag}${attrsToString(params)}`;\n};\nconst renderContent = (content, openTag, closeTag)=>{\n const toString = (node)=>{\n if (isTagNode(node)) {\n return node.toString({\n openTag,\n closeTag\n });\n }\n return String(node);\n };\n if (Array.isArray(content)) {\n return content.reduce((r, node)=>{\n if (node !== null) {\n return r + toString(node);\n }\n return r;\n }, '');\n }\n if (content) {\n return toString(content);\n }\n return null;\n};\nexport class TagNode {\n attr(name, value) {\n if (typeof value !== 'undefined') {\n this.attrs[name] = value;\n }\n return this.attrs[name];\n }\n append(value) {\n return appendToNode(this, value);\n }\n setStart(value) {\n this.start = value;\n }\n setEnd(value) {\n this.end = value;\n }\n get length() {\n return getNodeLength(this);\n }\n toTagStart({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n const tagAttrs = getTagAttrs(String(this.tag), this.attrs);\n return `${openTag}${tagAttrs}${closeTag}`;\n }\n toTagEnd({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n return `${openTag}${SLASH}${this.tag}${closeTag}`;\n }\n toTagNode() {\n const newNode = new TagNode(String(this.tag).toLowerCase(), this.attrs, this.content);\n if (this.start) {\n newNode.setStart(this.start);\n }\n if (this.end) {\n newNode.setEnd(this.end);\n }\n return newNode;\n }\n toString({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n const content = this.content ? renderContent(this.content, openTag, closeTag) : '';\n const tagStart = this.toTagStart({\n openTag,\n closeTag\n });\n if (this.content === null || Array.isArray(this.content) && this.content.length === 0) {\n return tagStart;\n }\n return `${tagStart}${content}${this.toTagEnd({\n openTag,\n closeTag\n })}`;\n }\n static create(tag, attrs = {}, content = null, start) {\n const node = new TagNode(tag, attrs, content);\n if (start) {\n node.setStart(start);\n }\n return node;\n }\n static isOf(node, type) {\n return node.tag === type;\n }\n constructor(tag, attrs, content){\n this.tag = tag;\n this.attrs = attrs;\n this.content = content;\n }\n}\n","import { OPEN_BRAKET, CLOSE_BRAKET, SLASH } from '@bbob/plugin-helper';\n// type, value, line, row, start pos, end pos\nconst TOKEN_TYPE_ID = 't'; // 0;\nconst TOKEN_VALUE_ID = 'v'; // 1;\nconst TOKEN_COLUMN_ID = 'r'; // 2;\nconst TOKEN_LINE_ID = 'l'; // 3;\nconst TOKEN_START_POS_ID = 's'; // 4;\nconst TOKEN_END_POS_ID = 'e'; // 5;\nconst TOKEN_TYPE_WORD = 1; // 'word';\nconst TOKEN_TYPE_TAG = 2; // 'tag';\nconst TOKEN_TYPE_ATTR_NAME = 3; // 'attr-name';\nconst TOKEN_TYPE_ATTR_VALUE = 4; // 'attr-value';\nconst TOKEN_TYPE_SPACE = 5; // 'space';\nconst TOKEN_TYPE_NEW_LINE = 6; // 'new-line';\nconst getTokenValue = (token)=>{\n if (token && typeof token[TOKEN_VALUE_ID] !== 'undefined') {\n return token[TOKEN_VALUE_ID];\n }\n return '';\n};\nconst getTokenLine = (token)=>token && token[TOKEN_LINE_ID] || 0;\nconst getTokenColumn = (token)=>token && token[TOKEN_COLUMN_ID] || 0;\nconst getStartPosition = (token)=>token && token[TOKEN_START_POS_ID] || 0;\nconst getEndPosition = (token)=>token && token[TOKEN_END_POS_ID] || 0;\nconst isTextToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_SPACE || token[TOKEN_TYPE_ID] === TOKEN_TYPE_NEW_LINE || token[TOKEN_TYPE_ID] === TOKEN_TYPE_WORD;\n }\n return false;\n};\nconst isTagToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_TAG;\n }\n return false;\n};\nconst isTagEnd = (token)=>getTokenValue(token).charCodeAt(0) === SLASH.charCodeAt(0);\nconst isTagStart = (token)=>!isTagEnd(token);\nconst isAttrNameToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_NAME;\n }\n return false;\n};\nconst isAttrValueToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_VALUE;\n }\n return false;\n};\nconst getTagName = (token)=>{\n const value = getTokenValue(token);\n return isTagEnd(token) ? value.slice(1) : value;\n};\nconst tokenToText = (token, openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET)=>{\n let text = openTag;\n text += getTokenValue(token);\n text += closeTag;\n return text;\n};\n/**\n * @export\n * @class Token\n */ class Token {\n get type() {\n return this[TOKEN_TYPE_ID];\n }\n isEmpty() {\n return this[TOKEN_TYPE_ID] === 0 || isNaN(this[TOKEN_TYPE_ID]);\n }\n isText() {\n return isTextToken(this);\n }\n isTag() {\n return isTagToken(this);\n }\n isAttrName() {\n return isAttrNameToken(this);\n }\n isAttrValue() {\n return isAttrValueToken(this);\n }\n isStart() {\n return isTagStart(this);\n }\n isEnd() {\n return isTagEnd(this);\n }\n getName() {\n return getTagName(this);\n }\n getValue() {\n return getTokenValue(this);\n }\n getLine() {\n return getTokenLine(this);\n }\n getColumn() {\n return getTokenColumn(this);\n }\n getStart() {\n return getStartPosition(this);\n }\n getEnd() {\n return getEndPosition(this);\n }\n toString({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n return tokenToText(this, openTag, closeTag);\n }\n constructor(type, value, row = 0, col = 0, start = 0, end = 0){\n this[TOKEN_LINE_ID] = row;\n this[TOKEN_COLUMN_ID] = col;\n this[TOKEN_TYPE_ID] = type || 0;\n this[TOKEN_VALUE_ID] = String(value);\n this[TOKEN_START_POS_ID] = start;\n this[TOKEN_END_POS_ID] = end;\n }\n}\nexport const TYPE_ID = TOKEN_TYPE_ID;\nexport const VALUE_ID = TOKEN_VALUE_ID;\nexport const LINE_ID = TOKEN_LINE_ID;\nexport const COLUMN_ID = TOKEN_COLUMN_ID;\nexport const START_POS_ID = TOKEN_START_POS_ID;\nexport const END_POS_ID = TOKEN_END_POS_ID;\nexport const TYPE_WORD = TOKEN_TYPE_WORD;\nexport const TYPE_TAG = TOKEN_TYPE_TAG;\nexport const TYPE_ATTR_NAME = TOKEN_TYPE_ATTR_NAME;\nexport const TYPE_ATTR_VALUE = TOKEN_TYPE_ATTR_VALUE;\nexport const TYPE_SPACE = TOKEN_TYPE_SPACE;\nexport const TYPE_NEW_LINE = TOKEN_TYPE_NEW_LINE;\nexport { Token };\nexport default Token;\n","import { QUOTEMARK, BACKSLASH } from '@bbob/plugin-helper';\nexport class CharGrabber {\n skip(num = 1, silent) {\n this.c.pos += num;\n if (this.o && this.o.onSkip && !silent) {\n this.o.onSkip();\n }\n }\n hasNext() {\n return this.c.len > this.c.pos;\n }\n getCurr() {\n if (typeof this.s[this.c.pos] === 'undefined') {\n return '';\n }\n return this.s[this.c.pos];\n }\n getPos() {\n return this.c.pos;\n }\n getLength() {\n return this.c.len;\n }\n getRest() {\n return this.s.substring(this.c.pos);\n }\n getNext() {\n const nextPos = this.c.pos + 1;\n return nextPos <= this.s.length - 1 ? this.s[nextPos] : null;\n }\n getPrev() {\n const prevPos = this.c.pos - 1;\n if (typeof this.s[prevPos] === 'undefined') {\n return null;\n }\n return this.s[prevPos];\n }\n isLast() {\n return this.c.pos === this.c.len;\n }\n includes(val) {\n return this.s.indexOf(val, this.c.pos) >= 0;\n }\n grabWhile(condition, silent) {\n let start = 0;\n if (this.hasNext()) {\n start = this.c.pos;\n while(this.hasNext() && condition(this.getCurr())){\n this.skip(1, silent);\n }\n }\n return this.s.substring(start, this.c.pos);\n }\n grabN(num = 0) {\n return this.s.substring(this.c.pos, this.c.pos + num);\n }\n /**\n * Grabs rest of string until it find a char\n */ substrUntilChar(char) {\n const { pos } = this.c;\n const idx = this.s.indexOf(char, pos);\n return idx >= 0 ? this.s.substring(pos, idx) : '';\n }\n constructor(source, options = {}){\n this.s = source;\n this.c = {\n pos: 0,\n len: source.length\n };\n this.o = options;\n }\n}\n/**\n * Creates a grabber wrapper for source string, that helps to iterate over string char by char\n */ export const createCharGrabber = (source, options)=>new CharGrabber(source, options);\n/**\n * Trims string from start and end by char\n * @example\n * trimChar('*hello*', '*') ==> 'hello'\n */ export const trimChar = (str, charToRemove)=>{\n while(str.charAt(0) === charToRemove){\n // eslint-disable-next-line no-param-reassign\n str = str.substring(1);\n }\n while(str.charAt(str.length - 1) === charToRemove){\n // eslint-disable-next-line no-param-reassign\n str = str.substring(0, str.length - 1);\n }\n return str;\n};\n/**\n * Unquotes \\\" to \"\n */ export const unquote = (str)=>str.replace(BACKSLASH + QUOTEMARK, QUOTEMARK);\n","/* eslint-disable no-plusplus,no-param-reassign */ import { OPEN_BRAKET, CLOSE_BRAKET, QUOTEMARK, BACKSLASH, SLASH, SPACE, TAB, EQ, N } from '@bbob/plugin-helper';\nimport { Token, TYPE_ATTR_NAME, TYPE_ATTR_VALUE, TYPE_NEW_LINE, TYPE_SPACE, TYPE_TAG, TYPE_WORD } from './Token';\nimport { createCharGrabber, trimChar, unquote } from './utils';\n// for cases \nconst EM = '!';\nexport function createTokenOfType(type, value, r = 0, cl = 0, p = 0, e = 0) {\n return new Token(type, value, r, cl, p, e);\n}\nconst STATE_WORD = 0;\nconst STATE_TAG = 1;\nconst STATE_TAG_ATTRS = 2;\nconst TAG_STATE_NAME = 0;\nconst TAG_STATE_ATTR = 1;\nconst TAG_STATE_VALUE = 2;\nconst WHITESPACES = [\n SPACE,\n TAB\n];\nconst SPECIAL_CHARS = [\n EQ,\n SPACE,\n TAB\n];\nconst END_POS_OFFSET = 2; // length + start position offset\nconst isWhiteSpace = (char)=>WHITESPACES.indexOf(char) >= 0;\nconst isEscapeChar = (char)=>char === BACKSLASH;\nconst isSpecialChar = (char)=>SPECIAL_CHARS.indexOf(char) >= 0;\nconst isNewLine = (char)=>char === N;\nconst unq = (val)=>unquote(trimChar(val, QUOTEMARK));\nexport function createLexer(buffer, options = {}) {\n let row = 0;\n let prevCol = 0;\n let col = 0;\n let tokenIndex = -1;\n let stateMode = STATE_WORD;\n let tagMode = TAG_STATE_NAME;\n let contextFreeTag = '';\n const tokens = new Array(Math.floor(buffer.length));\n const openTag = options.openTag || OPEN_BRAKET;\n const closeTag = options.closeTag || CLOSE_BRAKET;\n const escapeTags = !!options.enableEscapeTags;\n const contextFreeTags = (options.contextFreeTags || []).filter(Boolean).map((tag)=>tag.toLowerCase());\n const caseFreeTags = options.caseFreeTags || false;\n const nestedMap = new Map();\n const onToken = options.onToken || (()=>{});\n const RESERVED_CHARS = [\n closeTag,\n openTag,\n QUOTEMARK,\n BACKSLASH,\n SPACE,\n TAB,\n EQ,\n N,\n EM\n ];\n const NOT_CHAR_TOKENS = [\n openTag,\n SPACE,\n TAB,\n N\n ];\n const isCharReserved = (char)=>RESERVED_CHARS.indexOf(char) >= 0;\n const isCharToken = (char)=>NOT_CHAR_TOKENS.indexOf(char) === -1;\n const isEscapableChar = (char)=>char === openTag || char === closeTag || char === BACKSLASH;\n const onSkip = ()=>{\n col++;\n };\n const checkContextFreeMode = (name, isClosingTag)=>{\n if (contextFreeTag !== '' && isClosingTag) {\n contextFreeTag = '';\n }\n if (contextFreeTag === '' && contextFreeTags.includes(name.toLowerCase())) {\n contextFreeTag = name;\n }\n };\n const chars = createCharGrabber(buffer, {\n onSkip\n });\n /**\n * Emits newly created token to subscriber\n */ function emitToken(type, value, startPos, endPos) {\n const token = createTokenOfType(type, value, row, prevCol, startPos, endPos);\n onToken(token);\n prevCol = col;\n tokenIndex += 1;\n tokens[tokenIndex] = token;\n }\n function nextTagState(tagChars, isSingleValueTag, masterStartPos) {\n if (tagMode === TAG_STATE_ATTR) {\n const validAttrName = (char)=>!(char === EQ || isWhiteSpace(char));\n const name = tagChars.grabWhile(validAttrName);\n const isEnd = tagChars.isLast();\n const isValue = tagChars.getCurr() !== EQ;\n tagChars.skip();\n if (isEnd || isValue) {\n emitToken(TYPE_ATTR_VALUE, unq(name));\n } else {\n emitToken(TYPE_ATTR_NAME, name);\n }\n if (isEnd) {\n return TAG_STATE_NAME;\n }\n if (isValue) {\n return TAG_STATE_ATTR;\n }\n return TAG_STATE_VALUE;\n }\n if (tagMode === TAG_STATE_VALUE) {\n let stateSpecial = false;\n const validAttrValue = (char)=>{\n // const isEQ = char === EQ;\n const isQM = char === QUOTEMARK;\n const prevChar = tagChars.getPrev();\n const nextChar = tagChars.getNext();\n const isPrevSLASH = prevChar === BACKSLASH;\n const isNextEQ = nextChar === EQ;\n const isWS = isWhiteSpace(char);\n // const isPrevWS = isWhiteSpace(prevChar);\n const isNextWS = nextChar && isWhiteSpace(nextChar);\n if (stateSpecial && isSpecialChar(char)) {\n return true;\n }\n if (isQM && !isPrevSLASH) {\n stateSpecial = !stateSpecial;\n if (!stateSpecial && !(isNextEQ || isNextWS)) {\n return false;\n }\n }\n if (!isSingleValueTag) {\n return !isWS;\n // return (isEQ || isWS) === false;\n }\n return true;\n };\n const name = tagChars.grabWhile(validAttrValue);\n tagChars.skip();\n emitToken(TYPE_ATTR_VALUE, unq(name));\n if (tagChars.getPrev() === QUOTEMARK) {\n prevCol++;\n }\n if (tagChars.isLast()) {\n return TAG_STATE_NAME;\n }\n return TAG_STATE_ATTR;\n }\n const start = masterStartPos + tagChars.getPos() - 1;\n const validName = (char)=>!(char === EQ || isWhiteSpace(char) || tagChars.isLast());\n const name = tagChars.grabWhile(validName);\n emitToken(TYPE_TAG, name, start, masterStartPos + tagChars.getLength() + 1);\n checkContextFreeMode(name);\n tagChars.skip();\n prevCol++;\n // in cases when we has [url=someval]GET[/url] and we dont need to parse all\n if (isSingleValueTag) {\n return TAG_STATE_VALUE;\n }\n const hasEQ = tagChars.includes(EQ);\n return hasEQ ? TAG_STATE_ATTR : TAG_STATE_VALUE;\n }\n function stateTag() {\n const currChar = chars.getCurr();\n const nextChar = chars.getNext();\n chars.skip();\n // detect case where we have '[My word [tag][/tag]' or we have '[My last line word'\n const substr = chars.substrUntilChar(closeTag);\n const hasInvalidChars = substr.length === 0 || substr.indexOf(openTag) >= 0;\n if (nextChar && isCharReserved(nextChar) || hasInvalidChars || chars.isLast()) {\n emitToken(TYPE_WORD, currChar);\n return STATE_WORD;\n }\n // [myTag ]\n const isNoAttrsInTag = substr.indexOf(EQ) === -1;\n // [/myTag]\n const isClosingTag = substr[0] === SLASH;\n if (isNoAttrsInTag || isClosingTag) {\n const startPos = chars.getPos() - 1;\n const name = chars.grabWhile((char)=>char !== closeTag);\n const endPos = startPos + name.length + END_POS_OFFSET;\n chars.skip(); // skip closeTag\n emitToken(TYPE_TAG, name, startPos, endPos);\n checkContextFreeMode(name, isClosingTag);\n return STATE_WORD;\n }\n return STATE_TAG_ATTRS;\n }\n function stateAttrs() {\n const startPos = chars.getPos();\n const silent = true;\n const tagStr = chars.grabWhile((char)=>char !== closeTag, silent);\n const tagGrabber = createCharGrabber(tagStr, {\n onSkip\n });\n const hasSpace = tagGrabber.includes(SPACE);\n tagMode = TAG_STATE_NAME;\n while(tagGrabber.hasNext()){\n tagMode = nextTagState(tagGrabber, !hasSpace, startPos);\n }\n chars.skip(); // skip closeTag\n return STATE_WORD;\n }\n function stateWord() {\n if (isNewLine(chars.getCurr())) {\n emitToken(TYPE_NEW_LINE, chars.getCurr());\n chars.skip();\n col = 0;\n prevCol = 0;\n row++;\n return STATE_WORD;\n }\n if (isWhiteSpace(chars.getCurr())) {\n const word = chars.grabWhile(isWhiteSpace);\n emitToken(TYPE_SPACE, word);\n return STATE_WORD;\n }\n if (chars.getCurr() === openTag) {\n if (contextFreeTag) {\n const fullTagLen = openTag.length + SLASH.length + contextFreeTag.length;\n const fullTagName = `${openTag}${SLASH}${contextFreeTag}`;\n const foundTag = chars.grabN(fullTagLen);\n const isEndContextFreeMode = foundTag === fullTagName;\n if (isEndContextFreeMode) {\n return STATE_TAG;\n }\n } else if (chars.includes(closeTag)) {\n return STATE_TAG;\n }\n emitToken(TYPE_WORD, chars.getCurr());\n chars.skip();\n prevCol++;\n return STATE_WORD;\n }\n if (escapeTags) {\n if (isEscapeChar(chars.getCurr())) {\n const currChar = chars.getCurr();\n const nextChar = chars.getNext();\n chars.skip(); // skip the \\ without emitting anything\n if (nextChar && isEscapableChar(nextChar)) {\n chars.skip(); // skip past the [, ] or \\ as well\n emitToken(TYPE_WORD, nextChar);\n return STATE_WORD;\n }\n emitToken(TYPE_WORD, currChar);\n return STATE_WORD;\n }\n const isChar = (char)=>isCharToken(char) && !isEscapeChar(char);\n const word = chars.grabWhile(isChar);\n emitToken(TYPE_WORD, word);\n return STATE_WORD;\n }\n const word = chars.grabWhile(isCharToken);\n emitToken(TYPE_WORD, word);\n return STATE_WORD;\n }\n function tokenize() {\n stateMode = STATE_WORD;\n while(chars.hasNext()){\n switch(stateMode){\n case STATE_TAG:\n stateMode = stateTag();\n break;\n case STATE_TAG_ATTRS:\n stateMode = stateAttrs();\n break;\n case STATE_WORD:\n default:\n stateMode = stateWord();\n break;\n }\n }\n tokens.length = tokenIndex + 1;\n return tokens;\n }\n function isTokenNested(tokenValue) {\n const value = openTag + SLASH + tokenValue;\n if (nestedMap.has(value)) {\n return !!nestedMap.get(value);\n } else {\n const status = caseFreeTags ? buffer.toLowerCase().indexOf(value.toLowerCase()) > -1 : buffer.indexOf(value) > -1;\n nestedMap.set(value, status);\n return status;\n }\n }\n return {\n tokenize,\n isTokenNested\n };\n}\n","import { CLOSE_BRAKET, OPEN_BRAKET, TagNode, isTagNode } from \"@bbob/plugin-helper\";\nimport { createLexer } from \"./lexer\";\nclass NodeList {\n last() {\n if (Array.isArray(this.n) && this.n.length > 0 && typeof this.n[this.n.length - 1] !== \"undefined\") {\n return this.n[this.n.length - 1];\n }\n return null;\n }\n flush() {\n return this.n.length ? this.n.pop() : false;\n }\n push(value) {\n this.n.push(value);\n }\n toArray() {\n return this.n;\n }\n constructor(){\n this.n = [];\n }\n}\nconst createList = ()=>new NodeList();\nfunction parse(input, opts = {}) {\n const options = opts;\n const openTag = options.openTag || OPEN_BRAKET;\n const closeTag = options.closeTag || CLOSE_BRAKET;\n const onlyAllowTags = (options.onlyAllowTags || []).filter(Boolean).map((tag)=>tag.toLowerCase());\n const caseFreeTags = options.caseFreeTags || false;\n let tokenizer = null;\n /**\n * Result AST of nodes\n * @private\n * @type {NodeList}\n */ const nodes = createList();\n /**\n * Temp buffer of nodes that's nested to another node\n * @private\n */ const nestedNodes = createList();\n /**\n * Temp buffer of nodes [tag..]...[/tag]\n * @private\n * @type {NodeList}\n */ const tagNodes = createList();\n /**\n * Temp buffer of tag attributes\n * @private\n * @type {NodeList}\n */ const tagNodesAttrName = createList();\n /**\n * Cache for nested tags checks\n */ const nestedTagsMap = new Set();\n function isTokenNested(token) {\n const tokenValue = token.getValue();\n const value = caseFreeTags ? tokenValue.toLowerCase() : tokenValue;\n const { isTokenNested } = tokenizer || {};\n if (!nestedTagsMap.has(value) && isTokenNested && isTokenNested(value)) {\n nestedTagsMap.add(value);\n return true;\n }\n return nestedTagsMap.has(value);\n }\n /**\n * @private\n */ function isTagNested(tagName) {\n return Boolean(nestedTagsMap.has(caseFreeTags ? tagName.toLowerCase() : tagName));\n }\n /**\n * @private\n */ function isAllowedTag(value) {\n if (onlyAllowTags.length) {\n return onlyAllowTags.indexOf(value.toLowerCase()) >= 0;\n }\n return true;\n }\n /**\n * Flushes temp tag nodes and its attributes buffers\n * @private\n */ function flushTagNodes() {\n if (tagNodes.flush()) {\n tagNodesAttrName.flush();\n }\n }\n /**\n * @private\n */ function getNodes() {\n const lastNestedNode = nestedNodes.last();\n if (lastNestedNode && isTagNode(lastNestedNode)) {\n return lastNestedNode.content;\n }\n return nodes.toArray();\n }\n /**\n * @private\n */ function appendNodeAsString(nodes, node, isNested = true) {\n if (Array.isArray(nodes) && typeof node !== \"undefined\") {\n nodes.push(node.toTagStart({\n openTag,\n closeTag\n }));\n if (Array.isArray(node.content) && node.content.length) {\n node.content.forEach((item)=>{\n nodes.push(item);\n });\n if (isNested) {\n nodes.push(node.toTagEnd({\n openTag,\n closeTag\n }));\n }\n }\n }\n }\n /**\n * @private\n */ function appendNodes(nodes, node) {\n if (Array.isArray(nodes) && typeof node !== \"undefined\") {\n if (isTagNode(node)) {\n if (isAllowedTag(node.tag)) {\n nodes.push(node.toTagNode());\n } else {\n appendNodeAsString(nodes, node);\n }\n } else {\n nodes.push(node);\n }\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleTagStart(token) {\n flushTagNodes();\n const tagNode = TagNode.create(token.getValue(), {}, [], {\n from: token.getStart(),\n to: token.getEnd()\n });\n const isNested = isTokenNested(token);\n tagNodes.push(tagNode);\n if (isNested) {\n nestedNodes.push(tagNode);\n } else {\n const nodes = getNodes();\n appendNodes(nodes, tagNode);\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleTagEnd(token) {\n const tagName = token.getValue().slice(1);\n const lastNestedNode = nestedNodes.flush();\n flushTagNodes();\n if (lastNestedNode) {\n const nodes = getNodes();\n if (isTagNode(lastNestedNode)) {\n lastNestedNode.setEnd({\n from: token.getStart(),\n to: token.getEnd()\n });\n }\n appendNodes(nodes, lastNestedNode);\n } else if (!isTagNested(tagName)) {\n const nodes = getNodes();\n appendNodes(nodes, token.toString({\n openTag,\n closeTag\n }));\n } else if (typeof options.onError === \"function\") {\n const tag = token.getValue();\n const line = token.getLine();\n const column = token.getColumn();\n options.onError({\n tagName: tag,\n lineNumber: line,\n columnNumber: column\n });\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleTag(token) {\n // [tag]\n if (token.isStart()) {\n handleTagStart(token);\n }\n // [/tag]\n if (token.isEnd()) {\n handleTagEnd(token);\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleNode(token) {\n /**\n * @type {TagNode}\n */ const activeTagNode = tagNodes.last();\n const tokenValue = token.getValue();\n const isNested = isTagNested(token.toString());\n const nodes = getNodes();\n if (activeTagNode !== null) {\n if (token.isAttrName()) {\n tagNodesAttrName.push(tokenValue);\n const attrName = tagNodesAttrName.last();\n if (attrName) {\n activeTagNode.attr(attrName, \"\");\n }\n } else if (token.isAttrValue()) {\n const attrName = tagNodesAttrName.last();\n if (attrName) {\n activeTagNode.attr(attrName, tokenValue);\n tagNodesAttrName.flush();\n } else {\n activeTagNode.attr(tokenValue, tokenValue);\n }\n } else if (token.isText()) {\n if (isNested) {\n activeTagNode.append(tokenValue);\n } else {\n appendNodes(nodes, tokenValue);\n }\n } else if (token.isTag()) {\n // if tag is not allowed, just pass it as is\n appendNodes(nodes, token.toString({\n openTag,\n closeTag\n }));\n }\n } else if (token.isText()) {\n appendNodes(nodes, tokenValue);\n } else if (token.isTag()) {\n // if tag is not allowed, just pass it as is\n appendNodes(nodes, token.toString({\n openTag,\n closeTag\n }));\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function onToken(token) {\n if (token.isTag()) {\n handleTag(token);\n } else {\n handleNode(token);\n }\n }\n const lexer = opts.createTokenizer ? opts.createTokenizer : createLexer;\n tokenizer = lexer(input, {\n onToken,\n openTag,\n closeTag,\n onlyAllowTags: options.onlyAllowTags,\n contextFreeTags: options.contextFreeTags,\n caseFreeTags: options.caseFreeTags,\n enableEscapeTags: options.enableEscapeTags\n });\n // eslint-disable-next-line no-unused-vars\n const tokens = tokenizer.tokenize();\n // handles situations where we open tag, but forgot close them\n // for ex [q]test[/q][u]some[/u][q]some [u]some[/u] // forgot to close [/q]\n // so we need to flush nested content to nodes array\n const lastNestedNode = nestedNodes.flush();\n if (lastNestedNode !== null && lastNestedNode && isTagNode(lastNestedNode) && isTagNested(lastNestedNode.tag)) {\n appendNodeAsString(getNodes(), lastNestedNode, false);\n }\n return nodes.toArray();\n}\nexport { parse };\nexport default parse;\n","/* eslint-disable no-plusplus */ const isObj = (value)=>typeof value === 'object' && value !== null;\nconst isBool = (value)=>typeof value === 'boolean';\nexport function iterate(t, cb) {\n const tree = t;\n if (Array.isArray(tree)) {\n for(let idx = 0; idx < tree.length; idx++){\n tree[idx] = iterate(cb(tree[idx]), cb);\n }\n } else if (isObj(tree) && 'content' in tree) {\n iterate(tree.content, cb);\n }\n return tree;\n}\nexport function same(expected, actual) {\n if (typeof expected !== typeof actual) {\n return false;\n }\n if (!isObj(expected) || expected === null) {\n return expected === actual;\n }\n if (Array.isArray(expected)) {\n return expected.every((exp)=>[].some.call(actual, (act)=>same(exp, act)));\n }\n if (isObj(expected) && isObj(actual)) {\n return Object.keys(expected).every((key)=>{\n const ao = actual[key];\n const eo = expected[key];\n if (isObj(eo) && isObj(ao)) {\n return same(eo, ao);\n }\n if (isBool(eo)) {\n return eo !== (ao === null);\n }\n return ao === eo;\n });\n }\n return false;\n}\nexport function match(t, expression, cb) {\n if (Array.isArray(expression)) {\n return iterate(t, (node)=>{\n for(let idx = 0; idx < expression.length; idx++){\n if (same(expression[idx], node)) {\n return cb(node);\n }\n }\n return node;\n });\n }\n return iterate(t, (node)=>same(expression, node) ? cb(node) : node);\n}\n","import { parse } from '@bbob/parser';\nimport { iterate, match } from './utils';\nimport { C1, C2 } from './errors';\nexport function createTree(tree, options) {\n const extendedTree = tree;\n extendedTree.messages = [\n ...extendedTree.messages || []\n ];\n extendedTree.options = {\n ...options,\n ...extendedTree.options\n };\n extendedTree.walk = function walkNodes(cb) {\n return iterate(this, cb);\n };\n extendedTree.match = function matchNodes(expr, cb) {\n return match(this, expr, cb);\n };\n return extendedTree;\n}\nexport default function bbob(plugs) {\n const plugins = typeof plugs === 'function' ? [\n plugs\n ] : plugs || [];\n const mockRender = ()=>\"\";\n return {\n process (input, opts) {\n const options = opts || {\n skipParse: false,\n parser: parse,\n render: mockRender,\n data: null\n };\n const parseFn = options.parser || parse;\n const renderFn = options.render;\n const data = options.data || null;\n if (typeof parseFn !== 'function') {\n throw new Error(C1);\n }\n // raw tree before modification with plugins\n const raw = options.skipParse && Array.isArray(input) ? input : parseFn(input, options);\n let tree = options.skipParse && Array.isArray(input) ? createTree(input || [], options) : createTree(raw, options);\n for(let idx = 0; idx < plugins.length; idx++){\n const plugin = plugins[idx];\n if (typeof plugin === 'function' && renderFn) {\n const newTree = plugin(tree, {\n parse: parseFn,\n render: renderFn,\n iterate,\n data\n });\n tree = createTree(newTree || tree, options);\n }\n }\n return {\n get html () {\n if (typeof renderFn !== 'function') {\n throw new Error(C2);\n }\n return renderFn(tree, tree.options);\n },\n tree,\n raw,\n messages: tree.messages\n };\n }\n };\n}\n","import core from '@bbob/core';\nimport { attrsToString, isTagNode } from '@bbob/plugin-helper';\nconst SELFCLOSE_END_TAG = '/>';\nconst CLOSE_START_TAG = '';\nfunction renderNode(node, options) {\n const { stripTags = false } = options || {};\n if (typeof node === 'undefined' || node === null) {\n return '';\n }\n if (typeof node === 'string' || typeof node === 'number') {\n return String(node);\n }\n if (Array.isArray(node)) {\n return render(node, options);\n }\n if (isTagNode(node)) {\n if (stripTags) {\n return render(node.content, options);\n }\n const attrs = attrsToString(node.attrs);\n if (node.content === null) {\n return START_TAG + node.tag + attrs + SELFCLOSE_END_TAG;\n }\n return START_TAG + node.tag + attrs + END_TAG + render(node.content, options) + CLOSE_START_TAG + node.tag + END_TAG;\n }\n return '';\n}\nexport function render(nodes, options) {\n if (nodes && Array.isArray(nodes)) {\n return nodes.reduce((r, node)=>r + renderNode(node, options), '');\n }\n if (nodes) {\n return renderNode(nodes, options);\n }\n return '';\n}\nexport function html(source, plugins, options) {\n return core(plugins).process(source, {\n ...options,\n render: render\n }).html;\n}\nexport default html;\n","/**\n * Generate the node object.\n *\n * Contains additional logic to help break any unintended side effects of the top down parsing of bbob.\n * @param {string} tag name of the tag\n * @param {Object} attrs attributes of the tag\n * @param {any} content contents of the tag. `[]` will create an empty tag. `null` will create a self closing tag\n *\n * @example\n * ```\n * toNode(\"div\", { class: \"class\" }, \"content\")\n * ```\n * becomes\n * ```\n * {\n * tag: \"div\",\n * attrs: { class: \"class\" },\n * content: \"content\",\n * gen: true,\n * }\n */\nconst toNode = (tag, attrs, content = []) => ({\n tag,\n attrs,\n content,\n gen: true,\n});\n\n/**\n * Preprocess attributes of a node to either return the default single attribute\n * or return a keyed attribute list\n * @param {import('@bbob/types').TagNode} node bbcode node to process\n * @param {string} [raw] raw string. Only include if the single attribute is allowed to have spaces\n * @returns processed attributes\n */\nconst preprocessAttr = (node, raw) => {\n const keys = Object.keys(node.attrs).join(\" \");\n const vals = Object.values(node.attrs).join(\" \");\n if (keys !== vals) {\n // [tag key=val]\n return node.attrs;\n }\n if (!raw || !node.start) {\n return {\n _default: vals,\n };\n }\n // [tag=attr]\n // node.start.from = 0\n // node.start.to = 10\n const nodeRaw = raw.substring(node.start.from, node.start.to);\n if (!nodeRaw.includes(\"=\")) {\n // [tag] or [tag attr]\n return node.attrs;\n }\n const openTagParts = nodeRaw.split(\"=\");\n if (openTagParts.length !== 2) {\n return node.attrs;\n }\n let val = openTagParts[1].slice(0, -1).trim(); // `attr` or `\"attr\"`\n if (val.startsWith('\"') && val.endsWith('\"')) {\n val = val.slice(1, -1);\n }\n return {\n _default: val,\n };\n};\n\n/**\n * Attempts to return tag into its original form with proper attributes\n * @returns string of tag start\n */\nconst toOriginalStartTag = (node, raw) => {\n if (node.start) {\n return raw.substring(node.start.from, node.start.to);\n }\n if (!node.attrs) {\n return `[${node.tag}]`;\n }\n const attrs = preprocessAttr(node, raw);\n if (attrs._default) {\n return `[${node.tag}=${attrs._default}]`;\n } else {\n return node.toTagStart();\n }\n};\n\n/**\n * Attempts to return tag into its original form\n * @returns string of tag end\n */\nconst toOriginalEndTag = (node, raw) => {\n if (node.end) {\n return raw.substring(node.end.from, node.end.to);\n }\n return node.toTagEnd();\n};\n\n/**\n * Attempts to convert a node to a Markdown URL-embed-safe raw tag.\n *\n * Depending on the input node, the result is either:\n * - A single raw tag string if no end node is present\n * - Or an array of such strings if an end node is present\n * @returns {(string|string[])} - A Markdown URL-embed-safe raw tag or an array of tags.\n */\nconst toRawTag = (node, raw) => {\n if (node.end) {\n return [\n toOriginalStartTag(node, raw),\n ...node.content,\n toOriginalEndTag(node, raw),\n ];\n }\n return toOriginalStartTag(node, raw);\n};\n\n/**\n * Given a string, find the first position of a regex match\n * @param {string} string to test against\n * @param {RegExp} regex to test with\n * @param {number} startpos starting position. Defaults to 0\n * @returns index of the first match of the regex in the string\n */\nconst regexIndexOf = (string, regex, startpos) => {\n const indexOf = string.substring(startpos || 0).search(regex);\n return indexOf >= 0 ? indexOf + (startpos || 0) : indexOf;\n};\n\nconst MD_NEWLINE_INJECT = \"\\n\\n\";\nconst MD_NEWLINE_PRE_INJECT = \"\\n\\n\";\nconst MD_NEWLINE_INJECT_COMMENT = \"\";\n\nconst URL_REGEX =\n /(http|ftp|https|upload):\\/\\/([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])/;\nconst MD_URL_REGEX =\n /\\!?\\[.*\\]\\((http|ftp|https|upload):\\/\\/([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])\\)/;\nconst URL_REGEX_SINGLE_LINE = new RegExp(`^${URL_REGEX.source}|${MD_URL_REGEX.source}$`);\nconst ESCAPABLES_REGEX =\n /((\\n|^)(?```+|~~~+)(?.*\\n))|(?\\[(?i?code|plain)(=.*)?\\])|(?(?`{1,2})(.*)(?\\k))/im;\nconst MD_TABLE_REGEX = /^(\\|[^\\n]+\\|\\r?\\n)((?:\\| ?:?[-]+:? ?)+\\|)(\\n(?:\\|[^\\n]+\\|\\r?\\n?)*)?$/m;\n\nconst MD_BROKEN_ORDERED_LIST = \"
\\n
    \";\nconst MD_BROKEN_UNORDERED_LIST = \"\\n
      \";\nconst MD_BROKEN_BLOCKQUOTE = \"\\n
      \";\n\n/**\n * Generates a random GUID.\n *\n * Mini Racer doesn't have the crypto module, so we can't use the built-in `crypto.randomUUID` function.\n * @returns {string} a GUID\n */\nfunction generateGUID() {\n let d = new Date().getTime();\n if (window.performance && typeof window.performance.now === \"function\") {\n d += performance.now(); //use high-precision timer if available\n }\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n // eslint-disable-next-line no-bitwise\n const r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n // eslint-disable-next-line no-bitwise\n return (c === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n\nexport {\n toNode,\n toOriginalStartTag,\n toOriginalEndTag,\n toRawTag,\n generateGUID,\n preprocessAttr,\n regexIndexOf,\n MD_NEWLINE_INJECT,\n MD_NEWLINE_INJECT_COMMENT,\n MD_NEWLINE_PRE_INJECT,\n URL_REGEX,\n MD_URL_REGEX,\n MD_TABLE_REGEX,\n URL_REGEX_SINGLE_LINE,\n ESCAPABLES_REGEX,\n MD_BROKEN_ORDERED_LIST,\n MD_BROKEN_UNORDERED_LIST,\n MD_BROKEN_BLOCKQUOTE,\n};\n","/**\n * Plugin that converts line breaks to `
      ` tags.\n * To use, put as function similar to the presets.\n *\n * If a node is marked with `noLineBreakConversion`, then it'll skip the parsing the children\n *\n * @example\n * ```ts\n * const output = bbob([preset(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n */\nimport { isEOL } from \"@bbob/plugin-helper\";\nimport { MD_NEWLINE_INJECT, MD_NEWLINE_PRE_INJECT, URL_REGEX_SINGLE_LINE } from \"../utils/common\";\n\nconst isObj = (value) => typeof value === \"object\";\nconst isString = (value) => typeof value === \"string\";\n\n/**\n * Walks the tree of nodes. Will add `br` tag to all `\\n` in format that can be used in any renderer.\n * Preserves \\n so that markdown-it doesn't try to treat everything like a block\n *\n * If a node has the property noLineBreakConversion is encountered, will skip parsing children.\n * @param t tree of nodes to be processed\n * @returns modified tree\n */\nconst walk = (t, disableLineBreakConversion = false) => {\n const tree = t;\n\n if (Array.isArray(tree)) {\n reduceWordsToLines(tree);\n if (tree.some(isString)) {\n // array contains strings. Might be md compatible\n tree.unshift(MD_NEWLINE_INJECT);\n tree.push(MD_NEWLINE_INJECT);\n }\n for (let idx = 0; idx < tree.length; idx++) {\n const child = walk(tree[idx], disableLineBreakConversion);\n if (Array.isArray(child)) {\n tree.splice(idx, 1, ...child);\n idx += child.length - 1;\n } else {\n tree[idx] = child;\n }\n }\n } else if (tree && isObj(tree) && tree.content) {\n if (tree.isWhitespaceSensitive) {\n // applies only to [code] and [icode]\n // stop walk. children won't be parsed to have
      \n return tree.tag ? tree : tree.content;\n }\n if (tree.disableLineBreakConversion) {\n disableLineBreakConversion = true;\n }\n walk(tree.content, disableLineBreakConversion);\n return tree.tag ? tree : tree.content;\n } else if (isString(tree) && URL_REGEX_SINGLE_LINE.test(tree.trim())) {\n // if the entire string is a URL, then it should be prepared for onebox.\n // BBob separates strings by newlines anyway, so we can already assume this is sitting on its own line\n // MD_NEWLINE_INJECT is already replacing newline came before or the start of the array,\n // so we only need to make sure \\n\\n is added after the URL\n return [tree, MD_NEWLINE_PRE_INJECT];\n }\n\n if (isString(tree) && isEOL(tree)) {\n return disableLineBreakConversion\n ? [\"\\n\", MD_NEWLINE_INJECT]\n : [{ tag: \"br\", content: null }, MD_NEWLINE_INJECT];\n }\n\n return tree;\n};\n\n/**\n * Reduces the list into lines, so that we can process them by line.\n * Performs in place.\n * @param {(string|Object)[]} words\n */\nconst reduceWordsToLines = (words) => {\n let rightIdx = words.findLastIndex((w) => isString(w) && !isEOL(w)) + 1;\n\n for (let i = rightIdx - 1; i >= 0; i--) {\n if (isString(words[i]) && !isEOL(words[i])) {\n continue;\n }\n if (isEOL(words[i])) {\n if (i !== rightIdx - 1) {\n words.splice(i + 1, rightIdx - i - 1, words.slice(i + 1, rightIdx).join(\"\"));\n }\n rightIdx = i;\n continue;\n }\n if (isObj(words[i])) {\n if (i !== rightIdx - 1) {\n words.splice(i + 1, rightIdx - i - 1, words.slice(i + 1, rightIdx).join(\"\"));\n }\n rightIdx = i;\n }\n }\n\n if (0 !== rightIdx) {\n words.splice(0, rightIdx, words.slice(0, rightIdx).join(\"\"));\n }\n};\n\n/**\n * Converts `\\n` to `
      ` self closing tag. Supply this as the last plugin in the preset lists\n *\n * @example converts all line breaks to br\n * ```ts\n * const output = bbob([preset(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n * @example will not convert line breaks inside [nobr]\n * ```ts\n * const nobr = (node: TagNode) => {return { disableLineBreakConversion: true, content: node.content }}; \\\\ tag in preset\n * ...\n * const output = bbob([preset(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n * @returns plugin to be used in BBob process\n */\nexport const lineBreakPlugin = () => {\n return (tree) => walk(tree);\n};\n","/**\n * Plugin that converts consecutive normal spaces (U+0020) to non-breaking spaces (U+00A0).\n * To use, put as function similar to the presets.\n *\n *\n * @example\n * ```ts\n * const output = bbob([preset(), , preserveWhitespace(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n */\nimport { isStringNode } from \"@bbob/plugin-helper\";\n\n/**\n * Checks if input is an object\n * @param value input\n * @returns if value is an object\n */\nconst isObj = (value) => typeof value === \"object\";\n\n/**\n * Walks the tree of nodes. Checks for node of consecutive spaces. If found replaces every space in\n * node with a nonbreaking space.\n * Preserves multiple spaces so html won't truncate them.\n *\n * Walks through entire tree.\n * @param t tree of nodes to be processed\n * @returns modified tree\n */\nconst walk = (t) => {\n const tree = t;\n\n if (Array.isArray(tree)) {\n for (let idx = 0; idx < tree.length; idx++) {\n const child = walk(tree[idx]);\n if (Array.isArray(child)) {\n tree.splice(idx, 1, ...child);\n idx += child.length - 1;\n } else {\n tree[idx] = child;\n }\n }\n } else if (tree && isObj(tree) && tree.content) {\n walk(tree.content);\n }\n\n //Bbob breaks up nodes by the presence of normal spaces.\n //So a node with a normal space can only have normal spaces in that node.\n if (isStringNode(tree)) {\n if (tree.length > 1 && tree[0] === \" \") {\n let numSpaces = tree.length;\n return [String.fromCharCode(160).repeat(numSpaces)];\n }\n }\n\n return tree;\n};\n\n/**\n * Converts consecutive normal spaces (U+0020) to nonbreaking spaces (U+00A0).\n * Supply this as a plugin in the preset lists.\n *\n * @example converts consecutive normal spaces (U+0020) to nonbreaking spaces (U+00A0)\n * ```ts\n * const output = bbob([preset(), preserveWhitespace(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n *\n * @returns plugin to be used in BBob process\n */\nexport const preserveWhitespace = () => {\n return (tree) => walk(tree);\n};\n","import { isTagNode } from \"@bbob/plugin-helper\";\n\nconst CONSECUTIVE_NEWLINE_REGEX = /\\n{2,}/gm;\n\n/**\n * Removes empty lines from a string\n * @param {string} text\n */\nconst removeEmptyLines = (text) => {\n return text.replace(CONSECUTIVE_NEWLINE_REGEX, \"\\n\");\n};\n\n/**\n * Removes empty lines from attributes\n * @type {import('@bbob/types').BBobPluginFunction}\n */\nexport const removeEmptyLinePlugin = (tree) => {\n return tree.walk((node) => {\n if (isTagNode(node) && node.attrs) {\n Object.keys(node.attrs).forEach((key) => {\n if (typeof node.attrs[key] === \"string\") {\n node.attrs[key] = removeEmptyLines(node.attrs[key]);\n }\n });\n }\n return node;\n });\n};\n","import { isTagNode } from \"@bbob/plugin-helper\";\nexport function process(tags, tree, core, options) {\n return tree.walk((node)=>{\n if (isTagNode(node)) {\n const tag = node.tag;\n const tagCallback = tags[tag];\n if (typeof tagCallback === \"function\") {\n return tagCallback(node, core, options);\n }\n }\n return node;\n });\n}\n/**\n * Create a preset plugin for @bbob/core\n */ function createPreset(defTags, processor = process) {\n const presetFactory = (opts)=>{\n presetFactory.options = Object.assign(presetFactory.options || {}, opts);\n function presetExecutor(tree, core) {\n return processor(defTags, tree, core, presetFactory.options || {});\n }\n presetExecutor.options = presetFactory.options;\n return presetExecutor;\n };\n presetFactory.extend = function presetExtend(callback) {\n const newTags = callback(defTags, presetFactory.options);\n return createPreset(newTags, processor);\n };\n return presetFactory;\n}\nexport { createPreset };\nexport default createPreset;\n","import { isStringNode, isTagNode, TagNode } from \"@bbob/plugin-helper\";\nimport {\n generateGUID,\n preprocessAttr,\n regexIndexOf,\n toNode,\n toOriginalEndTag,\n toOriginalStartTag,\n} from \"../utils/common\";\n\nconst SLIDE_TITLE_OPEN = Symbol(\"slide-title-open\");\nconst SLIDE_TITLE_CLOSE = Symbol(\"slide-title-close\");\nconst SLIDE_CLOSE = Symbol(\"slide-close\");\nconst SLIDE_REGEX =\n /(?\\{slide=)|(?\\})|(?\\{\\/slide\\})/i;\n\n/**\n * Adds the accordion tag\n * [accordion]{slide=name}content{/slide}[/accordion]\n *\n * [accordion][slide=name]content[/slide][/accordion]\n */\nconst accordion = (node, options) => {\n const groupId = generateGUID();\n\n // add support for existing {slide} tags style, due to copious amounts of existing content\n // also the only way to get true custom content inside a slide due to nesting limitations\n const markedContent = generateSlideMarkersFromContent(node.content);\n const generatedSlides = generateSlidesFromMarkers(markedContent);\n\n const filteredContent = generatedSlides\n .filter((n) => isTagNode(n) && n.tag === \"slide\")\n .map((content) => {\n content.isValid = true;\n content.groupId = groupId;\n return content;\n });\n if (!filteredContent.length) {\n // no [slide] tags found\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n const attrs = preprocessAttr(node, options.data.raw);\n\n if (attrs._default) {\n /** @type {string[]} */\n const customSettings = attrs._default.split(\"|\").map((s) => s.trim());\n const lastValidAlignment = customSettings\n .filter((s) => [\"bright\", \"bcenter\", \"bleft\", \"fleft\", \"fright\"].includes(s))\n .pop();\n if (lastValidAlignment) {\n attrs.align ??= lastValidAlignment;\n }\n\n if (\n customSettings.some((s) => s.endsWith(\"px\")) ||\n customSettings.some((s) => s.endsWith(\"%\"))\n ) {\n attrs.width ??= customSettings.find((s) => s.endsWith(\"px\") || s.endsWith(\"%\"));\n }\n }\n\n let classes = attrs.align?.toLowerCase() || \"\";\n let style = \"\";\n if (attrs.width?.endsWith(\"px\") || attrs.width?.endsWith(\"%\")) {\n style = `width: ${attrs.width};`;\n }\n return toNode(\n \"div\",\n { class: \"bb-accordion \" + classes, \"data-group-id\": groupId, style },\n filteredContent,\n );\n};\n\n/**\n * Locates and splits all {slide} tag components into their respective parts while preserving remaining content\n * @param {(TagNode|string)[]} contentArr node content of the accordion tag\n *\n * @example\n * ```\n * [\"{slide=test}\", \"lorem ipsum\", \"{/slide}\"]\n * ```\n * becomes\n * ```\n * [SLIDE_TITLE_OPEN, \"test\", SLIDE_TITLE_CLOSE, \"lorem ipsum\", SLIDE_CLOSE]\n * ```\n */\nfunction generateSlideMarkersFromContent(contentArr) {\n contentArr = [...contentArr]; // shallow clone. object nodes are not modified anyway\n\n const newArr = [];\n while (contentArr.length > 0) {\n const content = contentArr[0];\n if (isTagNode(content)) {\n newArr.push(contentArr.shift());\n continue;\n }\n const foundIndex = regexIndexOf(content, SLIDE_REGEX);\n if (foundIndex === -1) {\n newArr.push(contentArr.shift());\n continue;\n }\n const match = content.match(SLIDE_REGEX);\n const preContent = content.slice(0, foundIndex);\n const postContent = content.slice(foundIndex + match[0].length);\n if (preContent.length) {\n newArr.push(preContent);\n }\n if (match.groups.slideTitleOpen) {\n newArr.push(SLIDE_TITLE_OPEN);\n }\n if (match.groups.slideTitleClose) {\n newArr.push(SLIDE_TITLE_CLOSE);\n }\n if (match.groups.slideClose) {\n newArr.push(SLIDE_CLOSE);\n }\n if (postContent.length) {\n contentArr[0] = postContent;\n } else {\n contentArr.shift();\n }\n }\n\n return newArr;\n}\n\n/**\n * Generates slide nodes from markers\n * @param {(string | typeof SLIDE_TITLE_OPEN | typeof SLIDE_TITLE_CLOSE | typeof SLIDE_CLOSE | TagNode)[]} markedContent\n */\nfunction generateSlidesFromMarkers(markedContent) {\n const nodes = [];\n let currentSlide = null;\n /** @type {typeof SLIDE_TITLE_OPEN | typeof SLIDE_TITLE_CLOSE | null} */\n let prevMarker = null;\n for (const content of markedContent) {\n if (content === SLIDE_TITLE_OPEN && prevMarker === null) {\n currentSlide = TagNode.create(\"slide\");\n currentSlide.content = [];\n currentSlide.customTitle = [];\n prevMarker = SLIDE_TITLE_OPEN;\n } else if (content === SLIDE_TITLE_CLOSE && prevMarker === SLIDE_TITLE_OPEN) {\n prevMarker = SLIDE_TITLE_CLOSE;\n continue;\n } else if (content === SLIDE_CLOSE && currentSlide && prevMarker === SLIDE_TITLE_CLOSE) {\n nodes.push(currentSlide);\n currentSlide = null;\n prevMarker = null;\n } else if (currentSlide) {\n if (prevMarker === SLIDE_TITLE_OPEN) {\n currentSlide.customTitle.push(markerToString(content));\n } else {\n currentSlide.content.push(markerToString(content));\n }\n } else {\n // no slide open, just add content\n nodes.push(markerToString(content));\n }\n }\n return nodes;\n}\n\n/**\n * Processes content into a string. Catches stray markers and converts them back into a string\n * @param {string | typeof SLIDE_TITLE_OPEN | typeof SLIDE_TITLE_CLOSE | typeof SLIDE_CLOSE} marker\n * @returns expected string\n */\nfunction markerToString(marker) {\n switch (marker) {\n case SLIDE_TITLE_OPEN:\n return \"{slide=\";\n case SLIDE_TITLE_CLOSE:\n return \"}\";\n case SLIDE_CLOSE:\n return \"{/slide}\";\n default:\n return marker;\n }\n}\n\nconst slide = (node, options) => {\n if (!node.isValid) {\n // not inside an [accordion] tag\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n const attrs = preprocessAttr(node, options.data.raw);\n let title = [attrs.title || attrs._default || \"Slide\"];\n let isOpen = !!attrs.open || false;\n let titleAlign = attrs.left ? \"left\" : attrs.right ? \"right\" : attrs.center ? \"center\" : \"left\";\n if (node.customTitle?.length) {\n // slide was created from markers\n title = node.customTitle;\n // pull out old options from title if they exist\n const possibleOptions = title\n .filter((t) => typeof t === \"string\")\n .join(\"\")\n .toLowerCase()\n .split(\"|\")\n .map((s) => s.trim());\n if (possibleOptions.includes(\"open\")) {\n isOpen = true;\n }\n if (possibleOptions.includes(\"right\")) {\n titleAlign = \"right\";\n }\n if (possibleOptions.includes(\"center\")) {\n titleAlign = \"center\";\n }\n if (possibleOptions.includes(\"left\")) {\n titleAlign = \"left\";\n }\n title = title.map((t) => {\n if (isStringNode(t)) {\n t = t.replace(/\\|(open|right|center|left)/gi, \"\");\n }\n return t;\n });\n }\n return [\n toNode(\"details\", { class: \"bb-slide\", open: isOpen }, [\n toNode(\n \"summary\",\n { class: \"bb-slide-title\", style: `text-align: ${titleAlign}; ${attrs.style || \"\"}` },\n title,\n ),\n toNode(\"div\", { class: \"bb-slide-content\" }, node.content),\n ]),\n ];\n};\n\nexport const accordionTags = { accordion, slide };\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [left], [center], and [right] to bbcode\n * @example [center]content[/center]\n */\nexport const alignment = {\n left: (node) => toNode(\"div\", { class: \"bb-left\" }, node.content),\n center: (node) => toNode(\"div\", { class: \"bb-center\" }, node.content),\n right: (node) => toNode(\"div\", { class: \"bb-right\" }, node.content),\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n/**\n * @file Adds [a] and [goto] to bbcode\n * @example [a=your_anchor_name]An anchor[/a] [goto=your_anchor_name]Jump to an anchor[/goto]\n */\nexport const anchor = {\n // name is not valid in HTML5; however, it correctly displays back while id does not\n a: (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default || \"\";\n return toNode(\n \"a\",\n { id: `user-anchor-${attrs.trim()}`, name: `user-anchor-${attrs.trim()}` },\n node.content,\n );\n },\n goto: (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default || \"\";\n return toNode(\"a\", { href: `#user-anchor-${attrs.trim()}` }, node.content);\n },\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nconst WEB_FONTS = [\n \"arial\",\n \"book antiqua\",\n \"courier new\",\n \"georgia\",\n \"tahoma\",\n \"times new roman\",\n \"trebuchet ms\",\n \"verdana\",\n];\nconst VALID_FONT_STYLES = {\n thin: \"100\",\n extralight: \"200\",\n light: \"300\",\n regular: \"400\",\n medium: \"500\",\n semibold: \"600\",\n bold: \"700\",\n extrabold: \"800\",\n black: \"900\",\n};\n// registered axis tags https://learn.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg#registered-axis-tags\nconst REGISTERED_AXIS = [\"ital\", \"opsz\", \"slnt\", \"wdth\", \"wght\"];\n\nconst AXES_REGEX = /(?[a-zA-Z]*)?\\s?(?[0-9]*)?\\s?(?italic)?/;\n\nconst axesParser = (attrs) => {\n let axes = {\n ital: 0,\n wght: 400,\n };\n\n if (attrs?.style) {\n // user just copy pasted the name of the style on the google font site, probably\n const style = attrs.style.trim().toLowerCase();\n const matches = AXES_REGEX.exec(style).groups || {};\n if (matches?.italic) {\n axes.ital = 1;\n }\n\n const weight = matches.weight;\n if (weight && weight >= 0 && weight <= 900) {\n axes.wght = weight;\n } else if (Object.keys(VALID_FONT_STYLES).includes(matches.named_weight || \"\")) {\n axes.wght = VALID_FONT_STYLES[matches.named_weight];\n }\n\n axes = {\n ...axes,\n ...Object.fromEntries(Object.entries(attrs).filter(([key]) => REGISTERED_AXIS.includes(key))),\n };\n }\n return axes;\n};\n\n/**\n * Create google font api url\n * @param {string} family name of font\n * @param {object} axes custom font axes\n */\nconst googleFontApiBuild = (family, axes) => {\n family = family.replaceAll(\" \", \"+\");\n // google fonts requires axes names to be in alphabetical order\n axes = Object.keys(axes)\n .sort()\n .reduce((obj, key) => {\n obj[key] = axes[key];\n return obj;\n }, {});\n const axesList = Object.keys(axes).join(\",\") + \"@\" + Object.values(axes).join(\",\");\n return \"https://fonts.googleapis.com/css2?family=\" + family + \":\" + axesList;\n};\n\nexport const font = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw);\n const fontFamily = attrs?._default || attrs?.family || attrs?.name;\n if (!fontFamily || fontFamily.trim() === \"\") {\n return node.content;\n }\n if (WEB_FONTS.includes(fontFamily.trim().toLowerCase())) {\n return toNode(\"span\", { style: `font-family: '${fontFamily}'` }, node.content);\n }\n\n const axes = axesParser(attrs);\n const url = googleFontApiBuild(fontFamily, axes);\n options.data.fonts.add(url);\n\n const italic = axes.ital === 1 ? \"italic\" : \"normal\";\n\n const custom = Object.entries(axes).filter(([key]) => key !== \"wght\" && key !== \"ital\");\n let fontVar = \"\";\n if (custom.length) {\n fontVar =\n \"font-variation-settings: \" + custom.map(([key, val]) => `'${key}' ${val}`).join(\", \") + \";\";\n }\n\n return toNode(\n \"span\",\n {\n style: `font-family: '${fontFamily}'; font-weight: ${axes.wght}; font-style: ${italic}; ${fontVar}`,\n \"data-font\": url,\n },\n node.content\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Parse the user provided height and return a valid height value\n * @param {Number} heightValue obtains the input of the user entered height (default is 700)\n * @returns A validated number less than 0.\n */\nfunction parseHeight(heightValue) {\n const maxHeight = 700;\n const parsedHeight =\n heightValue && heightValue.trim() !== \"\" ? heightValue.replace(/[^\\d.]/g, \"\") : 0;\n\n if (parsedHeight && parsedHeight >= 0 && parsedHeight <= maxHeight) {\n return parsedHeight;\n } else {\n // if the value = 0 then nothing will be returned\n return parsedHeight === 0 ? 0 : maxHeight;\n }\n}\n\n/**\n * @file Adds [heightrestrict] to bbcode\n * @example [heightrestrict=50]content[/heightrestrict]\n */\nexport const heightrestrict = (node) => {\n const attrs = preprocessAttr(node)._default;\n const heightInput = parseHeight(attrs).toString();\n // Return image's default size if heightrestrict did not involve a valid value\n return heightInput === \"0\"\n ? toNode(\"div\", { class: \"bb-height-restrict\" }, node.content)\n : toNode(\n \"div\",\n { class: \"bb-height-restrict\", style: `height: ${heightInput}px;` },\n node.content,\n );\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [mail] to bbcode\n * @param {string} [type=\"send\"] Denotes type of mail either send or receive\n * @param {string} [person=\"Unknown\"] Denotes the person in the To/From field\n * @param {string} [subject=\"Empty\"] Denotes the subject line of the email\n * @example [mail type=\"send\" person=\"John Doe\" subject=\"Hello World\"]content[/mail]\n */\n\nconst parseEmailContent = (content) => {\n return toNode(\"div\", { class: \"bb-email-content\" }, content);\n};\n\nconst parseEmailSubject = (subject) => {\n return toNode(\"div\", { class: \"bb-email-subject\" }, subject);\n};\n\nconst parseEmailPerson = (person) => {\n return toNode(\"div\", { class: \"bb-email-address\" }, person);\n};\n\nconst emailHeader = toNode(\"div\", { class: \"bb-email-header\" }, \"\");\nconst emailFooter = toNode(\n \"div\",\n { class: \"bb-email-footer\" },\n toNode(\"div\", { class: \"bb-email-button\" }, \"\"),\n);\n\nexport const mail = (node) => {\n const attributes = node.attrs;\n let mailAttr = {\n mailOption: (attributes.type || \"send\").toLowerCase(),\n person: attributes.person || \"Unknown\",\n subject: attributes.subject || \"Empty\",\n };\n\n return toNode(\n \"div\",\n {\n class: \"bb-email\",\n \"data-bb-email\": mailAttr.mailOption,\n },\n [\n emailHeader,\n parseEmailPerson(mailAttr.person),\n parseEmailSubject(mailAttr.subject),\n parseEmailContent(node.content),\n emailFooter,\n ],\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [row][column] to bbcode\n * @example Adds [row][column][/column][/row]\n */\nexport const rowcolumn = {\n row: (node) => toNode(\"div\", { class: \"bb-row\" }, node.content),\n column: (node, options) => {\n const columnAttrs = preprocessAttr(node, options.data.raw)._default || \"8\";\n const columnStyle = columnAttrs.startsWith(\"span\")\n ? `column-width-${columnAttrs}`\n : `column-width-span${columnAttrs}`;\n return toNode(\"div\", { class: `bb-column`, \"data-span\": columnStyle }, node.content);\n },\n};\n","import { preprocessAttr } from \"../utils/common\";\n\nconst EVENTS = [\n \"init\",\n \"click\",\n \"change\",\n \"input\",\n \"dblclick\",\n \"mouseenter\",\n \"mouseleave\",\n \"scroll\",\n];\n\n/**\n * Script tag\n *\n * [script]content[/script]\n *\n * [script class=\"id\" on=\"event\" version=\"2\"]content[/script]\n */\nexport const script = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw);\n\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const classSuffix = options.data.previewing ? \"preview\" : options.data.commonGUID;\n\n const onEvent =\n (EVENTS.includes(attrs.on?.toLowerCase() || \"init\") && attrs.on?.toLowerCase()) || \"init\";\n\n const scriptSetup = {\n id: classSuffix,\n class: attrs.class || \"\",\n on: onEvent,\n version: attrs.version || \"\",\n content: node.content.join(\"\"),\n };\n options.data.bbscripts.push(scriptSetup);\n\n return [];\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Parses an inputted size value and returns the formatted valid font size\n * @param {string} fontValue the input of the size\n */\nfunction parseFontSize(fontValue) {\n let value;\n let fontSize = { valid: true };\n const parsedSize = /(\\d+\\.?\\d?)(px|rem)?/i.exec(fontValue);\n const sizeRanges = {\n px_max: 36,\n px_min: 8,\n rem_max: 3,\n rem_min: 0.2,\n unitless_max: 7,\n unitless_min: 1,\n };\n\n if (parsedSize && (value = parsedSize[1])) {\n fontSize.unit = (parsedSize[2] || \"\").toLowerCase();\n switch (fontSize.unit) {\n case \"px\":\n if (value > sizeRanges.px_max) {\n value = sizeRanges.px_max;\n } else if (value < sizeRanges.px_min) {\n value = sizeRanges.px_min;\n }\n break;\n case \"rem\":\n if (value > sizeRanges.rem_max) {\n value = sizeRanges.rem_max;\n } else if (value < sizeRanges.rem_min) {\n value = sizeRanges.rem_min;\n }\n break;\n default:\n if ((fontSize.valid = fontValue.length === value.length)) {\n if (value > sizeRanges.unitless_max) {\n value = sizeRanges.unitless_max;\n } else if (value < sizeRanges.unitless_min) {\n value = sizeRanges.unitless_min;\n }\n }\n break;\n }\n\n fontSize.value = value;\n }\n return fontSize;\n}\n\nexport const size = (node) => {\n const input = preprocessAttr(node)._default;\n const fontSize = parseFontSize(input);\n if (!fontSize.valid) {\n return node.content;\n }\n let outputAttr = {};\n if (fontSize.unit) {\n outputAttr = { style: `font-size: ${fontSize.value}${fontSize.unit}` };\n } else {\n outputAttr = { \"data-size\": fontSize.value };\n }\n return toNode(\"span\", outputAttr, node.content);\n};\n","import { isTagNode } from \"@bbob/plugin-helper\";\nimport { preprocessAttr, toNode, toRawTag } from \"../utils/common\";\n\n/**\n * @file Adds textmessage to bbcode\n * @example [textmessage=Recipient][message=them]Hi [/message][message=me] Hey![/message][/textmessage]\n */\n\nconst ACCEPTED_OPTIONS = [\"me\", \"them\", \"right\", \"left\"];\nexport const textmessage = {\n textmessage: (node, options) => {\n const messageList = node.content.filter(\n (contentNode) => isTagNode(contentNode) && contentNode.tag === \"message\"\n );\n messageList.forEach((messageNode) => {\n messageNode.isValid = true;\n });\n\n if (!messageList.length) {\n return toRawTag(node, options.data.raw);\n }\n\n const attr = preprocessAttr(node, options.data.raw)._default || \"Recipient\";\n const recipient = attr && attr.trim() !== \"\" ? attr : \"Recipient\";\n return toNode(\"div\", { class: \"bb-textmessage\" }, [\n toNode(\"div\", { class: \"bb-textmessage-name\" }, recipient),\n toNode(\"div\", { class: \"bb-textmessage-overflow\" }, [\n toNode(\"div\", { class: \"bb-textmessage-content\" }, node.content),\n ]),\n ]);\n },\n message: (node, options) => {\n if (!node.isValid) {\n return toRawTag(node, options.data.raw);\n }\n\n let option = preprocessAttr(node, options?.data?.raw)?._default?.toLowerCase();\n if (!ACCEPTED_OPTIONS.includes(option) || option === \"right\") {\n option = \"me\";\n }\n if (option === \"left\") {\n option = \"them\";\n }\n\n const senderAttrs = option === \"me\" ? \"bb-message-me\" : \"bb-message-them\";\n return toNode(\"div\", { class: senderAttrs }, [\n toNode(\"div\", { class: \"bb-message-content\" }, node.content),\n ]);\n },\n};\n","import { createPreset } from \"@bbob/preset\";\nimport { accordionTags } from \"./tags/accordion\";\nimport { alignment } from \"./tags/alignment\";\nimport { anchor } from \"./tags/anchor\";\nimport { animation, keyframe } from \"./tags/animation\";\nimport { bg } from \"./tags/background\";\nimport { block } from \"./tags/block\";\nimport { blockquote } from \"./tags/blockquote\";\nimport { border } from \"./tags/border\";\nimport { centerblock } from \"./tags/centerblock\";\nimport { check } from \"./tags/check\";\nimport { classStyle } from \"./tags/class\";\nimport { code, icode, savenl } from \"./tags/code\";\nimport { color } from \"./tags/color\";\nimport { comment } from \"./tags/comment\";\nimport { bold, italic, strike, underline } from \"./tags/discourse-core-replacement\";\nimport { div } from \"./tags/div\";\nimport { divide } from \"./tags/divide\";\nimport { fieldset } from \"./tags/fieldset\";\nimport { font } from \"./tags/font\";\nimport { fa } from \"./tags/fontawesome\";\nimport { h, h1, h2, h3, h4, h5, h6, sh } from \"./tags/header\";\nimport { heightrestrict } from \"./tags/heightrestrict\";\nimport { highlight } from \"./tags/highlight\";\nimport { imagefloat } from \"./tags/imagefloat\";\nimport { justify } from \"./tags/justify\";\nimport { br, nobr } from \"./tags/lineBreak\";\nimport { mail } from \"./tags/mail\";\nimport { newspaper } from \"./tags/newspaper\";\nimport { note } from \"./tags/note\";\nimport { ooc } from \"./tags/ooc\";\nimport { pindent } from \"./tags/pindent\";\nimport { plain } from \"./tags/plain\";\nimport { print } from \"./tags/print\";\nimport { progress } from \"./tags/progress\";\nimport { quote } from \"./tags/quote\";\nimport { rowcolumn } from \"./tags/rowcolumn\";\nimport { script } from \"./tags/script\";\nimport { scroll } from \"./tags/scroll\";\nimport { side } from \"./tags/side\";\nimport { size } from \"./tags/size\";\nimport { inlinespoiler, spoiler } from \"./tags/spoiler\";\nimport { sub } from \"./tags/subscript\";\nimport { sup } from \"./tags/superscript\";\nimport { tab, tabs } from \"./tags/tabs\";\nimport { textmessage } from \"./tags/textmessage\";\nimport { thinprogress } from \"./tags/thinprogress\";\n\nconst tags = {\n ...accordionTags,\n ...alignment,\n ...anchor,\n animation,\n bg,\n block,\n blockquote,\n border,\n br,\n centerblock,\n check,\n class: classStyle,\n code,\n color,\n comment,\n div,\n divide,\n fieldset,\n fa,\n font,\n h,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n heightrestrict,\n highlight,\n icode,\n imagefloat,\n inlinespoiler,\n justify,\n keyframe,\n mail,\n newspaper,\n nobr,\n note,\n ooc,\n pindent,\n plain,\n print,\n progress,\n quote,\n ...rowcolumn,\n thinprogress,\n savenl,\n sh,\n script,\n scroll,\n side,\n size,\n spoiler,\n sub,\n sup,\n tab,\n tabs,\n ...textmessage,\n\n // discourse core replacement tags\n b: bold,\n i: italic,\n u: underline,\n s: strike,\n};\n\nconst availableTags = Object.keys(tags);\nconst preventParsing = [\"plain\", \"code\", \"icode\", \"class\", \"fa\"];\n\nconst preset = createPreset(tags);\n\nexport { availableTags, tags, preset, preventParsing };\nexport default preset;\n","import { isStringNode, isTagNode } from \"@bbob/plugin-helper\";\nimport { preprocessAttr, toOriginalEndTag, toOriginalStartTag } from \"../utils/common\";\n\n/**\n * Renders css Keyframes\n *\n * [animation=name][keyframe=0]color: red[/keyframe][/animation]\n */\nexport const animation = (node, options) => {\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const commonId = options.data.previewing ? \"preview\" : options.data.commonGUID;\n\n const name = preprocessAttr(node, options.data.raw)?._default || \"\";\n const keyframes = node.content\n .filter((n) => isTagNode(n) && n.tag === \"keyframe\")\n .map((content) => {\n content.isValid = true;\n /** @type {string} */\n const ident = preprocessAttr(content, options.data.raw)._default || \"\";\n content.ident = ident + (ident.match(/^\\d+$/) ? \"%\" : \"\");\n const cleanContent = content.content\n .filter(isStringNode)\n .join(\"\")\n .replaceAll(/[\\[\\]\\{\\}]/g, \"\");\n content.formatted = `${content.ident}{ ${cleanContent} }`;\n return content;\n });\n const keyframeContent = keyframes.map((n) => n.formatted).join(\"\\n\");\n const content = `@keyframes ${commonId}${name} { ${keyframeContent} }`;\n options.data.styles.push(content);\n return [];\n};\n\nexport const keyframe = (node, options) => {\n if (!node.isValid) {\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n return [];\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Add [bg] tag\n * @example [bg=red]Hello[/bg]\n */\nexport const bg = (node, options) => {\n const color = preprocessAttr(node, options.data.raw)._default;\n return toNode(\n \"div\",\n {\n style: `background-color: ${color};`,\n class: \"bb-background\",\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Add [block] tag\n * @example [block=treasure]content[/block]\n */\nexport const block = (node, options) => {\n const defaultOp = \"block\";\n const blockAttr = (preprocessAttr(node, options.data.raw)._default || defaultOp).toLowerCase();\n\n const OPTIONS = [\n \"block\",\n \"dice\",\n \"dice10\",\n \"setting\",\n \"warning\",\n \"storyteller\",\n \"announcement\",\n \"important\",\n \"question\",\n \"encounter\",\n \"information\",\n \"character\",\n \"treasure\",\n ];\n\n // Default to block option if user did not provide anything valid\n const blockOption = OPTIONS.includes(blockAttr) ? blockAttr : defaultOp;\n\n return toNode(\"table\", { class: \"bb-block\", \"data-bb-block\": blockOption }, [\n toNode(\"tbody\", [\n toNode(\"tr\", [\n toNode(\"td\", { class: \"bb-block-icon\" }),\n toNode(\"td\", { class: \"bb-block-content\" }, node.content),\n ]),\n ]),\n ]);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [blockquote] to bbcode\n * @example [blockquote=author]content[/blockquote]\n */\nexport const blockquote = (node, options) => {\n const author = preprocessAttr(node, options.data.raw)._default || \"\";\n\n return toNode(\"div\", { class: \"bb-blockquote\" }, [\n toNode(\"div\", { class: \"bb-blockquote-left\" }),\n toNode(\"div\", { class: \"bb-blockquote-content\" }, [\n node.content,\n toNode(\"div\", { class: \"bb-blockquote-speaker\" }, author !== \"\" ? `- ${author}` : \"\"),\n ]),\n toNode(\"div\", { class: \"bb-blockquote-right\" }),\n ]);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const border = (node, options) => {\n const val = preprocessAttr(node, options.data.raw)._default;\n return toNode(\n \"div\",\n {\n style: `border: ${val};`,\n class: \"bb-border\",\n },\n node.content,\n );\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * Creates a line break html
      tag\n */\nexport const br = () => {\n return toNode(\"br\", {}, null);\n};\n\n/**\n * Disables line breaks for given content\n * @example\n * ```\n * [nobr]test\n * test\n * test\n * [/nobr]\n *\n * test test test\n * ```\n */\nexport const nobr = (node) => {\n return { disableLineBreakConversion: true, content: node.content };\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const centerblock = (node, options) => {\n const percentageInput = preprocessAttr(node, options.data.raw)._default || \"50\";\n return toNode(\"div\", { style: `margin: 0 auto; width: ${percentageInput}%` }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const check = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default || \"dot\";\n return toNode(\"div\", { class: `bb-check`, \"data-type\": attrs }, node.content);\n};\n","import { isStringNode } from \"@bbob/plugin-helper\";\nimport { preprocessAttr } from \"../utils/common\";\n\n/**\n * Class style tag\n *\n * [class=name]content[/class]\n * [class name=\"className\" state=\"psuedo-class\" minWidth=\"\" maxWidth=\"\"]content[/class]\n * [class name=\"className\" selector=\"\"]content[/class]\n */\nexport const classStyle = (node, options) => {\n const attrs = preprocessAttr(node);\n const nameAttr = attrs.name || attrs._default;\n\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const classSuffix = options.data.previewing ? \"preview\" : options.data.commonGUID;\n const className = nameAttr + \"__\" + classSuffix;\n const content = node.content\n .filter(isStringNode)\n .map((s) => s.replaceAll(\"{post_id}\", classSuffix).replaceAll(/[\\[\\]\\{\\}]/g, \"\"));\n let selector = \"\";\n const mediaQuery = [];\n if (\n [\"hover\", \"focus\", \"active\", \"focus-within\", \"focus-visible\"].includes(\n attrs.state?.toLowerCase(),\n )\n ) {\n selector = \":\" + attrs.state.toLowerCase();\n }\n if (attrs.selector) {\n selector = attrs.selector.replace(/[,{}\\\\\\n]/g, \"\");\n }\n if (attrs.minWidth?.match(/^[0-9]+[a-z]+$/)) {\n // @media (min-width: )\n mediaQuery.push(`(min-width: ${attrs.minWidth})`);\n }\n if (attrs.maxWidth?.match(/^[0-9]+[a-z]+$/)) {\n // @media (max-width: )\n mediaQuery.push(`(max-width: ${attrs.maxWidth})`);\n }\n\n content.unshift(`.${className}${selector} {`);\n content.push(\"}\");\n if (mediaQuery.length) {\n content.unshift(`@media ${mediaQuery.join(\" and \")} {`);\n content.push(\"}\");\n }\n options.data.styles.push(content.join(\"\"));\n\n return [];\n};\n","import { preprocessAttr } from \"../utils/common\";\n\n/**\n * processes [code] tag and returns a fenced code block\n */\nexport const code = (node) => {\n const lang = preprocessAttr(node)._default || \"bbcode\";\n return {\n isWhitespaceSensitive: true,\n content: [\"```\" + lang + \"\\n\", node.content, \"\\n```\\n\"],\n };\n};\n\n/**\n * processes [icode] tag and returns inline code\n */\nexport const icode = (node) => {\n return {\n isWhitespaceSensitive: true,\n content: [\"`\", node.content, \"`\"],\n };\n};\n\n/**\n * Special tag to save newlines in code blocks. Used for hoisting code blocks\n */\nexport const savenl = (node) => {\n return {\n isWhitespaceSensitive: true,\n content: node.content,\n };\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const color = (node) => {\n const inputColor = preprocessAttr(node)._default || \"\";\n if (inputColor.trim() === \"\") {\n return node.content;\n }\n return toNode(\"span\", { style: `color: ${inputColor}` }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds [comment] tag\n * @example [comment]Content[/comment]\n */\n\nconst comment = (node) => {\n return toNode(\"span\", { class: \"hidden\" }, node.content);\n};\n\nexport { comment };\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Adds [div] tag\n * [div=css]Content[/div]\n * [div class=\"class\" style=\"css\"]Content[/div]\n */\nexport const div = (node, options) => {\n if (node.gen) {\n // node is actually a generated node \"div\" made by another tag\n // don't process it\n return node;\n }\n const attrs = preprocessAttr(node, options.data.raw);\n const style = attrs.style || attrs._default;\n const classAttrs = attrs.class;\n if (!classAttrs?.trim()) {\n return toNode(\n \"div\",\n {\n style,\n },\n node.content,\n );\n }\n\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const classSuffix = options.data.previewing ? \"preview\" : options.data.commonGUID;\n const classNames = classAttrs\n .split(\" \")\n .map((c) => c + \"__\" + classSuffix)\n .join(\" \");\n\n return toNode(\n \"div\",\n {\n class: classNames,\n style,\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const divide = (node) => {\n const type = (preprocessAttr(node)._default || \"\").toLowerCase();\n return toNode(\n \"span\",\n {\n class: \"bb-divide\",\n \"data-type\": type,\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [fieldset] to bbcode\n * @example [fieldset=title]content[/fieldset]\n */\nexport const fieldset = (node, options) => {\n const title = preprocessAttr(node, options.data.raw)._default || \"\";\n return toNode(\"fieldset\", { class: \"bb-fieldset\" }, [\n toNode(\"legend\", { class: \"bb-fieldset-legend\" }, title),\n toNode(\"div\", { class: \"bb-fieldset\" }, node.content),\n ]);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * Adds [fa] tag\n * [fa]fa-icon[/fa]\n * [fa style=\"\" fa-transform=\"\"]fa-solid fa-icon[/fa]\n * [fa primary-color=\"\" secondary-color=\"\" primary-opacity=\"\" secondary-opacity=\"\" rotate-angle=\"\"]fa-duotone fa-icon[/fa]\n */\nexport const fa = (node) => {\n const attrs = node.attrs;\n let style = attrs.style || \"\";\n style += attrs[\"primary-color\"] ? `--fa-primary-color: ${attrs[\"primary-color\"]};` : \"\";\n style += attrs[\"secondary-color\"] ? `--fa-secondary-color: ${attrs[\"secondary-color\"]};` : \"\";\n style += attrs[\"primary-opacity\"] ? `--fa-primary-opacity: ${attrs[\"primary-opacity\"]};` : \"\";\n style += attrs[\"secondary-opacity\"]\n ? `--fa-secondary-opacity: ${attrs[\"secondary-opacity\"]};`\n : \"\";\n style += attrs[\"rotate-angle\"] ? `--fa-rotate-angle: ${attrs[\"rotate-angle\"]};` : \"\";\n\n return toNode(\n \"i\",\n {\n \"data-bbcode-fa\": null,\n },\n [\n toNode(\n \"i\",\n {\n class: (node.content || []).join(\"\"),\n style,\n \"data-fa-transform\": attrs[\"fa-transform\"] || \"\",\n },\n [],\n ),\n ],\n );\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds Header to bbcode\n * @example [h]content[/h], [h2]content[/h2], [h3]content[/h3],\n * [h4]content[/h4], [h5]content[/h5], [h6]content[/h6].\n */\n\nconst h = (node) => {\n return toNode(\"h1\", {}, node.content);\n};\n\nconst h1 = (node) => {\n return toNode(\"h1\", {}, node.content);\n};\n\nconst h2 = (node) => {\n return toNode(\"h2\", {}, node.content);\n};\n\nconst sh = (node) => {\n return toNode(\"h2\", {}, node.content);\n};\n\nconst h3 = (node) => {\n return toNode(\"h3\", {}, node.content);\n};\n\nconst h4 = (node) => {\n return toNode(\"h4\", {}, node.content);\n};\n\nconst h5 = (node) => {\n return toNode(\"h5\", {}, node.content);\n};\n\nconst h6 = (node) => {\n return toNode(\"h6\", {}, node.content);\n};\n\nexport { h, sh, h1, h2, h3, h4, h5, h6 };\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [highlight] to bbcode\n * @example [highlight]content[/highlight]\n */\nexport const highlight = (node) => {\n return toNode(\"span\", { class: \"bb-highlight\" }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n/**\n * @file Adds [imagefloat] to bbcode\n * @exmaple [imagefloat=left]content[/imagefloat]\n */\nexport const imagefloat = (node) => {\n const attrs = preprocessAttr(node)._default || \"\";\n return toNode(\"div\", { class: `bb-float-${attrs}` }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n/**\n * @file Adds [spoiler] and [inlinespoiler] to bbcode\n *\n * Defaults to \"Spoiler\" name if no title provided\n *\n * @example `[spoiler=Title]text[/spoiler]`\n * @example `[inlinespoiler]hidden content[/inlinespoiler]\n */\n\nexport const spoiler = (node, options) => {\n const providedTitle = preprocessAttr(node, options.data.raw)._default;\n const title = \"Spoiler\" + (providedTitle ? `: ${providedTitle}` : \"\");\n\n /**\n *
      \n * Title\n *
      \n * lorem ipsum\n *
      \n *
      \n */\n return toNode(\"details\", { class: \"bb-spoiler\" }, [\n toNode(\"summary\", {}, title),\n toNode(\"div\", { class: \"bb-spoiler-content\" }, node.content),\n ]);\n};\n\nexport const inlinespoiler = (node) => {\n return toNode(\"span\", { class: \"bb-inline-spoiler\" }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds [justify] to bbcode\n * @example [justify]content[/justify]\n */\nexport const justify = (node) => {\n return toNode(\"div\", { class: \"bb-justify\" }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [newspaper] to bbcode\n * @example [newspaper]content[/newspaper]\n */\nexport const newspaper = (node) => {\n return toNode(\"div\", { class: \"bb-newspaper\" }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [note] to bbcode\n * @example [note]content[/note]\n */\n\nexport const note = (node) => {\n return toNode(\"div\", { class: \"bb-note\" }, [\n toNode(\"div\", { class: \"bb-note-tape\" }, \"\"),\n toNode(\"div\", { class: \"bb-note-content\" }, [\n node.content,\n toNode(\"div\", { class: \"bb-note-footer\" }, \"\"),\n ]),\n ]);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds [ooc] to bbcode\n * @example [ooc]content[/ooc]\n */\nexport const ooc = (node) => {\n return toNode(\n \"div\",\n {\n class: \"bb-ooc\",\n },\n node.content,\n );\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [pindent] to bbcode\n * @example [pindent]content[/pindent]\n */\nexport const pindent = (node) => {\n return toNode(\"span\", { class: \"bb-pindent\" }, node.content);\n};\n","/**\n * [plain] bbcode tag that prevents parsing of inner tags\n * @example\n * ```\n * [plain]This is [b]bold[/b] and [i]italic[/i][/plain]\n * ```\n * outputs to\n * ```\n * This is [b]bold[/b] and [i]italic[/i]\n * ```\n */\nexport const plain = (node) => {\n return node.content;\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Add [print] tag\n * @example [print=lined]content[/print]\n */\nexport const print = (node) => {\n const defaultOp = \"print\";\n const printAttr = (preprocessAttr(node)._default || defaultOp).toLowerCase();\n\n const OPTIONS = [\"print\", \"line\", \"graph\", \"parchment\"];\n\n // Default to print if option is not valid\n const printOption = OPTIONS.includes(printAttr) ? printAttr : defaultOp;\n\n return toNode(\n \"div\",\n { class: printOption === defaultOp ? `bb-print` : `bb-print-${printOption}` },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [progress] to bbcode\n * @exmaple [progress=percentageInt]content[/progress]\n */\nexport const progress = (node) => {\n const percentageInt = preprocessAttr(node)._default;\n return toNode(\"div\", { class: \"bb-progress\" }, [\n toNode(\"div\", { class: \"bb-progress-text\" }, node.content),\n toNode(\"div\", { class: \"bb-progress-bar\", style: `width: calc(${percentageInt}% - 6px)` }, \"\"),\n toNode(\"div\", { class: \"bb-progress-bar-other\" }, \"\"),\n ]);\n};\n","import { preprocessAttr } from \"../utils/common\";\n\n/**\n * rebuild the [quote] tag so that markdown-it engine can parse it for itself\n */\nexport const quote = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw);\n if (node.content[0] === \"\\n\") {\n node.content.shift();\n }\n return [`\\n[${node.tag}=\"${attrs._default}\"]\\n\\n`, ...node.content, \"\\n\\n[/quote]\\n\"];\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [thinprogress] to bbcode\n * @exmaple [thinprogress=percentageInt]content[/progthinprogressress]\n */\nexport const thinprogress = (node, options) => {\n const percentageInt = preprocessAttr(node, options.data.raw)._default;\n return toNode(\"div\", { class: \"bb-progress-thin\" }, [\n toNode(\"div\", { class: \"bb-progress-text\" }, node.content),\n toNode(\"div\", { class: \"bb-progress-bar\", style: `width: calc(${percentageInt}% - 6px)` }, \"\"),\n toNode(\"div\", { class: \"bb-progress-bar-other\" }, \"\"),\n ]);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Parse the user provided height and return a valid height value\n * @param {Number} heightValue obtains the input of the user entered height (default is 700)\n * @returns A validated number less than 0.\n */\nfunction parseHeight(heightValue) {\n const maxHeight = 700;\n const parsedHeight =\n heightValue && heightValue.trim() !== \"\" ? heightValue.replace(/[^\\d.]/g, \"\") : 0;\n\n if (parsedHeight && parsedHeight >= 0 && parsedHeight <= maxHeight) {\n return parsedHeight;\n } else {\n // if the value = 0 then nothing will be returned\n return parsedHeight === 0 ? 0 : maxHeight;\n }\n}\n\n/**\n * @file Adds [scroll] to bbcode\n * @example [scroll]content[/scroll]\n */\nexport const scroll = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default;\n const heightInput = parseHeight(attrs);\n return toNode(\"div\", { class: \"bb-scroll\", style: `height: ${heightInput}px` }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const side = (node) => {\n const attrs = preprocessAttr(node)._default || \"left\";\n return toNode(\"div\", { class: \"bb-side\", \"data-side\": attrs }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds subscript to BBCode\n * @example [sub]content[/sub]\n */\n\nconst sub = (node) => {\n return toNode(\"sub\", {}, node.content);\n};\n\nexport { sub };\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds superscript to bbcode\n * @example [sup]content[/sup]\n */\n\nconst sup = (node) => {\n return toNode(\"sup\", {}, node.content);\n};\n\nexport { sup };\n","import { isTagNode } from \"@bbob/plugin-helper\";\nimport {\n generateGUID,\n preprocessAttr,\n toNode,\n toRawTag,\n} from \"../utils/common\";\n\n/**\n * @file Adds [tabs][tab] to bbcode\n * @example [tabs][tab=name 1]content[/tab][tab=name 2]content[/tab][/tabs]\n */\nexport const tabs = (node, options) => {\n const tabsList = node.content.filter(\n (contentNode) => isTagNode(contentNode) && contentNode.tag === \"tab\"\n );\n const groupId = generateGUID();\n tabsList.forEach((tabNode) => {\n tabNode.isValid = true;\n tabNode.groupId = groupId;\n });\n\n if (!tabsList.length) {\n return toRawTag(node, options.data.raw);\n }\n\n tabsList[0].open = true;\n return toNode(\n \"div\",\n {\n class: \"bb-tabs\",\n },\n tabsList\n );\n};\n\n/**\n * [tab=name]content[/tab]\n * [tab name=\"name\" style=\"style\"]content[/tab]\n */\nexport const tab = (node, options) => {\n if (!node.isValid) {\n return toRawTag(node, options.data.raw);\n }\n\n const attrs = preprocessAttr(node, options.data.raw);\n const name = attrs?._default || attrs?.name || \"Tab\";\n const tabId = `tab-${name.replace(/\\W/g, \"_\")}-${generateGUID()}`;\n return [\n toNode(\"input\", {\n type: \"radio\",\n id: tabId,\n name: \"tab-group-\" + node.groupId,\n class: \"bb-tab\",\n checked: node.open,\n }),\n toNode(\n \"label\",\n {\n class: \"bb-tab-label\",\n for: tabId,\n style: attrs.style,\n },\n name\n ),\n toNode(\n \"div\",\n {\n class: \"bb-tab-content\",\n },\n node.content\n ),\n ];\n};\n","/**\n * @file discourse-core-replacement.js\n * This is a dedicated file for replacing the standard Discourse BBCode tags in core.\n * In the markdown-it engine, discourse has added these bbcode tags in the inline parser.\n * However this means that if the parser detects a block level tag inside an inline tag,\n * it will not parse the inline tag.\n *\n * This file is meant to fix such scenarios by doing the parsing of bbcode tags for it.\n *\n * @example\n * [b][h]bold[/h][/b] // this should properly parse the bold tag inside the h tag\n *\n * https://github.com/discourse/discourse/blob/d7ece61252d7671a1f124483836279b99852c08c/app/assets/javascripts/discourse-markdown-it/src/features/bbcode-inline.js\n */\nimport { toNode } from \"../utils/common\";\n\nexport const bold = (node) => {\n return toNode(\"span\", { class: \"bbcode-b\" }, node.content);\n};\n\nexport const italic = (node) => {\n if (node.gen) {\n // node is actually a generated node \"i\" made by another tag\n // don't process it\n return node;\n }\n return toNode(\"span\", { class: \"bbcode-i\" }, node.content);\n};\n\nexport const underline = (node) => {\n return toNode(\"span\", { class: \"bbcode-u\" }, node.content);\n};\n\nexport const strike = (node) => {\n return toNode(\"span\", { class: \"bbcode-s\" }, node.content);\n};\n","import {\n MD_BROKEN_BLOCKQUOTE,\n MD_BROKEN_ORDERED_LIST,\n MD_BROKEN_UNORDERED_LIST,\n MD_NEWLINE_INJECT,\n MD_NEWLINE_INJECT_COMMENT,\n MD_NEWLINE_PRE_INJECT,\n} from \"./common\";\n\n/**\n * Post Processing designed to fix issues with Markdown and BBCode that the parser can't fix.\n *\n * Separate from markdown-it post processing as it'll be able to manipulate the full string.\n * @param {string} raw string from processing through both BBCode and Markdown\n * @returns post processed string\n */\nfunction removeNewlineInjects(raw) {\n const processed = raw\n .replaceAll(MD_NEWLINE_INJECT, \"\")\n .replaceAll(MD_NEWLINE_PRE_INJECT, \"\")\n .replaceAll(\"\\n\" + MD_NEWLINE_INJECT_COMMENT, \"\")\n .replaceAll(MD_NEWLINE_INJECT_COMMENT + \"\\n\", \"\")\n .replaceAll(MD_NEWLINE_INJECT_COMMENT, \"\"); // Remove all instances of the injected newline\n return processed;\n}\n\nfunction cleanMultilineMDBlocks(raw) {\n const processed = raw\n .replaceAll(MD_BROKEN_ORDERED_LIST, \"\")\n .replaceAll(MD_BROKEN_UNORDERED_LIST, \"\")\n .replaceAll(MD_BROKEN_BLOCKQUOTE, \"\");\n return processed;\n}\n\n/**\n * Injects hoisted code blocks back into the raw string\n * @param {string} raw input to inject hoisted code blocks into\n * @param {any} data contains hoist map\n * @returns string with hoisted code blocks injected\n */\nfunction renderHoistedCodeBlocks(raw, data) {\n const hoistMap = data.hoistMap;\n for (const [uuid, content] of Object.entries(hoistMap)) {\n raw = raw.replaceAll(uuid, content);\n }\n return raw;\n}\n\n/**\n * Setups the class style tag template for the post\n * @param {string} raw\n * @param {{styles: string[]}} data - contains styles array\n * @returns string\n */\nfunction createClassStyleTagTemplate(raw, data) {\n if (data.styles.length === 0) {\n return raw;\n }\n const template = '\";\n return template + raw;\n}\n\n/**\n * Setups the script tag template for the post\n * @param {string} raw\n * @param {{\n * bbscripts: {\n * id: string,\n * class: string,\n * on: string,\n * version: string,\n * content: string\n * }[]}} data - contains scripts array\n * @returns string\n */\nfunction createScriptTagTemplate(raw, data) {\n if (data.bbscripts.length === 0) {\n return raw;\n }\n const templates = data.bbscripts.map(\n (s) =>\n ``\n );\n return templates.join(\"\") + raw;\n}\n\n/**\n * Performs post processing on the raw string to address any necessary functionality that BBob/MD can't handle with a plugin (i.e. hoisting).\n * @param {string} raw processed input from after bbob and md\n * @param {any} data from bbob data\n * @returns final processed string\n */\nexport function postprocess(raw, data) {\n let final = raw;\n const postprocessors = [\n removeNewlineInjects,\n createClassStyleTagTemplate,\n createScriptTagTemplate,\n cleanMultilineMDBlocks,\n renderHoistedCodeBlocks,\n ];\n for (const postprocessor of postprocessors) {\n final = postprocessor(final, data);\n }\n return final;\n}\n","import { ESCAPABLES_REGEX, generateGUID, MD_TABLE_REGEX, regexIndexOf } from \"./common\";\n\n/**\n * Find all code blocks and hoist them out of the content and into a map for later insertion\n * @param {string} raw input to preprocess\n * @returns processed string and hoist map\n */\nfunction fenceCodeBlockPreprocess(content, data) {\n /** @type {Object.} */\n const hoistMap = {};\n let index = 0;\n\n const addHoistAndReturnNewStartPoint = (cutOffStart, cutOffEnd, expected, trim = false) => {\n const uuid = generateGUID();\n if (cutOffEnd !== -1) {\n hoistMap[uuid] = content.substring(cutOffStart, cutOffEnd);\n content = content.substring(0, cutOffStart) + uuid + content.substring(cutOffEnd);\n } else {\n hoistMap[uuid] = content.substring(cutOffStart);\n content = content.substring(0, cutOffStart) + uuid + expected;\n }\n if (trim) {\n if (hoistMap[uuid].startsWith(\"\\n\")) {\n hoistMap[uuid] = hoistMap[uuid].substring(1);\n }\n if (hoistMap[uuid].endsWith(\"\\n\")) {\n hoistMap[uuid] = hoistMap[uuid].substring(0, hoistMap[uuid].length - 1);\n }\n }\n return cutOffStart + uuid.length + expected.length;\n };\n\n while ((index = regexIndexOf(content, ESCAPABLES_REGEX, index)) !== -1) {\n const match = ESCAPABLES_REGEX.exec(content.substring(index));\n if (match.groups?.fence) {\n const fence = match.groups.fence;\n const fenceInfo = match.groups.fenceInfo;\n if (content[index] === \"\\n\") {\n // Check if the fence is not at the start of the content\n index += 1;\n }\n const closingFenceRegex = new RegExp(\"\\n\" + fence + \"(\\n|$)\"); // Find the next fence. By commonmark spec, it should be the same fence length and type\n const nextIndex = regexIndexOf(content, closingFenceRegex, index + fence.length);\n\n const uuid = generateGUID();\n if (nextIndex !== -1) {\n hoistMap[uuid] = content.substring(index + fence.length + fenceInfo.length, nextIndex);\n } else {\n hoistMap[uuid] = content.substring(index + fence.length + fenceInfo.length);\n }\n // inject bbcode tag before and after the code block. This is to prevent BBob plugin from injecting newlines\n const replacement = `[saveNL]\\n${fence}${fenceInfo}${uuid}\\n${fence}\\n[/saveNL]`;\n content =\n content.substring(0, index) +\n replacement +\n (nextIndex !== -1 ? content.substring(nextIndex + 1 + fence.length) : \"\");\n index = index + replacement.length;\n } else if (match.groups?.bbcode) {\n const bbcode = match.groups.bbcode;\n const bbcodeTag = match.groups.bbcodeTag.toLowerCase(); // coerce to lowercase for caseinsensitive matching\n const closingTag = `[/${bbcodeTag}]`;\n const nextIndex = content.toLowerCase().indexOf(closingTag, index + 1);\n index = addHoistAndReturnNewStartPoint(index + bbcode.length, nextIndex, closingTag, true);\n } else if (match.groups.backtick) {\n const backtick = match.groups.backtick; // contains whole content\n const tickStart = match.groups.tickStart;\n const tickEnd = match.groups.tickEnd;\n index = addHoistAndReturnNewStartPoint(\n index + tickStart.length,\n index + backtick.length - tickEnd.length,\n tickEnd,\n );\n }\n }\n\n data.hoistMap = hoistMap;\n return [content, data];\n}\n\n/**\n * Find all markdown table blocks and mark them to ignore newlines\n * @param {string} raw input to preprocess\n * @returns processed string\n */\nfunction mdTableBlockPreprocess(content, data) {\n let index = 0;\n while ((index = regexIndexOf(content, MD_TABLE_REGEX, index)) !== -1) {\n const match = MD_TABLE_REGEX.exec(content.substring(index));\n const table = match[0];\n const replacement = `[saveNL]\\n${table}\\n[/saveNL]`;\n content = content.substring(0, index) + replacement + content.substring(index + table.length);\n index = index + replacement.length;\n }\n return [content, data];\n}\n\n/**\n * Preprocesses input to be formatted for bbob to intake. Handles any necessary functionality that BBob can't handle with a plugin (i.e. hoisting).\n * @param {string} raw input to preprocess\n * @returns formatted input for bbob to intake\n */\nexport function preprocessRaw(raw) {\n let data = {};\n const preprocessors = [fenceCodeBlockPreprocess, mdTableBlockPreprocess];\n for (const preprocessor of preprocessors) {\n [raw, data] = preprocessor(raw, data);\n }\n return [raw, data];\n}\n","import bbob from \"@bbob/core\";\nimport { render } from \"@bbob/html\";\nimport { lineBreakPlugin } from \"./plugins/lineBreak\";\nimport { preserveWhitespace } from \"./plugins/preserveWhitespace\";\nimport { removeEmptyLinePlugin } from \"./plugins/removeEmptyLinesInAttr\";\nimport { availableTags, preset, preventParsing } from \"./preset\";\nimport { postprocess } from \"./utils/postprocess\";\nimport { preprocessRaw } from \"./utils/preprocess\";\n\nconst options = {\n onlyAllowTags: [...availableTags],\n caseFreeTags: true,\n contextFreeTags: preventParsing, // prevent parsing of children\n enableEscapeTags: true,\n onError: (err) => {\n if (options.previewing) {\n // eslint-disable-next-line no-console\n console.warn(err.message, err.lineNumber, err.columnNumber);\n }\n },\n};\nconst presetTags = preset();\n\nexport const RpNBBCode = (code, opts) => {\n const plugins = [presetTags];\n if (opts.preserveWhitespace) {\n plugins.push(preserveWhitespace());\n }\n plugins.push(lineBreakPlugin(), removeEmptyLinePlugin);\n const [preprocessed, preprocessedData] = preprocessRaw(code);\n return bbob(plugins).process(preprocessed, {\n render,\n ...options,\n data: {\n ...preprocessedData,\n raw: preprocessed,\n previewing: opts.previewing,\n fonts: new Set(),\n styles: [],\n bbscripts: [],\n },\n });\n};\n\nexport { postprocess };\n","let C1 = 'C1';\nlet C2 = 'C2';\nif (process.env.NODE_ENV !== 'production') {\n C1 = '\"parser\" is not a function, please pass to \"process(input, { parser })\" right function';\n C2 = '\"render\" function not defined, please pass to \"process(input, { render })\"';\n}\nexport { C1, C2 };\n"],"names":["N","TAB","EQ","QUOTEMARK","SPACE","OPEN_BRAKET","CLOSE_BRAKET","SLASH","BACKSLASH","isTagNode","el","isStringNode","isEOL","keysReduce","obj","reduce","def","Object","keys","acc","key","getNodeLength","node","Array","isArray","content","count","contentNode","String","length","escapeAttrValue","value","replace","attrValue","name","JSON","stringify","attrsToString","values","arr","join","getTagAttrs","tag","params","uniqAttr","res","tagAttr","attrs","TagNode","attr","this","append","push","appendToNode","setStart","start","setEnd","end","toTagStart","openTag","closeTag","toTagEnd","toTagNode","newNode","toLowerCase","toString","r","renderContent","tagStart","create","isOf","type","constructor","TOKEN_TYPE_ID","getTokenValue","token","isTagEnd","charCodeAt","Token","isEmpty","isNaN","isText","isTag","isAttrName","isAttrValue","isStart","isEnd","getName","slice","getTagName","getValue","getLine","getColumn","getStart","getEnd","text","tokenToText","row","col","CharGrabber","skip","num","silent","c","pos","o","onSkip","hasNext","len","getCurr","s","getPos","getLength","getRest","substring","getNext","nextPos","getPrev","prevPos","isLast","includes","val","indexOf","grabWhile","condition","grabN","substrUntilChar","char","idx","source","options","createCharGrabber","WHITESPACES","SPECIAL_CHARS","isWhiteSpace","isEscapeChar","unq","str","charToRemove","charAt","trimChar","createLexer","buffer","prevCol","tokenIndex","stateMode","tagMode","contextFreeTag","tokens","Math","floor","escapeTags","enableEscapeTags","contextFreeTags","filter","Boolean","map","caseFreeTags","nestedMap","Map","onToken","RESERVED_CHARS","NOT_CHAR_TOKENS","isCharToken","checkContextFreeMode","isClosingTag","chars","emitToken","startPos","endPos","cl","p","e","createTokenOfType","nextTagState","tagChars","isSingleValueTag","masterStartPos","validAttrName","isValue","stateSpecial","validAttrValue","isQM","prevChar","nextChar","isPrevSLASH","isNextEQ","isWS","isNextWS","isSpecialChar","stateTag","currChar","substr","hasInvalidChars","isNoAttrsInTag","stateAttrs","tagStr","tagGrabber","hasSpace","stateWord","fullTagLen","fullTagName","isEscapableChar","isChar","tokenize","isTokenNested","tokenValue","has","get","status","set","NodeList","last","n","flush","pop","toArray","createList","parse","input","opts","onlyAllowTags","tokenizer","nodes","nestedNodes","tagNodes","tagNodesAttrName","nestedTagsMap","Set","isTagNested","tagName","flushTagNodes","getNodes","lastNestedNode","appendNodeAsString","isNested","forEach","item","appendNodes","handleTagStart","tagNode","from","to","add","handleTag","onError","line","column","lineNumber","columnNumber","handleTagEnd","lexer","createTokenizer","activeTagNode","attrName","handleNode","isObj","iterate","t","cb","tree","same","expected","actual","every","exp","some","call","act","ao","eo","createTree","extendedTree","messages","walk","match","expr","expression","renderNode","stripTags","render","toNode","gen","preprocessAttr","raw","vals","_default","nodeRaw","openTagParts","split","trim","startsWith","endsWith","toOriginalStartTag","toOriginalEndTag","toRawTag","regexIndexOf","string","regex","startpos","search","MD_NEWLINE_INJECT","MD_NEWLINE_PRE_INJECT","MD_NEWLINE_INJECT_COMMENT","URL_REGEX_SINGLE_LINE","RegExp","ESCAPABLES_REGEX","MD_TABLE_REGEX","generateGUID","d","Date","getTime","window","performance","now","random","isString","disableLineBreakConversion","reduceWordsToLines","unshift","child","splice","isWhitespaceSensitive","test","words","rightIdx","findLastIndex","w","i","numSpaces","fromCharCode","repeat","CONSECUTIVE_NEWLINE_REGEX","removeEmptyLinePlugin","process","tags","core","tagCallback","SLIDE_TITLE_OPEN","Symbol","SLIDE_TITLE_CLOSE","SLIDE_CLOSE","SLIDE_REGEX","markerToString","marker","accordionTags","accordion","groupId","markedContent","contentArr","newArr","shift","foundIndex","preContent","postContent","groups","slideTitleOpen","slideTitleClose","slideClose","generateSlideMarkersFromContent","generatedSlides","currentSlide","prevMarker","customTitle","generateSlidesFromMarkers","filteredContent","isValid","data","customSettings","lastValidAlignment","align","width","find","classes","style","class","slide","title","isOpen","open","titleAlign","left","right","center","possibleOptions","alignment","anchor","a","id","goto","href","WEB_FONTS","VALID_FONT_STYLES","thin","extralight","light","regular","medium","semibold","bold","extrabold","black","REGISTERED_AXIS","AXES_REGEX","emailHeader","emailFooter","rowcolumn","columnAttrs","columnStyle","EVENTS","ACCEPTED_OPTIONS","textmessage","messageList","messageNode","recipient","message","option","animation","previewing","commonGUID","commonId","keyframes","ident","cleanContent","replaceAll","formatted","styles","bg","color","block","defaultOp","blockAttr","blockOption","blockquote","author","border","br","centerblock","percentageInput","check","nameAttr","classSuffix","className","selector","mediaQuery","state","minWidth","maxWidth","code","inputColor","comment","div","classAttrs","classNames","divide","fieldset","fa","font","fontFamily","family","axes","ital","wght","matches","exec","italic","weight","named_weight","fromEntries","entries","axesParser","url","sort","googleFontApiBuild","fonts","custom","fontVar","h","h1","h2","h3","h4","h5","h6","heightrestrict","heightInput","heightValue","parsedHeight","parseHeight","highlight","icode","imagefloat","inlinespoiler","justify","keyframe","mail","attributes","mailAttr","mailOption","person","subject","newspaper","nobr","note","ooc","pindent","plain","print","printAttr","printOption","progress","percentageInt","quote","thinprogress","savenl","sh","script","onEvent","on","scriptSetup","version","bbscripts","scroll","side","size","fontSize","fontValue","valid","parsedSize","sizeRanges","unit","parseFontSize","outputAttr","spoiler","providedTitle","sub","sup","tab","tabId","checked","for","tabs","tabsList","tabNode","b","u","availableTags","preset","createPreset","defTags","processor","presetFactory","presetExecutor","assign","extend","callback","removeNewlineInjects","cleanMultilineMDBlocks","renderHoistedCodeBlocks","hoistMap","uuid","createClassStyleTagTemplate","createScriptTagTemplate","fenceCodeBlockPreprocess","index","addHoistAndReturnNewStartPoint","cutOffStart","cutOffEnd","fence","fenceInfo","closingFenceRegex","nextIndex","replacement","bbcode","closingTag","bbcodeTag","backtick","tickStart","tickEnd","mdTableBlockPreprocess","table","err","console","warn","presetTags","plugins","preserveWhitespace","preprocessed","preprocessedData","preprocessors","preprocessor","preprocessRaw","plugs","mockRender","skipParse","parser","parseFn","renderFn","Error","plugin","newTree","html","bbob","final","postprocessors","postprocessor"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,14,65]} \ No newline at end of file +{"version":3,"file":"bbcode-parser.min.js","sources":["../../node_modules/.pnpm/@bbob+plugin-helper@4.2.0/node_modules/@bbob/plugin-helper/es/char.js","../../node_modules/.pnpm/@bbob+plugin-helper@4.2.0/node_modules/@bbob/plugin-helper/es/helpers.js","../../node_modules/.pnpm/@bbob+plugin-helper@4.2.0/node_modules/@bbob/plugin-helper/es/TagNode.js","../../node_modules/.pnpm/@bbob+parser@4.2.0/node_modules/@bbob/parser/es/Token.js","../../node_modules/.pnpm/@bbob+parser@4.2.0/node_modules/@bbob/parser/es/utils.js","../../node_modules/.pnpm/@bbob+parser@4.2.0/node_modules/@bbob/parser/es/lexer.js","../../node_modules/.pnpm/@bbob+parser@4.2.0/node_modules/@bbob/parser/es/parse.js","../../node_modules/.pnpm/@bbob+core@4.2.0/node_modules/@bbob/core/es/utils.js","../../node_modules/.pnpm/@bbob+core@4.2.0/node_modules/@bbob/core/es/index.js","../../node_modules/.pnpm/@bbob+html@4.2.0/node_modules/@bbob/html/es/index.js","../../bbcode-src/utils/common.js","../../bbcode-src/plugins/lineBreak.js","../../bbcode-src/plugins/preserveWhitespace.js","../../bbcode-src/plugins/removeEmptyLinesInAttr.js","../../node_modules/.pnpm/@bbob+preset@4.2.0/node_modules/@bbob/preset/es/preset.js","../../bbcode-src/tags/accordion.js","../../bbcode-src/tags/alignment.js","../../bbcode-src/tags/anchor.js","../../bbcode-src/tags/font.js","../../bbcode-src/tags/heightrestrict.js","../../bbcode-src/tags/mail.js","../../bbcode-src/tags/rowcolumn.js","../../bbcode-src/tags/script.js","../../bbcode-src/tags/size.js","../../bbcode-src/tags/textmessage.js","../../bbcode-src/preset.js","../../bbcode-src/tags/animation.js","../../bbcode-src/tags/background.js","../../bbcode-src/tags/block.js","../../bbcode-src/tags/blockquote.js","../../bbcode-src/tags/border.js","../../bbcode-src/tags/lineBreak.js","../../bbcode-src/tags/centerblock.js","../../bbcode-src/tags/check.js","../../bbcode-src/tags/class.js","../../bbcode-src/tags/code.js","../../bbcode-src/tags/color.js","../../bbcode-src/tags/comment.js","../../bbcode-src/tags/div.js","../../bbcode-src/tags/divide.js","../../bbcode-src/tags/fieldset.js","../../bbcode-src/tags/fontawesome.js","../../bbcode-src/tags/header.js","../../bbcode-src/tags/highlight.js","../../bbcode-src/tags/imagefloat.js","../../bbcode-src/tags/spoiler.js","../../bbcode-src/tags/justify.js","../../bbcode-src/tags/newspaper.js","../../bbcode-src/tags/note.js","../../bbcode-src/tags/ooc.js","../../bbcode-src/tags/pindent.js","../../bbcode-src/tags/plain.js","../../bbcode-src/tags/print.js","../../bbcode-src/tags/progress.js","../../bbcode-src/tags/quote.js","../../bbcode-src/tags/thinprogress.js","../../bbcode-src/tags/scroll.js","../../bbcode-src/tags/side.js","../../bbcode-src/tags/subscript.js","../../bbcode-src/tags/superscript.js","../../bbcode-src/tags/tabs.js","../../bbcode-src/tags/discourse-core-replacement.js","../../bbcode-src/utils/postprocess.js","../../bbcode-src/utils/preprocess.js","../../bbcode-src/index.js","../../node_modules/.pnpm/@bbob+core@4.2.0/node_modules/@bbob/core/es/errors.js"],"sourcesContent":["const N = '\\n';\nconst TAB = '\\t';\nconst F = '\\f';\nconst R = '\\r';\nconst EQ = '=';\nconst QUOTEMARK = '\"';\nconst SPACE = ' ';\nconst OPEN_BRAKET = '[';\nconst CLOSE_BRAKET = ']';\nconst SLASH = '/';\nconst BACKSLASH = '\\\\';\nexport { N, F, R, EQ, TAB, SPACE, SLASH, BACKSLASH, QUOTEMARK, OPEN_BRAKET, CLOSE_BRAKET };\n","import { N } from './char';\nfunction isTagNode(el) {\n return typeof el === 'object' && el !== null && 'tag' in el;\n}\nfunction isStringNode(el) {\n return typeof el === 'string';\n}\n// check string is end of line\nfunction isEOL(el) {\n return el === N;\n}\nfunction keysReduce(obj, reduce, def) {\n const keys = Object.keys(obj);\n return keys.reduce((acc, key)=>reduce(acc, key, obj), def);\n}\nfunction getNodeLength(node) {\n if (isTagNode(node) && Array.isArray(node.content)) {\n return node.content.reduce((count, contentNode)=>{\n return count + getNodeLength(contentNode);\n }, 0);\n }\n if (isStringNode(node)) {\n return String(node).length;\n }\n return 0;\n}\nfunction appendToNode(node, value) {\n if (Array.isArray(node.content)) {\n node.content.push(value);\n }\n}\n/**\n * Replaces \" to &qquot;\n * @param {string} value\n */ function escapeAttrValue(value) {\n return value.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"').replace(/'/g, ''')// eslint-disable-next-line no-script-url\n .replace(/(javascript|data|vbscript):/gi, '$1%3A');\n}\n/**\n * @deprecated use escapeAttrValue\n */ const escapeHTML = escapeAttrValue;\n/**\n * Accept name and value and return valid html5 attribute string\n */ function attrValue(name, value) {\n // in case of performance\n switch(typeof value){\n case 'boolean':\n return value ? `${name}` : '';\n case 'number':\n return `${name}=\"${value}\"`;\n case 'string':\n return `${name}=\"${escapeAttrValue(value)}\"`;\n case 'object':\n return `${name}=\"${escapeAttrValue(JSON.stringify(value))}\"`;\n default:\n return '';\n }\n}\n/**\n * Transforms attrs to html params string\n * @example\n * attrsToString({ 'foo': true, 'bar': bar' }) => 'foo=\"true\" bar=\"bar\"'\n */ function attrsToString(values) {\n // To avoid some malformed attributes\n if (values == null) {\n return '';\n }\n return keysReduce(values, (arr, key, obj)=>[\n ...arr,\n attrValue(key, obj[key])\n ], [\n ''\n ]).join(' ');\n}\n/**\n * Gets value from\n * @example\n * getUniqAttr({ 'foo': true, 'bar': bar' }) => 'bar'\n */ function getUniqAttr(attrs) {\n return keysReduce(attrs || {}, (res, key, obj)=>obj[key] === key ? obj[key] : null, null);\n}\nexport { attrsToString, attrValue, appendToNode, escapeHTML, escapeAttrValue, getNodeLength, getUniqAttr, isTagNode, isStringNode, isEOL };\n","import { OPEN_BRAKET, CLOSE_BRAKET, SLASH } from './char';\nimport { getUniqAttr, getNodeLength, appendToNode, attrsToString, attrValue, isTagNode } from './helpers';\nconst getTagAttrs = (tag, params)=>{\n const uniqAttr = getUniqAttr(params);\n if (uniqAttr) {\n const tagAttr = attrValue(tag, uniqAttr);\n const attrs = {\n ...params\n };\n delete attrs[String(uniqAttr)];\n const attrsStr = attrsToString(attrs);\n return `${tagAttr}${attrsStr}`;\n }\n return `${tag}${attrsToString(params)}`;\n};\nconst renderContent = (content, openTag, closeTag)=>{\n const toString = (node)=>{\n if (isTagNode(node)) {\n return node.toString({\n openTag,\n closeTag\n });\n }\n return String(node);\n };\n if (Array.isArray(content)) {\n return content.reduce((r, node)=>{\n if (node !== null) {\n return r + toString(node);\n }\n return r;\n }, '');\n }\n if (content) {\n return toString(content);\n }\n return null;\n};\nexport class TagNode {\n attr(name, value) {\n if (typeof value !== 'undefined') {\n this.attrs[name] = value;\n }\n return this.attrs[name];\n }\n append(value) {\n return appendToNode(this, value);\n }\n setStart(value) {\n this.start = value;\n }\n setEnd(value) {\n this.end = value;\n }\n get length() {\n return getNodeLength(this);\n }\n toTagStart({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n const tagAttrs = getTagAttrs(String(this.tag), this.attrs);\n return `${openTag}${tagAttrs}${closeTag}`;\n }\n toTagEnd({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n return `${openTag}${SLASH}${this.tag}${closeTag}`;\n }\n toTagNode() {\n const newNode = new TagNode(String(this.tag).toLowerCase(), this.attrs, this.content);\n if (this.start) {\n newNode.setStart(this.start);\n }\n if (this.end) {\n newNode.setEnd(this.end);\n }\n return newNode;\n }\n toString({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n const content = this.content ? renderContent(this.content, openTag, closeTag) : '';\n const tagStart = this.toTagStart({\n openTag,\n closeTag\n });\n if (this.content === null || Array.isArray(this.content) && this.content.length === 0) {\n return tagStart;\n }\n return `${tagStart}${content}${this.toTagEnd({\n openTag,\n closeTag\n })}`;\n }\n static create(tag, attrs = {}, content = null, start) {\n const node = new TagNode(tag, attrs, content);\n if (start) {\n node.setStart(start);\n }\n return node;\n }\n static isOf(node, type) {\n return node.tag === type;\n }\n constructor(tag, attrs, content){\n this.tag = tag;\n this.attrs = attrs;\n this.content = content;\n }\n}\n","import { OPEN_BRAKET, CLOSE_BRAKET, SLASH } from '@bbob/plugin-helper';\n// type, value, line, row, start pos, end pos\nconst TOKEN_TYPE_ID = 't'; // 0;\nconst TOKEN_VALUE_ID = 'v'; // 1;\nconst TOKEN_COLUMN_ID = 'r'; // 2;\nconst TOKEN_LINE_ID = 'l'; // 3;\nconst TOKEN_START_POS_ID = 's'; // 4;\nconst TOKEN_END_POS_ID = 'e'; // 5;\nconst TOKEN_TYPE_WORD = 1; // 'word';\nconst TOKEN_TYPE_TAG = 2; // 'tag';\nconst TOKEN_TYPE_ATTR_NAME = 3; // 'attr-name';\nconst TOKEN_TYPE_ATTR_VALUE = 4; // 'attr-value';\nconst TOKEN_TYPE_SPACE = 5; // 'space';\nconst TOKEN_TYPE_NEW_LINE = 6; // 'new-line';\nconst getTokenValue = (token)=>{\n if (token && typeof token[TOKEN_VALUE_ID] !== 'undefined') {\n return token[TOKEN_VALUE_ID];\n }\n return '';\n};\nconst getTokenLine = (token)=>token && token[TOKEN_LINE_ID] || 0;\nconst getTokenColumn = (token)=>token && token[TOKEN_COLUMN_ID] || 0;\nconst getStartPosition = (token)=>token && token[TOKEN_START_POS_ID] || 0;\nconst getEndPosition = (token)=>token && token[TOKEN_END_POS_ID] || 0;\nconst isTextToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_SPACE || token[TOKEN_TYPE_ID] === TOKEN_TYPE_NEW_LINE || token[TOKEN_TYPE_ID] === TOKEN_TYPE_WORD;\n }\n return false;\n};\nconst isTagToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_TAG;\n }\n return false;\n};\nconst isTagEnd = (token)=>getTokenValue(token).charCodeAt(0) === SLASH.charCodeAt(0);\nconst isTagStart = (token)=>!isTagEnd(token);\nconst isAttrNameToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_NAME;\n }\n return false;\n};\nconst isAttrValueToken = (token)=>{\n if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {\n return token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_VALUE;\n }\n return false;\n};\nconst getTagName = (token)=>{\n const value = getTokenValue(token);\n return isTagEnd(token) ? value.slice(1) : value;\n};\nconst tokenToText = (token, openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET)=>{\n let text = openTag;\n text += getTokenValue(token);\n text += closeTag;\n return text;\n};\n/**\n * @export\n * @class Token\n */ class Token {\n get type() {\n return this[TOKEN_TYPE_ID];\n }\n isEmpty() {\n return this[TOKEN_TYPE_ID] === 0 || isNaN(this[TOKEN_TYPE_ID]);\n }\n isText() {\n return isTextToken(this);\n }\n isTag() {\n return isTagToken(this);\n }\n isAttrName() {\n return isAttrNameToken(this);\n }\n isAttrValue() {\n return isAttrValueToken(this);\n }\n isStart() {\n return isTagStart(this);\n }\n isEnd() {\n return isTagEnd(this);\n }\n getName() {\n return getTagName(this);\n }\n getValue() {\n return getTokenValue(this);\n }\n getLine() {\n return getTokenLine(this);\n }\n getColumn() {\n return getTokenColumn(this);\n }\n getStart() {\n return getStartPosition(this);\n }\n getEnd() {\n return getEndPosition(this);\n }\n toString({ openTag = OPEN_BRAKET, closeTag = CLOSE_BRAKET } = {}) {\n return tokenToText(this, openTag, closeTag);\n }\n constructor(type, value, row = 0, col = 0, start = 0, end = 0){\n this[TOKEN_LINE_ID] = row;\n this[TOKEN_COLUMN_ID] = col;\n this[TOKEN_TYPE_ID] = type || 0;\n this[TOKEN_VALUE_ID] = String(value);\n this[TOKEN_START_POS_ID] = start;\n this[TOKEN_END_POS_ID] = end;\n }\n}\nexport const TYPE_ID = TOKEN_TYPE_ID;\nexport const VALUE_ID = TOKEN_VALUE_ID;\nexport const LINE_ID = TOKEN_LINE_ID;\nexport const COLUMN_ID = TOKEN_COLUMN_ID;\nexport const START_POS_ID = TOKEN_START_POS_ID;\nexport const END_POS_ID = TOKEN_END_POS_ID;\nexport const TYPE_WORD = TOKEN_TYPE_WORD;\nexport const TYPE_TAG = TOKEN_TYPE_TAG;\nexport const TYPE_ATTR_NAME = TOKEN_TYPE_ATTR_NAME;\nexport const TYPE_ATTR_VALUE = TOKEN_TYPE_ATTR_VALUE;\nexport const TYPE_SPACE = TOKEN_TYPE_SPACE;\nexport const TYPE_NEW_LINE = TOKEN_TYPE_NEW_LINE;\nexport { Token };\nexport default Token;\n","import { QUOTEMARK, BACKSLASH } from '@bbob/plugin-helper';\nexport class CharGrabber {\n skip(num = 1, silent) {\n this.c.pos += num;\n if (this.o && this.o.onSkip && !silent) {\n this.o.onSkip();\n }\n }\n hasNext() {\n return this.c.len > this.c.pos;\n }\n getCurr() {\n if (typeof this.s[this.c.pos] === 'undefined') {\n return '';\n }\n return this.s[this.c.pos];\n }\n getPos() {\n return this.c.pos;\n }\n getLength() {\n return this.c.len;\n }\n getRest() {\n return this.s.substring(this.c.pos);\n }\n getNext() {\n const nextPos = this.c.pos + 1;\n return nextPos <= this.s.length - 1 ? this.s[nextPos] : null;\n }\n getPrev() {\n const prevPos = this.c.pos - 1;\n if (typeof this.s[prevPos] === 'undefined') {\n return null;\n }\n return this.s[prevPos];\n }\n isLast() {\n return this.c.pos === this.c.len;\n }\n includes(val) {\n return this.s.indexOf(val, this.c.pos) >= 0;\n }\n grabWhile(condition, silent) {\n let start = 0;\n if (this.hasNext()) {\n start = this.c.pos;\n while(this.hasNext() && condition(this.getCurr())){\n this.skip(1, silent);\n }\n }\n return this.s.substring(start, this.c.pos);\n }\n grabN(num = 0) {\n return this.s.substring(this.c.pos, this.c.pos + num);\n }\n /**\n * Grabs rest of string until it find a char\n */ substrUntilChar(char) {\n const { pos } = this.c;\n const idx = this.s.indexOf(char, pos);\n return idx >= 0 ? this.s.substring(pos, idx) : '';\n }\n constructor(source, options = {}){\n this.s = source;\n this.c = {\n pos: 0,\n len: source.length\n };\n this.o = options;\n }\n}\n/**\n * Creates a grabber wrapper for source string, that helps to iterate over string char by char\n */ export const createCharGrabber = (source, options)=>new CharGrabber(source, options);\n/**\n * Trims string from start and end by char\n * @example\n * trimChar('*hello*', '*') ==> 'hello'\n */ export const trimChar = (str, charToRemove)=>{\n while(str.charAt(0) === charToRemove){\n // eslint-disable-next-line no-param-reassign\n str = str.substring(1);\n }\n while(str.charAt(str.length - 1) === charToRemove){\n // eslint-disable-next-line no-param-reassign\n str = str.substring(0, str.length - 1);\n }\n return str;\n};\n/**\n * Unquotes \\\" to \"\n */ export const unquote = (str)=>str.replace(BACKSLASH + QUOTEMARK, QUOTEMARK);\n","/* eslint-disable no-plusplus,no-param-reassign */ import { OPEN_BRAKET, CLOSE_BRAKET, QUOTEMARK, BACKSLASH, SLASH, SPACE, TAB, EQ, N } from '@bbob/plugin-helper';\nimport { Token, TYPE_ATTR_NAME, TYPE_ATTR_VALUE, TYPE_NEW_LINE, TYPE_SPACE, TYPE_TAG, TYPE_WORD } from './Token';\nimport { createCharGrabber, trimChar, unquote } from './utils';\n// for cases \nconst EM = '!';\nexport function createTokenOfType(type, value, r = 0, cl = 0, p = 0, e = 0) {\n return new Token(type, value, r, cl, p, e);\n}\nconst STATE_WORD = 0;\nconst STATE_TAG = 1;\nconst STATE_TAG_ATTRS = 2;\nconst TAG_STATE_NAME = 0;\nconst TAG_STATE_ATTR = 1;\nconst TAG_STATE_VALUE = 2;\nconst WHITESPACES = [\n SPACE,\n TAB\n];\nconst SPECIAL_CHARS = [\n EQ,\n SPACE,\n TAB\n];\nconst END_POS_OFFSET = 2; // length + start position offset\nconst isWhiteSpace = (char)=>WHITESPACES.indexOf(char) >= 0;\nconst isEscapeChar = (char)=>char === BACKSLASH;\nconst isSpecialChar = (char)=>SPECIAL_CHARS.indexOf(char) >= 0;\nconst isNewLine = (char)=>char === N;\nconst unq = (val)=>unquote(trimChar(val, QUOTEMARK));\nexport function createLexer(buffer, options = {}) {\n let row = 0;\n let prevCol = 0;\n let col = 0;\n let tokenIndex = -1;\n let stateMode = STATE_WORD;\n let tagMode = TAG_STATE_NAME;\n let contextFreeTag = '';\n const tokens = new Array(Math.floor(buffer.length));\n const openTag = options.openTag || OPEN_BRAKET;\n const closeTag = options.closeTag || CLOSE_BRAKET;\n const escapeTags = !!options.enableEscapeTags;\n const contextFreeTags = (options.contextFreeTags || []).filter(Boolean).map((tag)=>tag.toLowerCase());\n const caseFreeTags = options.caseFreeTags || false;\n const nestedMap = new Map();\n const onToken = options.onToken || (()=>{});\n const RESERVED_CHARS = [\n closeTag,\n openTag,\n QUOTEMARK,\n BACKSLASH,\n SPACE,\n TAB,\n EQ,\n N,\n EM\n ];\n const NOT_CHAR_TOKENS = [\n openTag,\n SPACE,\n TAB,\n N\n ];\n const isCharReserved = (char)=>RESERVED_CHARS.indexOf(char) >= 0;\n const isCharToken = (char)=>NOT_CHAR_TOKENS.indexOf(char) === -1;\n const isEscapableChar = (char)=>char === openTag || char === closeTag || char === BACKSLASH;\n const onSkip = ()=>{\n col++;\n };\n const checkContextFreeMode = (name, isClosingTag)=>{\n if (contextFreeTag !== '' && isClosingTag) {\n contextFreeTag = '';\n }\n if (contextFreeTag === '' && contextFreeTags.includes(name.toLowerCase())) {\n contextFreeTag = name;\n }\n };\n const chars = createCharGrabber(buffer, {\n onSkip\n });\n /**\n * Emits newly created token to subscriber\n */ function emitToken(type, value, startPos, endPos) {\n const token = createTokenOfType(type, value, row, prevCol, startPos, endPos);\n onToken(token);\n prevCol = col;\n tokenIndex += 1;\n tokens[tokenIndex] = token;\n }\n function nextTagState(tagChars, isSingleValueTag, masterStartPos) {\n if (tagMode === TAG_STATE_ATTR) {\n const validAttrName = (char)=>!(char === EQ || isWhiteSpace(char));\n const name = tagChars.grabWhile(validAttrName);\n const isEnd = tagChars.isLast();\n const isValue = tagChars.getCurr() !== EQ;\n tagChars.skip();\n if (isEnd || isValue) {\n emitToken(TYPE_ATTR_VALUE, unq(name));\n } else {\n emitToken(TYPE_ATTR_NAME, name);\n }\n if (isEnd) {\n return TAG_STATE_NAME;\n }\n if (isValue) {\n return TAG_STATE_ATTR;\n }\n return TAG_STATE_VALUE;\n }\n if (tagMode === TAG_STATE_VALUE) {\n let stateSpecial = false;\n const validAttrValue = (char)=>{\n // const isEQ = char === EQ;\n const isQM = char === QUOTEMARK;\n const prevChar = tagChars.getPrev();\n const nextChar = tagChars.getNext();\n const isPrevSLASH = prevChar === BACKSLASH;\n const isNextEQ = nextChar === EQ;\n const isWS = isWhiteSpace(char);\n // const isPrevWS = isWhiteSpace(prevChar);\n const isNextWS = nextChar && isWhiteSpace(nextChar);\n if (stateSpecial && isSpecialChar(char)) {\n return true;\n }\n if (isQM && !isPrevSLASH) {\n stateSpecial = !stateSpecial;\n if (!stateSpecial && !(isNextEQ || isNextWS)) {\n return false;\n }\n }\n if (!isSingleValueTag) {\n return !isWS;\n // return (isEQ || isWS) === false;\n }\n return true;\n };\n const name = tagChars.grabWhile(validAttrValue);\n tagChars.skip();\n emitToken(TYPE_ATTR_VALUE, unq(name));\n if (tagChars.getPrev() === QUOTEMARK) {\n prevCol++;\n }\n if (tagChars.isLast()) {\n return TAG_STATE_NAME;\n }\n return TAG_STATE_ATTR;\n }\n const start = masterStartPos + tagChars.getPos() - 1;\n const validName = (char)=>!(char === EQ || isWhiteSpace(char) || tagChars.isLast());\n const name = tagChars.grabWhile(validName);\n emitToken(TYPE_TAG, name, start, masterStartPos + tagChars.getLength() + 1);\n checkContextFreeMode(name);\n tagChars.skip();\n prevCol++;\n // in cases when we has [url=someval]GET[/url] and we dont need to parse all\n if (isSingleValueTag) {\n return TAG_STATE_VALUE;\n }\n const hasEQ = tagChars.includes(EQ);\n return hasEQ ? TAG_STATE_ATTR : TAG_STATE_VALUE;\n }\n function stateTag() {\n const currChar = chars.getCurr();\n const nextChar = chars.getNext();\n chars.skip();\n // detect case where we have '[My word [tag][/tag]' or we have '[My last line word'\n const substr = chars.substrUntilChar(closeTag);\n const hasInvalidChars = substr.length === 0 || substr.indexOf(openTag) >= 0;\n if (nextChar && isCharReserved(nextChar) || hasInvalidChars || chars.isLast()) {\n emitToken(TYPE_WORD, currChar);\n return STATE_WORD;\n }\n // [myTag ]\n const isNoAttrsInTag = substr.indexOf(EQ) === -1;\n // [/myTag]\n const isClosingTag = substr[0] === SLASH;\n if (isNoAttrsInTag || isClosingTag) {\n const startPos = chars.getPos() - 1;\n const name = chars.grabWhile((char)=>char !== closeTag);\n const endPos = startPos + name.length + END_POS_OFFSET;\n chars.skip(); // skip closeTag\n emitToken(TYPE_TAG, name, startPos, endPos);\n checkContextFreeMode(name, isClosingTag);\n return STATE_WORD;\n }\n return STATE_TAG_ATTRS;\n }\n function stateAttrs() {\n const startPos = chars.getPos();\n const silent = true;\n const tagStr = chars.grabWhile((char)=>char !== closeTag, silent);\n const tagGrabber = createCharGrabber(tagStr, {\n onSkip\n });\n const hasSpace = tagGrabber.includes(SPACE);\n tagMode = TAG_STATE_NAME;\n while(tagGrabber.hasNext()){\n tagMode = nextTagState(tagGrabber, !hasSpace, startPos);\n }\n chars.skip(); // skip closeTag\n return STATE_WORD;\n }\n function stateWord() {\n if (isNewLine(chars.getCurr())) {\n emitToken(TYPE_NEW_LINE, chars.getCurr());\n chars.skip();\n col = 0;\n prevCol = 0;\n row++;\n return STATE_WORD;\n }\n if (isWhiteSpace(chars.getCurr())) {\n const word = chars.grabWhile(isWhiteSpace);\n emitToken(TYPE_SPACE, word);\n return STATE_WORD;\n }\n if (chars.getCurr() === openTag) {\n if (contextFreeTag) {\n const fullTagLen = openTag.length + SLASH.length + contextFreeTag.length;\n const fullTagName = `${openTag}${SLASH}${contextFreeTag}`;\n const foundTag = chars.grabN(fullTagLen);\n const isEndContextFreeMode = foundTag === fullTagName;\n if (isEndContextFreeMode) {\n return STATE_TAG;\n }\n } else if (chars.includes(closeTag)) {\n return STATE_TAG;\n }\n emitToken(TYPE_WORD, chars.getCurr());\n chars.skip();\n prevCol++;\n return STATE_WORD;\n }\n if (escapeTags) {\n if (isEscapeChar(chars.getCurr())) {\n const currChar = chars.getCurr();\n const nextChar = chars.getNext();\n chars.skip(); // skip the \\ without emitting anything\n if (nextChar && isEscapableChar(nextChar)) {\n chars.skip(); // skip past the [, ] or \\ as well\n emitToken(TYPE_WORD, nextChar);\n return STATE_WORD;\n }\n emitToken(TYPE_WORD, currChar);\n return STATE_WORD;\n }\n const isChar = (char)=>isCharToken(char) && !isEscapeChar(char);\n const word = chars.grabWhile(isChar);\n emitToken(TYPE_WORD, word);\n return STATE_WORD;\n }\n const word = chars.grabWhile(isCharToken);\n emitToken(TYPE_WORD, word);\n return STATE_WORD;\n }\n function tokenize() {\n stateMode = STATE_WORD;\n while(chars.hasNext()){\n switch(stateMode){\n case STATE_TAG:\n stateMode = stateTag();\n break;\n case STATE_TAG_ATTRS:\n stateMode = stateAttrs();\n break;\n case STATE_WORD:\n default:\n stateMode = stateWord();\n break;\n }\n }\n tokens.length = tokenIndex + 1;\n return tokens;\n }\n function isTokenNested(tokenValue) {\n const value = openTag + SLASH + tokenValue;\n if (nestedMap.has(value)) {\n return !!nestedMap.get(value);\n } else {\n const status = caseFreeTags ? buffer.toLowerCase().indexOf(value.toLowerCase()) > -1 : buffer.indexOf(value) > -1;\n nestedMap.set(value, status);\n return status;\n }\n }\n return {\n tokenize,\n isTokenNested\n };\n}\n","import { CLOSE_BRAKET, OPEN_BRAKET, TagNode, isTagNode } from \"@bbob/plugin-helper\";\nimport { createLexer } from \"./lexer\";\nclass NodeList {\n last() {\n if (Array.isArray(this.n) && this.n.length > 0 && typeof this.n[this.n.length - 1] !== \"undefined\") {\n return this.n[this.n.length - 1];\n }\n return null;\n }\n flush() {\n return this.n.length ? this.n.pop() : false;\n }\n push(value) {\n this.n.push(value);\n }\n toArray() {\n return this.n;\n }\n constructor(){\n this.n = [];\n }\n}\nconst createList = ()=>new NodeList();\nfunction parse(input, opts = {}) {\n const options = opts;\n const openTag = options.openTag || OPEN_BRAKET;\n const closeTag = options.closeTag || CLOSE_BRAKET;\n const onlyAllowTags = (options.onlyAllowTags || []).filter(Boolean).map((tag)=>tag.toLowerCase());\n const caseFreeTags = options.caseFreeTags || false;\n let tokenizer = null;\n /**\n * Result AST of nodes\n * @private\n * @type {NodeList}\n */ const nodes = createList();\n /**\n * Temp buffer of nodes that's nested to another node\n * @private\n */ const nestedNodes = createList();\n /**\n * Temp buffer of nodes [tag..]...[/tag]\n * @private\n * @type {NodeList}\n */ const tagNodes = createList();\n /**\n * Temp buffer of tag attributes\n * @private\n * @type {NodeList}\n */ const tagNodesAttrName = createList();\n /**\n * Cache for nested tags checks\n */ const nestedTagsMap = new Set();\n function isTokenNested(token) {\n const tokenValue = token.getValue();\n const value = caseFreeTags ? tokenValue.toLowerCase() : tokenValue;\n const { isTokenNested } = tokenizer || {};\n if (!nestedTagsMap.has(value) && isTokenNested && isTokenNested(value)) {\n nestedTagsMap.add(value);\n return true;\n }\n return nestedTagsMap.has(value);\n }\n /**\n * @private\n */ function isTagNested(tagName) {\n return Boolean(nestedTagsMap.has(caseFreeTags ? tagName.toLowerCase() : tagName));\n }\n /**\n * @private\n */ function isAllowedTag(value) {\n if (onlyAllowTags.length) {\n return onlyAllowTags.indexOf(value.toLowerCase()) >= 0;\n }\n return true;\n }\n /**\n * Flushes temp tag nodes and its attributes buffers\n * @private\n */ function flushTagNodes() {\n if (tagNodes.flush()) {\n tagNodesAttrName.flush();\n }\n }\n /**\n * @private\n */ function getNodes() {\n const lastNestedNode = nestedNodes.last();\n if (lastNestedNode && isTagNode(lastNestedNode)) {\n return lastNestedNode.content;\n }\n return nodes.toArray();\n }\n /**\n * @private\n */ function appendNodeAsString(nodes, node, isNested = true) {\n if (Array.isArray(nodes) && typeof node !== \"undefined\") {\n nodes.push(node.toTagStart({\n openTag,\n closeTag\n }));\n if (Array.isArray(node.content) && node.content.length) {\n node.content.forEach((item)=>{\n nodes.push(item);\n });\n if (isNested) {\n nodes.push(node.toTagEnd({\n openTag,\n closeTag\n }));\n }\n }\n }\n }\n /**\n * @private\n */ function appendNodes(nodes, node) {\n if (Array.isArray(nodes) && typeof node !== \"undefined\") {\n if (isTagNode(node)) {\n if (isAllowedTag(node.tag)) {\n nodes.push(node.toTagNode());\n } else {\n appendNodeAsString(nodes, node);\n }\n } else {\n nodes.push(node);\n }\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleTagStart(token) {\n flushTagNodes();\n const tagNode = TagNode.create(token.getValue(), {}, [], {\n from: token.getStart(),\n to: token.getEnd()\n });\n const isNested = isTokenNested(token);\n tagNodes.push(tagNode);\n if (isNested) {\n nestedNodes.push(tagNode);\n } else {\n const nodes = getNodes();\n appendNodes(nodes, tagNode);\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleTagEnd(token) {\n const tagName = token.getValue().slice(1);\n const lastNestedNode = nestedNodes.flush();\n flushTagNodes();\n if (lastNestedNode) {\n const nodes = getNodes();\n if (isTagNode(lastNestedNode)) {\n lastNestedNode.setEnd({\n from: token.getStart(),\n to: token.getEnd()\n });\n }\n appendNodes(nodes, lastNestedNode);\n } else if (!isTagNested(tagName)) {\n const nodes = getNodes();\n appendNodes(nodes, token.toString({\n openTag,\n closeTag\n }));\n } else if (typeof options.onError === \"function\") {\n const tag = token.getValue();\n const line = token.getLine();\n const column = token.getColumn();\n options.onError({\n tagName: tag,\n lineNumber: line,\n columnNumber: column\n });\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleTag(token) {\n // [tag]\n if (token.isStart()) {\n handleTagStart(token);\n }\n // [/tag]\n if (token.isEnd()) {\n handleTagEnd(token);\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function handleNode(token) {\n /**\n * @type {TagNode}\n */ const activeTagNode = tagNodes.last();\n const tokenValue = token.getValue();\n const isNested = isTagNested(token.toString());\n const nodes = getNodes();\n if (activeTagNode !== null) {\n if (token.isAttrName()) {\n tagNodesAttrName.push(tokenValue);\n const attrName = tagNodesAttrName.last();\n if (attrName) {\n activeTagNode.attr(attrName, \"\");\n }\n } else if (token.isAttrValue()) {\n const attrName = tagNodesAttrName.last();\n if (attrName) {\n activeTagNode.attr(attrName, tokenValue);\n tagNodesAttrName.flush();\n } else {\n activeTagNode.attr(tokenValue, tokenValue);\n }\n } else if (token.isText()) {\n if (isNested) {\n activeTagNode.append(tokenValue);\n } else {\n appendNodes(nodes, tokenValue);\n }\n } else if (token.isTag()) {\n // if tag is not allowed, just pass it as is\n appendNodes(nodes, token.toString({\n openTag,\n closeTag\n }));\n }\n } else if (token.isText()) {\n appendNodes(nodes, tokenValue);\n } else if (token.isTag()) {\n // if tag is not allowed, just pass it as is\n appendNodes(nodes, token.toString({\n openTag,\n closeTag\n }));\n }\n }\n /**\n * @private\n * @param {Token} token\n */ function onToken(token) {\n if (token.isTag()) {\n handleTag(token);\n } else {\n handleNode(token);\n }\n }\n const lexer = opts.createTokenizer ? opts.createTokenizer : createLexer;\n tokenizer = lexer(input, {\n onToken,\n openTag,\n closeTag,\n onlyAllowTags: options.onlyAllowTags,\n contextFreeTags: options.contextFreeTags,\n caseFreeTags: options.caseFreeTags,\n enableEscapeTags: options.enableEscapeTags\n });\n // eslint-disable-next-line no-unused-vars\n const tokens = tokenizer.tokenize();\n // handles situations where we open tag, but forgot close them\n // for ex [q]test[/q][u]some[/u][q]some [u]some[/u] // forgot to close [/q]\n // so we need to flush nested content to nodes array\n const lastNestedNode = nestedNodes.flush();\n if (lastNestedNode !== null && lastNestedNode && isTagNode(lastNestedNode) && isTagNested(lastNestedNode.tag)) {\n appendNodeAsString(getNodes(), lastNestedNode, false);\n }\n return nodes.toArray();\n}\nexport { parse };\nexport default parse;\n","/* eslint-disable no-plusplus */ const isObj = (value)=>typeof value === 'object' && value !== null;\nconst isBool = (value)=>typeof value === 'boolean';\nexport function iterate(t, cb) {\n const tree = t;\n if (Array.isArray(tree)) {\n for(let idx = 0; idx < tree.length; idx++){\n tree[idx] = iterate(cb(tree[idx]), cb);\n }\n } else if (isObj(tree) && 'content' in tree) {\n iterate(tree.content, cb);\n }\n return tree;\n}\nexport function same(expected, actual) {\n if (typeof expected !== typeof actual) {\n return false;\n }\n if (!isObj(expected) || expected === null) {\n return expected === actual;\n }\n if (Array.isArray(expected)) {\n return expected.every((exp)=>[].some.call(actual, (act)=>same(exp, act)));\n }\n if (isObj(expected) && isObj(actual)) {\n return Object.keys(expected).every((key)=>{\n const ao = actual[key];\n const eo = expected[key];\n if (isObj(eo) && isObj(ao)) {\n return same(eo, ao);\n }\n if (isBool(eo)) {\n return eo !== (ao === null);\n }\n return ao === eo;\n });\n }\n return false;\n}\nexport function match(t, expression, cb) {\n if (Array.isArray(expression)) {\n return iterate(t, (node)=>{\n for(let idx = 0; idx < expression.length; idx++){\n if (same(expression[idx], node)) {\n return cb(node);\n }\n }\n return node;\n });\n }\n return iterate(t, (node)=>same(expression, node) ? cb(node) : node);\n}\n","import { parse } from '@bbob/parser';\nimport { iterate, match } from './utils';\nimport { C1, C2 } from './errors';\nexport function createTree(tree, options) {\n const extendedTree = tree;\n extendedTree.messages = [\n ...extendedTree.messages || []\n ];\n extendedTree.options = {\n ...options,\n ...extendedTree.options\n };\n extendedTree.walk = function walkNodes(cb) {\n return iterate(this, cb);\n };\n extendedTree.match = function matchNodes(expr, cb) {\n return match(this, expr, cb);\n };\n return extendedTree;\n}\nexport default function bbob(plugs) {\n const plugins = typeof plugs === 'function' ? [\n plugs\n ] : plugs || [];\n const mockRender = ()=>\"\";\n return {\n process (input, opts) {\n const options = opts || {\n skipParse: false,\n parser: parse,\n render: mockRender,\n data: null\n };\n const parseFn = options.parser || parse;\n const renderFn = options.render;\n const data = options.data || null;\n if (typeof parseFn !== 'function') {\n throw new Error(C1);\n }\n // raw tree before modification with plugins\n const raw = options.skipParse && Array.isArray(input) ? input : parseFn(input, options);\n let tree = options.skipParse && Array.isArray(input) ? createTree(input || [], options) : createTree(raw, options);\n for(let idx = 0; idx < plugins.length; idx++){\n const plugin = plugins[idx];\n if (typeof plugin === 'function' && renderFn) {\n const newTree = plugin(tree, {\n parse: parseFn,\n render: renderFn,\n iterate,\n data\n });\n tree = createTree(newTree || tree, options);\n }\n }\n return {\n get html () {\n if (typeof renderFn !== 'function') {\n throw new Error(C2);\n }\n return renderFn(tree, tree.options);\n },\n tree,\n raw,\n messages: tree.messages\n };\n }\n };\n}\n","import core from '@bbob/core';\nimport { attrsToString, isTagNode } from '@bbob/plugin-helper';\nconst SELFCLOSE_END_TAG = '/>';\nconst CLOSE_START_TAG = '';\nfunction renderNode(node, options) {\n const { stripTags = false } = options || {};\n if (typeof node === 'undefined' || node === null) {\n return '';\n }\n if (typeof node === 'string' || typeof node === 'number') {\n return String(node);\n }\n if (Array.isArray(node)) {\n return render(node, options);\n }\n if (isTagNode(node)) {\n if (stripTags) {\n return render(node.content, options);\n }\n const attrs = attrsToString(node.attrs);\n if (node.content === null) {\n return START_TAG + node.tag + attrs + SELFCLOSE_END_TAG;\n }\n return START_TAG + node.tag + attrs + END_TAG + render(node.content, options) + CLOSE_START_TAG + node.tag + END_TAG;\n }\n return '';\n}\nexport function render(nodes, options) {\n if (nodes && Array.isArray(nodes)) {\n return nodes.reduce((r, node)=>r + renderNode(node, options), '');\n }\n if (nodes) {\n return renderNode(nodes, options);\n }\n return '';\n}\nexport function html(source, plugins, options) {\n return core(plugins).process(source, {\n ...options,\n render: render\n }).html;\n}\nexport default html;\n","/**\n * Generate the node object.\n *\n * Contains additional logic to help break any unintended side effects of the top down parsing of bbob.\n * @param {string} tag name of the tag\n * @param {Object} attrs attributes of the tag\n * @param {any} content contents of the tag. `[]` will create an empty tag. `null` will create a self closing tag\n *\n * @example\n * ```\n * toNode(\"div\", { class: \"class\" }, \"content\")\n * ```\n * becomes\n * ```\n * {\n * tag: \"div\",\n * attrs: { class: \"class\" },\n * content: \"content\",\n * gen: true,\n * }\n */\nconst toNode = (tag, attrs, content = []) => ({\n tag,\n attrs,\n content,\n gen: true,\n});\n\n/**\n * Preprocess attributes of a node to either return the default single attribute\n * or return a keyed attribute list\n * @param {import('@bbob/types').TagNode} node bbcode node to process\n * @param {string} [raw] raw string. Only include if the single attribute is allowed to have spaces\n * @returns processed attributes\n */\nconst preprocessAttr = (node, raw) => {\n const keys = Object.keys(node.attrs).join(\" \");\n const vals = Object.values(node.attrs).join(\" \");\n if (keys !== vals) {\n // [tag key=val]\n return node.attrs;\n }\n if (!raw || !node.start) {\n return {\n _default: vals,\n };\n }\n // [tag=attr]\n // node.start.from = 0\n // node.start.to = 10\n const nodeRaw = raw.substring(node.start.from, node.start.to);\n if (!nodeRaw.includes(\"=\")) {\n // [tag] or [tag attr]\n return node.attrs;\n }\n const openTagParts = nodeRaw.split(\"=\");\n if (openTagParts.length !== 2) {\n return node.attrs;\n }\n let val = openTagParts[1].slice(0, -1).trim(); // `attr` or `\"attr\"`\n if (val.startsWith('\"') && val.endsWith('\"')) {\n val = val.slice(1, -1);\n }\n return {\n _default: val,\n };\n};\n\n/**\n * Attempts to return tag into its original form with proper attributes\n * @returns string of tag start\n */\nconst toOriginalStartTag = (node, raw) => {\n if (node.start) {\n return raw.substring(node.start.from, node.start.to);\n }\n if (!node.attrs) {\n return `[${node.tag}]`;\n }\n const attrs = preprocessAttr(node, raw);\n if (attrs._default) {\n return `[${node.tag}=${attrs._default}]`;\n } else {\n return node.toTagStart();\n }\n};\n\n/**\n * Attempts to return tag into its original form\n * @returns string of tag end\n */\nconst toOriginalEndTag = (node, raw) => {\n if (node.end) {\n return raw.substring(node.end.from, node.end.to);\n }\n return node.toTagEnd();\n};\n\n/**\n * Attempts to convert a node to a Markdown URL-embed-safe raw tag.\n *\n * Depending on the input node, the result is either:\n * - A single raw tag string if no end node is present\n * - Or an array of such strings if an end node is present\n * @returns {(string|string[])} - A Markdown URL-embed-safe raw tag or an array of tags.\n */\nconst toRawTag = (node, raw) => {\n if (node.end) {\n return [toOriginalStartTag(node, raw), ...node.content, toOriginalEndTag(node, raw)];\n }\n return toOriginalStartTag(node, raw);\n};\n\n/**\n * Given a string, find the first position of a regex match\n * @param {string} string to test against\n * @param {RegExp} regex to test with\n * @param {number} startpos starting position. Defaults to 0\n * @returns index of the first match of the regex in the string\n */\nconst regexIndexOf = (string, regex, startpos) => {\n const indexOf = string.substring(startpos || 0).search(regex);\n return indexOf >= 0 ? indexOf + (startpos || 0) : indexOf;\n};\n\nconst MD_NEWLINE_INJECT = \"\\n\\n\";\nconst MD_NEWLINE_PRE_INJECT = \"\\n\\n\";\nconst MD_NEWLINE_INJECT_COMMENT = \"\";\n\nconst URL_REGEX =\n /(http|ftp|https|upload):\\/\\/([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])/;\nconst MD_URL_REGEX =\n /\\!?\\[.*\\]\\((http|ftp|https|upload):\\/\\/([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])\\)/;\nconst URL_REGEX_SINGLE_LINE = new RegExp(`^${URL_REGEX.source}|${MD_URL_REGEX.source}$`);\n// Both ends of an inline-code delimiter must be whole backtick runs. In\n// particular, never retry shorter openers from inside an unmatched long run.\nconst ESCAPABLES_REGEX =\n /((\\n|^)(?```+|~~~+)(?.*\\n))|(?\\[(?i?code|plain)(=[^\\]\\r\\n]*)?\\])|(?(?`+)(?!`)([\\s\\S]*?)(?(?)(?!`))/im;\nconst MD_TABLE_REGEX = /^(\\|[^\\n]+\\|\\r?\\n)((?:\\| ?:?[-]+:? ?)+\\|)(\\n(?:\\|[^\\n]+\\|\\r?\\n?)*)?$/m;\n\nconst MD_BROKEN_ORDERED_LIST = \"
\\n
    \";\nconst MD_BROKEN_UNORDERED_LIST = \"\\n
      \";\nconst MD_BROKEN_BLOCKQUOTE = \"\\n
      \";\n\n/**\n * Generates a random GUID.\n *\n * Mini Racer doesn't have the crypto module, so we can't use the built-in `crypto.randomUUID` function.\n * @returns {string} a GUID\n */\nfunction generateGUID() {\n let d = new Date().getTime();\n if (window.performance && typeof window.performance.now === \"function\") {\n d += performance.now(); //use high-precision timer if available\n }\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n // eslint-disable-next-line no-bitwise\n const r = ((d + Math.random() * 16) % 16) | 0;\n d = Math.floor(d / 16);\n // eslint-disable-next-line no-bitwise\n return (c === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n\nexport {\n toNode,\n toOriginalStartTag,\n toOriginalEndTag,\n toRawTag,\n generateGUID,\n preprocessAttr,\n regexIndexOf,\n MD_NEWLINE_INJECT,\n MD_NEWLINE_INJECT_COMMENT,\n MD_NEWLINE_PRE_INJECT,\n URL_REGEX,\n MD_URL_REGEX,\n MD_TABLE_REGEX,\n URL_REGEX_SINGLE_LINE,\n ESCAPABLES_REGEX,\n MD_BROKEN_ORDERED_LIST,\n MD_BROKEN_UNORDERED_LIST,\n MD_BROKEN_BLOCKQUOTE,\n};\n","/**\n * Plugin that converts line breaks to `
      ` tags.\n * To use, put as function similar to the presets.\n *\n * If a node is marked with `noLineBreakConversion`, then it'll skip the parsing the children\n *\n * @example\n * ```ts\n * const output = bbob([preset(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n */\nimport { isEOL } from \"@bbob/plugin-helper\";\nimport { MD_NEWLINE_INJECT, MD_NEWLINE_PRE_INJECT, URL_REGEX_SINGLE_LINE } from \"../utils/common\";\n\nconst isObj = (value) => typeof value === \"object\";\nconst isString = (value) => typeof value === \"string\";\n\n/**\n * Walks the tree of nodes. Will add `br` tag to all `\\n` in format that can be used in any renderer.\n * Preserves \\n so that markdown-it doesn't try to treat everything like a block\n *\n * If a node has the property noLineBreakConversion is encountered, will skip parsing children.\n * @param t tree of nodes to be processed\n * @returns modified tree\n */\nconst walk = (t, disableLineBreakConversion = false) => {\n const tree = t;\n\n if (Array.isArray(tree)) {\n reduceWordsToLines(tree);\n if (tree.some(isString)) {\n // array contains strings. Might be md compatible\n tree.unshift(MD_NEWLINE_INJECT);\n tree.push(MD_NEWLINE_INJECT);\n }\n for (let idx = 0; idx < tree.length; idx++) {\n const child = walk(tree[idx], disableLineBreakConversion);\n if (Array.isArray(child)) {\n tree.splice(idx, 1, ...child);\n idx += child.length - 1;\n } else {\n tree[idx] = child;\n }\n }\n } else if (tree && isObj(tree) && tree.content) {\n if (tree.isWhitespaceSensitive) {\n // applies only to [code] and [icode]\n // stop walk. children won't be parsed to have
      \n return tree.tag ? tree : tree.content;\n }\n if (tree.disableLineBreakConversion) {\n disableLineBreakConversion = true;\n }\n walk(tree.content, disableLineBreakConversion);\n return tree.tag ? tree : tree.content;\n } else if (isString(tree) && URL_REGEX_SINGLE_LINE.test(tree.trim())) {\n // if the entire string is a URL, then it should be prepared for onebox.\n // BBob separates strings by newlines anyway, so we can already assume this is sitting on its own line\n // MD_NEWLINE_INJECT is already replacing newline came before or the start of the array,\n // so we only need to make sure \\n\\n is added after the URL\n return [tree, MD_NEWLINE_PRE_INJECT];\n }\n\n if (isString(tree) && isEOL(tree)) {\n return disableLineBreakConversion\n ? [\"\\n\", MD_NEWLINE_INJECT]\n : [{ tag: \"br\", content: null }, MD_NEWLINE_INJECT];\n }\n\n return tree;\n};\n\n/**\n * Reduces the list into lines, so that we can process them by line.\n * Performs in place.\n * @param {(string|Object)[]} words\n */\nconst reduceWordsToLines = (words) => {\n let rightIdx = words.findLastIndex((w) => isString(w) && !isEOL(w)) + 1;\n\n for (let i = rightIdx - 1; i >= 0; i--) {\n if (isString(words[i]) && !isEOL(words[i])) {\n continue;\n }\n if (isEOL(words[i])) {\n if (i !== rightIdx - 1) {\n words.splice(i + 1, rightIdx - i - 1, words.slice(i + 1, rightIdx).join(\"\"));\n }\n rightIdx = i;\n continue;\n }\n if (isObj(words[i])) {\n if (i !== rightIdx - 1) {\n words.splice(i + 1, rightIdx - i - 1, words.slice(i + 1, rightIdx).join(\"\"));\n }\n rightIdx = i;\n }\n }\n\n if (0 !== rightIdx) {\n words.splice(0, rightIdx, words.slice(0, rightIdx).join(\"\"));\n }\n};\n\n/**\n * Converts `\\n` to `
      ` self closing tag. Supply this as the last plugin in the preset lists\n *\n * @example converts all line breaks to br\n * ```ts\n * const output = bbob([preset(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n * @example will not convert line breaks inside [nobr]\n * ```ts\n * const nobr = (node: TagNode) => {return { disableLineBreakConversion: true, content: node.content }}; \\\\ tag in preset\n * ...\n * const output = bbob([preset(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n * @returns plugin to be used in BBob process\n */\nexport const lineBreakPlugin = () => {\n return (tree) => walk(tree);\n};\n","/**\n * Plugin that converts consecutive normal spaces (U+0020) to non-breaking spaces (U+00A0).\n * To use, put as function similar to the presets.\n *\n *\n * @example\n * ```ts\n * const output = bbob([preset(), , preserveWhitespace(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n */\nimport { isStringNode } from \"@bbob/plugin-helper\";\n\n/**\n * Checks if input is an object\n * @param value input\n * @returns if value is an object\n */\nconst isObj = (value) => typeof value === \"object\";\n\n/**\n * Walks the tree of nodes. Checks for node of consecutive spaces. If found replaces every space in\n * node with a nonbreaking space.\n * Preserves multiple spaces so html won't truncate them.\n *\n * Walks through entire tree.\n * @param t tree of nodes to be processed\n * @returns modified tree\n */\nconst walk = (t) => {\n const tree = t;\n\n if (Array.isArray(tree)) {\n for (let idx = 0; idx < tree.length; idx++) {\n const child = walk(tree[idx]);\n if (Array.isArray(child)) {\n tree.splice(idx, 1, ...child);\n idx += child.length - 1;\n } else {\n tree[idx] = child;\n }\n }\n } else if (tree && isObj(tree) && tree.content) {\n walk(tree.content);\n }\n\n //Bbob breaks up nodes by the presence of normal spaces.\n //So a node with a normal space can only have normal spaces in that node.\n if (isStringNode(tree)) {\n if (tree.length > 1 && tree[0] === \" \") {\n let numSpaces = tree.length;\n return [String.fromCharCode(160).repeat(numSpaces)];\n }\n }\n\n return tree;\n};\n\n/**\n * Converts consecutive normal spaces (U+0020) to nonbreaking spaces (U+00A0).\n * Supply this as a plugin in the preset lists.\n *\n * @example converts consecutive normal spaces (U+0020) to nonbreaking spaces (U+00A0)\n * ```ts\n * const output = bbob([preset(), preserveWhitespace(), lineBreakPlugin()]).process(input, {render}).html\n * ```\n *\n * @returns plugin to be used in BBob process\n */\nexport const preserveWhitespace = () => {\n return (tree) => walk(tree);\n};\n","import { isTagNode } from \"@bbob/plugin-helper\";\n\nconst CONSECUTIVE_NEWLINE_REGEX = /\\n{2,}/gm;\n\n/**\n * Removes empty lines from a string\n * @param {string} text\n */\nconst removeEmptyLines = (text) => {\n return text.replace(CONSECUTIVE_NEWLINE_REGEX, \"\\n\");\n};\n\n/**\n * Removes empty lines from attributes\n * @type {import('@bbob/types').BBobPluginFunction}\n */\nexport const removeEmptyLinePlugin = (tree) => {\n return tree.walk((node) => {\n if (isTagNode(node) && node.attrs) {\n Object.keys(node.attrs).forEach((key) => {\n if (typeof node.attrs[key] === \"string\") {\n node.attrs[key] = removeEmptyLines(node.attrs[key]);\n }\n });\n }\n return node;\n });\n};\n","import { isTagNode } from \"@bbob/plugin-helper\";\nexport function process(tags, tree, core, options) {\n return tree.walk((node)=>{\n if (isTagNode(node)) {\n const tag = node.tag;\n const tagCallback = tags[tag];\n if (typeof tagCallback === \"function\") {\n return tagCallback(node, core, options);\n }\n }\n return node;\n });\n}\n/**\n * Create a preset plugin for @bbob/core\n */ function createPreset(defTags, processor = process) {\n const presetFactory = (opts)=>{\n presetFactory.options = Object.assign(presetFactory.options || {}, opts);\n function presetExecutor(tree, core) {\n return processor(defTags, tree, core, presetFactory.options || {});\n }\n presetExecutor.options = presetFactory.options;\n return presetExecutor;\n };\n presetFactory.extend = function presetExtend(callback) {\n const newTags = callback(defTags, presetFactory.options);\n return createPreset(newTags, processor);\n };\n return presetFactory;\n}\nexport { createPreset };\nexport default createPreset;\n","import { isStringNode, isTagNode, TagNode } from \"@bbob/plugin-helper\";\nimport {\n generateGUID,\n preprocessAttr,\n regexIndexOf,\n toNode,\n toOriginalEndTag,\n toOriginalStartTag,\n} from \"../utils/common\";\n\nconst SLIDE_TITLE_OPEN = Symbol(\"slide-title-open\");\nconst SLIDE_TITLE_CLOSE = Symbol(\"slide-title-close\");\nconst SLIDE_CLOSE = Symbol(\"slide-close\");\nconst SLIDE_REGEX =\n /(?\\{slide=)|(?\\})|(?\\{\\/slide\\})/i;\n\n/**\n * Adds the accordion tag\n * [accordion]{slide=name}content{/slide}[/accordion]\n *\n * [accordion][slide=name]content[/slide][/accordion]\n */\nconst accordion = (node, options) => {\n const groupId = generateGUID();\n\n // add support for existing {slide} tags style, due to copious amounts of existing content\n // also the only way to get true custom content inside a slide due to nesting limitations\n const markedContent = generateSlideMarkersFromContent(node.content);\n const generatedSlides = generateSlidesFromMarkers(markedContent);\n\n const filteredContent = generatedSlides\n .filter((n) => isTagNode(n) && n.tag === \"slide\")\n .map((content) => {\n content.isValid = true;\n content.groupId = groupId;\n return content;\n });\n if (!filteredContent.length) {\n // no [slide] tags found\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n const attrs = preprocessAttr(node, options.data.raw);\n\n if (attrs._default) {\n /** @type {string[]} */\n const customSettings = attrs._default.split(\"|\").map((s) => s.trim());\n const lastValidAlignment = customSettings\n .filter((s) => [\"bright\", \"bcenter\", \"bleft\", \"fleft\", \"fright\"].includes(s))\n .pop();\n if (lastValidAlignment) {\n attrs.align ??= lastValidAlignment;\n }\n\n if (\n customSettings.some((s) => s.endsWith(\"px\")) ||\n customSettings.some((s) => s.endsWith(\"%\"))\n ) {\n attrs.width ??= customSettings.find((s) => s.endsWith(\"px\") || s.endsWith(\"%\"));\n }\n }\n\n let classes = attrs.align?.toLowerCase() || \"\";\n let style = \"\";\n if (attrs.width?.endsWith(\"px\") || attrs.width?.endsWith(\"%\")) {\n style = `width: ${attrs.width};`;\n }\n return toNode(\n \"div\",\n { class: \"bb-accordion \" + classes, \"data-group-id\": groupId, style },\n filteredContent,\n );\n};\n\n/**\n * Locates and splits all {slide} tag components into their respective parts while preserving remaining content\n * @param {(TagNode|string)[]} contentArr node content of the accordion tag\n *\n * @example\n * ```\n * [\"{slide=test}\", \"lorem ipsum\", \"{/slide}\"]\n * ```\n * becomes\n * ```\n * [SLIDE_TITLE_OPEN, \"test\", SLIDE_TITLE_CLOSE, \"lorem ipsum\", SLIDE_CLOSE]\n * ```\n */\nfunction generateSlideMarkersFromContent(contentArr) {\n contentArr = [...contentArr]; // shallow clone. object nodes are not modified anyway\n\n const newArr = [];\n while (contentArr.length > 0) {\n const content = contentArr[0];\n if (isTagNode(content)) {\n newArr.push(contentArr.shift());\n continue;\n }\n const foundIndex = regexIndexOf(content, SLIDE_REGEX);\n if (foundIndex === -1) {\n newArr.push(contentArr.shift());\n continue;\n }\n const match = content.match(SLIDE_REGEX);\n const preContent = content.slice(0, foundIndex);\n const postContent = content.slice(foundIndex + match[0].length);\n if (preContent.length) {\n newArr.push(preContent);\n }\n if (match.groups.slideTitleOpen) {\n newArr.push(SLIDE_TITLE_OPEN);\n }\n if (match.groups.slideTitleClose) {\n newArr.push(SLIDE_TITLE_CLOSE);\n }\n if (match.groups.slideClose) {\n newArr.push(SLIDE_CLOSE);\n }\n if (postContent.length) {\n contentArr[0] = postContent;\n } else {\n contentArr.shift();\n }\n }\n\n return newArr;\n}\n\n/**\n * Generates slide nodes from markers\n * @param {(string | typeof SLIDE_TITLE_OPEN | typeof SLIDE_TITLE_CLOSE | typeof SLIDE_CLOSE | TagNode)[]} markedContent\n */\nfunction generateSlidesFromMarkers(markedContent) {\n const nodes = [];\n let currentSlide = null;\n /** @type {typeof SLIDE_TITLE_OPEN | typeof SLIDE_TITLE_CLOSE | null} */\n let prevMarker = null;\n for (const content of markedContent) {\n if (content === SLIDE_TITLE_OPEN && prevMarker === null) {\n currentSlide = TagNode.create(\"slide\");\n currentSlide.content = [];\n currentSlide.customTitle = [];\n prevMarker = SLIDE_TITLE_OPEN;\n } else if (content === SLIDE_TITLE_CLOSE && prevMarker === SLIDE_TITLE_OPEN) {\n prevMarker = SLIDE_TITLE_CLOSE;\n continue;\n } else if (content === SLIDE_CLOSE && currentSlide && prevMarker === SLIDE_TITLE_CLOSE) {\n nodes.push(currentSlide);\n currentSlide = null;\n prevMarker = null;\n } else if (currentSlide) {\n if (prevMarker === SLIDE_TITLE_OPEN) {\n currentSlide.customTitle.push(markerToString(content));\n } else {\n currentSlide.content.push(markerToString(content));\n }\n } else {\n // no slide open, just add content\n nodes.push(markerToString(content));\n }\n }\n return nodes;\n}\n\n/**\n * Processes content into a string. Catches stray markers and converts them back into a string\n * @param {string | typeof SLIDE_TITLE_OPEN | typeof SLIDE_TITLE_CLOSE | typeof SLIDE_CLOSE} marker\n * @returns expected string\n */\nfunction markerToString(marker) {\n switch (marker) {\n case SLIDE_TITLE_OPEN:\n return \"{slide=\";\n case SLIDE_TITLE_CLOSE:\n return \"}\";\n case SLIDE_CLOSE:\n return \"{/slide}\";\n default:\n return marker;\n }\n}\n\nconst slide = (node, options) => {\n if (!node.isValid) {\n // not inside an [accordion] tag\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n const attrs = preprocessAttr(node, options.data.raw);\n let title = [attrs.title || attrs._default || \"Slide\"];\n let isOpen = !!attrs.open || false;\n let titleAlign = attrs.left ? \"left\" : attrs.right ? \"right\" : attrs.center ? \"center\" : \"left\";\n if (node.customTitle?.length) {\n // slide was created from markers\n title = node.customTitle;\n // pull out old options from title if they exist\n const possibleOptions = title\n .filter((t) => typeof t === \"string\")\n .join(\"\")\n .toLowerCase()\n .split(\"|\")\n .map((s) => s.trim());\n if (possibleOptions.includes(\"open\")) {\n isOpen = true;\n }\n if (possibleOptions.includes(\"right\")) {\n titleAlign = \"right\";\n }\n if (possibleOptions.includes(\"center\")) {\n titleAlign = \"center\";\n }\n if (possibleOptions.includes(\"left\")) {\n titleAlign = \"left\";\n }\n title = title.map((t) => {\n if (isStringNode(t)) {\n t = t.replace(/\\|(open|right|center|left)/gi, \"\");\n }\n return t;\n });\n }\n return [\n toNode(\"details\", { class: \"bb-slide\", open: isOpen }, [\n toNode(\n \"summary\",\n { class: \"bb-slide-title\", style: `text-align: ${titleAlign}; ${attrs.style || \"\"}` },\n title,\n ),\n toNode(\"div\", { class: \"bb-slide-content\" }, node.content),\n ]),\n ];\n};\n\nexport const accordionTags = { accordion, slide };\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [left], [center], and [right] to bbcode\n * @example [center]content[/center]\n */\nexport const alignment = {\n left: (node) => toNode(\"div\", { class: \"bb-left\" }, node.content),\n center: (node) => toNode(\"div\", { class: \"bb-center\" }, node.content),\n right: (node) => toNode(\"div\", { class: \"bb-right\" }, node.content),\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n/**\n * @file Adds [a] and [goto] to bbcode\n * @example [a=your_anchor_name]An anchor[/a] [goto=your_anchor_name]Jump to an anchor[/goto]\n */\nexport const anchor = {\n // name is not valid in HTML5; however, it correctly displays back while id does not\n a: (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default || \"\";\n return toNode(\n \"a\",\n { id: `user-anchor-${attrs.trim()}`, name: `user-anchor-${attrs.trim()}` },\n node.content,\n );\n },\n goto: (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default || \"\";\n return toNode(\"a\", { href: `#user-anchor-${attrs.trim()}` }, node.content);\n },\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nconst WEB_FONTS = [\n \"arial\",\n \"book antiqua\",\n \"courier new\",\n \"georgia\",\n \"tahoma\",\n \"times new roman\",\n \"trebuchet ms\",\n \"verdana\",\n];\nconst VALID_FONT_STYLES = {\n thin: \"100\",\n extralight: \"200\",\n light: \"300\",\n regular: \"400\",\n medium: \"500\",\n semibold: \"600\",\n bold: \"700\",\n extrabold: \"800\",\n black: \"900\",\n};\n// registered axis tags https://learn.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg#registered-axis-tags\nconst REGISTERED_AXIS = [\"ital\", \"opsz\", \"slnt\", \"wdth\", \"wght\"];\n\nconst AXES_REGEX = /(?[a-zA-Z]*)?\\s?(?[0-9]*)?\\s?(?italic)?/;\n\nconst axesParser = (attrs) => {\n let axes = {\n ital: 0,\n wght: 400,\n };\n\n if (attrs?.style) {\n // user just copy pasted the name of the style on the google font site, probably\n const style = attrs.style.trim().toLowerCase();\n const matches = AXES_REGEX.exec(style).groups || {};\n if (matches?.italic) {\n axes.ital = 1;\n }\n\n const weight = matches.weight;\n if (weight && weight >= 0 && weight <= 900) {\n axes.wght = weight;\n } else if (Object.keys(VALID_FONT_STYLES).includes(matches.named_weight || \"\")) {\n axes.wght = VALID_FONT_STYLES[matches.named_weight];\n }\n\n axes = {\n ...axes,\n ...Object.fromEntries(Object.entries(attrs).filter(([key]) => REGISTERED_AXIS.includes(key))),\n };\n }\n return axes;\n};\n\n/**\n * Create google font api url\n * @param {string} family name of font\n * @param {object} axes custom font axes\n */\nconst googleFontApiBuild = (family, axes) => {\n family = family.replaceAll(\" \", \"+\");\n // google fonts requires axes names to be in alphabetical order\n axes = Object.keys(axes)\n .sort()\n .reduce((obj, key) => {\n obj[key] = axes[key];\n return obj;\n }, {});\n const axesList = Object.keys(axes).join(\",\") + \"@\" + Object.values(axes).join(\",\");\n return \"https://fonts.googleapis.com/css2?family=\" + family + \":\" + axesList;\n};\n\nexport const font = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw);\n const fontFamily = attrs?._default || attrs?.family || attrs?.name;\n if (!fontFamily || fontFamily.trim() === \"\") {\n return node.content;\n }\n if (WEB_FONTS.includes(fontFamily.trim().toLowerCase())) {\n return toNode(\"span\", { style: `font-family: '${fontFamily}'` }, node.content);\n }\n\n const axes = axesParser(attrs);\n const url = googleFontApiBuild(fontFamily, axes);\n options.data.fonts.add(url);\n\n const italic = axes.ital === 1 ? \"italic\" : \"normal\";\n\n const custom = Object.entries(axes).filter(([key]) => key !== \"wght\" && key !== \"ital\");\n let fontVar = \"\";\n if (custom.length) {\n fontVar =\n \"font-variation-settings: \" + custom.map(([key, val]) => `'${key}' ${val}`).join(\", \") + \";\";\n }\n\n return toNode(\n \"span\",\n {\n style: `font-family: '${fontFamily}'; font-weight: ${axes.wght}; font-style: ${italic}; ${fontVar}`,\n \"data-font\": url,\n },\n node.content\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Parse the user provided height and return a valid height value\n * @param {Number} heightValue obtains the input of the user entered height (default is 700)\n * @returns A validated number less than 0.\n */\nfunction parseHeight(heightValue) {\n const maxHeight = 700;\n const parsedHeight =\n heightValue && heightValue.trim() !== \"\" ? heightValue.replace(/[^\\d.]/g, \"\") : 0;\n\n if (parsedHeight && parsedHeight >= 0 && parsedHeight <= maxHeight) {\n return parsedHeight;\n } else {\n // if the value = 0 then nothing will be returned\n return parsedHeight === 0 ? 0 : maxHeight;\n }\n}\n\n/**\n * @file Adds [heightrestrict] to bbcode\n * @example [heightrestrict=50]content[/heightrestrict]\n */\nexport const heightrestrict = (node) => {\n const attrs = preprocessAttr(node)._default;\n const heightInput = parseHeight(attrs).toString();\n // Return image's default size if heightrestrict did not involve a valid value\n return heightInput === \"0\"\n ? toNode(\"div\", { class: \"bb-height-restrict\" }, node.content)\n : toNode(\n \"div\",\n { class: \"bb-height-restrict\", style: `height: ${heightInput}px;` },\n node.content,\n );\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [mail] to bbcode\n * @param {string} [type=\"send\"] Denotes type of mail either send or receive\n * @param {string} [person=\"Unknown\"] Denotes the person in the To/From field\n * @param {string} [subject=\"Empty\"] Denotes the subject line of the email\n * @example [mail type=\"send\" person=\"John Doe\" subject=\"Hello World\"]content[/mail]\n */\n\nconst parseEmailContent = (content) => {\n return toNode(\"div\", { class: \"bb-email-content\" }, content);\n};\n\nconst parseEmailSubject = (subject) => {\n return toNode(\"div\", { class: \"bb-email-subject\" }, subject);\n};\n\nconst parseEmailPerson = (person) => {\n return toNode(\"div\", { class: \"bb-email-address\" }, person);\n};\n\nconst emailHeader = toNode(\"div\", { class: \"bb-email-header\" }, \"\");\nconst emailFooter = toNode(\n \"div\",\n { class: \"bb-email-footer\" },\n toNode(\"div\", { class: \"bb-email-button\" }, \"\"),\n);\n\nexport const mail = (node) => {\n const attributes = node.attrs;\n let mailAttr = {\n mailOption: (attributes.type || \"send\").toLowerCase(),\n person: attributes.person || \"Unknown\",\n subject: attributes.subject || \"Empty\",\n };\n\n return toNode(\n \"div\",\n {\n class: \"bb-email\",\n \"data-bb-email\": mailAttr.mailOption,\n },\n [\n emailHeader,\n parseEmailPerson(mailAttr.person),\n parseEmailSubject(mailAttr.subject),\n parseEmailContent(node.content),\n emailFooter,\n ],\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [row][column] to bbcode\n * @example Adds [row][column][/column][/row]\n */\nexport const rowcolumn = {\n row: (node) => toNode(\"div\", { class: \"bb-row\" }, node.content),\n column: (node, options) => {\n const columnAttrs = preprocessAttr(node, options.data.raw)._default || \"8\";\n const columnStyle = columnAttrs.startsWith(\"span\")\n ? `column-width-${columnAttrs}`\n : `column-width-span${columnAttrs}`;\n return toNode(\"div\", { class: `bb-column`, \"data-span\": columnStyle }, node.content);\n },\n};\n","import { preprocessAttr } from \"../utils/common\";\n\nconst EVENTS = [\n \"init\",\n \"click\",\n \"change\",\n \"input\",\n \"dblclick\",\n \"mouseenter\",\n \"mouseleave\",\n \"scroll\",\n];\n\n/**\n * Script tag\n *\n * [script]content[/script]\n *\n * [script class=\"id\" on=\"event\" version=\"2\"]content[/script]\n */\nexport const script = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw);\n\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const classSuffix = options.data.previewing ? \"preview\" : options.data.commonGUID;\n\n const onEvent =\n (EVENTS.includes(attrs.on?.toLowerCase() || \"init\") && attrs.on?.toLowerCase()) || \"init\";\n\n const scriptSetup = {\n id: classSuffix,\n class: attrs.class || \"\",\n on: onEvent,\n version: attrs.version || \"\",\n content: node.content.join(\"\"),\n };\n options.data.bbscripts.push(scriptSetup);\n\n return [];\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Parses an inputted size value and returns the formatted valid font size\n * @param {string} fontValue the input of the size\n */\nfunction parseFontSize(fontValue) {\n let value;\n let fontSize = { valid: true };\n const parsedSize = /(\\d+\\.?\\d?)(px|rem)?/i.exec(fontValue);\n const sizeRanges = {\n px_max: 36,\n px_min: 8,\n rem_max: 3,\n rem_min: 0.2,\n unitless_max: 7,\n unitless_min: 1,\n };\n\n if (parsedSize && (value = parsedSize[1])) {\n fontSize.unit = (parsedSize[2] || \"\").toLowerCase();\n switch (fontSize.unit) {\n case \"px\":\n if (value > sizeRanges.px_max) {\n value = sizeRanges.px_max;\n } else if (value < sizeRanges.px_min) {\n value = sizeRanges.px_min;\n }\n break;\n case \"rem\":\n if (value > sizeRanges.rem_max) {\n value = sizeRanges.rem_max;\n } else if (value < sizeRanges.rem_min) {\n value = sizeRanges.rem_min;\n }\n break;\n default:\n if ((fontSize.valid = fontValue.length === value.length)) {\n if (value > sizeRanges.unitless_max) {\n value = sizeRanges.unitless_max;\n } else if (value < sizeRanges.unitless_min) {\n value = sizeRanges.unitless_min;\n }\n }\n break;\n }\n\n fontSize.value = value;\n }\n return fontSize;\n}\n\nexport const size = (node) => {\n const input = preprocessAttr(node)._default;\n const fontSize = parseFontSize(input);\n if (!fontSize.valid) {\n return node.content;\n }\n let outputAttr = {};\n if (fontSize.unit) {\n outputAttr = { style: `font-size: ${fontSize.value}${fontSize.unit}` };\n } else {\n outputAttr = { \"data-size\": fontSize.value };\n }\n return toNode(\"span\", outputAttr, node.content);\n};\n","import { isTagNode } from \"@bbob/plugin-helper\";\nimport { preprocessAttr, toNode, toRawTag } from \"../utils/common\";\n\n/**\n * @file Adds textmessage to bbcode\n * @example [textmessage=Recipient][message=them]Hi [/message][message=me] Hey![/message][/textmessage]\n */\n\nconst ACCEPTED_OPTIONS = [\"me\", \"them\", \"right\", \"left\"];\nexport const textmessage = {\n textmessage: (node, options) => {\n const messageList = node.content.filter(\n (contentNode) => isTagNode(contentNode) && contentNode.tag === \"message\"\n );\n messageList.forEach((messageNode) => {\n messageNode.isValid = true;\n });\n\n if (!messageList.length) {\n return toRawTag(node, options.data.raw);\n }\n\n const attr = preprocessAttr(node, options.data.raw)._default || \"Recipient\";\n const recipient = attr && attr.trim() !== \"\" ? attr : \"Recipient\";\n return toNode(\"div\", { class: \"bb-textmessage\" }, [\n toNode(\"div\", { class: \"bb-textmessage-name\" }, recipient),\n toNode(\"div\", { class: \"bb-textmessage-overflow\" }, [\n toNode(\"div\", { class: \"bb-textmessage-content\" }, node.content),\n ]),\n ]);\n },\n message: (node, options) => {\n if (!node.isValid) {\n return toRawTag(node, options.data.raw);\n }\n\n let option = preprocessAttr(node, options?.data?.raw)?._default?.toLowerCase();\n if (!ACCEPTED_OPTIONS.includes(option) || option === \"right\") {\n option = \"me\";\n }\n if (option === \"left\") {\n option = \"them\";\n }\n\n const senderAttrs = option === \"me\" ? \"bb-message-me\" : \"bb-message-them\";\n return toNode(\"div\", { class: senderAttrs }, [\n toNode(\"div\", { class: \"bb-message-content\" }, node.content),\n ]);\n },\n};\n","import { createPreset } from \"@bbob/preset\";\nimport { accordionTags } from \"./tags/accordion\";\nimport { alignment } from \"./tags/alignment\";\nimport { anchor } from \"./tags/anchor\";\nimport { animation, keyframe } from \"./tags/animation\";\nimport { bg } from \"./tags/background\";\nimport { block } from \"./tags/block\";\nimport { blockquote } from \"./tags/blockquote\";\nimport { border } from \"./tags/border\";\nimport { centerblock } from \"./tags/centerblock\";\nimport { check } from \"./tags/check\";\nimport { classStyle } from \"./tags/class\";\nimport { code, icode, savenl } from \"./tags/code\";\nimport { color } from \"./tags/color\";\nimport { comment } from \"./tags/comment\";\nimport { bold, italic, strike, underline } from \"./tags/discourse-core-replacement\";\nimport { div } from \"./tags/div\";\nimport { divide } from \"./tags/divide\";\nimport { fieldset } from \"./tags/fieldset\";\nimport { font } from \"./tags/font\";\nimport { fa } from \"./tags/fontawesome\";\nimport { h, h1, h2, h3, h4, h5, h6, sh } from \"./tags/header\";\nimport { heightrestrict } from \"./tags/heightrestrict\";\nimport { highlight } from \"./tags/highlight\";\nimport { imagefloat } from \"./tags/imagefloat\";\nimport { justify } from \"./tags/justify\";\nimport { br, nobr } from \"./tags/lineBreak\";\nimport { mail } from \"./tags/mail\";\nimport { newspaper } from \"./tags/newspaper\";\nimport { note } from \"./tags/note\";\nimport { ooc } from \"./tags/ooc\";\nimport { pindent } from \"./tags/pindent\";\nimport { plain } from \"./tags/plain\";\nimport { print } from \"./tags/print\";\nimport { progress } from \"./tags/progress\";\nimport { quote } from \"./tags/quote\";\nimport { rowcolumn } from \"./tags/rowcolumn\";\nimport { script } from \"./tags/script\";\nimport { scroll } from \"./tags/scroll\";\nimport { side } from \"./tags/side\";\nimport { size } from \"./tags/size\";\nimport { inlinespoiler, spoiler } from \"./tags/spoiler\";\nimport { sub } from \"./tags/subscript\";\nimport { sup } from \"./tags/superscript\";\nimport { tab, tabs } from \"./tags/tabs\";\nimport { textmessage } from \"./tags/textmessage\";\nimport { thinprogress } from \"./tags/thinprogress\";\n\nconst tags = {\n ...accordionTags,\n ...alignment,\n ...anchor,\n animation,\n bg,\n block,\n blockquote,\n border,\n br,\n centerblock,\n check,\n class: classStyle,\n code,\n color,\n comment,\n div,\n divide,\n fieldset,\n fa,\n font,\n h,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n heightrestrict,\n highlight,\n icode,\n imagefloat,\n inlinespoiler,\n justify,\n keyframe,\n mail,\n newspaper,\n nobr,\n note,\n ooc,\n pindent,\n plain,\n print,\n progress,\n quote,\n ...rowcolumn,\n thinprogress,\n savenl,\n sh,\n script,\n scroll,\n side,\n size,\n spoiler,\n sub,\n sup,\n tab,\n tabs,\n ...textmessage,\n\n // discourse core replacement tags\n b: bold,\n i: italic,\n u: underline,\n s: strike,\n};\n\nconst availableTags = Object.keys(tags);\nconst preventParsing = [\"plain\", \"code\", \"icode\", \"class\", \"fa\"];\n\nconst preset = createPreset(tags);\n\nexport { availableTags, tags, preset, preventParsing };\nexport default preset;\n","import { isStringNode, isTagNode } from \"@bbob/plugin-helper\";\nimport { preprocessAttr, toOriginalEndTag, toOriginalStartTag } from \"../utils/common\";\n\n/**\n * Renders css Keyframes\n *\n * [animation=name][keyframe=0]color: red[/keyframe][/animation]\n */\nexport const animation = (node, options) => {\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const commonId = options.data.previewing ? \"preview\" : options.data.commonGUID;\n\n const name = preprocessAttr(node, options.data.raw)?._default || \"\";\n const keyframes = node.content\n .filter((n) => isTagNode(n) && n.tag === \"keyframe\")\n .map((content) => {\n content.isValid = true;\n /** @type {string} */\n const ident = preprocessAttr(content, options.data.raw)._default || \"\";\n content.ident = ident + (ident.match(/^\\d+$/) ? \"%\" : \"\");\n const cleanContent = content.content\n .filter(isStringNode)\n .join(\"\")\n .replaceAll(/[\\[\\]\\{\\}]/g, \"\");\n content.formatted = `${content.ident}{ ${cleanContent} }`;\n return content;\n });\n const keyframeContent = keyframes.map((n) => n.formatted).join(\"\\n\");\n const content = `@keyframes ${commonId}${name} { ${keyframeContent} }`;\n options.data.styles.push(content);\n return [];\n};\n\nexport const keyframe = (node, options) => {\n if (!node.isValid) {\n return [\n toOriginalStartTag(node, options.data.raw),\n ...node.content,\n toOriginalEndTag(node, options.data.raw),\n ];\n }\n return [];\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Add [bg] tag\n * @example [bg=red]Hello[/bg]\n */\nexport const bg = (node, options) => {\n const color = preprocessAttr(node, options.data.raw)._default;\n return toNode(\n \"div\",\n {\n style: `background-color: ${color};`,\n class: \"bb-background\",\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Add [block] tag\n * @example [block=treasure]content[/block]\n */\nexport const block = (node, options) => {\n const defaultOp = \"block\";\n const blockAttr = (preprocessAttr(node, options.data.raw)._default || defaultOp).toLowerCase();\n\n const OPTIONS = [\n \"block\",\n \"dice\",\n \"dice10\",\n \"setting\",\n \"warning\",\n \"storyteller\",\n \"announcement\",\n \"important\",\n \"question\",\n \"encounter\",\n \"information\",\n \"character\",\n \"treasure\",\n ];\n\n // Default to block option if user did not provide anything valid\n const blockOption = OPTIONS.includes(blockAttr) ? blockAttr : defaultOp;\n\n return toNode(\"table\", { class: \"bb-block\", \"data-bb-block\": blockOption }, [\n toNode(\"tbody\", [\n toNode(\"tr\", [\n toNode(\"td\", { class: \"bb-block-icon\" }),\n toNode(\"td\", { class: \"bb-block-content\" }, node.content),\n ]),\n ]),\n ]);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [blockquote] to bbcode\n * @example [blockquote=author]content[/blockquote]\n */\nexport const blockquote = (node, options) => {\n const author = preprocessAttr(node, options.data.raw)._default || \"\";\n\n return toNode(\"div\", { class: \"bb-blockquote\" }, [\n toNode(\"div\", { class: \"bb-blockquote-left\" }),\n toNode(\"div\", { class: \"bb-blockquote-content\" }, [\n node.content,\n toNode(\"div\", { class: \"bb-blockquote-speaker\" }, author !== \"\" ? `- ${author}` : \"\"),\n ]),\n toNode(\"div\", { class: \"bb-blockquote-right\" }),\n ]);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const border = (node, options) => {\n const val = preprocessAttr(node, options.data.raw)._default;\n return toNode(\n \"div\",\n {\n style: `border: ${val};`,\n class: \"bb-border\",\n },\n node.content,\n );\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * Creates a line break html
      tag\n */\nexport const br = () => {\n return toNode(\"br\", {}, null);\n};\n\n/**\n * Disables line breaks for given content\n * @example\n * ```\n * [nobr]test\n * test\n * test\n * [/nobr]\n *\n * test test test\n * ```\n */\nexport const nobr = (node) => {\n return { disableLineBreakConversion: true, content: node.content };\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const centerblock = (node, options) => {\n const percentageInput = preprocessAttr(node, options.data.raw)._default || \"50\";\n return toNode(\"div\", { style: `margin: 0 auto; width: ${percentageInput}%` }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const check = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default || \"dot\";\n return toNode(\"div\", { class: `bb-check`, \"data-type\": attrs }, node.content);\n};\n","import { isStringNode } from \"@bbob/plugin-helper\";\nimport { preprocessAttr } from \"../utils/common\";\n\n/**\n * Class style tag\n *\n * [class=name]content[/class]\n * [class name=\"className\" state=\"psuedo-class\" minWidth=\"\" maxWidth=\"\"]content[/class]\n * [class name=\"className\" selector=\"\"]content[/class]\n */\nexport const classStyle = (node, options) => {\n const attrs = preprocessAttr(node);\n const nameAttr = attrs.name || attrs._default;\n\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const classSuffix = options.data.previewing ? \"preview\" : options.data.commonGUID;\n const className = nameAttr + \"__\" + classSuffix;\n const content = node.content\n .filter(isStringNode)\n .map((s) => s.replaceAll(\"{post_id}\", classSuffix).replaceAll(/[\\[\\]\\{\\}]/g, \"\"));\n let selector = \"\";\n const mediaQuery = [];\n if (\n [\"hover\", \"focus\", \"active\", \"focus-within\", \"focus-visible\"].includes(\n attrs.state?.toLowerCase(),\n )\n ) {\n selector = \":\" + attrs.state.toLowerCase();\n }\n if (attrs.selector) {\n selector = attrs.selector.replace(/[,{}\\\\\\n]/g, \"\");\n }\n if (attrs.minWidth?.match(/^[0-9]+[a-z]+$/)) {\n // @media (min-width: )\n mediaQuery.push(`(min-width: ${attrs.minWidth})`);\n }\n if (attrs.maxWidth?.match(/^[0-9]+[a-z]+$/)) {\n // @media (max-width: )\n mediaQuery.push(`(max-width: ${attrs.maxWidth})`);\n }\n\n content.unshift(`.${className}${selector} {`);\n content.push(\"}\");\n if (mediaQuery.length) {\n content.unshift(`@media ${mediaQuery.join(\" and \")} {`);\n content.push(\"}\");\n }\n options.data.styles.push(content.join(\"\"));\n\n return [];\n};\n","import { preprocessAttr } from \"../utils/common\";\n\n/**\n * processes [code] tag and returns a fenced code block\n */\nexport const code = (node) => {\n const lang = preprocessAttr(node)._default || \"bbcode\";\n return {\n isWhitespaceSensitive: true,\n content: [\"```\" + lang + \"\\n\", node.content, \"\\n```\\n\"],\n };\n};\n\n/**\n * processes [icode] tag and returns inline code\n */\nexport const icode = (node) => {\n return {\n isWhitespaceSensitive: true,\n content: [\"`\", node.content, \"`\"],\n };\n};\n\n/**\n * Special tag to save newlines in code blocks. Used for hoisting code blocks\n */\nexport const savenl = (node) => {\n return {\n isWhitespaceSensitive: true,\n content: node.content,\n };\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const color = (node) => {\n const inputColor = preprocessAttr(node)._default || \"\";\n if (inputColor.trim() === \"\") {\n return node.content;\n }\n return toNode(\"span\", { style: `color: ${inputColor}` }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds [comment] tag\n * @example [comment]Content[/comment]\n */\n\nconst comment = (node) => {\n return toNode(\"span\", { class: \"hidden\" }, node.content);\n};\n\nexport { comment };\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Adds [div] tag\n * [div=css]Content[/div]\n * [div class=\"class\" style=\"css\"]Content[/div]\n */\nexport const div = (node, options) => {\n if (node.gen) {\n // node is actually a generated node \"div\" made by another tag\n // don't process it\n return node;\n }\n const attrs = preprocessAttr(node, options.data.raw);\n const style = attrs.style || attrs._default;\n const classAttrs = attrs.class;\n if (!classAttrs?.trim()) {\n return toNode(\n \"div\",\n {\n style,\n },\n node.content,\n );\n }\n\n if (!options.data.previewing && !options.data.commonGUID) {\n // create a common GUID for the post\n // only applicable for div, style, and script tags\n // this is to prevent the same class name from being used in different posts\n options.data.commonGUID = \"post-\" + Math.random().toString(36).substring(2, 7);\n }\n const classSuffix = options.data.previewing ? \"preview\" : options.data.commonGUID;\n const classNames = classAttrs\n .split(\" \")\n .map((c) => c + \"__\" + classSuffix)\n .join(\" \");\n\n return toNode(\n \"div\",\n {\n class: classNames,\n style,\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const divide = (node) => {\n const type = (preprocessAttr(node)._default || \"\").toLowerCase();\n return toNode(\n \"span\",\n {\n class: \"bb-divide\",\n \"data-type\": type,\n },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [fieldset] to bbcode\n * @example [fieldset=title]content[/fieldset]\n */\nexport const fieldset = (node, options) => {\n const title = preprocessAttr(node, options.data.raw)._default || \"\";\n return toNode(\"fieldset\", { class: \"bb-fieldset\" }, [\n toNode(\"legend\", { class: \"bb-fieldset-legend\" }, title),\n toNode(\"div\", { class: \"bb-fieldset\" }, node.content),\n ]);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * Adds [fa] tag\n * [fa]fa-icon[/fa]\n * [fa style=\"\" fa-transform=\"\"]fa-solid fa-icon[/fa]\n * [fa primary-color=\"\" secondary-color=\"\" primary-opacity=\"\" secondary-opacity=\"\" rotate-angle=\"\"]fa-duotone fa-icon[/fa]\n */\nexport const fa = (node) => {\n const attrs = node.attrs;\n let style = attrs.style || \"\";\n style += attrs[\"primary-color\"] ? `--fa-primary-color: ${attrs[\"primary-color\"]};` : \"\";\n style += attrs[\"secondary-color\"] ? `--fa-secondary-color: ${attrs[\"secondary-color\"]};` : \"\";\n style += attrs[\"primary-opacity\"] ? `--fa-primary-opacity: ${attrs[\"primary-opacity\"]};` : \"\";\n style += attrs[\"secondary-opacity\"]\n ? `--fa-secondary-opacity: ${attrs[\"secondary-opacity\"]};`\n : \"\";\n style += attrs[\"rotate-angle\"] ? `--fa-rotate-angle: ${attrs[\"rotate-angle\"]};` : \"\";\n\n return toNode(\n \"i\",\n {\n \"data-bbcode-fa\": null,\n },\n [\n toNode(\n \"i\",\n {\n class: (node.content || []).join(\"\"),\n style,\n \"data-fa-transform\": attrs[\"fa-transform\"] || \"\",\n },\n [],\n ),\n ],\n );\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds Header to bbcode\n * @example [h]content[/h], [h2]content[/h2], [h3]content[/h3],\n * [h4]content[/h4], [h5]content[/h5], [h6]content[/h6].\n */\n\nconst h = (node) => {\n return toNode(\"h1\", {}, node.content);\n};\n\nconst h1 = (node) => {\n return toNode(\"h1\", {}, node.content);\n};\n\nconst h2 = (node) => {\n return toNode(\"h2\", {}, node.content);\n};\n\nconst sh = (node) => {\n return toNode(\"h2\", {}, node.content);\n};\n\nconst h3 = (node) => {\n return toNode(\"h3\", {}, node.content);\n};\n\nconst h4 = (node) => {\n return toNode(\"h4\", {}, node.content);\n};\n\nconst h5 = (node) => {\n return toNode(\"h5\", {}, node.content);\n};\n\nconst h6 = (node) => {\n return toNode(\"h6\", {}, node.content);\n};\n\nexport { h, sh, h1, h2, h3, h4, h5, h6 };\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [highlight] to bbcode\n * @example [highlight]content[/highlight]\n */\nexport const highlight = (node) => {\n return toNode(\"span\", { class: \"bb-highlight\" }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n/**\n * @file Adds [imagefloat] to bbcode\n * @exmaple [imagefloat=left]content[/imagefloat]\n */\nexport const imagefloat = (node) => {\n const attrs = preprocessAttr(node)._default || \"\";\n return toNode(\"div\", { class: `bb-float-${attrs}` }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n/**\n * @file Adds [spoiler] and [inlinespoiler] to bbcode\n *\n * Defaults to \"Spoiler\" name if no title provided\n *\n * @example `[spoiler=Title]text[/spoiler]`\n * @example `[inlinespoiler]hidden content[/inlinespoiler]\n */\n\nexport const spoiler = (node, options) => {\n const providedTitle = preprocessAttr(node, options.data.raw)._default;\n const title = \"Spoiler\" + (providedTitle ? `: ${providedTitle}` : \"\");\n\n /**\n *
      \n * Title\n *
      \n * lorem ipsum\n *
      \n *
      \n */\n return toNode(\"details\", { class: \"bb-spoiler\" }, [\n toNode(\"summary\", {}, title),\n toNode(\"div\", { class: \"bb-spoiler-content\" }, node.content),\n ]);\n};\n\nexport const inlinespoiler = (node) => {\n return toNode(\"span\", { class: \"bb-inline-spoiler\" }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds [justify] to bbcode\n * @example [justify]content[/justify]\n */\nexport const justify = (node) => {\n return toNode(\"div\", { class: \"bb-justify\" }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [newspaper] to bbcode\n * @example [newspaper]content[/newspaper]\n */\nexport const newspaper = (node) => {\n return toNode(\"div\", { class: \"bb-newspaper\" }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [note] to bbcode\n * @example [note]content[/note]\n */\n\nexport const note = (node) => {\n return toNode(\"div\", { class: \"bb-note\" }, [\n toNode(\"div\", { class: \"bb-note-tape\" }, \"\"),\n toNode(\"div\", { class: \"bb-note-content\" }, [\n node.content,\n toNode(\"div\", { class: \"bb-note-footer\" }, \"\"),\n ]),\n ]);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds [ooc] to bbcode\n * @example [ooc]content[/ooc]\n */\nexport const ooc = (node) => {\n return toNode(\n \"div\",\n {\n class: \"bb-ooc\",\n },\n node.content,\n );\n};\n","import { toNode } from \"../utils/common\";\n/**\n * @file Adds [pindent] to bbcode\n * @example [pindent]content[/pindent]\n */\nexport const pindent = (node) => {\n return toNode(\"span\", { class: \"bb-pindent\" }, node.content);\n};\n","/**\n * [plain] bbcode tag that prevents parsing of inner tags\n * @example\n * ```\n * [plain]This is [b]bold[/b] and [i]italic[/i][/plain]\n * ```\n * outputs to\n * ```\n * This is [b]bold[/b] and [i]italic[/i]\n * ```\n */\nexport const plain = (node) => {\n return node.content;\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Add [print] tag\n * @example [print=lined]content[/print]\n */\nexport const print = (node) => {\n const defaultOp = \"print\";\n const printAttr = (preprocessAttr(node)._default || defaultOp).toLowerCase();\n\n const OPTIONS = [\"print\", \"line\", \"graph\", \"parchment\"];\n\n // Default to print if option is not valid\n const printOption = OPTIONS.includes(printAttr) ? printAttr : defaultOp;\n\n return toNode(\n \"div\",\n { class: printOption === defaultOp ? `bb-print` : `bb-print-${printOption}` },\n node.content,\n );\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [progress] to bbcode\n * @exmaple [progress=percentageInt]content[/progress]\n */\nexport const progress = (node) => {\n const percentageInt = preprocessAttr(node)._default;\n return toNode(\"div\", { class: \"bb-progress\" }, [\n toNode(\"div\", { class: \"bb-progress-text\" }, node.content),\n toNode(\"div\", { class: \"bb-progress-bar\", style: `width: calc(${percentageInt}% - 6px)` }, \"\"),\n toNode(\"div\", { class: \"bb-progress-bar-other\" }, \"\"),\n ]);\n};\n","import { preprocessAttr } from \"../utils/common\";\n\n/**\n * rebuild the [quote] tag so that markdown-it engine can parse it for itself\n */\nexport const quote = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw);\n if (node.content[0] === \"\\n\") {\n node.content.shift();\n }\n return [`\\n[${node.tag}=\"${attrs._default}\"]\\n\\n`, ...node.content, \"\\n\\n[/quote]\\n\"];\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * @file Adds [thinprogress] to bbcode\n * @exmaple [thinprogress=percentageInt]content[/progthinprogressress]\n */\nexport const thinprogress = (node, options) => {\n const percentageInt = preprocessAttr(node, options.data.raw)._default;\n return toNode(\"div\", { class: \"bb-progress-thin\" }, [\n toNode(\"div\", { class: \"bb-progress-text\" }, node.content),\n toNode(\"div\", { class: \"bb-progress-bar\", style: `width: calc(${percentageInt}% - 6px)` }, \"\"),\n toNode(\"div\", { class: \"bb-progress-bar-other\" }, \"\"),\n ]);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\n/**\n * Parse the user provided height and return a valid height value\n * @param {Number} heightValue obtains the input of the user entered height (default is 700)\n * @returns A validated number less than 0.\n */\nfunction parseHeight(heightValue) {\n const maxHeight = 700;\n const parsedHeight =\n heightValue && heightValue.trim() !== \"\" ? heightValue.replace(/[^\\d.]/g, \"\") : 0;\n\n if (parsedHeight && parsedHeight >= 0 && parsedHeight <= maxHeight) {\n return parsedHeight;\n } else {\n // if the value = 0 then nothing will be returned\n return parsedHeight === 0 ? 0 : maxHeight;\n }\n}\n\n/**\n * @file Adds [scroll] to bbcode\n * @example [scroll]content[/scroll]\n */\nexport const scroll = (node, options) => {\n const attrs = preprocessAttr(node, options.data.raw)._default;\n const heightInput = parseHeight(attrs);\n return toNode(\"div\", { class: \"bb-scroll\", style: `height: ${heightInput}px` }, node.content);\n};\n","import { preprocessAttr, toNode } from \"../utils/common\";\n\nexport const side = (node) => {\n const attrs = preprocessAttr(node)._default || \"left\";\n return toNode(\"div\", { class: \"bb-side\", \"data-side\": attrs }, node.content);\n};\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds subscript to BBCode\n * @example [sub]content[/sub]\n */\n\nconst sub = (node) => {\n return toNode(\"sub\", {}, node.content);\n};\n\nexport { sub };\n","import { toNode } from \"../utils/common\";\n\n/**\n * @file Adds superscript to bbcode\n * @example [sup]content[/sup]\n */\n\nconst sup = (node) => {\n return toNode(\"sup\", {}, node.content);\n};\n\nexport { sup };\n","import { isTagNode } from \"@bbob/plugin-helper\";\nimport { generateGUID, preprocessAttr, toNode, toRawTag } from \"../utils/common\";\n\n/**\n * @file Adds [tabs][tab] to bbcode\n * @example [tabs][tab=name 1]content[/tab][tab=name 2]content[/tab][/tabs]\n */\nexport const tabs = (node, options) => {\n const tabsList = node.content.filter(\n (contentNode) => isTagNode(contentNode) && contentNode.tag === \"tab\"\n );\n const groupId = generateGUID();\n tabsList.forEach((tabNode) => {\n tabNode.isValid = true;\n tabNode.groupId = groupId;\n });\n\n if (!tabsList.length) {\n return toRawTag(node, options.data.raw);\n }\n\n tabsList[0].open = true;\n return toNode(\n \"div\",\n {\n class: \"bb-tabs\",\n },\n tabsList\n );\n};\n\n/**\n * [tab=name]content[/tab]\n * [tab name=\"name\" style=\"style\"]content[/tab]\n */\nexport const tab = (node, options) => {\n if (!node.isValid) {\n return toRawTag(node, options.data.raw);\n }\n\n const attrs = preprocessAttr(node, options.data.raw);\n const name = attrs?._default || attrs?.name || \"Tab\";\n const tabId = `tab-${name.replace(/\\W/g, \"_\")}-${generateGUID()}`;\n return [\n toNode(\"input\", {\n type: \"radio\",\n id: tabId,\n name: \"tab-group-\" + node.groupId,\n class: \"bb-tab\",\n checked: node.open,\n }),\n toNode(\n \"label\",\n {\n class: \"bb-tab-label\",\n for: tabId,\n style: attrs.style,\n },\n name\n ),\n toNode(\n \"div\",\n {\n class: \"bb-tab-content\",\n },\n node.content\n ),\n ];\n};\n","/**\n * @file discourse-core-replacement.js\n * This is a dedicated file for replacing the standard Discourse BBCode tags in core.\n * In the markdown-it engine, discourse has added these bbcode tags in the inline parser.\n * However this means that if the parser detects a block level tag inside an inline tag,\n * it will not parse the inline tag.\n *\n * This file is meant to fix such scenarios by doing the parsing of bbcode tags for it.\n *\n * @example\n * [b][h]bold[/h][/b] // this should properly parse the bold tag inside the h tag\n *\n * https://github.com/discourse/discourse/blob/d7ece61252d7671a1f124483836279b99852c08c/app/assets/javascripts/discourse-markdown-it/src/features/bbcode-inline.js\n */\nimport { toNode } from \"../utils/common\";\n\nexport const bold = (node) => {\n return toNode(\"span\", { class: \"bbcode-b\" }, node.content);\n};\n\nexport const italic = (node) => {\n if (node.gen) {\n // node is actually a generated node \"i\" made by another tag\n // don't process it\n return node;\n }\n return toNode(\"span\", { class: \"bbcode-i\" }, node.content);\n};\n\nexport const underline = (node) => {\n return toNode(\"span\", { class: \"bbcode-u\" }, node.content);\n};\n\nexport const strike = (node) => {\n return toNode(\"span\", { class: \"bbcode-s\" }, node.content);\n};\n","import {\n MD_BROKEN_BLOCKQUOTE,\n MD_BROKEN_ORDERED_LIST,\n MD_BROKEN_UNORDERED_LIST,\n MD_NEWLINE_INJECT,\n MD_NEWLINE_INJECT_COMMENT,\n MD_NEWLINE_PRE_INJECT,\n} from \"./common\";\n\n/**\n * Post Processing designed to fix issues with Markdown and BBCode that the parser can't fix.\n *\n * Separate from markdown-it post processing as it'll be able to manipulate the full string.\n * @param {string} raw string from processing through both BBCode and Markdown\n * @returns post processed string\n */\nfunction removeNewlineInjects(raw) {\n const processed = raw\n .replaceAll(MD_NEWLINE_INJECT, \"\")\n .replaceAll(MD_NEWLINE_PRE_INJECT, \"\")\n .replaceAll(\"\\n\" + MD_NEWLINE_INJECT_COMMENT, \"\")\n .replaceAll(MD_NEWLINE_INJECT_COMMENT + \"\\n\", \"\")\n .replaceAll(MD_NEWLINE_INJECT_COMMENT, \"\"); // Remove all instances of the injected newline\n return processed;\n}\n\nfunction cleanMultilineMDBlocks(raw) {\n const processed = raw\n .replaceAll(MD_BROKEN_ORDERED_LIST, \"\")\n .replaceAll(MD_BROKEN_UNORDERED_LIST, \"\")\n .replaceAll(MD_BROKEN_BLOCKQUOTE, \"\");\n return processed;\n}\n\n/**\n * Injects hoisted code blocks back into the raw string\n * @param {string} raw input to inject hoisted code blocks into\n * @param {any} data contains hoist map\n * @returns string with hoisted code blocks injected\n */\nfunction renderHoistedCodeBlocks(raw, data) {\n const hoistMap = data.hoistMap;\n for (const [uuid, content] of Object.entries(hoistMap)) {\n // These examples bypass Markdown's text renderer while hoisted. Escape\n // them when restoring them, so HTML examples stay text inside code/plain.\n const escaped = content\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n raw = raw.replaceAll(uuid, escaped);\n }\n return raw;\n}\n\n/**\n * Setups the class style tag template for the post\n * @param {string} raw\n * @param {{styles: string[]}} data - contains styles array\n * @returns string\n */\nfunction createClassStyleTagTemplate(raw, data) {\n if (data.styles.length === 0) {\n return raw;\n }\n const template = '\";\n return template + raw;\n}\n\n/**\n * Setups the script tag template for the post\n * @param {string} raw\n * @param {{\n * bbscripts: {\n * id: string,\n * class: string,\n * on: string,\n * version: string,\n * content: string\n * }[]}} data - contains scripts array\n * @returns string\n */\nfunction createScriptTagTemplate(raw, data) {\n if (data.bbscripts.length === 0) {\n return raw;\n }\n const templates = data.bbscripts.map(\n (s) =>\n ``\n );\n return templates.join(\"\") + raw;\n}\n\n/**\n * Performs post processing on the raw string to address any necessary functionality that BBob/MD can't handle with a plugin (i.e. hoisting).\n * @param {string} raw processed input from after bbob and md\n * @param {any} data from bbob data\n * @returns final processed string\n */\nexport function postprocess(raw, data) {\n let final = raw;\n const postprocessors = [\n removeNewlineInjects,\n createClassStyleTagTemplate,\n createScriptTagTemplate,\n cleanMultilineMDBlocks,\n renderHoistedCodeBlocks,\n ];\n for (const postprocessor of postprocessors) {\n final = postprocessor(final, data);\n }\n return final;\n}\n","import { ESCAPABLES_REGEX, generateGUID, MD_TABLE_REGEX, regexIndexOf } from \"./common\";\n\n/**\n * Find all code blocks and hoist them out of the content and into a map for later insertion\n * @param {string} raw input to preprocess\n * @returns processed string and hoist map\n */\nfunction fenceCodeBlockPreprocess(content, data) {\n /** @type {Object.} */\n const hoistMap = {};\n let index = 0;\n\n const addHoistAndReturnNewStartPoint = (cutOffStart, cutOffEnd, expected, trim = false) => {\n const uuid = generateGUID();\n if (cutOffEnd !== -1) {\n hoistMap[uuid] = content.substring(cutOffStart, cutOffEnd);\n content = content.substring(0, cutOffStart) + uuid + content.substring(cutOffEnd);\n } else {\n hoistMap[uuid] = content.substring(cutOffStart);\n content = content.substring(0, cutOffStart) + uuid + expected;\n }\n if (trim) {\n if (hoistMap[uuid].startsWith(\"\\n\")) {\n hoistMap[uuid] = hoistMap[uuid].substring(1);\n }\n if (hoistMap[uuid].endsWith(\"\\n\")) {\n hoistMap[uuid] = hoistMap[uuid].substring(0, hoistMap[uuid].length - 1);\n }\n }\n return cutOffStart + uuid.length + expected.length;\n };\n\n while ((index = regexIndexOf(content, ESCAPABLES_REGEX, index)) !== -1) {\n const match = ESCAPABLES_REGEX.exec(content.substring(index));\n if (match.groups?.fence) {\n const fence = match.groups.fence;\n const fenceInfo = match.groups.fenceInfo;\n if (content[index] === \"\\n\") {\n // Check if the fence is not at the start of the content\n index += 1;\n }\n const closingFenceRegex = new RegExp(\"\\n\" + fence + \"(\\n|$)\"); // Find the next fence. By commonmark spec, it should be the same fence length and type\n const nextIndex = regexIndexOf(content, closingFenceRegex, index + fence.length);\n\n const uuid = generateGUID();\n if (nextIndex !== -1) {\n hoistMap[uuid] = content.substring(index + fence.length + fenceInfo.length, nextIndex);\n } else {\n hoistMap[uuid] = content.substring(index + fence.length + fenceInfo.length);\n }\n // inject bbcode tag before and after the code block. This is to prevent BBob plugin from injecting newlines\n const replacement = `[saveNL]\\n${fence}${fenceInfo}${uuid}\\n${fence}\\n[/saveNL]`;\n content =\n content.substring(0, index) +\n replacement +\n (nextIndex !== -1 ? content.substring(nextIndex + 1 + fence.length) : \"\");\n index = index + replacement.length;\n } else if (match.groups?.bbcode) {\n const bbcode = match.groups.bbcode;\n const bbcodeTag = match.groups.bbcodeTag.toLowerCase(); // coerce to lowercase for caseinsensitive matching\n const closingTag = `[/${bbcodeTag}]`;\n const nextIndex = content.toLowerCase().indexOf(closingTag, index + 1);\n index = addHoistAndReturnNewStartPoint(index + bbcode.length, nextIndex, closingTag, true);\n } else if (match.groups.backtick) {\n const backtick = match.groups.backtick; // contains whole content\n const tickStart = match.groups.tickStart;\n const tickEnd = match.groups.tickEnd;\n index = addHoistAndReturnNewStartPoint(\n index + tickStart.length,\n index + backtick.length - tickEnd.length,\n tickEnd,\n );\n }\n }\n\n data.hoistMap = hoistMap;\n return [content, data];\n}\n\n/**\n * Find all markdown table blocks and mark them to ignore newlines\n * @param {string} raw input to preprocess\n * @returns processed string\n */\nfunction mdTableBlockPreprocess(content, data) {\n let index = 0;\n while ((index = regexIndexOf(content, MD_TABLE_REGEX, index)) !== -1) {\n const match = MD_TABLE_REGEX.exec(content.substring(index));\n const table = match[0];\n const replacement = `[saveNL]\\n${table}\\n[/saveNL]`;\n content = content.substring(0, index) + replacement + content.substring(index + table.length);\n index = index + replacement.length;\n }\n return [content, data];\n}\n\n/**\n * Preprocesses input to be formatted for bbob to intake. Handles any necessary functionality that BBob can't handle with a plugin (i.e. hoisting).\n * @param {string} raw input to preprocess\n * @returns formatted input for bbob to intake\n */\nexport function preprocessRaw(raw) {\n let data = {};\n const preprocessors = [fenceCodeBlockPreprocess, mdTableBlockPreprocess];\n for (const preprocessor of preprocessors) {\n [raw, data] = preprocessor(raw, data);\n }\n return [raw, data];\n}\n","import bbob from \"@bbob/core\";\nimport { render } from \"@bbob/html\";\nimport { lineBreakPlugin } from \"./plugins/lineBreak\";\nimport { preserveWhitespace } from \"./plugins/preserveWhitespace\";\nimport { removeEmptyLinePlugin } from \"./plugins/removeEmptyLinesInAttr\";\nimport { availableTags, preset, preventParsing } from \"./preset\";\nimport { postprocess } from \"./utils/postprocess\";\nimport { preprocessRaw } from \"./utils/preprocess\";\n\nconst options = {\n onlyAllowTags: [...availableTags],\n caseFreeTags: true,\n contextFreeTags: preventParsing, // prevent parsing of children\n enableEscapeTags: true,\n onError: (err) => {\n if (options.previewing) {\n // eslint-disable-next-line no-console\n console.warn(err.message, err.lineNumber, err.columnNumber);\n }\n },\n};\nconst presetTags = preset();\n// Core handles its inline formatting unless a custom layout needs the BBCode tree.\nconst nativeInlineTags = new Set([\"b\", \"i\", \"u\", \"s\"]);\nconst customTagPattern = new RegExp(\n `\\\\[(?:${availableTags.filter((tag) => tag !== \"savenl\" && !nativeInlineTags.has(tag)).join(\"|\")})(?=[\\\\s=\\\\]])`,\n \"i\"\n);\n\nexport function containsBBCode(code) {\n // Hoist native fenced/inline code before deciding whether this post needs\n // legacy whitespace rules. A BBCode example is still ordinary Markdown.\n // Indented code can only start at the document start or after a blank line;\n // indentation continuing an ordinary paragraph is not a Markdown code block.\n // This is detection only: indenting nested tags in legacy layouts must not\n // turn those layouts into code when actual BBCode exists outside examples.\n const withoutIndentedCode = code\n .replace(/\\r\\n?/g, \"\\n\")\n .replace(/(^|\\n[ \\t]*\\n)(?:(?: {4}| {0,3}\\t)[^\\n]*(?:\\n|$)|[ \\t]*\\n)+/g, \"$1\");\n const [preprocessed] = preprocessRaw(withoutIndentedCode);\n return customTagPattern.test(preprocessed);\n}\n\nexport const RpNBBCode = (code, opts) => {\n const plugins = [presetTags];\n if (opts.preserveWhitespace) {\n plugins.push(preserveWhitespace());\n }\n plugins.push(lineBreakPlugin(), removeEmptyLinePlugin);\n const [preprocessed, preprocessedData] = preprocessRaw(code);\n return bbob(plugins).process(preprocessed, {\n render,\n ...options,\n data: {\n ...preprocessedData,\n raw: preprocessed,\n previewing: opts.previewing,\n fonts: new Set(),\n styles: [],\n bbscripts: [],\n },\n });\n};\n\nexport { availableTags, postprocess };\n","let C1 = 'C1';\nlet C2 = 'C2';\nif (process.env.NODE_ENV !== 'production') {\n C1 = '\"parser\" is not a function, please pass to \"process(input, { parser })\" right function';\n C2 = '\"render\" function not defined, please pass to \"process(input, { render })\"';\n}\nexport { C1, C2 };\n"],"names":["N","TAB","EQ","QUOTEMARK","SPACE","OPEN_BRAKET","CLOSE_BRAKET","SLASH","BACKSLASH","isTagNode","el","isStringNode","isEOL","keysReduce","obj","reduce","def","Object","keys","acc","key","getNodeLength","node","Array","isArray","content","count","contentNode","String","length","escapeAttrValue","value","replace","attrValue","name","JSON","stringify","attrsToString","values","arr","join","getTagAttrs","tag","params","uniqAttr","res","tagAttr","attrs","TagNode","attr","this","append","push","appendToNode","setStart","start","setEnd","end","toTagStart","openTag","closeTag","toTagEnd","toTagNode","newNode","toLowerCase","toString","r","renderContent","tagStart","create","isOf","type","constructor","TOKEN_TYPE_ID","getTokenValue","token","isTagEnd","charCodeAt","Token","isEmpty","isNaN","isText","isTag","isAttrName","isAttrValue","isStart","isEnd","getName","slice","getTagName","getValue","getLine","getColumn","getStart","getEnd","text","tokenToText","row","col","CharGrabber","skip","num","silent","c","pos","o","onSkip","hasNext","len","getCurr","s","getPos","getLength","getRest","substring","getNext","nextPos","getPrev","prevPos","isLast","includes","val","indexOf","grabWhile","condition","grabN","substrUntilChar","char","idx","source","options","createCharGrabber","WHITESPACES","SPECIAL_CHARS","isWhiteSpace","isEscapeChar","unq","str","charToRemove","charAt","trimChar","createLexer","buffer","prevCol","tokenIndex","stateMode","tagMode","contextFreeTag","tokens","Math","floor","escapeTags","enableEscapeTags","contextFreeTags","filter","Boolean","map","caseFreeTags","nestedMap","Map","onToken","RESERVED_CHARS","NOT_CHAR_TOKENS","isCharToken","checkContextFreeMode","isClosingTag","chars","emitToken","startPos","endPos","cl","p","e","createTokenOfType","nextTagState","tagChars","isSingleValueTag","masterStartPos","validAttrName","isValue","stateSpecial","validAttrValue","isQM","prevChar","nextChar","isPrevSLASH","isNextEQ","isWS","isNextWS","isSpecialChar","stateTag","currChar","substr","hasInvalidChars","isNoAttrsInTag","stateAttrs","tagStr","tagGrabber","hasSpace","stateWord","fullTagLen","fullTagName","isEscapableChar","isChar","tokenize","isTokenNested","tokenValue","has","get","status","set","NodeList","last","n","flush","pop","toArray","createList","parse","input","opts","onlyAllowTags","tokenizer","nodes","nestedNodes","tagNodes","tagNodesAttrName","nestedTagsMap","Set","isTagNested","tagName","flushTagNodes","getNodes","lastNestedNode","appendNodeAsString","isNested","forEach","item","appendNodes","handleTagStart","tagNode","from","to","add","handleTag","onError","line","column","lineNumber","columnNumber","handleTagEnd","lexer","createTokenizer","activeTagNode","attrName","handleNode","isObj","iterate","t","cb","tree","same","expected","actual","every","exp","some","call","act","ao","eo","createTree","extendedTree","messages","walk","match","expr","expression","renderNode","stripTags","render","toNode","gen","preprocessAttr","raw","vals","_default","nodeRaw","openTagParts","split","trim","startsWith","endsWith","toOriginalStartTag","toOriginalEndTag","toRawTag","regexIndexOf","string","regex","startpos","search","MD_NEWLINE_INJECT","MD_NEWLINE_PRE_INJECT","MD_NEWLINE_INJECT_COMMENT","URL_REGEX_SINGLE_LINE","RegExp","ESCAPABLES_REGEX","MD_TABLE_REGEX","generateGUID","d","Date","getTime","window","performance","now","random","isString","disableLineBreakConversion","reduceWordsToLines","unshift","child","splice","isWhitespaceSensitive","test","words","rightIdx","findLastIndex","w","i","numSpaces","fromCharCode","repeat","CONSECUTIVE_NEWLINE_REGEX","removeEmptyLinePlugin","process","tags","core","tagCallback","SLIDE_TITLE_OPEN","Symbol","SLIDE_TITLE_CLOSE","SLIDE_CLOSE","SLIDE_REGEX","markerToString","marker","accordionTags","accordion","groupId","markedContent","contentArr","newArr","shift","foundIndex","preContent","postContent","groups","slideTitleOpen","slideTitleClose","slideClose","generateSlideMarkersFromContent","generatedSlides","currentSlide","prevMarker","customTitle","generateSlidesFromMarkers","filteredContent","isValid","data","customSettings","lastValidAlignment","align","width","find","classes","style","class","slide","title","isOpen","open","titleAlign","left","right","center","possibleOptions","alignment","anchor","a","id","goto","href","WEB_FONTS","VALID_FONT_STYLES","thin","extralight","light","regular","medium","semibold","bold","extrabold","black","REGISTERED_AXIS","AXES_REGEX","emailHeader","emailFooter","rowcolumn","columnAttrs","columnStyle","EVENTS","ACCEPTED_OPTIONS","textmessage","messageList","messageNode","recipient","message","option","animation","previewing","commonGUID","commonId","keyframes","ident","cleanContent","replaceAll","formatted","styles","bg","color","block","defaultOp","blockAttr","blockOption","blockquote","author","border","br","centerblock","percentageInput","check","nameAttr","classSuffix","className","selector","mediaQuery","state","minWidth","maxWidth","code","inputColor","comment","div","classAttrs","classNames","divide","fieldset","fa","font","fontFamily","family","axes","ital","wght","matches","exec","italic","weight","named_weight","fromEntries","entries","axesParser","url","sort","googleFontApiBuild","fonts","custom","fontVar","h","h1","h2","h3","h4","h5","h6","heightrestrict","heightInput","heightValue","parsedHeight","parseHeight","highlight","icode","imagefloat","inlinespoiler","justify","keyframe","mail","attributes","mailAttr","mailOption","person","subject","newspaper","nobr","note","ooc","pindent","plain","print","printAttr","printOption","progress","percentageInt","quote","thinprogress","savenl","sh","script","onEvent","on","scriptSetup","version","bbscripts","scroll","side","size","fontSize","fontValue","valid","parsedSize","sizeRanges","unit","parseFontSize","outputAttr","spoiler","providedTitle","sub","sup","tab","tabId","checked","for","tabs","tabsList","tabNode","b","u","availableTags","preset","createPreset","defTags","processor","presetFactory","presetExecutor","assign","extend","callback","removeNewlineInjects","cleanMultilineMDBlocks","renderHoistedCodeBlocks","hoistMap","uuid","escaped","createClassStyleTagTemplate","createScriptTagTemplate","fenceCodeBlockPreprocess","index","addHoistAndReturnNewStartPoint","cutOffStart","cutOffEnd","fence","fenceInfo","closingFenceRegex","nextIndex","replacement","bbcode","closingTag","bbcodeTag","backtick","tickStart","tickEnd","mdTableBlockPreprocess","table","preprocessRaw","preprocessors","preprocessor","err","console","warn","presetTags","nativeInlineTags","customTagPattern","plugins","preserveWhitespace","preprocessed","preprocessedData","plugs","mockRender","skipParse","parser","parseFn","renderFn","Error","plugin","newTree","html","bbob","withoutIndentedCode","final","postprocessors","postprocessor"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,14,65]} \ No newline at end of file diff --git a/assets/javascripts/discourse/initializers/bbcode-parser-init.js b/assets/javascripts/discourse/initializers/bbcode-parser-init.js deleted file mode 100644 index f9a67ff..0000000 --- a/assets/javascripts/discourse/initializers/bbcode-parser-init.js +++ /dev/null @@ -1,15 +0,0 @@ -import loadscript from "discourse/lib/load-script"; - -export default { - name: "bbcode-parser-init", - initialize() { - if (window.bbcodeParser) { - return; - } else { - loadscript("/assets/bundled/bbcode-parser.min.js").then(() => { - // eslint-disable-next-line no-console - console.info("BBCode parser loaded for preview."); - }); - } - }, -}; diff --git a/assets/javascripts/discourse/initializers/fontawesome.js b/assets/javascripts/discourse/initializers/fontawesome.js index 422059b..731c585 100644 --- a/assets/javascripts/discourse/initializers/fontawesome.js +++ b/assets/javascripts/discourse/initializers/fontawesome.js @@ -5,7 +5,7 @@ const postsMissingFontAwesome = []; function initializeFontAwesome(api) { const siteSettings = api.container.lookup("service:site-settings"); - if (!siteSettings.fontawesome_kit_url) { + if (!siteSettings.bbcode_enabled || !siteSettings.fontawesome_kit_url) { return; } window.FontAwesomeConfig = { diff --git a/assets/javascripts/discourse/initializers/google-font.js b/assets/javascripts/discourse/initializers/google-font.js index 24203b7..538f321 100644 --- a/assets/javascripts/discourse/initializers/google-font.js +++ b/assets/javascripts/discourse/initializers/google-font.js @@ -10,7 +10,7 @@ import { withPluginApi } from "discourse/lib/plugin-api"; function addGoogleFont(post) { // Cleans up post if we're editing const priorLinks = post.querySelectorAll("link[data-rendered-gfont]"); - priorLinks.forEach((oldLink) => post.removeChild(oldLink)); + priorLinks.forEach((oldLink) => oldLink.remove()); const elements = post.querySelectorAll("[data-font]"); if (!elements.length) { @@ -20,7 +20,7 @@ function addGoogleFont(post) { const gFonts = []; Array.from(elements).map((e) => { const data = e.getAttribute("data-font"); - if (!gFonts.includes(data) && data.startsWith("https://fonts.googleapis.com")) { + if (!gFonts.includes(data) && data.startsWith("https://fonts.googleapis.com/css2?")) { frag.appendChild(linkBuilder(data)); gFonts.push(data); } @@ -48,6 +48,10 @@ function linkBuilder(data) { * @param api */ function initializeFont(api) { + if (!api.container.lookup("service:site-settings").bbcode_enabled) { + return; + } + api.decorateCookedElement((elem) => addGoogleFont(elem), { id: "add google font", }); diff --git a/assets/javascripts/discourse/initializers/highlight.js b/assets/javascripts/discourse/initializers/highlight.js index a3c4285..c22c986 100644 --- a/assets/javascripts/discourse/initializers/highlight.js +++ b/assets/javascripts/discourse/initializers/highlight.js @@ -340,6 +340,10 @@ function markdownHighlight(hljs) { * @param api */ function registerHighlightJs(api) { + if (!api.container.lookup("service:site-settings").bbcode_enabled) { + return; + } + api.registerHighlightJSLanguage("bbcode", bbcodeHighlight); api.registerHighlightJSLanguage("markdown-bbcode", markdownHighlight); } diff --git a/assets/javascripts/lib/discourse-markdown/bbcode-plugin.js b/assets/javascripts/lib/discourse-markdown/bbcode-plugin.js index 17ba3d0..8cedf39 100644 --- a/assets/javascripts/lib/discourse-markdown/bbcode-plugin.js +++ b/assets/javascripts/lib/discourse-markdown/bbcode-plugin.js @@ -1,116 +1,72 @@ -/** - * Processes inputted BBCode string using custom configured 3rd party library (see /bbcode-src) - * @param {string} raw content to preprocess into HTML - * @returns processed HTML string to pass into markdown-it - */ -function preprocessor(raw, opts, previewing = false) { - // eslint-disable-next-line no-undef - if (!bbcodeParser) { - // parser doesn't exist. Something horrible has happened and somehow the parser wasn't imported/initialized - // give up and send it straight back. - // eslint-disable-next-line no-console - console.warn( - "Attempted to get the bbcode parser: does not exist. Defaulting to standard markdown-it.", - "\ncalled on: \n", - raw - ); - return [raw, {}]; - } - const parser = globalThis.bbcodeParser.RpNBBCode; - opts.previewing = previewing; - - const processed = parser(raw, opts); - return [processed.html, processed.tree.options.data]; -} - -/** - * Processes the output of both the markdown-it and the bbcode parser, concatenating additional content if necessary - * @param {string} raw processed string - * @param {boolean} previewing flag - * @param {any} data from preprocessor - * @returns processed string - */ -function postprocessor(raw, previewing = false, data = {}) { - // eslint-disable-next-line no-undef - if (!bbcodeParser) { - // parser doesn't exist. Something horrible has happened and somehow the parser wasn't imported/initialized - // give up and send it straight back. - // eslint-disable-next-line no-console - console.warn( - "Attempted to get the bbcode parser: does not exist. Defaulting to standard markdown-it.", - "\ncalled on: \n", - raw - ); - return raw; - } - // preview auto clear doesn't check against the live dom, so if a onebox is at the end of the post, - // it won't be cleared and could cause a fatal error - const append = previewing ? '
      ' : ""; - return globalThis.bbcodeParser.postprocess(raw, data) + append; -} - +// Keep the BBCode parser inside Discourse's registered Markdown pipeline. +// Its output still passes through the normal sanitizer on both server and client. export function setup(helper) { - if (!helper.markdownIt) { - return; - } + helper.registerOptions((options, siteSettings) => { + options.features["bbcode-plugin"] = !!siteSettings.bbcode_enabled; + options.bbcodePreserveWhitespace = + siteSettings.preserve_whitespace && !siteSettings.discourse_normalize_whitespace; + }); - helper.registerOptions((opts, siteSettings) => { - opts.features["bbcode-parser"] = siteSettings.bbcode_enabled; - if (opts.engine || !siteSettings.bbcode_enabled) { - return; + helper.registerPlugin((md) => { + const parser = globalThis.bbcodeParser; + if (!parser) { + throw new Error("The registered BBCode parser asset is missing"); } - //Add check site settings for options to send to RpNBBCode - let preprocessor_options = { - preserveWhitespace: - siteSettings.preserve_whitespace && !siteSettings.discourse_normalize_whitespace, - }; - Object.defineProperty(opts, "engine", { - configurable: true, - set(engine) { - const md = engine.render; - engine.set({ breaks: false }); // disable breaks. Let BBob handle line breaks. + const parsedTokens = new WeakMap(); - engine.render = function (raw) { - if (engine.options?.discourse?.featuresOverride !== undefined) { - // if featuresOverride is set, we're in a chat message and should not preprocess - return md.apply(this, [raw]); - } - const [preprocessed, data] = preprocessor( - raw, - preprocessor_options, - engine.options?.discourse?.previewing - ); - const processed = md.apply(this, [preprocessed]); - const postprocessed = postprocessor( - processed, - engine.options?.discourse?.previewing, - data - ); - return postprocessed; - }; - Object.defineProperty(opts, "engine", { - configurable: true, - enumerable: true, - writable: true, - value: engine, - }); - }, + md.core.ruler.before("normalize", "rpn-bbcode", (state) => { + // Plain Markdown keeps native paragraphs, whitespace and code blocks. + // Restricted cooks (including chat) do not enable this feature. + state.env.rpnBBCode = false; + if (!parser.containsBBCode(state.src)) { + return; + } + + const processed = parser.RpNBBCode(state.src, { + preserveWhitespace: md.options.discourse.bbcodePreserveWhitespace, + previewing: md.options.discourse.previewing, + }); + state.src = processed.html; + state.env.rpnBBCode = true; + parsedTokens.set(state.tokens, processed.tree.options.data); }); - }); - helper.registerPlugin((md) => { - // disable paragraph rendering - md.renderer.rules.paragraph_open = function () { - return ""; - }; - md.renderer.rules.paragraph_close = function () { - return ""; - }; + // Legacy layouts indent nested tags for readability. After conversion the + // generated HTML must not become an indented Markdown code block. Capture + // the native rule through Ruler's public API while registering the plugin, + // then keep it enabled for every ordinary Markdown cook. + const blockRules = md.block.ruler.getRules(""); + md.block.ruler.disable("code", true); + const withoutCode = new Set(md.block.ruler.getRules("")); + const nativeCode = blockRules.find((rule) => !withoutCode.has(rule)); + if (nativeCode) { + md.block.ruler.at("code", (state, ...args) => { + return !state.env.rpnBBCode && nativeCode(state, ...args); + }); + md.block.ruler.enable("code"); + } + + for (const name of ["paragraph_open", "paragraph_close", "softbreak"]) { + const renderRule = md.renderer.rules[name]; + md.renderer.rules[name] = (tokens, index, options, env, renderer) => { + if (env.rpnBBCode) { + return name === "softbreak" ? "\n" : ""; + } + return renderRule + ? renderRule(tokens, index, options, env, renderer) + : renderer.renderToken(tokens, index, options); + }; + } - // this rule is where an indent (space/indent) is converted to a code block - // rarely used in the wild, but it's a common source of confusion - md.disable("code"); + // A renderer extension preserves the parser's hoisted code, styles and + // scripts without intercepting Discourse's engine initialization. + const render = md.renderer.render; + md.renderer.render = function (tokens, options, env) { + const html = render.call(this, tokens, options, env); + const data = parsedTokens.get(tokens); + return data ? parser.postprocess(html, data) : html; + }; }); helper.allowList([ @@ -138,6 +94,7 @@ export function setup(helper) { "div.bb-email-subject", "div.bb-float-left", "div.bb-float-right", + "div.bb-fieldset", "div.bb-height-restrict", "div.bb-img", "div.bb-justify", @@ -154,6 +111,7 @@ export function setup(helper) { "div.bb-progress", "div.bb-progress-bar", "div.bb-progress-other", + "div.bb-progress-bar-other", "div.bb-progress-text", "div.bb-progress-thin", "div.bb-ooc", @@ -204,6 +162,14 @@ export function setup(helper) { return true; } + if (tag === "div" && name === "data-span") { + return /^column-width-span\d+$/.test(value); + } + + if (tag === "span" && name === "data-font") { + return value.startsWith("https://fonts.googleapis.com/css2?"); + } + // custom attr allowlist for tabs if (tag === "input" && name === "type" && value === "radio") { return true; diff --git a/bbcode-src/index.js b/bbcode-src/index.js index 69a47b0..a6b4fb7 100644 --- a/bbcode-src/index.js +++ b/bbcode-src/index.js @@ -20,6 +20,26 @@ const options = { }, }; const presetTags = preset(); +// Core handles its inline formatting unless a custom layout needs the BBCode tree. +const nativeInlineTags = new Set(["b", "i", "u", "s"]); +const customTagPattern = new RegExp( + `\\[(?:${availableTags.filter((tag) => tag !== "savenl" && !nativeInlineTags.has(tag)).join("|")})(?=[\\s=\\]])`, + "i" +); + +export function containsBBCode(code) { + // Hoist native fenced/inline code before deciding whether this post needs + // legacy whitespace rules. A BBCode example is still ordinary Markdown. + // Indented code can only start at the document start or after a blank line; + // indentation continuing an ordinary paragraph is not a Markdown code block. + // This is detection only: indenting nested tags in legacy layouts must not + // turn those layouts into code when actual BBCode exists outside examples. + const withoutIndentedCode = code + .replace(/\r\n?/g, "\n") + .replace(/(^|\n[ \t]*\n)(?:(?: {4}| {0,3}\t)[^\n]*(?:\n|$)|[ \t]*\n)+/g, "$1"); + const [preprocessed] = preprocessRaw(withoutIndentedCode); + return customTagPattern.test(preprocessed); +} export const RpNBBCode = (code, opts) => { const plugins = [presetTags]; @@ -42,4 +62,4 @@ export const RpNBBCode = (code, opts) => { }); }; -export { postprocess }; +export { availableTags, postprocess }; diff --git a/bbcode-src/utils/common.js b/bbcode-src/utils/common.js index 8ca8adc..1d4b417 100644 --- a/bbcode-src/utils/common.js +++ b/bbcode-src/utils/common.js @@ -132,8 +132,10 @@ const URL_REGEX = const MD_URL_REGEX = /\!?\[.*\]\((http|ftp|https|upload):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])\)/; const URL_REGEX_SINGLE_LINE = new RegExp(`^${URL_REGEX.source}|${MD_URL_REGEX.source}$`); +// Both ends of an inline-code delimiter must be whole backtick runs. In +// particular, never retry shorter openers from inside an unmatched long run. const ESCAPABLES_REGEX = - /((\n|^)(?```+|~~~+)(?.*\n))|(?\[(?i?code|plain)(=.*)?\])|(?(?`{1,2})(.*)(?\k))/im; + /((\n|^)(?```+|~~~+)(?.*\n))|(?\[(?i?code|plain)(=[^\]\r\n]*)?\])|(?(?`+)(?!`)([\s\S]*?)(?(?)(?!`))/im; const MD_TABLE_REGEX = /^(\|[^\n]+\|\r?\n)((?:\| ?:?[-]+:? ?)+\|)(\n(?:\|[^\n]+\|\r?\n?)*)?$/m; const MD_BROKEN_ORDERED_LIST = "
\n
    "; @@ -153,7 +155,7 @@ function generateGUID() { } return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { // eslint-disable-next-line no-bitwise - const r = (d + Math.random() * 16) % 16 | 0; + const r = ((d + Math.random() * 16) % 16) | 0; d = Math.floor(d / 16); // eslint-disable-next-line no-bitwise return (c === "x" ? r : (r & 0x3) | 0x8).toString(16); diff --git a/bbcode-src/utils/postprocess.js b/bbcode-src/utils/postprocess.js index 6270578..0f7b234 100644 --- a/bbcode-src/utils/postprocess.js +++ b/bbcode-src/utils/postprocess.js @@ -41,7 +41,13 @@ function cleanMultilineMDBlocks(raw) { function renderHoistedCodeBlocks(raw, data) { const hoistMap = data.hoistMap; for (const [uuid, content] of Object.entries(hoistMap)) { - raw = raw.replaceAll(uuid, content); + // These examples bypass Markdown's text renderer while hoisted. Escape + // them when restoring them, so HTML examples stay text inside code/plain. + const escaped = content + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">"); + raw = raw.replaceAll(uuid, escaped); } return raw; } diff --git a/plugin.rb b/plugin.rb index 6a7c7f9..902aed3 100644 --- a/plugin.rb +++ b/plugin.rb @@ -37,15 +37,10 @@ module ::BbCode # when false, it does nothing, which allows for persistence of non-default whitespace. class ::TextCleaner # rubocop:disable Discourse/Plugins/NoMonkeyPatching module Optional_normalize_whitespace - def title_options - options = super - options[:normalize_whitespace_opt] = SiteSetting.discourse_normalize_whitespace - options - end def normalize_whitespaces(text) - options = title_options - text = super(text) if (options[:normalize_whitespace_opt]) - text + return text if SiteSetting.bbcode_enabled && !SiteSetting.discourse_normalize_whitespace + + super end end singleton_class.prepend Optional_normalize_whitespace diff --git a/spec/lib/pretty_text_spec.rb b/spec/lib/pretty_text_spec.rb new file mode 100644 index 0000000..c6d1e18 --- /dev/null +++ b/spec/lib/pretty_text_spec.rb @@ -0,0 +1,359 @@ +# frozen_string_literal: true + +RSpec.describe PrettyText do + before { SiteSetting.bbcode_enabled = true } + + def bbcode_fragment(raw, **options) + Nokogiri::HTML5.fragment(PrettyText.cook(raw, options)) + end + + it "cooks nested XenForo spoilers as independent, initially closed details" do + fragment = + bbcode_fragment( + "[spoiler=Outer]Before [spoiler=Inner][b]Hidden text[/b][/spoiler] After[/spoiler]", + ) + + outer = fragment.at_css("details.bb-spoiler") + inner = outer.at_css(".bb-spoiler-content details.bb-spoiler") + + expect(fragment.css("details.bb-spoiler").size).to eq(2) + expect(outer.at_css("summary").text).to eq("Spoiler: Outer") + expect(inner.at_css("summary").text).to eq("Spoiler: Inner") + expect(inner.at_css(".bb-spoiler-content .bbcode-b").text).to eq("Hidden text") + expect(outer.key?("open")).to eq(false) + expect(inner.key?("open")).to eq(false) + expect(outer.at_css(".bb-spoiler-content").text).to include("Before", "After") + end + + it "accepts mixed-case legacy spoiler tags" do + fragment = bbcode_fragment("[SPOILER=Example]Hidden [I]text[/I][/SPOILER]") + + expect(fragment.at_css("details.bb-spoiler > summary").text).to eq("Spoiler: Example") + expect(fragment.at_css(".bb-spoiler-content .bbcode-i").text).to eq("text") + end + + it "keeps formatted children inside an inline spoiler" do + fragment = bbcode_fragment("Before [inlinespoiler][b]Hidden[/b][/inlinespoiler] after") + + expect(fragment.at_css("span.bb-inline-spoiler .bbcode-b").text).to eq("Hidden") + expect(fragment.text).to include("Before", "after") + end + + it "preserves literal guide examples in BBCode and Markdown code blocks" do + example = "[spoiler=Example][b]Do not render this example[/b][/spoiler]" + fragment = bbcode_fragment("[code]#{example}[/code]\n\n```bbcode\n#{example}\n```") + + expect(fragment.css("pre code").size).to eq(2) + expect(fragment.css("pre code").map(&:text).map(&:strip)).to eq([example, example]) + expect(fragment.css("details, .bbcode-b")).to be_empty + end + + it "preserves inline code and plain-tag examples used by the guide" do + fragment = + bbcode_fragment( + "`[spoiler=Example]Hidden[/spoiler]` [plain][b]literal[/b][/plain] [b]rendered[/b]", + ) + + expect(fragment.at_css("code").text).to eq("[spoiler=Example]Hidden[/spoiler]") + expect(fragment.text).to include("[b]literal[/b]") + expect(fragment.css(".bbcode-b").map(&:text)).to eq(["rendered"]) + expect(fragment.css("details")).to be_empty + end + + it "does not reinterpret part of an unmatched backtick run as a shorter delimiter" do + fragment = bbcode_fragment("[b]Outside[/b] prefix ````example``` suffix") + + expect(fragment.css("code")).to be_empty + expect(fragment.text).to include("prefix ````example``` suffix") + expect(fragment.at_css(".bbcode-b").text).to eq("Outside") + end + + it "keeps exact-length backtick delimiters and multiline inline examples" do + fragment = + bbcode_fragment("[b]Outside[/b] prefix ``one ` two`` suffix `alpha\n[b]literal[/b]\nbeta`") + + expect(fragment.css("code").size).to eq(2) + expect(fragment.css("code").first.text).to eq("one ` two") + expect(fragment.css("code").last.text).to include("alpha", "[b]literal[/b]", "beta") + expect(fragment.css(".bbcode-b").map(&:text)).to eq(["Outside"]) + end + + it "shows HTML examples as text inside BBCode and Markdown code blocks" do + example = '
    A & B
    ' + fragment = + bbcode_fragment("[code=html]#{example}[/code]\n\n```html\n#{example}\n```\n\n`#{example}`") + + expect(fragment.css("code").map(&:text).map(&:strip)).to eq([example, example, example]) + expect(fragment.css("code div, .example")).to be_empty + end + + it "retains Markdown paragraphs when BBCode appears only inside a fenced example" do + example = "[spoiler=Example]Hidden text[/spoiler]" + fragment = + bbcode_fragment("First **paragraph**.\n\n```bbcode\n#{example}\n```\n\nSecond paragraph.") + + expect(fragment.css("p").map(&:text)).to eq(["First paragraph.", "Second paragraph."]) + expect(fragment.at_css("strong").text).to eq("paragraph") + expect(fragment.at_css("pre code").text.strip).to eq(example) + expect(fragment.css("details")).to be_empty + end + + it "retains Markdown paragraphs when BBCode appears only inside inline code" do + example = "[div]A layout example[/div]" + fragment = bbcode_fragment("First `#{example}` paragraph.\n\nSecond **paragraph**.") + + expect(fragment.css("p").map(&:text)).to eq( + ["First #{example} paragraph.", "Second paragraph."], + ) + expect(fragment.at_css("code").text).to eq(example) + expect(fragment.at_css("strong").text).to eq("paragraph") + expect(fragment.css("div")).to be_empty + end + + it "retains native indented code containing BBCode examples" do + fragment = bbcode_fragment(<<~MARKDOWN) + First **paragraph**. + + [b]Literal bold example[/b] + [spoiler=Example]Hidden text[/spoiler] + + Second paragraph. + MARKDOWN + + expect(fragment.css("p").map(&:text)).to eq(["First paragraph.", "Second paragraph."]) + expect(fragment.at_css("strong").text).to eq("paragraph") + expect(fragment.at_css("pre code").text.strip).to eq( + "[b]Literal bold example[/b]\n[spoiler=Example]Hidden text[/spoiler]", + ) + expect(fragment.css(".bbcode-b, details")).to be_empty + end + + it "retains native tab-indented code containing a BBCode example" do + example = "[spoiler=Example]Hidden text[/spoiler]" + fragment = bbcode_fragment("First paragraph.\n\n\t#{example}\n\nSecond paragraph.") + + expect(fragment.css("p").map(&:text)).to eq(["First paragraph.", "Second paragraph."]) + expect(fragment.at_css("pre code").text.strip).to eq(example) + expect(fragment.css("details")).to be_empty + end + + it "preserves historical curly-brace accordion slides and their nested content" do + fragment = bbcode_fragment(<<~BBCODE) + [accordion] + {slide=First|open}[spoiler=Secret][b]First body[/b][/spoiler]{/slide} + {slide=Second}Second body{/slide} + [/accordion] + BBCODE + slides = fragment.css(".bb-accordion > details.bb-slide") + + expect(slides.size).to eq(2) + expect(slides.map { |slide| slide.at_css("summary").text }).to eq(%w[First Second]) + expect(slides.first.key?("open")).to eq(true) + expect(slides.last.key?("open")).to eq(false) + expect(slides.first.at_css(".bb-slide-content details.bb-spoiler .bbcode-b").text).to eq( + "First body", + ) + expect(slides.last.at_css(".bb-slide-content").text).to eq("Second body") + end + + it "gives separate tab sets independent controls and matching labels" do + fragment = + bbcode_fragment( + "[tabs][tab=First]One[/tab][tab=Second]Two[/tab][/tabs]\n" \ + "[tabs][tab=First]Three[/tab][tab=Second]Four[/tab][/tabs]", + ) + groups = fragment.css(".bb-tabs") + inputs = fragment.css("input.bb-tab") + + expect(groups.size).to eq(2) + expect(inputs.size).to eq(4) + expect(inputs.map { |input| input["id"] }.uniq.size).to eq(4) + expect(inputs.map { |input| input["name"] }.uniq.size).to eq(2) + expect(fragment.css("label.bb-tab-label").map { |label| label["for"] }).to eq( + inputs.map { |input| input["id"] }, + ) + groups.each do |group| + expect(group.css("input[checked]").size).to eq(1) + expect(group.css(".bb-tab-content").size).to eq(2) + end + end + + it "preserves nested column layout and fieldset content through sanitization" do + fragment = + bbcode_fragment( + "[row][column=4][fieldset=Character][b]Name[/b][/fieldset][/column]" \ + "[column=8][spoiler=History]Story[/spoiler][/column][/row]", + ) + columns = fragment.css(".bb-row > .bb-column") + + expect(columns.size).to eq(2) + expect(columns.map { |column| column["data-span"] }).to eq( + %w[column-width-span4 column-width-span8], + ) + expect(columns.first.at_css("fieldset.bb-fieldset legend").text).to eq("Character") + expect(columns.first.at_css("fieldset.bb-fieldset .bbcode-b").text).to eq("Name") + expect(columns.last.at_css("details.bb-spoiler .bb-spoiler-content").text).to eq("Story") + end + + it "retains native paragraphs, emphasis, lists and indented code for Markdown posts" do + fragment = bbcode_fragment(<<~MARKDOWN) + First paragraph with **bold**. + + Second paragraph. + + - One + - Two + + standalone code + MARKDOWN + + expect(fragment.css("p").map(&:text)).to include( + "First paragraph with bold.", + "Second paragraph.", + ) + expect(fragment.at_css("strong").text).to eq("bold") + expect(fragment.css("ul > li").size).to eq(2) + + code = bbcode_fragment("Paragraph.\n\n standalone code") + expect(code.at_css("pre code").text.strip).to eq("standalone code") + end + + it "retains native Markdown tables" do + fragment = bbcode_fragment("| Name | Role |\n| --- | --- |\n| Alice | Writer |") + + expect(fragment.css("table th").map(&:text)).to eq(%w[Name Role]) + expect(fragment.css("table td").map(&:text)).to eq(%w[Alice Writer]) + end + + it "uses native inline formatting without changing Markdown paragraphs" do + fragment = + bbcode_fragment("First [b]bold[/b] [i]italic[/i].\n\nSecond [u]underlined[/u] [s]struck[/s].") + + expect(fragment.css("p").map(&:text)).to eq(["First bold italic.", "Second underlined struck."]) + expect(fragment.at_css("span.bbcode-b").text).to eq("bold") + expect(fragment.at_css("span.bbcode-i").text).to eq("italic") + expect(fragment.at_css("span.bbcode-u").text).to eq("underlined") + expect(fragment.at_css("span.bbcode-s").text).to eq("struck") + end + + it "retains native Markdown lists and tables containing core inline BBCode" do + fragment = bbcode_fragment(<<~MARKDOWN) + - [b]First[/b] + - [i]Second[/i] + + | Name | Role | + | --- | --- | + | [u]Alice[/u] | [s]Writer[/s] | + MARKDOWN + + expect(fragment.css("ul > li").map(&:text)).to eq(%w[First Second]) + expect(fragment.at_css("li .bbcode-b").text).to eq("First") + expect(fragment.css("table th").map(&:text)).to eq(%w[Name Role]) + expect(fragment.at_css("table td .bbcode-u").text).to eq("Alice") + end + + it "retains native indented code alongside core inline BBCode" do + fragment = bbcode_fragment("[b]Formatted paragraph[/b]\n\n [i]Literal example[/i]") + + expect(fragment.at_css("p .bbcode-b").text).to eq("Formatted paragraph") + expect(fragment.at_css("pre code").text.strip).to eq("[i]Literal example[/i]") + expect(fragment.css(".bbcode-i")).to be_empty + end + + it "keeps native Markdown headings inside authored div and nobr wrappers" do + fragment = + bbcode_fragment("[div]\n\n# First heading\n\n[/div]\n[nobr]\n\n## Second heading\n\n[/nobr]") + + expect(fragment.at_css("div h1").text).to eq("First heading") + expect(fragment.at_css("h2").text).to eq("Second heading") + end + + it "lets authors escape literal hash labels without disabling headings" do + fragment = bbcode_fragment("[div]\n\n\\# character sheet\n\n# Heading\n\n[/div]") + + expect(fragment.at_css("div").text).to include("# character sheet") + expect(fragment.css("h1").map(&:text)).to eq(["Heading"]) + end + + it "renders allowed raw HTML and leaves comments hidden beside custom BBCode" do + fragment = bbcode_fragment(<<~MARKUP) + [center]Custom content[/center] + +
    Open detailsVisible body
    + + + After the details. + MARKUP + + expect(fragment.at_css("details > summary").text).to eq("Open details") + expect(fragment.at_css("details").text).to include("Visible body") + expect(fragment.text).not_to include("
    ", "Hidden source note") + expect(fragment.at_css(".bb-center").text).to eq("Custom content") + end + + it "shows HTML and comments literally in plain and code examples" do + example = "
    ExampleBody
    " + fragment = bbcode_fragment("[plain]#{example}[/plain]\n[code=html]#{example}[/code]") + + expect(fragment.css("details, summary")).to be_empty + expect(fragment.text).to include(example) + expect(fragment.at_css("pre code").text.strip).to eq(example) + end + + it "leaves unsupported XenForo list and table tags literal" do + example = "[list][*]First[/list]\n[table][tr][td]Cell[/td][/tr][/table]" + fragment = bbcode_fragment(example) + + expect(fragment.text).to include( + "[list][*]First[/list]", + "[table][tr][td]Cell[/td][/tr][/table]", + ) + expect(fragment.css("ul, ol, table")).to be_empty + end + + it "renders indented legacy div layouts inside nobr without exposing generated HTML" do + fragment = bbcode_fragment(<<~BBCODE) + [div class=outer][nobr] + [div class=card] + [div class=inside][b]Character name[/b][/div] + [/div] + [/nobr][/div] + BBCODE + + expect(fragment.at_css("div div div .bbcode-b").text).to eq("Character name") + expect(fragment.css("pre, code")).to be_empty + expect(fragment.text).not_to include("", "[div", "[/div]") + end + + it "leaves native cooking in control when the plugin is disabled" do + SiteSetting.bbcode_enabled = false + fragment = bbcode_fragment("First **paragraph**.\n\n[center]Legacy text[/center]") + + expect(fragment.at_css("strong").text).to eq("paragraph") + expect(fragment.css("p").size).to eq(2) + expect(fragment.text).to include("[center]Legacy text[/center]") + expect(fragment.css(".bb-center")).to be_empty + end + + it "honors an explicit feature override used by chat cooking" do + fragment = + bbcode_fragment( + "**Chat text**\n\n[center]Legacy text[/center]", + features_override: %w[bold italics code paragraph], + ) + + expect(fragment.text).to include("[center]Legacy text[/center]") + expect(fragment.css(".bb-center")).to be_empty + end + + it "keeps cooked custom content inside Discourse's sanitizer" do + fragment = + bbcode_fragment( + '[spoiler=Example]' \ + "[b]Safe text[/b][/spoiler]", + ) + + expect(fragment.at_css("details.bb-spoiler .bbcode-b").text).to eq("Safe text") + expect(fragment.css("script, [onerror]")).to be_empty + end +end