├── .gitignore
├── .npmrc
├── .rubocop.yml
├── .prettierrc.cjs
├── .template-lintrc.cjs
├── .streerc
├── stylelint.config.mjs
├── test
├── fixtures
│ ├── corpus.js
│ ├── bug-reports.js
│ └── basic.js
├── unit
│ ├── from-bug-reports-test.js
│ ├── detect-code
│ │ ├── without-html-test.js
│ │ └── with-html-test.js
│ ├── post-length-test.js
│ ├── emoji-diversity-test.js
│ ├── sequential-lines-test.js
│ └── sensitivity-test.js
└── helpers
│ └── utils.js
├── eslint.config.mjs
├── translator.yml
├── Gemfile
├── spec
└── system
│ └── core_features_spec.rb
├── README.md
├── locales
├── be.yml
├── bg.yml
├── ca.yml
├── cs.yml
├── da.yml
├── el.yml
├── et.yml
├── gl.yml
├── hr.yml
├── hu.yml
├── hy.yml
├── id.yml
├── ko.yml
├── lt.yml
├── lv.yml
├── pt.yml
├── ro.yml
├── sk.yml
├── sl.yml
├── sq.yml
├── sr.yml
├── sv.yml
├── sw.yml
├── te.yml
├── th.yml
├── ug.yml
├── uk.yml
├── ur.yml
├── vi.yml
├── bs_BA.yml
├── en_GB.yml
├── fa_IR.yml
├── nb_NO.yml
├── pl_PL.yml
├── zh_TW.yml
├── en.yml
├── zh_CN.yml
├── ja.yml
├── he.yml
├── nl.yml
├── ar.yml
├── it.yml
├── fi.yml
├── tr_TR.yml
├── pt_BR.yml
├── ru.yml
├── es.yml
├── fr.yml
└── de.yml
├── .github
└── workflows
│ └── discourse-theme.yml
├── common
└── common.scss
├── package.json
├── scripts
└── watch-tests.sh
├── .discourse-compatibility
├── about.json
├── javascripts
└── discourse
│ ├── services
│ └── ucd-state.js
│ ├── core
│ ├── sensitivity.js
│ ├── strip-ignored-content.js
│ ├── code-energy.js
│ └── detect-code.js
│ ├── lib
│ ├── boundaries.js
│ └── emoji-diversity.js
│ ├── components
│ ├── modal
│ │ └── ucd-warning.gjs
│ └── ucd-warning.gjs
│ └── initializers
│ └── init.js
├── LICENSE
├── settings.yml
├── Gemfile.lock
└── pnpm-lock.yaml
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .discourse-site
3 | HELP
4 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict = true
2 | auto-install-peers = false
3 |
--------------------------------------------------------------------------------
/.rubocop.yml:
--------------------------------------------------------------------------------
1 | inherit_gem:
2 | rubocop-discourse: stree-compat.yml
3 |
--------------------------------------------------------------------------------
/.prettierrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = require("@discourse/lint-configs/prettier");
2 |
--------------------------------------------------------------------------------
/.template-lintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = require("@discourse/lint-configs/template-lint");
2 |
--------------------------------------------------------------------------------
/.streerc:
--------------------------------------------------------------------------------
1 | --print-width=100
2 | --plugins=plugin/trailing_comma,plugin/disable_auto_ternary
3 |
--------------------------------------------------------------------------------
/stylelint.config.mjs:
--------------------------------------------------------------------------------
1 | export default {
2 | extends: ["@discourse/lint-configs/stylelint"],
3 | };
4 |
--------------------------------------------------------------------------------
/test/fixtures/corpus.js:
--------------------------------------------------------------------------------
1 | // TODO
2 | export const shouldTrigger = [];
3 |
4 | // TODO
5 | export const shouldNotTrigger = [];
6 |
--------------------------------------------------------------------------------
/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import DiscourseRecommendedTheme from "@discourse/lint-configs/eslint-theme";
2 |
3 | export default [...DiscourseRecommendedTheme];
4 |
--------------------------------------------------------------------------------
/translator.yml:
--------------------------------------------------------------------------------
1 | # Configuration file for discourse-translator-bot
2 |
3 | files:
4 | - source_path: locales/en.yml
5 | destination_path: translations.yml
6 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | source "https://rubygems.org"
4 |
5 | group :development do
6 | gem "rubocop-discourse"
7 | gem "syntax_tree"
8 | end
9 |
--------------------------------------------------------------------------------
/spec/system/core_features_spec.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | RSpec.describe "Core features", type: :system do
4 | before { upload_theme_or_component }
5 |
6 | it_behaves_like "having working core features"
7 | end
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Discourse Unformatted Code Detector
2 |
3 | A discourse theme component to detect and warn users about unformatted code.
4 |
5 | Learn more at: https://meta.discourse.org/t/unformatted-code-detector-theme-component/112773
6 |
--------------------------------------------------------------------------------
/locales/be.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | be:
8 |
--------------------------------------------------------------------------------
/locales/bg.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | bg:
8 |
--------------------------------------------------------------------------------
/locales/ca.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ca:
8 |
--------------------------------------------------------------------------------
/locales/cs.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | cs:
8 |
--------------------------------------------------------------------------------
/locales/da.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | da:
8 |
--------------------------------------------------------------------------------
/locales/el.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | el:
8 |
--------------------------------------------------------------------------------
/locales/et.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | et:
8 |
--------------------------------------------------------------------------------
/locales/gl.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | gl:
8 |
--------------------------------------------------------------------------------
/locales/hr.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | hr:
8 |
--------------------------------------------------------------------------------
/locales/hu.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | hu:
8 |
--------------------------------------------------------------------------------
/locales/hy.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | hy:
8 |
--------------------------------------------------------------------------------
/locales/id.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | id:
8 |
--------------------------------------------------------------------------------
/locales/ko.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ko:
8 |
--------------------------------------------------------------------------------
/locales/lt.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | lt:
8 |
--------------------------------------------------------------------------------
/locales/lv.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | lv:
8 |
--------------------------------------------------------------------------------
/locales/pt.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | pt:
8 |
--------------------------------------------------------------------------------
/locales/ro.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ro:
8 |
--------------------------------------------------------------------------------
/locales/sk.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | sk:
8 |
--------------------------------------------------------------------------------
/locales/sl.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | sl:
8 |
--------------------------------------------------------------------------------
/locales/sq.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | sq:
8 |
--------------------------------------------------------------------------------
/locales/sr.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | sr:
8 |
--------------------------------------------------------------------------------
/locales/sv.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | sv:
8 |
--------------------------------------------------------------------------------
/locales/sw.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | sw:
8 |
--------------------------------------------------------------------------------
/locales/te.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | te:
8 |
--------------------------------------------------------------------------------
/locales/th.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | th:
8 |
--------------------------------------------------------------------------------
/locales/ug.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ug:
8 |
--------------------------------------------------------------------------------
/locales/uk.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | uk:
8 |
--------------------------------------------------------------------------------
/locales/ur.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ur:
8 |
--------------------------------------------------------------------------------
/locales/vi.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | vi:
8 |
--------------------------------------------------------------------------------
/locales/bs_BA.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | bs_BA:
8 |
--------------------------------------------------------------------------------
/locales/en_GB.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | en_GB:
8 |
--------------------------------------------------------------------------------
/locales/fa_IR.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | fa_IR:
8 |
--------------------------------------------------------------------------------
/locales/nb_NO.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | nb_NO:
8 |
--------------------------------------------------------------------------------
/locales/pl_PL.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | pl_PL:
8 |
--------------------------------------------------------------------------------
/locales/zh_TW.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | zh_TW:
8 |
--------------------------------------------------------------------------------
/.github/workflows/discourse-theme.yml:
--------------------------------------------------------------------------------
1 | name: Discourse Theme
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 | pull_request:
8 |
9 | jobs:
10 | ci:
11 | uses: discourse/.github/.github/workflows/discourse-theme.yml@v1
12 |
--------------------------------------------------------------------------------
/common/common.scss:
--------------------------------------------------------------------------------
1 | $spacer: 15px;
2 |
3 | .modal-ucd-warning {
4 | .modal-body {
5 | padding: 0 $spacer;
6 | }
7 |
8 | .checkbox-label {
9 | display: flex;
10 | justify-content: flex-end;
11 | margin: $spacer 0;
12 | }
13 |
14 | .action-buttons {
15 | display: flex;
16 | align-items: center;
17 | justify-content: space-between;
18 | margin: $spacer 0;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "devDependencies": {
4 | "@discourse/lint-configs": "2.25.0",
5 | "ember-template-lint": "7.8.1",
6 | "eslint": "9.28.0",
7 | "prettier": "3.5.3",
8 | "stylelint": "16.20.0"
9 | },
10 | "engines": {
11 | "node": ">= 22",
12 | "npm": "please-use-pnpm",
13 | "yarn": "please-use-pnpm",
14 | "pnpm": "9.x"
15 | },
16 | "packageManager": "pnpm@9.15.5"
17 | }
18 |
--------------------------------------------------------------------------------
/scripts/watch-tests.sh:
--------------------------------------------------------------------------------
1 | DISCOURSE_DIR="../discourse"
2 | UCD_DIR=$(pwd)
3 |
4 | run_tests () {
5 | QUNIT_RAILS_ENV=development d/rake "themes:qunit[name,Unformatted Code Detector]"
6 | }
7 |
8 | cd $DISCOURSE_DIR
9 |
10 | run_tests
11 |
12 | while true; do
13 | inotifywait -r -e modify,create,delete,attrib $UCD_DIR/test $UCD_DIR/javascripts
14 | sleep 1 # wait for changes to persist to Discourse instance
15 | run_tests
16 | done
17 |
--------------------------------------------------------------------------------
/test/unit/from-bug-reports-test.js:
--------------------------------------------------------------------------------
1 | import { module } from "qunit";
2 | import { detectUnformattedCode } from "../../discourse/core/detect-code";
3 | import { falseNegatives, falsePositives } from "../fixtures/bug-reports";
4 | import { expectAll } from "../helpers/utils";
5 |
6 | module("Unformatted Code Detector | bug reports", function () {
7 | expectAll(detectUnformattedCode, falseNegatives, true);
8 | expectAll(detectUnformattedCode, falsePositives, false);
9 | });
10 |
--------------------------------------------------------------------------------
/.discourse-compatibility:
--------------------------------------------------------------------------------
1 | < 3.6.0.beta1-dev: 758a2f70762f12b6f116aa642264040ca98daa2d
2 | < 3.5.0.beta5-dev: f92eab97a15556df502ea4d644920071b8446e09
3 | < 3.5.0.beta1-dev: 7c56ad642017bd7649f531cab57d2da0f6d4f84d
4 | < 3.4.0.beta2-dev: 9b5d5b16aa800d8d43dfe3f871594bf68f69cf02
5 | < 3.4.0.beta1-dev: 7dff8ccbcda763519cc1b94806b701af56875c3d
6 | < 3.3.0.beta1-dev: ac4dff5325b541b0337bad27c60afcfd954a2f0c
7 | 3.1.999: 84d3a6c7781260dff46ee2d3b7bebc99066c5493
8 | < 3.1.0: 4357b3ecb5ad907a596215b4154b4b1896cdde5a
9 |
--------------------------------------------------------------------------------
/about.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Unformatted Code Detector",
3 | "component": true,
4 | "license_url": "https://github.com/discourse/unformatted-code-detector/blob/main/LICENSE",
5 | "about_url": "https://meta.discourse.org/t/unformatted-code-detector-theme-component/112773",
6 | "authors": "Lionel Rowe",
7 | "theme_version": "0.11.3",
8 | "minimum_discourse_version": null,
9 | "maximum_discourse_version": null,
10 | "learn_more": "https://meta.discourse.org/t/beginners-guide-to-using-discourse-themes/91966"
11 | }
12 |
--------------------------------------------------------------------------------
/javascripts/discourse/services/ucd-state.js:
--------------------------------------------------------------------------------
1 | import Service from "@ember/service";
2 | import KeyValueStore from "discourse/lib/key-value-store";
3 |
4 | const DISMISSED = "permanently_dismissed";
5 | const NAMESPACE = "ucd_";
6 |
7 | export default class extends Service {
8 | store = new KeyValueStore(NAMESPACE);
9 |
10 | get permanentlyDismissed() {
11 | return this.store.getObject(DISMISSED) || false;
12 | }
13 |
14 | toggle() {
15 | this.store.setObject({ key: DISMISSED, value: !this.permanentlyDismissed });
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/test/unit/detect-code/without-html-test.js:
--------------------------------------------------------------------------------
1 | import { module } from "qunit";
2 | import { detectUnformattedCode } from "../../../discourse/core/detect-code";
3 | import { withBareHTML } from "../../fixtures/basic";
4 | import { expectAll } from "../../helpers/utils";
5 |
6 | module("Unformatted Code Detector | without HTML", function (hooks) {
7 | hooks.beforeEach(function () {
8 | settings.sensitivity = 1;
9 | settings.min_post_length_to_check = 0;
10 | settings.include_html = false;
11 | });
12 |
13 | expectAll(detectUnformattedCode, withBareHTML, false);
14 | });
15 |
--------------------------------------------------------------------------------
/test/helpers/utils.js:
--------------------------------------------------------------------------------
1 | import { test } from "qunit";
2 |
3 | export const wrap = (str) => {
4 | return str.split("\n").length > 1 ? "```\n" + str + "\n```" : "`" + str + "`";
5 | };
6 |
7 | const truncate = (len) => (str) =>
8 | str.slice(0, len) + (str.length > len ? "..." : "");
9 | const toSingleLine = (str) => truncate(35)(str).replaceAll("\n", "\\n");
10 |
11 | export const expectAll = (fn, tests, expected) => {
12 | tests.forEach((t) => {
13 | test(toSingleLine(t.toString()), function (assert) {
14 | assert.strictEqual(fn(t), expected);
15 | });
16 | });
17 | };
18 |
--------------------------------------------------------------------------------
/locales/en.yml:
--------------------------------------------------------------------------------
1 | en:
2 | warning_modal:
3 | title: Are you posting code?
4 | content: |
5 | It looks like your post may contain code or logs. To keep your post readable, please remember to **format your code** using the *Preformatted text* toolbar button >, or the backtick ` key on your keyboard, like so:
6 |
7 | `` `single line` ``
8 |
9 | ````
10 | ```
11 | multiple
12 | lines
13 | ```
14 | ````
15 | do_not_show_again: do not show this message again
16 | fix_post: Edit Post
17 | ignore_and_post_anyway: Post Anyway
18 |
--------------------------------------------------------------------------------
/javascripts/discourse/core/sensitivity.js:
--------------------------------------------------------------------------------
1 | export const applySensitivity =
2 | (sensitivity) => (leastSensitive, mostSensitive) =>
3 | leastSensitive + sensitivity * (mostSensitive - leastSensitive);
4 |
5 | export const sensitivityConfig = {
6 | get complexMatchesToIgnore() {
7 | return Math.round(applySensitivity(settings.sensitivity)(4, 0));
8 | },
9 |
10 | get minSequentialLinesToMatch() {
11 | return Math.round(applySensitivity(settings.sensitivity)(5, 1));
12 | },
13 |
14 | get minTotalCodeEnergy() {
15 | return Math.round(applySensitivity(settings.sensitivity)(5, 1));
16 | },
17 | };
18 |
--------------------------------------------------------------------------------
/locales/zh_CN.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | zh_CN:
8 | warning_modal:
9 | title: 您是否在发布代码?
10 | content: |
11 | 您的帖子中似乎包含代码或日志。为了让帖子易于阅读,请记得使用 *预格式化文本* 工具栏按钮 > 或键盘上的反引号 ` 键**设置您的代码的格式**,如下所示:
12 |
13 | `` `单行` ``
14 |
15 | ````
16 | ```
17 | 多行
18 | ```
19 | ````
20 | do_not_show_again: 不再显示此消息
21 | fix_post: 编辑帖子
22 | ignore_and_post_anyway: 仍然发帖
23 |
--------------------------------------------------------------------------------
/locales/ja.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ja:
8 | warning_modal:
9 | title: コードを投稿しようとしていますか?
10 | content: |
11 | 投稿にはコードまたはログが含まれるようです。投稿の可読性を維持するには、*整形済みテキスト*ツールバーボタン > を使用するか、以下のようにキーボードで逆引用符 ` キーを押して**コードをフォーマット**してください。
12 |
13 | `` `単一行` ``
14 |
15 | ````
16 | ```
17 | 複数
18 | 行
19 | ```
20 | ````
21 | do_not_show_again: 今後このメッセージを表示しない
22 | fix_post: 投稿を編集
23 | ignore_and_post_anyway: このまま投稿する
24 |
--------------------------------------------------------------------------------
/javascripts/discourse/lib/boundaries.js:
--------------------------------------------------------------------------------
1 | export const getLineBoundaries = (str) => {
2 | const lineBoundaries = [];
3 |
4 | let cursor = -1;
5 |
6 | do {
7 | lineBoundaries.push({ start: cursor + 1 });
8 |
9 | cursor = str.indexOf("\n", cursor + 1);
10 |
11 | lineBoundaries[lineBoundaries.length - 1].end =
12 | cursor === -1 ? str.length : cursor;
13 |
14 | lineBoundaries[lineBoundaries.length - 1].content = str.slice(
15 | lineBoundaries[lineBoundaries.length - 1].start,
16 | lineBoundaries[lineBoundaries.length - 1].end
17 | );
18 | } while (cursor > -1);
19 |
20 | return lineBoundaries;
21 | };
22 |
23 | export const isBetween = (start, end) => (point) => {
24 | return point >= start && point <= end;
25 | };
26 |
--------------------------------------------------------------------------------
/locales/he.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | he:
8 | warning_modal:
9 | title: בחרת לפרסם קוד?
10 | content: |
11 | נראה שהקוד שלך מכיל קוד או יומנים. כדי שהקוד שלך יישאר קריא, נא לזכור **לעצב את הקוד שלך** בעזרת כפתור סרגל הכלים *טקסט שעוצב מראש* >, או מקש ה־backtick ` במקלדת שלך, ככה:
12 |
13 | `` `שורה אחת` ``
14 |
15 | ````
16 | ```
17 | מספר
18 | שורות
19 | ```
20 | ````
21 | do_not_show_again: לא להציג את ההודעה הזאת שוב
22 | fix_post: לערוך את הפוסט
23 | ignore_and_post_anyway: לפרסם בכל זאת
24 |
--------------------------------------------------------------------------------
/locales/nl.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | nl:
8 | warning_modal:
9 | title: Plaats je code?
10 | content: |
11 | Het lijkt erop dat je bericht code of logs bevat. Houd je bericht leesbaar, dus denk eraan om **je code op te maken** met de werkbalkknop *Vooraf opgemaakte tekst* > of de backtick (accent grave) ` op je toetsenbord, op deze manier:
12 |
13 | `` `één regel` ``
14 |
15 | ````
16 | ```
17 | meerdere
18 | regels
19 | ```
20 | ````
21 | do_not_show_again: dit bericht niet meer weergeven
22 | fix_post: Bericht bewerken
23 | ignore_and_post_anyway: Toch plaatsen
24 |
--------------------------------------------------------------------------------
/locales/ar.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ar:
8 | warning_modal:
9 | title: هل تنشر رموز برمجية؟
10 | content: |
11 | يبدو أن منشورك قد يحتوي على رموز برمجية أو سجلات. للحفاظ على قابلية قراءة منشورك، يُرجى تذكر **تنسيق الرموز البرمجية الخاص بك** باستخدام زر شريط الأدوات *نص مُنسَّق مسبقًا* >، أو مفتاح علامة الاقتباس العكسية ` على لوحة المفاتيح، كما يلي:
12 |
13 | `` `single line` ``
14 |
15 | ````
16 | ```
17 | multiple
18 | lines
19 | ```
20 | ````
21 | do_not_show_again: لا تظهر هذه الرسالة مرة أخرى
22 | fix_post: تعديل المنشور
23 | ignore_and_post_anyway: النشر على أي حال
24 |
--------------------------------------------------------------------------------
/locales/it.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | it:
8 | warning_modal:
9 | title: Stai pubblicando codice?
10 | content: |
11 | Sembra che il tuo post contenga codice o log. Per mantenere il tuo post leggibile, ricordati di **formattare il tuo codice** usando il pulsante della barra degli strumenti *Testo preformattato* >, oppure il carattere backtick ` in questo modo:
12 |
13 | `` `riga singola` ``
14 |
15 | ````
16 | ```
17 | più
18 | righe
19 | ```
20 | ````
21 | do_not_show_again: non mostrare più questo messaggio
22 | fix_post: Modifica messaggio
23 | ignore_and_post_anyway: Pubblica comunque
24 |
--------------------------------------------------------------------------------
/locales/fi.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | fi:
8 | warning_modal:
9 | title: Oletko kirjoittamassa koodia?
10 | content: |
11 | Näyttää siltä, että viestisi saattaa sisältää koodia tai lokeja. Jotta viestisi pysyy luettavana, muista **muotoilla koodisi** käyttämällä työkalupalkin *Teksti ilman muotoiluja* -painiketta > tai näppäimistön gravismerkkiä ` , kuten näin:
12 |
13 | `` `yksi rivi` ``
14 |
15 | ````
16 | ```
17 | useita
18 | rivejä
19 | ```
20 | ````
21 | do_not_show_again: älä näytä tätä viestiä uudelleen
22 | fix_post: Muokkaa viestiä
23 | ignore_and_post_anyway: Julkaise joka tapauksessa
24 |
--------------------------------------------------------------------------------
/locales/tr_TR.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | tr_TR:
8 | warning_modal:
9 | title: Kod mu paylaşıyorsunuz?
10 | content: |
11 | Gönderiniz kod veya günlük içeriyor gibi görünüyor. Gönderinizi okunabilir tutmak için lütfen *Önceden biçimlendirilmiş metin* araç çubuğu düğmesini >veya aşağıdaki gibi klavyenizdeki ters tırnak işaretini ` kullanarak **kodunuzu biçimlendirmeyi** unutmayın:
12 |
13 | `` `tek satır` ``
14 |
15 | ````
16 | ```
17 | birden fazla
18 | satır
19 | ```
20 | ````
21 | do_not_show_again: bu mesajı tekrar gösterme
22 | fix_post: Gönderiyi düzenle
23 | ignore_and_post_anyway: Yine de paylaş
24 |
--------------------------------------------------------------------------------
/locales/pt_BR.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | pt_BR:
8 | warning_modal:
9 | title: Está postando um código?
10 | content: |
11 | Parece que sua postagem contém códigos ou registros. Para a postagem permanecer legível, não se esqueça de **formatar o código** usando o botão *Texto pré-formatado* na barra de ferramentas>, ou a tecla de acento grave ` no seu teclado, conforme a seguir:
12 |
13 | `` `linha única` ``
14 |
15 | ````
16 | ```
17 | várias
18 | linhas
19 | ```
20 | ````
21 | do_not_show_again: não exibir esta mensagem novamente
22 | fix_post: Editar postagem
23 | ignore_and_post_anyway: Postar mesmo assim
24 |
--------------------------------------------------------------------------------
/locales/ru.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | ru:
8 | warning_modal:
9 | title: Вы публикуете код?
10 | content: |
11 | Похоже, ваша публикация может содержать код или логи. Чтобы публикацию было удобно читать, **отформатируйте код** с помощью кнопки *Предварительно отформатированный текст* на панели инструментов >или обратной кавычки ` на клавиатуре, например:
12 |
13 | `` `одна строка` ``
14 |
15 | ````
16 | ```
17 | несколько
18 | строк
19 | ```
20 | ````
21 | do_not_show_again: больше не показывать это сообщение
22 | fix_post: Редактировать публикацию
23 | ignore_and_post_anyway: Опубликовать в любом случае
24 |
--------------------------------------------------------------------------------
/test/unit/detect-code/with-html-test.js:
--------------------------------------------------------------------------------
1 | import { module } from "qunit";
2 | import { detectUnformattedCode } from "../../../discourse/core/detect-code";
3 | import {
4 | noCode,
5 | withBareHTML,
6 | withFormattedCode,
7 | withFormattedHTML,
8 | withUnformattedCode,
9 | } from "../../fixtures/basic";
10 | import { expectAll } from "../../helpers/utils";
11 |
12 | module("Unformatted Code Detector | with HTML", function (hooks) {
13 | hooks.beforeEach(function () {
14 | settings.sensitivity = 1;
15 | settings.min_post_length_to_check = 0;
16 | });
17 |
18 | expectAll(detectUnformattedCode, noCode, false);
19 | expectAll(detectUnformattedCode, withUnformattedCode, true);
20 | expectAll(detectUnformattedCode, withFormattedCode, false);
21 | expectAll(detectUnformattedCode, withBareHTML, true);
22 | expectAll(detectUnformattedCode, withFormattedHTML, false);
23 | });
24 |
--------------------------------------------------------------------------------
/locales/es.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | es:
8 | warning_modal:
9 | title: '¿Estas publicando código?'
10 | content: |
11 | Parece que tu publicación puede contener código o registros. Para que tu publicación sea legible, recuerda **formatear tu código** utilizando el botón de la barra de herramientas *Texto preformateado* >, o la tecla de retroceso ` de tu teclado, de esta forma
12 |
13 | `` `línea única` ``
14 |
15 | ````
16 | ```
17 | varias
18 | líneas
19 | ```
20 | ````
21 | do_not_show_again: no volver a mostrar este mensaje
22 | fix_post: Editar publicación
23 | ignore_and_post_anyway: Publicar de todos modos
24 |
--------------------------------------------------------------------------------
/locales/fr.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | fr:
8 | warning_modal:
9 | title: Publiez-vous du code ?
10 | content: |
11 | Il semble que votre publication contient du code ou des journaux. Pour que votre publication reste lisible, n'oubliez pas de **formater votre code** à l'aide du bouton *Texte préformaté* de la barre d'outils > ou de la touche backtick ` de votre clavier, comme suit :
12 |
13 | ```ligne unique```
14 |
15 | ````
16 | ```
17 | plusieurs
18 | lignes
19 | ```
20 | ````
21 | do_not_show_again: ne plus afficher ce message
22 | fix_post: Modifier la publication
23 | ignore_and_post_anyway: Publier quand même
24 |
--------------------------------------------------------------------------------
/test/unit/post-length-test.js:
--------------------------------------------------------------------------------
1 | import { module } from "qunit";
2 | import { detectUnformattedCode } from "../../discourse/core/detect-code";
3 | import { withUnformattedCode } from "../fixtures/basic";
4 | import { expectAll } from "../helpers/utils";
5 |
6 | module("Unformatted Code Detector | ignore if too short", function (hooks) {
7 | hooks.beforeEach(function () {
8 | settings.sensitivity = 1;
9 | settings.min_post_length_to_check = 10_000;
10 | });
11 |
12 | expectAll(detectUnformattedCode, withUnformattedCode, false);
13 | });
14 |
15 | module("Unformatted Code Detector | ignore if too long", function (hooks) {
16 | hooks.beforeEach(function () {
17 | settings.sensitivity = 1;
18 | settings.max_post_length_to_check = 1;
19 | });
20 |
21 | expectAll(
22 | detectUnformattedCode,
23 | withUnformattedCode.filter((str) => str.length > 1),
24 | false
25 | );
26 | });
27 |
--------------------------------------------------------------------------------
/locales/de.yml:
--------------------------------------------------------------------------------
1 | # WARNING: Never edit this file.
2 | # It will be overwritten when translations are pulled from Crowdin.
3 | #
4 | # To work with us on translations, join this project:
5 | # https://translate.discourse.org/
6 |
7 | de:
8 | warning_modal:
9 | title: Postest du Code?
10 | content: |
11 | Es sieht so aus, als würde dein Beitrag Code oder Fehlerprotokolle enthalten. Damit dein Beitrag lesbar bleibt, vergiss bitte nicht, deinen Code zu **formatieren**, indem du die Schaltfläche *Vorformatierter Text* in der Symbolleiste > oder die Rückschritttaste ` auf deiner Tastatur benutzt, etwa so:
12 |
13 | `` `einzelne Zeile` ``
14 |
15 | ````
16 | ```
17 | mehrere
18 | Zeilen
19 | ```
20 | ````
21 | do_not_show_again: diese Meldung nicht mehr anzeigen
22 | fix_post: Beitrag bearbeiten
23 | ignore_and_post_anyway: Trotzdem posten
24 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Lionel Rowe
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/test/unit/emoji-diversity-test.js:
--------------------------------------------------------------------------------
1 | import { module, test } from "qunit";
2 | import { randomizeEmojiGender } from "../../discourse/lib/emoji-diversity";
3 |
4 | const originalMathRandom = Math.random;
5 |
6 | module("Unformatted Code Detector | randomize emoji gender", function (hooks) {
7 | hooks.afterEach(function () {
8 | // override in tests to make deterministic
9 | Math.random = originalMathRandom;
10 | });
11 |
12 | test("man technologist", function (assert) {
13 | Math.random = () => 0.4999;
14 |
15 | assert.strictEqual(randomizeEmojiGender("👩💻"), "👨💻");
16 | });
17 |
18 | test("woman technologist", function (assert) {
19 | Math.random = () => 0.5;
20 |
21 | assert.strictEqual(randomizeEmojiGender("👨💻"), "👩💻");
22 | });
23 |
24 | test("family: woman, woman, boy, boy", function (assert) {
25 | let i = 0;
26 | Math.random = () => [0.9, 0.9, 0, 0][i++];
27 |
28 | assert.strictEqual(randomizeEmojiGender("👨👩👧👦"), "👩👩👦👦");
29 | });
30 |
31 | test("family: man, man, girl, girl", function (assert) {
32 | let i = 0;
33 | Math.random = () => [0, 0, 0.9, 0.9][i++];
34 |
35 | assert.strictEqual(randomizeEmojiGender("👨👩👧👦"), "👨👨👧👧");
36 | });
37 | });
38 |
--------------------------------------------------------------------------------
/javascripts/discourse/components/modal/ucd-warning.gjs:
--------------------------------------------------------------------------------
1 | import Component from "@glimmer/component";
2 | import { action } from "@ember/object";
3 | import { service } from "@ember/service";
4 | import { htmlSafe } from "@ember/template";
5 | import { escape } from "pretty-text/sanitizer";
6 | import DModal from "discourse/components/d-modal";
7 | import { emojiUnescape } from "discourse/lib/text";
8 | import { i18n } from "discourse-i18n";
9 | import { randomizeEmojiDiversity } from "../../lib/emoji-diversity";
10 | import UcdWarning from "../ucd-warning";
11 |
12 | export default class ModalUcdWarning extends Component {
13 | @service ucdState;
14 |
15 | get title() {
16 | return htmlSafe(
17 | [
18 | emojiUnescape(escape(randomizeEmojiDiversity(settings.emoji_icon))),
19 | escape(i18n(themePrefix("warning_modal.title"))),
20 | ].join(" ")
21 | );
22 | }
23 |
24 | @action
25 | closeModal() {
26 | if (this.args.model.ucd_shouldPermanentlyDismiss) {
27 | this.ucdState.permanentlyDismiss();
28 | }
29 |
30 | this.args.closeModal();
31 | }
32 |
33 |
34 |
40 |
41 |
42 |
43 | }
44 |
--------------------------------------------------------------------------------
/test/unit/sequential-lines-test.js:
--------------------------------------------------------------------------------
1 | import { module, test } from "qunit";
2 | import {
3 | CodeEnergyLevels,
4 | codeEnergyValues,
5 | } from "../../discourse/core/code-energy";
6 | import {
7 | getCodeEnergy,
8 | numSequentialLinesWithThresholdCodeEnergy,
9 | } from "../../discourse/core/detect-code";
10 |
11 | module("Unformatted Code Detector | sequential lines", function (hooks) {
12 | hooks.beforeEach(function () {
13 | settings.min_sequential_lines_to_match = 3;
14 | settings.min_post_length_to_check = 0;
15 | });
16 |
17 | test("Unformatted Code Detector | no empty lines", function (assert) {
18 | const str =
19 | "a != b\nsome prose\n!=\nmore prose\n/* multi\nline != !=\ncomment */\na\na != 5\na != 7\n";
20 | const { lines } = getCodeEnergy(str);
21 |
22 | const sequentialLines = numSequentialLinesWithThresholdCodeEnergy(
23 | codeEnergyValues[CodeEnergyLevels.Complex]
24 | )(lines);
25 |
26 | assert.strictEqual(sequentialLines, 3);
27 | });
28 |
29 | test("Unformatted Code Detector | with empty lines", function (assert) {
30 | const str =
31 | "a != b\nsome prose\n\n!=\nmore prose\n/* multi\nline != !=\ncomment */\na\n\na != 5\na != 7\n";
32 | const { lines } = getCodeEnergy(str);
33 |
34 | const sequentialLines = numSequentialLinesWithThresholdCodeEnergy(
35 | codeEnergyValues[CodeEnergyLevels.Complex]
36 | )(lines);
37 |
38 | assert.strictEqual(sequentialLines, 3);
39 | });
40 | });
41 |
--------------------------------------------------------------------------------
/settings.yml:
--------------------------------------------------------------------------------
1 | emoji_icon:
2 | default: 👩🏽💻
3 | description:
4 | en: The emoji icon to be displayed next to the title in the unformatted warning modal.
5 | disable_at_trust_level:
6 | default: 3
7 | min: -1
8 | max: 4
9 | description:
10 | en: Disable warning for users with a trust level of N or higher. -1 = enabled for all users.
11 | zh_CN: 不要向信任等级高于 N 的用户显示警告。-1 即向所有用户显示。
12 | sensitivity:
13 | default: 0.5
14 | min: 0
15 | max: 1
16 | description:
17 | en: Sensitivity of the detection algorithm. 0 = plugin disabled; 1 = warn for anything that looks even slightly like code.
18 | min_post_length_to_check:
19 | default: 50
20 | min: 0
21 | description:
22 | en: Minimum post length to check (number of characters).
23 | max_post_length_to_check:
24 | default: -1
25 | min: -1
26 | description:
27 | en: Maximum post length to check (number of characters). -1 = no maximum.
28 | custom_regex_strings:
29 | default: ^#!
30 | type: list
31 | description:
32 | en: "Additional regex match strings to detect possible code fragments. CAUTION: These strings are evaluated directly with no syntax checking. Expressions cannot contain the alternation | character."
33 | include_extra_patterns:
34 | default: false
35 | description:
36 | en: Enable custom regex pattern string matching.
37 | include_html:
38 | default: true
39 | description:
40 | en: Check for HTML tags as well as other types of code. Recommended to disable if users frequently need to render custom HTML in their posts.
41 |
--------------------------------------------------------------------------------
/test/unit/sensitivity-test.js:
--------------------------------------------------------------------------------
1 | import { module, test } from "qunit";
2 | import { applySensitivity } from "../../discourse/core/sensitivity";
3 |
4 | module("Unformatted Code Detector | apply sensitivity", function () {
5 | test("lowest sensitivity", function (assert) {
6 | assert.strictEqual(applySensitivity(0)(1, 10), 1);
7 | });
8 |
9 | test("highest sensitivity", function (assert) {
10 | assert.strictEqual(applySensitivity(1)(1, 10), 10);
11 | });
12 |
13 | test("lowest sensitivity (higher = less sensitive)", function (assert) {
14 | assert.strictEqual(applySensitivity(0)(10, 1), 10);
15 | });
16 |
17 | test("highest sensitivity (higher = less sensitive)", function (assert) {
18 | assert.strictEqual(applySensitivity(1)(10, 1), 1);
19 | });
20 |
21 | test("middle sensitivity", function (assert) {
22 | assert.strictEqual(applySensitivity(0.5)(1, 9), 5);
23 | });
24 |
25 | test("middle sensitivity (higher = less sensitive)", function (assert) {
26 | assert.strictEqual(applySensitivity(0.5)(9, 1), 5);
27 | });
28 |
29 | test("mid-high sensitivity", function (assert) {
30 | assert.strictEqual(applySensitivity(0.75)(0, 4), 3);
31 | });
32 |
33 | test("mid-high sensitivity (higher = less sensitive)", function (assert) {
34 | assert.strictEqual(applySensitivity(0.75)(4, 0), 1);
35 | });
36 |
37 | test("mid-low sensitivity", function (assert) {
38 | assert.strictEqual(applySensitivity(0.25)(0, 4), 1);
39 | });
40 |
41 | test("mid-low sensitivity (higher = less sensitive)", function (assert) {
42 | assert.strictEqual(applySensitivity(0.25)(4, 0), 3);
43 | });
44 | });
45 |
--------------------------------------------------------------------------------
/test/fixtures/bug-reports.js:
--------------------------------------------------------------------------------
1 | export const falsePositives = [
2 | // https://meta.discourse.org/t/unformatted-code-detector-theme-component/112773/28
3 | `That's Japanese. ;)
4 |
5 | Funny bug though.`,
6 | // https://meta.discourse.org/t/unformatted-code-detector-theme-component/112773/34
7 | `[quote="mbauman, post:1, topic:186896"]
8 | I also just changed discobot’s text a bit as an experiment on our site to see if a slightly different wording helps lower the volume.
9 | [/quote]
10 |
11 | It's still early for our relatively small site but this is looking promising. In the month prior to changing this, 18 folks did that tutorial step and 4 flagged it wrong. In the month+ since 17 have done that step and 0 got it wrong. The new text adds a few more details about why you might flag a post but I'm guessing it's the very small change to the final sentence that's doing most of the work:
12 |
13 | > We like our discussions friendly, and we need your help to [keep things civilized](%{guidelines_url}). If you see a problem, please flag to privately let the author, or [our helpful staff](%{about_url}), know about it. There are many reasons you might want to flag a post ranging from an innocuous thread-splitting suggestion to a clear-cut standards violation. If you select "something else," you'll start a private message discussion chain with the moderators in which you can ask further questions.
14 | >
15 | > > :imp: I wrote something nasty here
16 | >
17 | > Go ahead and **flag this post**
and select **inappropriate** as the reason!`,
18 | ];
19 |
20 | export const falseNegatives = [];
21 |
--------------------------------------------------------------------------------
/javascripts/discourse/core/strip-ignored-content.js:
--------------------------------------------------------------------------------
1 | const ignoredContents = [
2 | // properly formatted code
3 | /(^([`~])\2{2,})[^`~\n]*\n[\s\S]*?\n\1\2*\s*(?:\n|$)/gm, // backtick-/tilde-fenced block
4 | /(?:^|(?:\n{2,}))\s*(?:(?: {4}|\t).*(?:\n|$))/g, // indented block
5 | // lack of `m` flag is intentional (`^` must match beginning of input, not line)
6 |
7 | /`[^`\n]+`/g, // inline backticks (must come after fenced code blocks)
8 |
9 | /\[([a-z]+).*?\][\s\S]*?\[\/\1\]/gim, // BBCode tags
10 |
11 | // URLs
12 | /https?:\/\/(_\([^() \n\t]+\)|[^() \n\t])+/g, // parens/underscores
13 | // for Wikipedia-style URLs
14 |
15 | // emojis
16 | /:[a-z_+-][a-z_0-9+-]*:/g, // descriptive style, e.g. :wink:, :stuck_out_tongue:
17 | /:D|:-D|:\)|:-\)|;\)|;-\)|:\(|:-\(|:o|:-o|:\?|:-\?|:\?\?\?:|8\)|8-\)|:x|:-x|:P|:-P|:!:|:\?:|:\||:-\||^_^|^__^|:'\(|:'-\(|:-'\(|:p|:O|:-O|:\/|;P|;-P|:\$|:-\$/g, // emoticon style, e.g. ;), :-P
18 | // per https://github.com/discourse/discourse/blob/dc6b547ed89f652b5406489d76140b76cf8e0d1d/script/import_scripts/phpbb3/support/smiley_processor.rb#L36-L63 and https://github.com/discourse/discourse/blob/0eeedf307a8f2a8e1ccd5b24dafbf5a7fd20e51e/lib/emoji/db.json#L7015-L7042
19 |
20 | // misc
21 | /\((?:c|tm|r)\)/gi, // copy/trademark/registered
22 |
23 | // markdown links and images
24 | /!?\[[^\]]+\]\([[^\)]+\)/g,
25 |
26 | // mentions (Prefixed by non-word and terminated at word boundary)
27 | /\B@[\w][\w.-]{0,58}\b/g,
28 | ];
29 |
30 | export const stripIgnoredContent = (content) => {
31 | const strippedContent = ignoredContents.reduce((str, ignoredContent) => {
32 | return str.replace(ignoredContent, "");
33 | }, content);
34 |
35 | return strippedContent;
36 | };
37 |
--------------------------------------------------------------------------------
/javascripts/discourse/lib/emoji-diversity.js:
--------------------------------------------------------------------------------
1 | const genderEmojiData = {
2 | masc: {
3 | adult: "👨",
4 | child: "👦",
5 | modifier: "\u200d♂",
6 | },
7 | fem: {
8 | adult: "👩",
9 | child: "👧",
10 | modifier: "\u200d♀",
11 | },
12 | // no widespread support for most gender-neutral emoji sequences yet :(
13 | // neutral: {
14 | // adult: "🧑",
15 | // child: "🧒",
16 | // modifier: "",
17 | // },
18 | };
19 |
20 | const randomGenderEmojiData = () => {
21 | const genders = Object.values(genderEmojiData);
22 |
23 | return genders[Math.floor(Math.random() * genders.length)];
24 | };
25 |
26 | const emojiRegexes = Object.keys(Object.values(genderEmojiData)[0]).reduce(
27 | (regexInfo, subStrType) => {
28 | regexInfo[subStrType] = new RegExp(
29 | Object.values(genderEmojiData)
30 | .map((gender) => gender[subStrType])
31 | .filter(Boolean)
32 | .join("|"),
33 | "g"
34 | );
35 |
36 | return regexInfo;
37 | },
38 | {}
39 | );
40 |
41 | export const randomizeEmojiGender = (emojis) =>
42 | Object.entries(emojiRegexes).reduce(
43 | (emoji, [subStrType, regex]) =>
44 | emoji.replace(regex, () => randomGenderEmojiData()[subStrType]),
45 | emojis
46 | );
47 |
48 | const MIN_SKIN_TONE_CODEPOINT = 0x1f3fb;
49 | const MAX_SKIN_TONE_CODEPOINT = 0x1f3ff;
50 |
51 | export const randomizeEmojiSkinTone = (emoji) =>
52 | emoji.replace(/[\u{1f3fb}-\u{1f3ff}]/gu, () =>
53 | String.fromCodePoint(
54 | MIN_SKIN_TONE_CODEPOINT +
55 | Math.floor(
56 | Math.random() *
57 | (MAX_SKIN_TONE_CODEPOINT - MIN_SKIN_TONE_CODEPOINT + 1)
58 | )
59 | )
60 | );
61 |
62 | export const randomizeEmojiDiversity = (emoji) =>
63 | randomizeEmojiSkinTone(randomizeEmojiGender(emoji));
64 |
--------------------------------------------------------------------------------
/javascripts/discourse/components/ucd-warning.gjs:
--------------------------------------------------------------------------------
1 | import Component from "@glimmer/component";
2 | import { Input } from "@ember/component";
3 | import { inject as controller } from "@ember/controller";
4 | import { on } from "@ember/modifier";
5 | import { action } from "@ember/object";
6 | import { service } from "@ember/service";
7 | import CookText from "discourse/components/cook-text";
8 | import DButton from "discourse/components/d-button";
9 | import { i18n } from "discourse-i18n";
10 |
11 | export default class UcdWarning extends Component {
12 | @service modal;
13 | @service ucdState;
14 |
15 | @controller composer;
16 |
17 | get shouldPermanentlyDismiss() {
18 | return this.ucdState.permanentlyDismissed ?? false;
19 | }
20 |
21 | @action
22 | toggleShouldPermanentlyDismiss() {
23 | this.ucdState.toggle();
24 | }
25 |
26 | @action
27 | goBackAndFix() {
28 | this.modal.close();
29 | }
30 |
31 | @action
32 | ignoreAndProceed() {
33 | this.modal.close();
34 | this.composer.model.ucd_previousWarningIgnored = true;
35 | this.composer.save();
36 | }
37 |
38 |
39 |
40 |
50 |
51 |
57 |
61 |
62 |
63 | }
64 |
--------------------------------------------------------------------------------
/javascripts/discourse/initializers/init.js:
--------------------------------------------------------------------------------
1 | import { service } from "@ember/service";
2 | import { withPluginApi } from "discourse/lib/plugin-api";
3 | import ModalUcdWarning from "../components/modal/ucd-warning";
4 | import { detectUnformattedCode, printDebugInfo } from "../core/detect-code";
5 |
6 | const getDisableAtTrustLevel = () =>
7 | settings.disable_at_trust_level === -1
8 | ? Infinity
9 | : settings.disable_at_trust_level;
10 |
11 | export default {
12 | name: "unformatted-code-detector",
13 | initialize() {
14 | withPluginApi("0.8.8", (api) => {
15 | window.debugUnformattedCodeDetector = () => {
16 | const content = document.querySelector(
17 | "#reply-control textarea.d-editor-input"
18 | )?.value;
19 | if (!content) {
20 | // eslint-disable-next-line no-console
21 | console.log("No content found");
22 | } else {
23 | printDebugInfo(content);
24 | }
25 | };
26 |
27 | api.modifyClass(
28 | "model:composer",
29 | (Superclass) =>
30 | class extends Superclass {
31 | @service ucdState;
32 |
33 | ucd_previousWarningIgnored = false;
34 |
35 | ucd_checkShouldIgnoreWarning() {
36 | return (
37 | this.ucd_previousWarningIgnored ||
38 | this.ucdState.permanentlyDismissed ||
39 | api.getCurrentUser()?.trust_level >= getDisableAtTrustLevel()
40 | );
41 | }
42 |
43 | ucd_checkUnformattedCodeDetected() {
44 | return detectUnformattedCode(this.reply);
45 | }
46 | }
47 | );
48 |
49 | api.modifyClass(
50 | "service:composer",
51 | (Superclass) =>
52 | class extends Superclass {
53 | save(...args) {
54 | if (
55 | this.model.ucd_checkUnformattedCodeDetected() &&
56 | !this.model.ucd_checkShouldIgnoreWarning()
57 | ) {
58 | this.modal.show(ModalUcdWarning, {
59 | model: this.model,
60 | });
61 | } else {
62 | super.save(...args);
63 | }
64 | }
65 | }
66 | );
67 | });
68 | },
69 | };
70 |
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: https://rubygems.org/
3 | specs:
4 | activesupport (8.0.2)
5 | base64
6 | benchmark (>= 0.3)
7 | bigdecimal
8 | concurrent-ruby (~> 1.0, >= 1.3.1)
9 | connection_pool (>= 2.2.5)
10 | drb
11 | i18n (>= 1.6, < 2)
12 | logger (>= 1.4.2)
13 | minitest (>= 5.1)
14 | securerandom (>= 0.3)
15 | tzinfo (~> 2.0, >= 2.0.5)
16 | uri (>= 0.13.1)
17 | ast (2.4.3)
18 | base64 (0.3.0)
19 | benchmark (0.4.1)
20 | bigdecimal (3.2.2)
21 | concurrent-ruby (1.3.5)
22 | connection_pool (2.5.3)
23 | drb (2.2.3)
24 | i18n (1.14.7)
25 | concurrent-ruby (~> 1.0)
26 | json (2.12.2)
27 | language_server-protocol (3.17.0.5)
28 | lint_roller (1.1.0)
29 | logger (1.7.0)
30 | minitest (5.25.5)
31 | parallel (1.27.0)
32 | parser (3.3.8.0)
33 | ast (~> 2.4.1)
34 | racc
35 | prettier_print (1.2.1)
36 | prism (1.4.0)
37 | racc (1.8.1)
38 | rack (3.1.16)
39 | rainbow (3.1.1)
40 | regexp_parser (2.10.0)
41 | rubocop (1.76.0)
42 | json (~> 2.3)
43 | language_server-protocol (~> 3.17.0.2)
44 | lint_roller (~> 1.1.0)
45 | parallel (~> 1.10)
46 | parser (>= 3.3.0.2)
47 | rainbow (>= 2.2.2, < 4.0)
48 | regexp_parser (>= 2.9.3, < 3.0)
49 | rubocop-ast (>= 1.45.0, < 2.0)
50 | ruby-progressbar (~> 1.7)
51 | unicode-display_width (>= 2.4.0, < 4.0)
52 | rubocop-ast (1.45.0)
53 | parser (>= 3.3.7.2)
54 | prism (~> 1.4)
55 | rubocop-capybara (2.22.1)
56 | lint_roller (~> 1.1)
57 | rubocop (~> 1.72, >= 1.72.1)
58 | rubocop-discourse (3.12.1)
59 | activesupport (>= 6.1)
60 | lint_roller (>= 1.1.0)
61 | rubocop (>= 1.73.2)
62 | rubocop-capybara (>= 2.22.0)
63 | rubocop-factory_bot (>= 2.27.0)
64 | rubocop-rails (>= 2.30.3)
65 | rubocop-rspec (>= 3.0.1)
66 | rubocop-rspec_rails (>= 2.31.0)
67 | rubocop-factory_bot (2.27.1)
68 | lint_roller (~> 1.1)
69 | rubocop (~> 1.72, >= 1.72.1)
70 | rubocop-rails (2.32.0)
71 | activesupport (>= 4.2.0)
72 | lint_roller (~> 1.1)
73 | rack (>= 1.1)
74 | rubocop (>= 1.75.0, < 2.0)
75 | rubocop-ast (>= 1.44.0, < 2.0)
76 | rubocop-rspec (3.6.0)
77 | lint_roller (~> 1.1)
78 | rubocop (~> 1.72, >= 1.72.1)
79 | rubocop-rspec_rails (2.31.0)
80 | lint_roller (~> 1.1)
81 | rubocop (~> 1.72, >= 1.72.1)
82 | rubocop-rspec (~> 3.5)
83 | ruby-progressbar (1.13.0)
84 | securerandom (0.4.1)
85 | syntax_tree (6.2.0)
86 | prettier_print (>= 1.2.0)
87 | tzinfo (2.0.6)
88 | concurrent-ruby (~> 1.0)
89 | unicode-display_width (3.1.4)
90 | unicode-emoji (~> 4.0, >= 4.0.4)
91 | unicode-emoji (4.0.4)
92 | uri (1.0.3)
93 |
94 | PLATFORMS
95 | arm64-darwin-23
96 | ruby
97 |
98 | DEPENDENCIES
99 | rubocop-discourse
100 | syntax_tree
101 |
102 | BUNDLED WITH
103 | 2.6.9
104 |
--------------------------------------------------------------------------------
/test/fixtures/basic.js:
--------------------------------------------------------------------------------
1 | import { wrap } from "../helpers/utils";
2 |
3 | export const noCode = [
4 | "hello world",
5 | "just some _plain old italics_",
6 | "one _word_ italicized",
7 | "one *word* italicized",
8 | "one __word__ bolded",
9 | "one **word** bolded",
10 | "# an innocent heading",
11 | "google.com",
12 | "https://www.google.com",
13 | "semicolons; also,",
14 | "freeCodeCamp",
15 | "hyphenated-word",
16 | "C++",
17 | "Notepad++",
18 | "this is (just some stuff in brackets)",
19 | "this is(just some stuff in brackets, despite the typo)",
20 | "{ I just happen to like curly braces }",
21 | "'",
22 | '"',
23 | "\n",
24 | "\t",
25 | "\0",
26 | "\\",
27 | "$15",
28 | "||", // empty table heading
29 | "https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Client-side_web_APIs/Client-side_storage",
30 | "https://en.wikipedia.org/wiki/LAN_(disambiguation)",
31 | "[LAN](https://en.wikipedia.org/wiki/LAN_(disambiguation))",
32 | "https://www.google.com?foo=bar",
33 | "https://www.google.com?foo=bar,baz",
34 | "https://www.google.com?foo[0]=bar&foo[1]=baz",
35 | "email@example.com",
36 | "O(n)",
37 | ":smile:",
38 | ":slight_smile:",
39 | ":+1:",
40 | "TradeName(tm)",
41 | "copy(c)",
42 | "registered(R)",
43 | '[quote="David_Bowie, post:8, topic:1120"]\nsome text\n[/quote]',
44 | 'some other stuff\n\n[quote="David_Bowie, post:8, topic:1120"]\nquoted text\n[/quote]\n\nmore stuff',
45 | 'empty\n\n[quote="David_Bowie, post:8, topic:1120"][/quote]',
46 | "[abc](https://www.google.com)",
47 | "",
48 | "That's Japanese. ;)\n\nFunny bug though.",
49 | "That's Japanese. :stuck_out_tongue:\n\nFunny bug though.",
50 | "That's Japanese. :???:\n\nFunny bug though.",
51 | "That's Japanese. :!:\n\nFunny bug though.",
52 | "Hey @some_username, how are you?",
53 | ];
54 |
55 | export const withUnformattedCode = [
56 | "const a = $helloWorld",
57 | "const a = helloWorld;",
58 | ".my-class { background: red; }",
59 | ":symbol",
60 | "this_is_snake_case",
61 | "a snake_case var",
62 | "// a comment",
63 | "// www.google.com",
64 | "; an old-school comment",
65 | "/* this comment\nspans two lines */",
66 | "/* this comment doesn't */",
67 | '"""\nhooray for python\n"""',
68 | "'''\nhooray for python\n'''",
69 | "noArgs()",
70 | "oneArg(1)",
71 | "lotsOfArgs(1, \"a\", 'b', onionSoup)",
72 | "myArr[15]",
73 | "myObj['prop']",
74 | "{",
75 | "}",
76 | "{{templates}}",
77 | "${js}", // exclude backticks to bypass code markup stripping
78 | '"#{ruby}"',
79 | "1 && 2",
80 | "a != b",
81 | "a !== b",
82 | "exists.?maybeExists",
83 | "arr << item",
84 | "0b100 >> 2",
85 | "Double::Colons",
86 | "counter += 2",
87 | "counter -= 2",
88 | "counter *= 2",
89 | "counter /= 2",
90 | "maybeExists ||= definitelyExists",
91 | "maybeExists &&= definitelyExists",
92 | "casting ?= operator",
93 | "\\'",
94 | '\\"',
95 | "\\n",
96 | "\\t",
97 | "\\r",
98 | "\\0",
99 | "\\\\",
100 | " hello erb ?>",
101 | "<% hello php %>",
102 | 'some other stuff\n\n[quote="David_Bowie, post:8, topic:1120"]\nquoted text\n[/quote]\n\ncode overHere()',
103 | 'some other stuff\n\n[quote="David_Bowie, post:8, topic:1120"]\nquoted text\n[/quote]\n\ncode overHere()\n\n\na',
104 | "2021-05-17T13:40:52.845Z",
105 | "2021-05-17T13:40:52.845+01:00",
106 | "2021-05-17T13:40:52.845-01:00",
107 | "2021-05-17T13:40:52.845",
108 | "2021-05-17T13:40:52",
109 | "2021-05-17T13:40:52Z",
110 | "2021-05-17T13:40:52+01:00",
111 | "2021-05-17T13:40:52-01:00",
112 | "error\nat java.base/java.lang.Thread.dumpStack(Thread.java:1383)",
113 | "error\n\tat com.somewhere.stacktraces.StackTrace.d(StackTrace.java:23)",
114 | "error\n at unwrapOpResult (deno:core/core.js:106:13)",
115 | '{"a": 1}',
116 | '{"a":"b","c":"d"}',
117 | '{"a": "b","c": "d"}',
118 | '{ "a": "b","c": "d" }',
119 | '{ "a" : "b","c" : "d" }',
120 | `a != b
121 | some prose
122 | /* multi
123 | line != !=
124 | comment */
125 |
126 | a != 5
127 | a != 7
128 | `,
129 | ];
130 |
131 | export const withBareHTML = [
132 | "",
133 | '',
134 | "",
135 | "\nsome text\n",
136 | "",
137 | "",
138 | "one & two",
139 | "three * four",
140 | "five * six",
141 | ];
142 |
143 | export const withFormattedCode = withUnformattedCode.map(wrap);
144 |
145 | export const withFormattedHTML = withBareHTML.map(wrap);
146 |
--------------------------------------------------------------------------------
/javascripts/discourse/core/code-energy.js:
--------------------------------------------------------------------------------
1 | const varNameStart = "[$_a-zA-Z]";
2 | const varNameEnd = "[$_a-zA-Z0-9]*";
3 | const varName = `${varNameStart}${varNameEnd}`;
4 | const varFragment = `[$a-zA-Z]${varNameEnd}`; // no underscore at start
5 | const xmlLikeName = "[a-zA-Z-]+";
6 | const string = `(?:"(?:[^\\n"\\\\]|\\\\[^\\n])*"|'(?:[^\\n'\\\\]|\\\\[^\\n])*')`;
7 | // adapted from http://wordaligned.org/articles/string-literals-and-regular-expressions
8 | const numeric = "-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?";
9 | // adapted from https://www.json.org/
10 | const argument = `(?:${varName}|${string}|${numeric})`;
11 | // ignoring complex values due to complexity;
12 | // bools, `null`s, and `undefined`s are already matched based on varName
13 | const argList = `(?:\\s*${argument}\\s*(?:,\\s*${argument}\\s*)*|\\s*)`;
14 | // matches 0 or more args; don't use on its own due to risk of infinite matches
15 |
16 | // enum
17 | export const CodeEnergyLevels = {
18 | Complex: "Complex",
19 | High: "High",
20 | Medium: "Medium",
21 | Low: "Low",
22 | };
23 |
24 | export const codeEnergyValues = {
25 | [CodeEnergyLevels.Complex]: 1,
26 | [CodeEnergyLevels.High]: 0.7,
27 | [CodeEnergyLevels.Medium]: 0.3,
28 | [CodeEnergyLevels.Low]: 0.1,
29 | };
30 |
31 | const nonHtmlIndicators = [
32 | `\\$${varName}`, // almost certain to be var name
33 | `^\\s*\\.${xmlLikeName}`, // CSS class selectors
34 | `:${varName}`, // Ruby symbol
35 | // omitted: _varName starting with underscore (conflict with italics)
36 | `${varFragment}(?:_${varFragment})+`, // snake_case
37 | // ommitted: camelCase and spinal-case (too many false positives)
38 | "(?:^|\\s+)(?:\\/\\/|;)", // single-line comment
39 | // omitted: python-style `#` single-line comments and CSS ID selectors (conflict with md headings)
40 | `\\/\\*[\\s\\S]+?\\*\\/`, // C-like multiline comment
41 | `('''|""")[\\s\\S]+?\\1`, // Python-like multiline string/comment
42 | ";\\s*$", // trailing semicolon
43 | `(?:${varName})?[$_a-z]\\(${argList}\\)`, // function call
44 | // var name cannot end with uppercase to avoid `O(n)` false positive etc.
45 | `${varName}\\[\\s*${argument}?\\s*\\]`, // array index
46 | // omitted: object property (conflict with domain names, e.g. "google.com")
47 | "^\\s*[{}]\\s*$", // curly brace and nothing else on a line
48 | "\\{\\{.+\\}\\}", // templating languages e.g. Handlebars
49 | "[\\$#]\\{.+\\}", // template string
50 | "&&|!=|>>|<<|::|\\+=|-=|\\*=|\\/=|\\|\\|=|\\?=|\\.\\?", // various operators
51 | // omitted: ++ (conflict with C++, Notepad++, etc.)
52 | // omitted: || (conflict with empty table header row)
53 | "\\\\['\"ntr0\\\\]", // common escape sequences
54 | `<\\?[^>]*\\?>`, // PHP
55 | `<%[^>]*%>`, // ERB (Rails)
56 | "0000-00-00T00:00:00".split("0").join("\\d"), // ISO 8601 timestamps in logs
57 | "^\\s*at .+(.+)", // common stack trace format
58 | '^\\s*{\\s*"[^"]*"\\s*:', // single-line JSON property
59 | ];
60 |
61 | const htmlIndicators = [
62 | "", // XML-like comment
63 | `<${xmlLikeName}[^>]*\\/?>`, // XML-like start/empty tag
64 | `${xmlLikeName}>`, // XML-like end tag
65 | "&[0-9a-zA-Z]+;", // HTML entity - human-readable
66 | "[0-9]{1,7};", // HTML entity - decimal
67 | "[0-9a-fA-F]{1,6};", // HTML entity - hex
68 | ];
69 |
70 | const _codeEnergyIndicators = {
71 | // multiple-character matches
72 | [CodeEnergyLevels.Complex]: {
73 | get indicators() {
74 | return [nonHtmlIndicators,
75 | settings.include_extra_patterns && settings.custom_regex_strings.split("|"),
76 | settings.include_html && htmlIndicators]
77 | .filter(Boolean)
78 | .flat();
79 | },
80 | },
81 | // High code energy(almost always seen only in code and never in regular text, such as [)
82 | [CodeEnergyLevels.High]: {
83 | // TODO
84 | indicators: [
85 | // "\\["
86 | ],
87 | },
88 | // Medium code energy(usually seen in code but rarely in regular text, such as ;)
89 | [CodeEnergyLevels.Medium]: {
90 | // TODO
91 | indicators: [
92 | // ";"
93 | ],
94 | },
95 | // Low code energy(sometimes seen in code, but also seen with fair frequency in regular text, such as .)
96 | [CodeEnergyLevels.Low]: {
97 | // TODO
98 | value: 0.1,
99 | indicators: [
100 | // "."
101 | ],
102 | },
103 | };
104 |
105 | export const getCodeEnergyIndicators = () => {
106 | return Object.entries(_codeEnergyIndicators)
107 | .map(([key, { indicators }]) => {
108 | return indicators.map((source) => ({
109 | value: codeEnergyValues[key],
110 | matcher: new RegExp(source, "gm"),
111 | }));
112 | })
113 | .flat();
114 | };
115 |
--------------------------------------------------------------------------------
/javascripts/discourse/core/detect-code.js:
--------------------------------------------------------------------------------
1 | import { getLineBoundaries, isBetween } from "../lib/boundaries";
2 | import {
3 | CodeEnergyLevels,
4 | codeEnergyValues,
5 | getCodeEnergyIndicators,
6 | } from "./code-energy";
7 | import { sensitivityConfig } from "./sensitivity";
8 | import { stripIgnoredContent } from "./strip-ignored-content";
9 |
10 | export const getCodeEnergy = (content) => {
11 | let totalCodeEnergy = 0;
12 | let totalComplexMatches = 0;
13 |
14 | const lines = getLineBoundaries(content);
15 |
16 | lines.forEach((x) => {
17 | x.matches = 0;
18 | x.matched_patterns = [];
19 | });
20 |
21 | for (const { matcher, value } of getCodeEnergyIndicators()) {
22 | const matches = [...content.matchAll(matcher)];
23 |
24 | totalCodeEnergy += matches.length * value;
25 |
26 | if (value === codeEnergyValues[CodeEnergyLevels.Complex]) {
27 | totalComplexMatches += matches.length;
28 | }
29 |
30 | for (const match of matches) {
31 | const startIndex = match.index;
32 | const endIndex = startIndex + match[0].length;
33 |
34 | for (const line of lines) {
35 | const isThisLine = isBetween(line.start, line.end);
36 |
37 | if (
38 | isThisLine(startIndex) ||
39 | isThisLine(endIndex) ||
40 | (line.start >= startIndex && line.end <= endIndex)
41 | ) {
42 | ++line.matches;
43 | line.matched_patterns.push({ matcher, value });
44 | }
45 | }
46 | }
47 | }
48 |
49 | return { totalCodeEnergy, totalComplexMatches, lines };
50 | };
51 |
52 | export const numSequentialLinesWithThresholdCodeEnergy =
53 | (threshold) => (lines) => {
54 | let maxContiguous = 0;
55 | let curContiguous = 0;
56 |
57 | for (const line of lines) {
58 | // empty/whitespace-only lines don't affect contiguity
59 | if (!line.content.trim().length) {
60 | continue;
61 | }
62 |
63 | if (line.matches >= threshold) {
64 | ++curContiguous;
65 | } else {
66 | maxContiguous = Math.max(maxContiguous, curContiguous);
67 | curContiguous = 0;
68 | }
69 | }
70 |
71 | return Math.max(maxContiguous, curContiguous);
72 | };
73 |
74 | export const printDebugInfo = (content) => {
75 | content = stripIgnoredContent(content);
76 |
77 | const {
78 | complexMatchesToIgnore,
79 | minSequentialLinesToMatch,
80 | minTotalCodeEnergy,
81 | } = sensitivityConfig;
82 |
83 | const { totalCodeEnergy, totalComplexMatches, lines } =
84 | getCodeEnergy(content);
85 |
86 | const debugTable = [];
87 |
88 | let consecutive = 0;
89 | lines.forEach((l) => {
90 | if (!l.content.trim()) {
91 | return;
92 | }
93 | if (l.matches) {
94 | consecutive++;
95 | } else {
96 | consecutive = 0;
97 | }
98 | debugTable.push([
99 | l.matches ? String(l.matches) : "",
100 | consecutive ? String(consecutive) : "",
101 | l.matched_patterns.length
102 | ? `\`${l.matched_patterns.map((p) => p.matcher).join("`, `")}\``
103 | : "",
104 | l.content,
105 | ]);
106 | });
107 |
108 | const columns = ["matches", "cumulative", "matched patterns", "content"];
109 | const dividers = columns.map(() => "");
110 |
111 | columns.forEach((c, i) => {
112 | const longest = Math.max(
113 | c.length,
114 | ...debugTable.map((row) => row[i].length)
115 | );
116 | debugTable.forEach((row) => (row[i] = row[i].padEnd(longest)));
117 | columns[i] = c.padEnd(longest);
118 | dividers[i] = dividers[i].padEnd(longest, "-");
119 | });
120 |
121 | debugTable.unshift(columns, dividers);
122 |
123 | // eslint-disable-next-line no-console
124 | console.log(debugTable.map((l) => `| ${l.join(" | ")} |`).join("\n"));
125 |
126 | // eslint-disable-next-line no-console
127 | console.log("Result is ", { totalCodeEnergy, totalComplexMatches, lines });
128 | // eslint-disable-next-line no-console
129 | console.log("Sensitivity Config is ", {
130 | complexMatchesToIgnore,
131 | minSequentialLinesToMatch,
132 | minTotalCodeEnergy,
133 | });
134 | };
135 |
136 | const detectCode = (content) => {
137 | const {
138 | complexMatchesToIgnore,
139 | minSequentialLinesToMatch,
140 | minTotalCodeEnergy,
141 | } = sensitivityConfig;
142 |
143 | const { totalCodeEnergy, totalComplexMatches, lines } =
144 | getCodeEnergy(content);
145 |
146 | if (totalComplexMatches <= complexMatchesToIgnore) {
147 | return false;
148 | }
149 |
150 | if (totalCodeEnergy < minTotalCodeEnergy) {
151 | return false;
152 | }
153 |
154 | if (
155 | numSequentialLinesWithThresholdCodeEnergy(
156 | codeEnergyValues[CodeEnergyLevels.Complex]
157 | )(lines) < minSequentialLinesToMatch
158 | ) {
159 | return false;
160 | }
161 |
162 | return true;
163 | };
164 |
165 | export const detectUnformattedCode = (content) => {
166 | const strippedContent = stripIgnoredContent(content);
167 |
168 | return isBetween(
169 | settings.min_post_length_to_check,
170 | settings.max_post_length_to_check === -1
171 | ? Infinity
172 | : settings.max_post_length_to_check
173 | )(content.length)
174 | ? detectCode(strippedContent)
175 | : false;
176 | };
177 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: false
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | devDependencies:
11 | '@discourse/lint-configs':
12 | specifier: 2.25.0
13 | version: 2.25.0(ember-template-lint@7.8.1)(eslint@9.28.0)(postcss@8.5.4)(prettier@3.5.3)(stylelint@16.20.0(typescript@5.8.3))
14 | ember-template-lint:
15 | specifier: 7.8.1
16 | version: 7.8.1
17 | eslint:
18 | specifier: 9.28.0
19 | version: 9.28.0
20 | prettier:
21 | specifier: 3.5.3
22 | version: 3.5.3
23 | stylelint:
24 | specifier: 16.20.0
25 | version: 16.20.0(typescript@5.8.3)
26 |
27 | packages:
28 |
29 | '@ampproject/remapping@2.3.0':
30 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
31 | engines: {node: '>=6.0.0'}
32 |
33 | '@babel/code-frame@7.27.1':
34 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
35 | engines: {node: '>=6.9.0'}
36 |
37 | '@babel/compat-data@7.27.5':
38 | resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==}
39 | engines: {node: '>=6.9.0'}
40 |
41 | '@babel/core@7.27.4':
42 | resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==}
43 | engines: {node: '>=6.9.0'}
44 |
45 | '@babel/eslint-parser@7.27.5':
46 | resolution: {integrity: sha512-HLkYQfRICudzcOtjGwkPvGc5nF1b4ljLZh1IRDj50lRZ718NAKVgQpIAUX8bfg6u/yuSKY3L7E0YzIV+OxrB8Q==}
47 | engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0}
48 | peerDependencies:
49 | '@babel/core': ^7.11.0
50 | eslint: ^7.5.0 || ^8.0.0 || ^9.0.0
51 |
52 | '@babel/generator@7.27.5':
53 | resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==}
54 | engines: {node: '>=6.9.0'}
55 |
56 | '@babel/helper-annotate-as-pure@7.27.3':
57 | resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
58 | engines: {node: '>=6.9.0'}
59 |
60 | '@babel/helper-compilation-targets@7.27.2':
61 | resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
62 | engines: {node: '>=6.9.0'}
63 |
64 | '@babel/helper-create-class-features-plugin@7.27.1':
65 | resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==}
66 | engines: {node: '>=6.9.0'}
67 | peerDependencies:
68 | '@babel/core': ^7.0.0
69 |
70 | '@babel/helper-member-expression-to-functions@7.27.1':
71 | resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==}
72 | engines: {node: '>=6.9.0'}
73 |
74 | '@babel/helper-module-imports@7.27.1':
75 | resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
76 | engines: {node: '>=6.9.0'}
77 |
78 | '@babel/helper-module-transforms@7.27.3':
79 | resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==}
80 | engines: {node: '>=6.9.0'}
81 | peerDependencies:
82 | '@babel/core': ^7.0.0
83 |
84 | '@babel/helper-optimise-call-expression@7.27.1':
85 | resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==}
86 | engines: {node: '>=6.9.0'}
87 |
88 | '@babel/helper-plugin-utils@7.27.1':
89 | resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
90 | engines: {node: '>=6.9.0'}
91 |
92 | '@babel/helper-replace-supers@7.27.1':
93 | resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==}
94 | engines: {node: '>=6.9.0'}
95 | peerDependencies:
96 | '@babel/core': ^7.0.0
97 |
98 | '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
99 | resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==}
100 | engines: {node: '>=6.9.0'}
101 |
102 | '@babel/helper-string-parser@7.27.1':
103 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
104 | engines: {node: '>=6.9.0'}
105 |
106 | '@babel/helper-validator-identifier@7.27.1':
107 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
108 | engines: {node: '>=6.9.0'}
109 |
110 | '@babel/helper-validator-option@7.27.1':
111 | resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
112 | engines: {node: '>=6.9.0'}
113 |
114 | '@babel/helpers@7.27.4':
115 | resolution: {integrity: sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==}
116 | engines: {node: '>=6.9.0'}
117 |
118 | '@babel/parser@7.27.5':
119 | resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==}
120 | engines: {node: '>=6.0.0'}
121 | hasBin: true
122 |
123 | '@babel/plugin-proposal-decorators@7.27.1':
124 | resolution: {integrity: sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==}
125 | engines: {node: '>=6.9.0'}
126 | peerDependencies:
127 | '@babel/core': ^7.0.0-0
128 |
129 | '@babel/plugin-syntax-decorators@7.27.1':
130 | resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==}
131 | engines: {node: '>=6.9.0'}
132 | peerDependencies:
133 | '@babel/core': ^7.0.0-0
134 |
135 | '@babel/template@7.27.2':
136 | resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
137 | engines: {node: '>=6.9.0'}
138 |
139 | '@babel/traverse@7.27.4':
140 | resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==}
141 | engines: {node: '>=6.9.0'}
142 |
143 | '@babel/types@7.27.3':
144 | resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==}
145 | engines: {node: '>=6.9.0'}
146 |
147 | '@csstools/css-parser-algorithms@3.0.5':
148 | resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==}
149 | engines: {node: '>=18'}
150 | peerDependencies:
151 | '@csstools/css-tokenizer': ^3.0.4
152 |
153 | '@csstools/css-tokenizer@3.0.4':
154 | resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==}
155 | engines: {node: '>=18'}
156 |
157 | '@csstools/media-query-list-parser@4.0.3':
158 | resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==}
159 | engines: {node: '>=18'}
160 | peerDependencies:
161 | '@csstools/css-parser-algorithms': ^3.0.5
162 | '@csstools/css-tokenizer': ^3.0.4
163 |
164 | '@csstools/selector-specificity@5.0.0':
165 | resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==}
166 | engines: {node: '>=18'}
167 | peerDependencies:
168 | postcss-selector-parser: ^7.0.0
169 |
170 | '@discourse/lint-configs@2.25.0':
171 | resolution: {integrity: sha512-59T4kzyWNCUun9JaiakjnV2e5KuX2BmZ2Lk8Toc1krYxbE7d+mVwYNB3OQABCw9SfNX9QwY+YM/Sk+A6uCdt3g==}
172 | peerDependencies:
173 | ember-template-lint: 7.8.1
174 | eslint: 9.28.0
175 | prettier: 3.5.3
176 | stylelint: 16.20.0
177 |
178 | '@dual-bundle/import-meta-resolve@4.1.0':
179 | resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==}
180 |
181 | '@ember-data/rfc395-data@0.0.4':
182 | resolution: {integrity: sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ==}
183 |
184 | '@eslint-community/eslint-utils@4.7.0':
185 | resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==}
186 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
187 | peerDependencies:
188 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
189 |
190 | '@eslint-community/regexpp@4.12.1':
191 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
192 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
193 |
194 | '@eslint/config-array@0.20.0':
195 | resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==}
196 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
197 |
198 | '@eslint/config-helpers@0.2.2':
199 | resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==}
200 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
201 |
202 | '@eslint/core@0.14.0':
203 | resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==}
204 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
205 |
206 | '@eslint/eslintrc@3.3.1':
207 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
208 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
209 |
210 | '@eslint/js@9.28.0':
211 | resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==}
212 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
213 |
214 | '@eslint/object-schema@2.1.6':
215 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
216 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
217 |
218 | '@eslint/plugin-kit@0.3.1':
219 | resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==}
220 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
221 |
222 | '@glimmer/env@0.1.7':
223 | resolution: {integrity: sha512-JKF/a9I9jw6fGoz8kA7LEQslrwJ5jms5CXhu/aqkBWk+PmZ6pTl8mlb/eJ/5ujBGTiQzBhy5AIWF712iA+4/mw==}
224 |
225 | '@glimmer/interfaces@0.92.3':
226 | resolution: {integrity: sha512-QwQeA01N+0h+TAi/J7iUnZtRuJy+093hNyagxDQBA6b1wCBw+q+al9+O6gmbWlkWE7EifzmNE1nnrgcecJBlJQ==}
227 |
228 | '@glimmer/syntax@0.92.3':
229 | resolution: {integrity: sha512-7wPKQmULyXCYf0KvbPmfrs/skPISH2QGR9atCnmDWnHyLv5SSZVLm1P0Ctrpta6+Ci3uGQb7hGk0IjsLEavcYQ==}
230 |
231 | '@glimmer/util@0.92.3':
232 | resolution: {integrity: sha512-K1oH93gGU36slycxJ9CcFpUTsdOc4XQ6RuZFu5oRsxFYtEF5PSu7ik11h58fyeoaWOr1ebfkyAMawbeI2AJ5GA==}
233 |
234 | '@glimmer/wire-format@0.92.3':
235 | resolution: {integrity: sha512-gFz81Q9+V7Xs0X8mSq6y8qacHm0dPaGJo2/Bfcsdow1hLOKNgTCLr4XeDBhRML8f6I6Gk9ugH4QDxyIOXOpC4w==}
236 |
237 | '@handlebars/parser@2.0.0':
238 | resolution: {integrity: sha512-EP9uEDZv/L5Qh9IWuMUGJRfwhXJ4h1dqKTT4/3+tY0eu7sPis7xh23j61SYUnNF4vqCQvvUXpDo9Bh/+q1zASA==}
239 |
240 | '@humanfs/core@0.19.1':
241 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
242 | engines: {node: '>=18.18.0'}
243 |
244 | '@humanfs/node@0.16.6':
245 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
246 | engines: {node: '>=18.18.0'}
247 |
248 | '@humanwhocodes/module-importer@1.0.1':
249 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
250 | engines: {node: '>=12.22'}
251 |
252 | '@humanwhocodes/retry@0.3.1':
253 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
254 | engines: {node: '>=18.18'}
255 |
256 | '@humanwhocodes/retry@0.4.3':
257 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
258 | engines: {node: '>=18.18'}
259 |
260 | '@jridgewell/gen-mapping@0.3.8':
261 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
262 | engines: {node: '>=6.0.0'}
263 |
264 | '@jridgewell/resolve-uri@3.1.2':
265 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
266 | engines: {node: '>=6.0.0'}
267 |
268 | '@jridgewell/set-array@1.2.1':
269 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
270 | engines: {node: '>=6.0.0'}
271 |
272 | '@jridgewell/sourcemap-codec@1.5.0':
273 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
274 |
275 | '@jridgewell/trace-mapping@0.3.25':
276 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
277 |
278 | '@keyv/serialize@1.0.3':
279 | resolution: {integrity: sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==}
280 |
281 | '@lint-todo/utils@13.1.1':
282 | resolution: {integrity: sha512-F5z53uvRIF4dYfFfJP3a2Cqg+4P1dgJchJsFnsZE0eZp0LK8X7g2J0CsJHRgns+skpXOlM7n5vFGwkWCWj8qJg==}
283 | engines: {node: 12.* || >= 14}
284 |
285 | '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
286 | resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==}
287 |
288 | '@nodelib/fs.scandir@2.1.5':
289 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
290 | engines: {node: '>= 8'}
291 |
292 | '@nodelib/fs.stat@2.0.5':
293 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
294 | engines: {node: '>= 8'}
295 |
296 | '@nodelib/fs.walk@1.2.8':
297 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
298 | engines: {node: '>= 8'}
299 |
300 | '@rtsao/scc@1.1.0':
301 | resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
302 |
303 | '@simple-dom/interface@1.4.0':
304 | resolution: {integrity: sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA==}
305 |
306 | '@types/eslint@8.56.12':
307 | resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==}
308 |
309 | '@types/estree@1.0.7':
310 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
311 |
312 | '@types/json-schema@7.0.15':
313 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
314 |
315 | '@types/json5@0.0.29':
316 | resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
317 |
318 | acorn-jsx@5.3.2:
319 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
320 | peerDependencies:
321 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
322 |
323 | acorn@8.14.1:
324 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
325 | engines: {node: '>=0.4.0'}
326 | hasBin: true
327 |
328 | ajv@6.12.6:
329 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
330 |
331 | ajv@8.17.1:
332 | resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
333 |
334 | ansi-regex@5.0.1:
335 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
336 | engines: {node: '>=8'}
337 |
338 | ansi-styles@4.3.0:
339 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
340 | engines: {node: '>=8'}
341 |
342 | argparse@2.0.1:
343 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
344 |
345 | array-buffer-byte-length@1.0.2:
346 | resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
347 | engines: {node: '>= 0.4'}
348 |
349 | array-includes@3.1.9:
350 | resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==}
351 | engines: {node: '>= 0.4'}
352 |
353 | array-union@2.1.0:
354 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
355 | engines: {node: '>=8'}
356 |
357 | array.prototype.findlastindex@1.2.6:
358 | resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==}
359 | engines: {node: '>= 0.4'}
360 |
361 | array.prototype.flat@1.3.3:
362 | resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
363 | engines: {node: '>= 0.4'}
364 |
365 | array.prototype.flatmap@1.3.3:
366 | resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
367 | engines: {node: '>= 0.4'}
368 |
369 | arraybuffer.prototype.slice@1.0.4:
370 | resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
371 | engines: {node: '>= 0.4'}
372 |
373 | astral-regex@2.0.0:
374 | resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
375 | engines: {node: '>=8'}
376 |
377 | async-function@1.0.0:
378 | resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
379 | engines: {node: '>= 0.4'}
380 |
381 | at-least-node@1.0.0:
382 | resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
383 | engines: {node: '>= 4.0.0'}
384 |
385 | available-typed-arrays@1.0.7:
386 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
387 | engines: {node: '>= 0.4'}
388 |
389 | balanced-match@1.0.2:
390 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
391 |
392 | balanced-match@2.0.0:
393 | resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
394 |
395 | base64-js@1.5.1:
396 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
397 |
398 | brace-expansion@1.1.11:
399 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
400 |
401 | braces@3.0.3:
402 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
403 | engines: {node: '>=8'}
404 |
405 | browserslist@4.25.0:
406 | resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==}
407 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
408 | hasBin: true
409 |
410 | buffer@6.0.3:
411 | resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
412 |
413 | cacheable@1.9.0:
414 | resolution: {integrity: sha512-8D5htMCxPDUULux9gFzv30f04Xo3wCnik0oOxKoRTPIBoqA7HtOcJ87uBhQTs3jCfZZTrUBGsYIZOgE0ZRgMAg==}
415 |
416 | call-bind-apply-helpers@1.0.2:
417 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
418 | engines: {node: '>= 0.4'}
419 |
420 | call-bind@1.0.8:
421 | resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
422 | engines: {node: '>= 0.4'}
423 |
424 | call-bound@1.0.4:
425 | resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
426 | engines: {node: '>= 0.4'}
427 |
428 | callsites@3.1.0:
429 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
430 | engines: {node: '>=6'}
431 |
432 | caniuse-lite@1.0.30001721:
433 | resolution: {integrity: sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==}
434 |
435 | chalk@4.1.2:
436 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
437 | engines: {node: '>=10'}
438 |
439 | color-convert@2.0.1:
440 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
441 | engines: {node: '>=7.0.0'}
442 |
443 | color-name@1.1.4:
444 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
445 |
446 | colord@2.9.3:
447 | resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
448 |
449 | concat-map@0.0.1:
450 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
451 |
452 | content-tag@2.0.3:
453 | resolution: {integrity: sha512-htLIdtfhhKW2fHlFLnZH7GFzHSdSpHhDLrWVswkNiiPMZ5uXq5JfrGboQKFhNQuAAFF8VNB2EYUj3MsdJrKKpg==}
454 |
455 | content-tag@3.1.3:
456 | resolution: {integrity: sha512-4Kiv9mEroxuMXfWUNUHcljVJgxThCNk7eEswdHMXdzJnkBBaYDqDwzHkoh3F74JJhfU3taJOsgpR6oEGIDg17g==}
457 |
458 | convert-source-map@2.0.0:
459 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
460 |
461 | cosmiconfig@9.0.0:
462 | resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
463 | engines: {node: '>=14'}
464 | peerDependencies:
465 | typescript: '>=4.9.5'
466 | peerDependenciesMeta:
467 | typescript:
468 | optional: true
469 |
470 | cross-spawn@7.0.6:
471 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
472 | engines: {node: '>= 8'}
473 |
474 | css-functions-list@3.2.3:
475 | resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==}
476 | engines: {node: '>=12 || >=16'}
477 |
478 | css-tree@3.1.0:
479 | resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==}
480 | engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
481 |
482 | cssesc@3.0.0:
483 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
484 | engines: {node: '>=4'}
485 | hasBin: true
486 |
487 | data-view-buffer@1.0.2:
488 | resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
489 | engines: {node: '>= 0.4'}
490 |
491 | data-view-byte-length@1.0.2:
492 | resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
493 | engines: {node: '>= 0.4'}
494 |
495 | data-view-byte-offset@1.0.1:
496 | resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
497 | engines: {node: '>= 0.4'}
498 |
499 | debug@3.2.7:
500 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
501 | peerDependencies:
502 | supports-color: '*'
503 | peerDependenciesMeta:
504 | supports-color:
505 | optional: true
506 |
507 | debug@4.4.1:
508 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
509 | engines: {node: '>=6.0'}
510 | peerDependencies:
511 | supports-color: '*'
512 | peerDependenciesMeta:
513 | supports-color:
514 | optional: true
515 |
516 | deep-is@0.1.4:
517 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
518 |
519 | define-data-property@1.1.4:
520 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
521 | engines: {node: '>= 0.4'}
522 |
523 | define-properties@1.2.1:
524 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
525 | engines: {node: '>= 0.4'}
526 |
527 | dir-glob@3.0.1:
528 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
529 | engines: {node: '>=8'}
530 |
531 | doctrine@2.1.0:
532 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
533 | engines: {node: '>=0.10.0'}
534 |
535 | dot-case@3.0.4:
536 | resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
537 |
538 | dunder-proto@1.0.1:
539 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
540 | engines: {node: '>= 0.4'}
541 |
542 | electron-to-chromium@1.5.165:
543 | resolution: {integrity: sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==}
544 |
545 | ember-eslint-parser@0.5.9:
546 | resolution: {integrity: sha512-IW4/3cEiFp49M2LiKyzi7VcT1egogOe8UxQ9eUKTooenC7Q4qNhzTD6rOZ8j51m8iJC+8hCzjbNCa3K4CN0Hhg==}
547 | engines: {node: '>=16.0.0'}
548 | peerDependencies:
549 | '@babel/core': ^7.23.6
550 | '@typescript-eslint/parser': '*'
551 | peerDependenciesMeta:
552 | '@typescript-eslint/parser':
553 | optional: true
554 |
555 | ember-rfc176-data@0.3.18:
556 | resolution: {integrity: sha512-JtuLoYGSjay1W3MQAxt3eINWXNYYQliK90tLwtb8aeCuQK8zKGCRbBodVIrkcTqshULMnRuTOS6t1P7oQk3g6Q==}
557 |
558 | ember-template-lint@7.8.1:
559 | resolution: {integrity: sha512-SFVTR6YdxvldbBL3ArphAbDhYOXyD8Tt9rTKEWKYpQTilq7Hl9mTrKP59q3GOcnDaR/rNk0cg4rJHYAg6/SCGw==}
560 | engines: {node: ^18.18.0 || >= 20.9.0}
561 | hasBin: true
562 |
563 | emoji-regex@8.0.0:
564 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
565 |
566 | env-paths@2.2.1:
567 | resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
568 | engines: {node: '>=6'}
569 |
570 | error-ex@1.3.2:
571 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
572 |
573 | es-abstract@1.24.0:
574 | resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==}
575 | engines: {node: '>= 0.4'}
576 |
577 | es-define-property@1.0.1:
578 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
579 | engines: {node: '>= 0.4'}
580 |
581 | es-errors@1.3.0:
582 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
583 | engines: {node: '>= 0.4'}
584 |
585 | es-object-atoms@1.1.1:
586 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
587 | engines: {node: '>= 0.4'}
588 |
589 | es-set-tostringtag@2.1.0:
590 | resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
591 | engines: {node: '>= 0.4'}
592 |
593 | es-shim-unscopables@1.1.0:
594 | resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
595 | engines: {node: '>= 0.4'}
596 |
597 | es-to-primitive@1.3.0:
598 | resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
599 | engines: {node: '>= 0.4'}
600 |
601 | escalade@3.2.0:
602 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
603 | engines: {node: '>=6'}
604 |
605 | escape-string-regexp@4.0.0:
606 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
607 | engines: {node: '>=10'}
608 |
609 | eslint-import-resolver-node@0.3.9:
610 | resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
611 |
612 | eslint-module-utils@2.12.0:
613 | resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==}
614 | engines: {node: '>=4'}
615 | peerDependencies:
616 | '@typescript-eslint/parser': '*'
617 | eslint: '*'
618 | eslint-import-resolver-node: '*'
619 | eslint-import-resolver-typescript: '*'
620 | eslint-import-resolver-webpack: '*'
621 | peerDependenciesMeta:
622 | '@typescript-eslint/parser':
623 | optional: true
624 | eslint:
625 | optional: true
626 | eslint-import-resolver-node:
627 | optional: true
628 | eslint-import-resolver-typescript:
629 | optional: true
630 | eslint-import-resolver-webpack:
631 | optional: true
632 |
633 | eslint-plugin-decorator-position@6.0.0:
634 | resolution: {integrity: sha512-AUbZbt3JXnmP7Typfba4BIEFkSCc2rA6BkutsYiywIcEoX/yRL7jzqAp4UMpSDNhCMUUAfGt48k3141PhKC07w==}
635 | engines: {node: '>=14'}
636 | peerDependencies:
637 | '@babel/eslint-parser': ^7.18.2
638 | eslint: ^7.31.0 || ^8.0.0 || ^9.0.0
639 | peerDependenciesMeta:
640 | '@babel/eslint-parser':
641 | optional: true
642 |
643 | eslint-plugin-ember@12.5.0:
644 | resolution: {integrity: sha512-DBUzsaKWDVXsujAZPpRir0O7owdlCoVzZmtaJm7g7iQeSrNtcRWI7AItsTqKSsws1XeAySH0sPsQItMdDCb9Fg==}
645 | engines: {node: 18.* || 20.* || >= 21}
646 | peerDependencies:
647 | '@typescript-eslint/parser': '*'
648 | eslint: '>= 8'
649 | peerDependenciesMeta:
650 | '@typescript-eslint/parser':
651 | optional: true
652 |
653 | eslint-plugin-import@2.31.0:
654 | resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==}
655 | engines: {node: '>=4'}
656 | peerDependencies:
657 | '@typescript-eslint/parser': '*'
658 | eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
659 | peerDependenciesMeta:
660 | '@typescript-eslint/parser':
661 | optional: true
662 |
663 | eslint-plugin-qunit@8.1.2:
664 | resolution: {integrity: sha512-2gDQdHlQW8GVXD7YYkO8vbm9Ldc60JeGMuQN5QlD48OeZ8znBvvoHWZZMeXjvoDPReGaLEvyuWrDtrI8bDbcqw==}
665 | engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0}
666 |
667 | eslint-plugin-simple-import-sort@12.1.1:
668 | resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==}
669 | peerDependencies:
670 | eslint: '>=5.0.0'
671 |
672 | eslint-plugin-sort-class-members@1.21.0:
673 | resolution: {integrity: sha512-QKV4jvGMu/ge1l4s1TUBC6rqqV/fbABWY7q2EeNpV3FRikoX6KuLhiNvS8UuMi+EERe0hKGrNU9e6ukFDxNnZQ==}
674 | engines: {node: '>=4.0.0'}
675 | peerDependencies:
676 | eslint: '>=0.8.0'
677 |
678 | eslint-scope@5.1.1:
679 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
680 | engines: {node: '>=8.0.0'}
681 |
682 | eslint-scope@7.2.2:
683 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
684 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
685 |
686 | eslint-scope@8.3.0:
687 | resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==}
688 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
689 |
690 | eslint-utils@3.0.0:
691 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
692 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
693 | peerDependencies:
694 | eslint: '>=5'
695 |
696 | eslint-visitor-keys@2.1.0:
697 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
698 | engines: {node: '>=10'}
699 |
700 | eslint-visitor-keys@3.4.3:
701 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
702 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
703 |
704 | eslint-visitor-keys@4.2.0:
705 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
706 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
707 |
708 | eslint@9.28.0:
709 | resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==}
710 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
711 | hasBin: true
712 | peerDependencies:
713 | jiti: '*'
714 | peerDependenciesMeta:
715 | jiti:
716 | optional: true
717 |
718 | espree@10.3.0:
719 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
720 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
721 |
722 | esquery@1.6.0:
723 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
724 | engines: {node: '>=0.10'}
725 |
726 | esrecurse@4.3.0:
727 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
728 | engines: {node: '>=4.0'}
729 |
730 | estraverse@4.3.0:
731 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
732 | engines: {node: '>=4.0'}
733 |
734 | estraverse@5.3.0:
735 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
736 | engines: {node: '>=4.0'}
737 |
738 | esutils@2.0.3:
739 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
740 | engines: {node: '>=0.10.0'}
741 |
742 | fast-deep-equal@3.1.3:
743 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
744 |
745 | fast-glob@3.3.3:
746 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
747 | engines: {node: '>=8.6.0'}
748 |
749 | fast-json-stable-stringify@2.1.0:
750 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
751 |
752 | fast-levenshtein@2.0.6:
753 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
754 |
755 | fast-uri@3.0.6:
756 | resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==}
757 |
758 | fastest-levenshtein@1.0.16:
759 | resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
760 | engines: {node: '>= 4.9.1'}
761 |
762 | fastq@1.19.1:
763 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
764 |
765 | file-entry-cache@10.1.0:
766 | resolution: {integrity: sha512-Et/ex6smi3wOOB+n5mek+Grf7P2AxZR5ueqRUvAAn4qkyatXi3cUC1cuQXVkX0VlzBVsN4BkWJFmY/fYiRTdww==}
767 |
768 | file-entry-cache@8.0.0:
769 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
770 | engines: {node: '>=16.0.0'}
771 |
772 | fill-range@7.1.1:
773 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
774 | engines: {node: '>=8'}
775 |
776 | find-up@5.0.0:
777 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
778 | engines: {node: '>=10'}
779 |
780 | flat-cache@4.0.1:
781 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
782 | engines: {node: '>=16'}
783 |
784 | flat-cache@6.1.9:
785 | resolution: {integrity: sha512-DUqiKkTlAfhtl7g78IuwqYM+YqvT+as0mY+EVk6mfimy19U79pJCzDZQsnqk3Ou/T6hFXWLGbwbADzD/c8Tydg==}
786 |
787 | flatted@3.3.3:
788 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
789 |
790 | for-each@0.3.5:
791 | resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
792 | engines: {node: '>= 0.4'}
793 |
794 | fs-extra@9.1.0:
795 | resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
796 | engines: {node: '>=10'}
797 |
798 | function-bind@1.1.2:
799 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
800 |
801 | function.prototype.name@1.1.8:
802 | resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
803 | engines: {node: '>= 0.4'}
804 |
805 | functions-have-names@1.2.3:
806 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
807 |
808 | gensync@1.0.0-beta.2:
809 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
810 | engines: {node: '>=6.9.0'}
811 |
812 | get-intrinsic@1.3.0:
813 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
814 | engines: {node: '>= 0.4'}
815 |
816 | get-proto@1.0.1:
817 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
818 | engines: {node: '>= 0.4'}
819 |
820 | get-symbol-description@1.1.0:
821 | resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
822 | engines: {node: '>= 0.4'}
823 |
824 | glob-parent@5.1.2:
825 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
826 | engines: {node: '>= 6'}
827 |
828 | glob-parent@6.0.2:
829 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
830 | engines: {node: '>=10.13.0'}
831 |
832 | global-modules@2.0.0:
833 | resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==}
834 | engines: {node: '>=6'}
835 |
836 | global-prefix@3.0.0:
837 | resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==}
838 | engines: {node: '>=6'}
839 |
840 | globals@11.12.0:
841 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
842 | engines: {node: '>=4'}
843 |
844 | globals@14.0.0:
845 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
846 | engines: {node: '>=18'}
847 |
848 | globals@16.2.0:
849 | resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==}
850 | engines: {node: '>=18'}
851 |
852 | globalthis@1.0.4:
853 | resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
854 | engines: {node: '>= 0.4'}
855 |
856 | globby@11.1.0:
857 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
858 | engines: {node: '>=10'}
859 |
860 | globjoin@0.1.4:
861 | resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==}
862 |
863 | gopd@1.2.0:
864 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
865 | engines: {node: '>= 0.4'}
866 |
867 | graceful-fs@4.2.11:
868 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
869 |
870 | has-bigints@1.1.0:
871 | resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
872 | engines: {node: '>= 0.4'}
873 |
874 | has-flag@4.0.0:
875 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
876 | engines: {node: '>=8'}
877 |
878 | has-property-descriptors@1.0.2:
879 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
880 |
881 | has-proto@1.2.0:
882 | resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
883 | engines: {node: '>= 0.4'}
884 |
885 | has-symbols@1.1.0:
886 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
887 | engines: {node: '>= 0.4'}
888 |
889 | has-tostringtag@1.0.2:
890 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
891 | engines: {node: '>= 0.4'}
892 |
893 | hasown@2.0.2:
894 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
895 | engines: {node: '>= 0.4'}
896 |
897 | hookified@1.9.1:
898 | resolution: {integrity: sha512-u3pxtGhKjcSXnGm1CX6aXS9xew535j3lkOCegbA6jdyh0BaAjTbXI4aslKstCr6zUNtoCxFGFKwjbSHdGrMB8g==}
899 |
900 | html-tags@3.3.1:
901 | resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
902 | engines: {node: '>=8'}
903 |
904 | ieee754@1.2.1:
905 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
906 |
907 | ignore@5.3.2:
908 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
909 | engines: {node: '>= 4'}
910 |
911 | ignore@7.0.5:
912 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
913 | engines: {node: '>= 4'}
914 |
915 | import-fresh@3.3.1:
916 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
917 | engines: {node: '>=6'}
918 |
919 | imurmurhash@0.1.4:
920 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
921 | engines: {node: '>=0.8.19'}
922 |
923 | ini@1.3.8:
924 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
925 |
926 | internal-slot@1.1.0:
927 | resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
928 | engines: {node: '>= 0.4'}
929 |
930 | is-array-buffer@3.0.5:
931 | resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
932 | engines: {node: '>= 0.4'}
933 |
934 | is-arrayish@0.2.1:
935 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
936 |
937 | is-async-function@2.1.1:
938 | resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
939 | engines: {node: '>= 0.4'}
940 |
941 | is-bigint@1.1.0:
942 | resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
943 | engines: {node: '>= 0.4'}
944 |
945 | is-boolean-object@1.2.2:
946 | resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
947 | engines: {node: '>= 0.4'}
948 |
949 | is-callable@1.2.7:
950 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
951 | engines: {node: '>= 0.4'}
952 |
953 | is-core-module@2.16.1:
954 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
955 | engines: {node: '>= 0.4'}
956 |
957 | is-data-view@1.0.2:
958 | resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
959 | engines: {node: '>= 0.4'}
960 |
961 | is-date-object@1.1.0:
962 | resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
963 | engines: {node: '>= 0.4'}
964 |
965 | is-extglob@2.1.1:
966 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
967 | engines: {node: '>=0.10.0'}
968 |
969 | is-finalizationregistry@1.1.1:
970 | resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
971 | engines: {node: '>= 0.4'}
972 |
973 | is-fullwidth-code-point@3.0.0:
974 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
975 | engines: {node: '>=8'}
976 |
977 | is-generator-function@1.1.0:
978 | resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
979 | engines: {node: '>= 0.4'}
980 |
981 | is-glob@4.0.3:
982 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
983 | engines: {node: '>=0.10.0'}
984 |
985 | is-map@2.0.3:
986 | resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
987 | engines: {node: '>= 0.4'}
988 |
989 | is-negative-zero@2.0.3:
990 | resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
991 | engines: {node: '>= 0.4'}
992 |
993 | is-number-object@1.1.1:
994 | resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
995 | engines: {node: '>= 0.4'}
996 |
997 | is-number@7.0.0:
998 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
999 | engines: {node: '>=0.12.0'}
1000 |
1001 | is-plain-object@5.0.0:
1002 | resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
1003 | engines: {node: '>=0.10.0'}
1004 |
1005 | is-regex@1.2.1:
1006 | resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
1007 | engines: {node: '>= 0.4'}
1008 |
1009 | is-set@2.0.3:
1010 | resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
1011 | engines: {node: '>= 0.4'}
1012 |
1013 | is-shared-array-buffer@1.0.4:
1014 | resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
1015 | engines: {node: '>= 0.4'}
1016 |
1017 | is-string@1.1.1:
1018 | resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
1019 | engines: {node: '>= 0.4'}
1020 |
1021 | is-symbol@1.1.1:
1022 | resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
1023 | engines: {node: '>= 0.4'}
1024 |
1025 | is-typed-array@1.1.15:
1026 | resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
1027 | engines: {node: '>= 0.4'}
1028 |
1029 | is-weakmap@2.0.2:
1030 | resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
1031 | engines: {node: '>= 0.4'}
1032 |
1033 | is-weakref@1.1.1:
1034 | resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
1035 | engines: {node: '>= 0.4'}
1036 |
1037 | is-weakset@2.0.4:
1038 | resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
1039 | engines: {node: '>= 0.4'}
1040 |
1041 | isarray@2.0.5:
1042 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
1043 |
1044 | isexe@2.0.0:
1045 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1046 |
1047 | js-tokens@4.0.0:
1048 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
1049 |
1050 | js-yaml@4.1.0:
1051 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1052 | hasBin: true
1053 |
1054 | jsesc@3.1.0:
1055 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
1056 | engines: {node: '>=6'}
1057 | hasBin: true
1058 |
1059 | json-buffer@3.0.1:
1060 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
1061 |
1062 | json-parse-even-better-errors@2.3.1:
1063 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
1064 |
1065 | json-schema-traverse@0.4.1:
1066 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
1067 |
1068 | json-schema-traverse@1.0.0:
1069 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
1070 |
1071 | json-stable-stringify-without-jsonify@1.0.1:
1072 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
1073 |
1074 | json5@1.0.2:
1075 | resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
1076 | hasBin: true
1077 |
1078 | json5@2.2.3:
1079 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
1080 | engines: {node: '>=6'}
1081 | hasBin: true
1082 |
1083 | jsonfile@6.1.0:
1084 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
1085 |
1086 | keyv@4.5.4:
1087 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
1088 |
1089 | keyv@5.3.3:
1090 | resolution: {integrity: sha512-Rwu4+nXI9fqcxiEHtbkvoes2X+QfkTRo1TMkPfwzipGsJlJO/z69vqB4FNl9xJ3xCpAcbkvmEabZfPzrwN3+gQ==}
1091 |
1092 | kind-of@6.0.3:
1093 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
1094 | engines: {node: '>=0.10.0'}
1095 |
1096 | known-css-properties@0.36.0:
1097 | resolution: {integrity: sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==}
1098 |
1099 | levn@0.4.1:
1100 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
1101 | engines: {node: '>= 0.8.0'}
1102 |
1103 | lines-and-columns@1.2.4:
1104 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
1105 |
1106 | locate-path@6.0.0:
1107 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
1108 | engines: {node: '>=10'}
1109 |
1110 | lodash.camelcase@4.3.0:
1111 | resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
1112 |
1113 | lodash.kebabcase@4.1.1:
1114 | resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==}
1115 |
1116 | lodash.merge@4.6.2:
1117 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
1118 |
1119 | lodash.truncate@4.4.2:
1120 | resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
1121 |
1122 | lower-case@2.0.2:
1123 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
1124 |
1125 | lru-cache@5.1.1:
1126 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
1127 |
1128 | math-intrinsics@1.1.0:
1129 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
1130 | engines: {node: '>= 0.4'}
1131 |
1132 | mathml-tag-names@2.1.3:
1133 | resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
1134 |
1135 | mdn-data@2.12.2:
1136 | resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==}
1137 |
1138 | mdn-data@2.21.0:
1139 | resolution: {integrity: sha512-+ZKPQezM5vYJIkCxaC+4DTnRrVZR1CgsKLu5zsQERQx6Tea8Y+wMx5A24rq8A8NepCeatIQufVAekKNgiBMsGQ==}
1140 |
1141 | meow@13.2.0:
1142 | resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==}
1143 | engines: {node: '>=18'}
1144 |
1145 | merge2@1.4.1:
1146 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1147 | engines: {node: '>= 8'}
1148 |
1149 | micromatch@4.0.8:
1150 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
1151 | engines: {node: '>=8.6'}
1152 |
1153 | minimatch@3.1.2:
1154 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1155 |
1156 | minimist@1.2.8:
1157 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
1158 |
1159 | ms@2.1.3:
1160 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
1161 |
1162 | nanoid@3.3.11:
1163 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
1164 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1165 | hasBin: true
1166 |
1167 | natural-compare@1.4.0:
1168 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1169 |
1170 | no-case@3.0.4:
1171 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
1172 |
1173 | node-releases@2.0.19:
1174 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
1175 |
1176 | normalize-path@3.0.0:
1177 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1178 | engines: {node: '>=0.10.0'}
1179 |
1180 | object-inspect@1.13.4:
1181 | resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
1182 | engines: {node: '>= 0.4'}
1183 |
1184 | object-keys@1.1.1:
1185 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
1186 | engines: {node: '>= 0.4'}
1187 |
1188 | object.assign@4.1.7:
1189 | resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
1190 | engines: {node: '>= 0.4'}
1191 |
1192 | object.fromentries@2.0.8:
1193 | resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
1194 | engines: {node: '>= 0.4'}
1195 |
1196 | object.groupby@1.0.3:
1197 | resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
1198 | engines: {node: '>= 0.4'}
1199 |
1200 | object.values@1.2.1:
1201 | resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
1202 | engines: {node: '>= 0.4'}
1203 |
1204 | optionator@0.9.4:
1205 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
1206 | engines: {node: '>= 0.8.0'}
1207 |
1208 | own-keys@1.0.1:
1209 | resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
1210 | engines: {node: '>= 0.4'}
1211 |
1212 | p-limit@3.1.0:
1213 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
1214 | engines: {node: '>=10'}
1215 |
1216 | p-locate@5.0.0:
1217 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
1218 | engines: {node: '>=10'}
1219 |
1220 | parent-module@1.0.1:
1221 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
1222 | engines: {node: '>=6'}
1223 |
1224 | parse-json@5.2.0:
1225 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
1226 | engines: {node: '>=8'}
1227 |
1228 | path-exists@4.0.0:
1229 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
1230 | engines: {node: '>=8'}
1231 |
1232 | path-key@3.1.1:
1233 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1234 | engines: {node: '>=8'}
1235 |
1236 | path-parse@1.0.7:
1237 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1238 |
1239 | path-type@4.0.0:
1240 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
1241 | engines: {node: '>=8'}
1242 |
1243 | picocolors@1.1.1:
1244 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
1245 |
1246 | picomatch@2.3.1:
1247 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1248 | engines: {node: '>=8.6'}
1249 |
1250 | possible-typed-array-names@1.1.0:
1251 | resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
1252 | engines: {node: '>= 0.4'}
1253 |
1254 | postcss-media-query-parser@0.2.3:
1255 | resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==}
1256 |
1257 | postcss-resolve-nested-selector@0.1.6:
1258 | resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==}
1259 |
1260 | postcss-safe-parser@7.0.1:
1261 | resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==}
1262 | engines: {node: '>=18.0'}
1263 | peerDependencies:
1264 | postcss: ^8.4.31
1265 |
1266 | postcss-scss@4.0.9:
1267 | resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==}
1268 | engines: {node: '>=12.0'}
1269 | peerDependencies:
1270 | postcss: ^8.4.29
1271 |
1272 | postcss-selector-parser@7.1.0:
1273 | resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==}
1274 | engines: {node: '>=4'}
1275 |
1276 | postcss-value-parser@4.2.0:
1277 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
1278 |
1279 | postcss@8.5.4:
1280 | resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==}
1281 | engines: {node: ^10 || ^12 || >=14}
1282 |
1283 | prelude-ls@1.2.1:
1284 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
1285 | engines: {node: '>= 0.8.0'}
1286 |
1287 | prettier-plugin-ember-template-tag@2.0.5:
1288 | resolution: {integrity: sha512-G9lbK3wmryIBSzqBKKoy254v7hIjqzqYpqWxi9NvOxcxNtwLyrC1u9NLJJFm+x9blzqHQOzKGOseVnbLtEwEbg==}
1289 | engines: {node: 18.* || >= 20}
1290 | peerDependencies:
1291 | prettier: '>= 3.0.0'
1292 |
1293 | prettier@3.5.3:
1294 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==}
1295 | engines: {node: '>=14'}
1296 | hasBin: true
1297 |
1298 | proper-lockfile@4.1.2:
1299 | resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==}
1300 |
1301 | punycode@2.3.1:
1302 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
1303 | engines: {node: '>=6'}
1304 |
1305 | queue-microtask@1.2.3:
1306 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1307 |
1308 | reflect.getprototypeof@1.0.10:
1309 | resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
1310 | engines: {node: '>= 0.4'}
1311 |
1312 | regexp.prototype.flags@1.5.4:
1313 | resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
1314 | engines: {node: '>= 0.4'}
1315 |
1316 | require-from-string@2.0.2:
1317 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
1318 | engines: {node: '>=0.10.0'}
1319 |
1320 | requireindex@1.2.0:
1321 | resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==}
1322 | engines: {node: '>=0.10.5'}
1323 |
1324 | resolve-from@4.0.0:
1325 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
1326 | engines: {node: '>=4'}
1327 |
1328 | resolve-from@5.0.0:
1329 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
1330 | engines: {node: '>=8'}
1331 |
1332 | resolve@1.22.10:
1333 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
1334 | engines: {node: '>= 0.4'}
1335 | hasBin: true
1336 |
1337 | retry@0.12.0:
1338 | resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
1339 | engines: {node: '>= 4'}
1340 |
1341 | reusify@1.1.0:
1342 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
1343 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1344 |
1345 | run-parallel@1.2.0:
1346 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1347 |
1348 | safe-array-concat@1.1.3:
1349 | resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
1350 | engines: {node: '>=0.4'}
1351 |
1352 | safe-push-apply@1.0.0:
1353 | resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
1354 | engines: {node: '>= 0.4'}
1355 |
1356 | safe-regex-test@1.1.0:
1357 | resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
1358 | engines: {node: '>= 0.4'}
1359 |
1360 | semver@6.3.1:
1361 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
1362 | hasBin: true
1363 |
1364 | set-function-length@1.2.2:
1365 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
1366 | engines: {node: '>= 0.4'}
1367 |
1368 | set-function-name@2.0.2:
1369 | resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
1370 | engines: {node: '>= 0.4'}
1371 |
1372 | set-proto@1.0.0:
1373 | resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
1374 | engines: {node: '>= 0.4'}
1375 |
1376 | shebang-command@2.0.0:
1377 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1378 | engines: {node: '>=8'}
1379 |
1380 | shebang-regex@3.0.0:
1381 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1382 | engines: {node: '>=8'}
1383 |
1384 | side-channel-list@1.0.0:
1385 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
1386 | engines: {node: '>= 0.4'}
1387 |
1388 | side-channel-map@1.0.1:
1389 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
1390 | engines: {node: '>= 0.4'}
1391 |
1392 | side-channel-weakmap@1.0.2:
1393 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
1394 | engines: {node: '>= 0.4'}
1395 |
1396 | side-channel@1.1.0:
1397 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
1398 | engines: {node: '>= 0.4'}
1399 |
1400 | signal-exit@3.0.7:
1401 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
1402 |
1403 | signal-exit@4.1.0:
1404 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
1405 | engines: {node: '>=14'}
1406 |
1407 | simple-html-tokenizer@0.5.11:
1408 | resolution: {integrity: sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og==}
1409 |
1410 | slash@3.0.0:
1411 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
1412 | engines: {node: '>=8'}
1413 |
1414 | slice-ansi@4.0.0:
1415 | resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
1416 | engines: {node: '>=10'}
1417 |
1418 | snake-case@3.0.4:
1419 | resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
1420 |
1421 | source-map-js@1.2.1:
1422 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
1423 | engines: {node: '>=0.10.0'}
1424 |
1425 | stop-iteration-iterator@1.1.0:
1426 | resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
1427 | engines: {node: '>= 0.4'}
1428 |
1429 | string-width@4.2.3:
1430 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
1431 | engines: {node: '>=8'}
1432 |
1433 | string.prototype.trim@1.2.10:
1434 | resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
1435 | engines: {node: '>= 0.4'}
1436 |
1437 | string.prototype.trimend@1.0.9:
1438 | resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
1439 | engines: {node: '>= 0.4'}
1440 |
1441 | string.prototype.trimstart@1.0.8:
1442 | resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
1443 | engines: {node: '>= 0.4'}
1444 |
1445 | strip-ansi@6.0.1:
1446 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1447 | engines: {node: '>=8'}
1448 |
1449 | strip-bom@3.0.0:
1450 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
1451 | engines: {node: '>=4'}
1452 |
1453 | strip-json-comments@3.1.1:
1454 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
1455 | engines: {node: '>=8'}
1456 |
1457 | stylelint-config-recommended-scss@15.0.1:
1458 | resolution: {integrity: sha512-V24bxkNkFGggqPVJlP9iXaBabwSGEG7QTz+PyxrRtjPkcF+/NsWtB3tKYvFYEmczRkWiIEfuFMhGpJFj9Fxe6Q==}
1459 | engines: {node: '>=20'}
1460 | peerDependencies:
1461 | postcss: ^8.3.3
1462 | stylelint: ^16.16.0
1463 | peerDependenciesMeta:
1464 | postcss:
1465 | optional: true
1466 |
1467 | stylelint-config-recommended@16.0.0:
1468 | resolution: {integrity: sha512-4RSmPjQegF34wNcK1e1O3Uz91HN8P1aFdFzio90wNK9mjgAI19u5vsU868cVZboKzCaa5XbpvtTzAAGQAxpcXA==}
1469 | engines: {node: '>=18.12.0'}
1470 | peerDependencies:
1471 | stylelint: ^16.16.0
1472 |
1473 | stylelint-config-standard-scss@15.0.1:
1474 | resolution: {integrity: sha512-8pmmfutrMlPHukLp+Th9asmk21tBXMVGxskZCzkRVWt1d8Z0SrXjUUQ3vn9KcBj1bJRd5msk6yfEFM0UYHBRdg==}
1475 | engines: {node: '>=20'}
1476 | peerDependencies:
1477 | postcss: ^8.3.3
1478 | stylelint: ^16.18.0
1479 | peerDependenciesMeta:
1480 | postcss:
1481 | optional: true
1482 |
1483 | stylelint-config-standard@38.0.0:
1484 | resolution: {integrity: sha512-uj3JIX+dpFseqd/DJx8Gy3PcRAJhlEZ2IrlFOc4LUxBX/PNMEQ198x7LCOE2Q5oT9Vw8nyc4CIL78xSqPr6iag==}
1485 | engines: {node: '>=18.12.0'}
1486 | peerDependencies:
1487 | stylelint: ^16.18.0
1488 |
1489 | stylelint-scss@6.12.0:
1490 | resolution: {integrity: sha512-U7CKhi1YNkM1pXUXl/GMUXi8xKdhl4Ayxdyceie1nZ1XNIdaUgMV6OArpooWcDzEggwgYD0HP/xIgVJo9a655w==}
1491 | engines: {node: '>=18.12.0'}
1492 | peerDependencies:
1493 | stylelint: ^16.0.2
1494 |
1495 | stylelint@16.20.0:
1496 | resolution: {integrity: sha512-B5Myu9WRxrgKuLs3YyUXLP2H0mrbejwNxPmyADlACWwFsrL8Bmor/nTSh4OMae5sHjOz6gkSeccQH34gM4/nAw==}
1497 | engines: {node: '>=18.12.0'}
1498 | hasBin: true
1499 |
1500 | supports-color@7.2.0:
1501 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
1502 | engines: {node: '>=8'}
1503 |
1504 | supports-hyperlinks@3.2.0:
1505 | resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==}
1506 | engines: {node: '>=14.18'}
1507 |
1508 | supports-preserve-symlinks-flag@1.0.0:
1509 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
1510 | engines: {node: '>= 0.4'}
1511 |
1512 | svg-tags@1.0.0:
1513 | resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
1514 |
1515 | table@6.9.0:
1516 | resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==}
1517 | engines: {node: '>=10.0.0'}
1518 |
1519 | to-regex-range@5.0.1:
1520 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1521 | engines: {node: '>=8.0'}
1522 |
1523 | tsconfig-paths@3.15.0:
1524 | resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
1525 |
1526 | tslib@2.8.1:
1527 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
1528 |
1529 | type-check@0.4.0:
1530 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
1531 | engines: {node: '>= 0.8.0'}
1532 |
1533 | typed-array-buffer@1.0.3:
1534 | resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
1535 | engines: {node: '>= 0.4'}
1536 |
1537 | typed-array-byte-length@1.0.3:
1538 | resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
1539 | engines: {node: '>= 0.4'}
1540 |
1541 | typed-array-byte-offset@1.0.4:
1542 | resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
1543 | engines: {node: '>= 0.4'}
1544 |
1545 | typed-array-length@1.0.7:
1546 | resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
1547 | engines: {node: '>= 0.4'}
1548 |
1549 | typescript@5.8.3:
1550 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
1551 | engines: {node: '>=14.17'}
1552 | hasBin: true
1553 |
1554 | unbox-primitive@1.1.0:
1555 | resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
1556 | engines: {node: '>= 0.4'}
1557 |
1558 | universalify@2.0.1:
1559 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
1560 | engines: {node: '>= 10.0.0'}
1561 |
1562 | upath@2.0.1:
1563 | resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==}
1564 | engines: {node: '>=4'}
1565 |
1566 | update-browserslist-db@1.1.3:
1567 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
1568 | hasBin: true
1569 | peerDependencies:
1570 | browserslist: '>= 4.21.0'
1571 |
1572 | uri-js@4.4.1:
1573 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
1574 |
1575 | util-deprecate@1.0.2:
1576 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
1577 |
1578 | which-boxed-primitive@1.1.1:
1579 | resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
1580 | engines: {node: '>= 0.4'}
1581 |
1582 | which-builtin-type@1.2.1:
1583 | resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
1584 | engines: {node: '>= 0.4'}
1585 |
1586 | which-collection@1.0.2:
1587 | resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
1588 | engines: {node: '>= 0.4'}
1589 |
1590 | which-typed-array@1.1.19:
1591 | resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
1592 | engines: {node: '>= 0.4'}
1593 |
1594 | which@1.3.1:
1595 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
1596 | hasBin: true
1597 |
1598 | which@2.0.2:
1599 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
1600 | engines: {node: '>= 8'}
1601 | hasBin: true
1602 |
1603 | word-wrap@1.2.5:
1604 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
1605 | engines: {node: '>=0.10.0'}
1606 |
1607 | write-file-atomic@5.0.1:
1608 | resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==}
1609 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
1610 |
1611 | yallist@3.1.1:
1612 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
1613 |
1614 | yocto-queue@0.1.0:
1615 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
1616 | engines: {node: '>=10'}
1617 |
1618 | snapshots:
1619 |
1620 | '@ampproject/remapping@2.3.0':
1621 | dependencies:
1622 | '@jridgewell/gen-mapping': 0.3.8
1623 | '@jridgewell/trace-mapping': 0.3.25
1624 |
1625 | '@babel/code-frame@7.27.1':
1626 | dependencies:
1627 | '@babel/helper-validator-identifier': 7.27.1
1628 | js-tokens: 4.0.0
1629 | picocolors: 1.1.1
1630 |
1631 | '@babel/compat-data@7.27.5': {}
1632 |
1633 | '@babel/core@7.27.4':
1634 | dependencies:
1635 | '@ampproject/remapping': 2.3.0
1636 | '@babel/code-frame': 7.27.1
1637 | '@babel/generator': 7.27.5
1638 | '@babel/helper-compilation-targets': 7.27.2
1639 | '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4)
1640 | '@babel/helpers': 7.27.4
1641 | '@babel/parser': 7.27.5
1642 | '@babel/template': 7.27.2
1643 | '@babel/traverse': 7.27.4
1644 | '@babel/types': 7.27.3
1645 | convert-source-map: 2.0.0
1646 | debug: 4.4.1
1647 | gensync: 1.0.0-beta.2
1648 | json5: 2.2.3
1649 | semver: 6.3.1
1650 | transitivePeerDependencies:
1651 | - supports-color
1652 |
1653 | '@babel/eslint-parser@7.27.5(@babel/core@7.27.4)(eslint@9.28.0)':
1654 | dependencies:
1655 | '@babel/core': 7.27.4
1656 | '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1
1657 | eslint: 9.28.0
1658 | eslint-visitor-keys: 2.1.0
1659 | semver: 6.3.1
1660 |
1661 | '@babel/generator@7.27.5':
1662 | dependencies:
1663 | '@babel/parser': 7.27.5
1664 | '@babel/types': 7.27.3
1665 | '@jridgewell/gen-mapping': 0.3.8
1666 | '@jridgewell/trace-mapping': 0.3.25
1667 | jsesc: 3.1.0
1668 |
1669 | '@babel/helper-annotate-as-pure@7.27.3':
1670 | dependencies:
1671 | '@babel/types': 7.27.3
1672 |
1673 | '@babel/helper-compilation-targets@7.27.2':
1674 | dependencies:
1675 | '@babel/compat-data': 7.27.5
1676 | '@babel/helper-validator-option': 7.27.1
1677 | browserslist: 4.25.0
1678 | lru-cache: 5.1.1
1679 | semver: 6.3.1
1680 |
1681 | '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)':
1682 | dependencies:
1683 | '@babel/core': 7.27.4
1684 | '@babel/helper-annotate-as-pure': 7.27.3
1685 | '@babel/helper-member-expression-to-functions': 7.27.1
1686 | '@babel/helper-optimise-call-expression': 7.27.1
1687 | '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4)
1688 | '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
1689 | '@babel/traverse': 7.27.4
1690 | semver: 6.3.1
1691 | transitivePeerDependencies:
1692 | - supports-color
1693 |
1694 | '@babel/helper-member-expression-to-functions@7.27.1':
1695 | dependencies:
1696 | '@babel/traverse': 7.27.4
1697 | '@babel/types': 7.27.3
1698 | transitivePeerDependencies:
1699 | - supports-color
1700 |
1701 | '@babel/helper-module-imports@7.27.1':
1702 | dependencies:
1703 | '@babel/traverse': 7.27.4
1704 | '@babel/types': 7.27.3
1705 | transitivePeerDependencies:
1706 | - supports-color
1707 |
1708 | '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)':
1709 | dependencies:
1710 | '@babel/core': 7.27.4
1711 | '@babel/helper-module-imports': 7.27.1
1712 | '@babel/helper-validator-identifier': 7.27.1
1713 | '@babel/traverse': 7.27.4
1714 | transitivePeerDependencies:
1715 | - supports-color
1716 |
1717 | '@babel/helper-optimise-call-expression@7.27.1':
1718 | dependencies:
1719 | '@babel/types': 7.27.3
1720 |
1721 | '@babel/helper-plugin-utils@7.27.1': {}
1722 |
1723 | '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)':
1724 | dependencies:
1725 | '@babel/core': 7.27.4
1726 | '@babel/helper-member-expression-to-functions': 7.27.1
1727 | '@babel/helper-optimise-call-expression': 7.27.1
1728 | '@babel/traverse': 7.27.4
1729 | transitivePeerDependencies:
1730 | - supports-color
1731 |
1732 | '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
1733 | dependencies:
1734 | '@babel/traverse': 7.27.4
1735 | '@babel/types': 7.27.3
1736 | transitivePeerDependencies:
1737 | - supports-color
1738 |
1739 | '@babel/helper-string-parser@7.27.1': {}
1740 |
1741 | '@babel/helper-validator-identifier@7.27.1': {}
1742 |
1743 | '@babel/helper-validator-option@7.27.1': {}
1744 |
1745 | '@babel/helpers@7.27.4':
1746 | dependencies:
1747 | '@babel/template': 7.27.2
1748 | '@babel/types': 7.27.3
1749 |
1750 | '@babel/parser@7.27.5':
1751 | dependencies:
1752 | '@babel/types': 7.27.3
1753 |
1754 | '@babel/plugin-proposal-decorators@7.27.1(@babel/core@7.27.4)':
1755 | dependencies:
1756 | '@babel/core': 7.27.4
1757 | '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4)
1758 | '@babel/helper-plugin-utils': 7.27.1
1759 | '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.27.4)
1760 | transitivePeerDependencies:
1761 | - supports-color
1762 |
1763 | '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.27.4)':
1764 | dependencies:
1765 | '@babel/core': 7.27.4
1766 | '@babel/helper-plugin-utils': 7.27.1
1767 |
1768 | '@babel/template@7.27.2':
1769 | dependencies:
1770 | '@babel/code-frame': 7.27.1
1771 | '@babel/parser': 7.27.5
1772 | '@babel/types': 7.27.3
1773 |
1774 | '@babel/traverse@7.27.4':
1775 | dependencies:
1776 | '@babel/code-frame': 7.27.1
1777 | '@babel/generator': 7.27.5
1778 | '@babel/parser': 7.27.5
1779 | '@babel/template': 7.27.2
1780 | '@babel/types': 7.27.3
1781 | debug: 4.4.1
1782 | globals: 11.12.0
1783 | transitivePeerDependencies:
1784 | - supports-color
1785 |
1786 | '@babel/types@7.27.3':
1787 | dependencies:
1788 | '@babel/helper-string-parser': 7.27.1
1789 | '@babel/helper-validator-identifier': 7.27.1
1790 |
1791 | '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)':
1792 | dependencies:
1793 | '@csstools/css-tokenizer': 3.0.4
1794 |
1795 | '@csstools/css-tokenizer@3.0.4': {}
1796 |
1797 | '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
1798 | dependencies:
1799 | '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
1800 | '@csstools/css-tokenizer': 3.0.4
1801 |
1802 | '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)':
1803 | dependencies:
1804 | postcss-selector-parser: 7.1.0
1805 |
1806 | '@discourse/lint-configs@2.25.0(ember-template-lint@7.8.1)(eslint@9.28.0)(postcss@8.5.4)(prettier@3.5.3)(stylelint@16.20.0(typescript@5.8.3))':
1807 | dependencies:
1808 | '@babel/core': 7.27.4
1809 | '@babel/eslint-parser': 7.27.5(@babel/core@7.27.4)(eslint@9.28.0)
1810 | '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.4)
1811 | ember-template-lint: 7.8.1
1812 | eslint: 9.28.0
1813 | eslint-plugin-decorator-position: 6.0.0(@babel/eslint-parser@7.27.5(@babel/core@7.27.4)(eslint@9.28.0))(eslint@9.28.0)
1814 | eslint-plugin-ember: 12.5.0(@babel/core@7.27.4)(eslint@9.28.0)
1815 | eslint-plugin-import: 2.31.0(eslint@9.28.0)
1816 | eslint-plugin-qunit: 8.1.2(eslint@9.28.0)
1817 | eslint-plugin-simple-import-sort: 12.1.1(eslint@9.28.0)
1818 | eslint-plugin-sort-class-members: 1.21.0(eslint@9.28.0)
1819 | globals: 16.2.0
1820 | prettier: 3.5.3
1821 | prettier-plugin-ember-template-tag: 2.0.5(prettier@3.5.3)
1822 | stylelint: 16.20.0(typescript@5.8.3)
1823 | stylelint-config-standard: 38.0.0(stylelint@16.20.0(typescript@5.8.3))
1824 | stylelint-config-standard-scss: 15.0.1(postcss@8.5.4)(stylelint@16.20.0(typescript@5.8.3))
1825 | stylelint-scss: 6.12.0(stylelint@16.20.0(typescript@5.8.3))
1826 | typescript: 5.8.3
1827 | transitivePeerDependencies:
1828 | - '@typescript-eslint/parser'
1829 | - eslint-import-resolver-typescript
1830 | - eslint-import-resolver-webpack
1831 | - postcss
1832 | - supports-color
1833 |
1834 | '@dual-bundle/import-meta-resolve@4.1.0': {}
1835 |
1836 | '@ember-data/rfc395-data@0.0.4': {}
1837 |
1838 | '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0)':
1839 | dependencies:
1840 | eslint: 9.28.0
1841 | eslint-visitor-keys: 3.4.3
1842 |
1843 | '@eslint-community/regexpp@4.12.1': {}
1844 |
1845 | '@eslint/config-array@0.20.0':
1846 | dependencies:
1847 | '@eslint/object-schema': 2.1.6
1848 | debug: 4.4.1
1849 | minimatch: 3.1.2
1850 | transitivePeerDependencies:
1851 | - supports-color
1852 |
1853 | '@eslint/config-helpers@0.2.2': {}
1854 |
1855 | '@eslint/core@0.14.0':
1856 | dependencies:
1857 | '@types/json-schema': 7.0.15
1858 |
1859 | '@eslint/eslintrc@3.3.1':
1860 | dependencies:
1861 | ajv: 6.12.6
1862 | debug: 4.4.1
1863 | espree: 10.3.0
1864 | globals: 14.0.0
1865 | ignore: 5.3.2
1866 | import-fresh: 3.3.1
1867 | js-yaml: 4.1.0
1868 | minimatch: 3.1.2
1869 | strip-json-comments: 3.1.1
1870 | transitivePeerDependencies:
1871 | - supports-color
1872 |
1873 | '@eslint/js@9.28.0': {}
1874 |
1875 | '@eslint/object-schema@2.1.6': {}
1876 |
1877 | '@eslint/plugin-kit@0.3.1':
1878 | dependencies:
1879 | '@eslint/core': 0.14.0
1880 | levn: 0.4.1
1881 |
1882 | '@glimmer/env@0.1.7': {}
1883 |
1884 | '@glimmer/interfaces@0.92.3':
1885 | dependencies:
1886 | '@simple-dom/interface': 1.4.0
1887 |
1888 | '@glimmer/syntax@0.92.3':
1889 | dependencies:
1890 | '@glimmer/interfaces': 0.92.3
1891 | '@glimmer/util': 0.92.3
1892 | '@glimmer/wire-format': 0.92.3
1893 | '@handlebars/parser': 2.0.0
1894 | simple-html-tokenizer: 0.5.11
1895 |
1896 | '@glimmer/util@0.92.3':
1897 | dependencies:
1898 | '@glimmer/env': 0.1.7
1899 | '@glimmer/interfaces': 0.92.3
1900 |
1901 | '@glimmer/wire-format@0.92.3':
1902 | dependencies:
1903 | '@glimmer/interfaces': 0.92.3
1904 | '@glimmer/util': 0.92.3
1905 |
1906 | '@handlebars/parser@2.0.0': {}
1907 |
1908 | '@humanfs/core@0.19.1': {}
1909 |
1910 | '@humanfs/node@0.16.6':
1911 | dependencies:
1912 | '@humanfs/core': 0.19.1
1913 | '@humanwhocodes/retry': 0.3.1
1914 |
1915 | '@humanwhocodes/module-importer@1.0.1': {}
1916 |
1917 | '@humanwhocodes/retry@0.3.1': {}
1918 |
1919 | '@humanwhocodes/retry@0.4.3': {}
1920 |
1921 | '@jridgewell/gen-mapping@0.3.8':
1922 | dependencies:
1923 | '@jridgewell/set-array': 1.2.1
1924 | '@jridgewell/sourcemap-codec': 1.5.0
1925 | '@jridgewell/trace-mapping': 0.3.25
1926 |
1927 | '@jridgewell/resolve-uri@3.1.2': {}
1928 |
1929 | '@jridgewell/set-array@1.2.1': {}
1930 |
1931 | '@jridgewell/sourcemap-codec@1.5.0': {}
1932 |
1933 | '@jridgewell/trace-mapping@0.3.25':
1934 | dependencies:
1935 | '@jridgewell/resolve-uri': 3.1.2
1936 | '@jridgewell/sourcemap-codec': 1.5.0
1937 |
1938 | '@keyv/serialize@1.0.3':
1939 | dependencies:
1940 | buffer: 6.0.3
1941 |
1942 | '@lint-todo/utils@13.1.1':
1943 | dependencies:
1944 | '@types/eslint': 8.56.12
1945 | find-up: 5.0.0
1946 | fs-extra: 9.1.0
1947 | proper-lockfile: 4.1.2
1948 | slash: 3.0.0
1949 | tslib: 2.8.1
1950 | upath: 2.0.1
1951 |
1952 | '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
1953 | dependencies:
1954 | eslint-scope: 5.1.1
1955 |
1956 | '@nodelib/fs.scandir@2.1.5':
1957 | dependencies:
1958 | '@nodelib/fs.stat': 2.0.5
1959 | run-parallel: 1.2.0
1960 |
1961 | '@nodelib/fs.stat@2.0.5': {}
1962 |
1963 | '@nodelib/fs.walk@1.2.8':
1964 | dependencies:
1965 | '@nodelib/fs.scandir': 2.1.5
1966 | fastq: 1.19.1
1967 |
1968 | '@rtsao/scc@1.1.0': {}
1969 |
1970 | '@simple-dom/interface@1.4.0': {}
1971 |
1972 | '@types/eslint@8.56.12':
1973 | dependencies:
1974 | '@types/estree': 1.0.7
1975 | '@types/json-schema': 7.0.15
1976 |
1977 | '@types/estree@1.0.7': {}
1978 |
1979 | '@types/json-schema@7.0.15': {}
1980 |
1981 | '@types/json5@0.0.29': {}
1982 |
1983 | acorn-jsx@5.3.2(acorn@8.14.1):
1984 | dependencies:
1985 | acorn: 8.14.1
1986 |
1987 | acorn@8.14.1: {}
1988 |
1989 | ajv@6.12.6:
1990 | dependencies:
1991 | fast-deep-equal: 3.1.3
1992 | fast-json-stable-stringify: 2.1.0
1993 | json-schema-traverse: 0.4.1
1994 | uri-js: 4.4.1
1995 |
1996 | ajv@8.17.1:
1997 | dependencies:
1998 | fast-deep-equal: 3.1.3
1999 | fast-uri: 3.0.6
2000 | json-schema-traverse: 1.0.0
2001 | require-from-string: 2.0.2
2002 |
2003 | ansi-regex@5.0.1: {}
2004 |
2005 | ansi-styles@4.3.0:
2006 | dependencies:
2007 | color-convert: 2.0.1
2008 |
2009 | argparse@2.0.1: {}
2010 |
2011 | array-buffer-byte-length@1.0.2:
2012 | dependencies:
2013 | call-bound: 1.0.4
2014 | is-array-buffer: 3.0.5
2015 |
2016 | array-includes@3.1.9:
2017 | dependencies:
2018 | call-bind: 1.0.8
2019 | call-bound: 1.0.4
2020 | define-properties: 1.2.1
2021 | es-abstract: 1.24.0
2022 | es-object-atoms: 1.1.1
2023 | get-intrinsic: 1.3.0
2024 | is-string: 1.1.1
2025 | math-intrinsics: 1.1.0
2026 |
2027 | array-union@2.1.0: {}
2028 |
2029 | array.prototype.findlastindex@1.2.6:
2030 | dependencies:
2031 | call-bind: 1.0.8
2032 | call-bound: 1.0.4
2033 | define-properties: 1.2.1
2034 | es-abstract: 1.24.0
2035 | es-errors: 1.3.0
2036 | es-object-atoms: 1.1.1
2037 | es-shim-unscopables: 1.1.0
2038 |
2039 | array.prototype.flat@1.3.3:
2040 | dependencies:
2041 | call-bind: 1.0.8
2042 | define-properties: 1.2.1
2043 | es-abstract: 1.24.0
2044 | es-shim-unscopables: 1.1.0
2045 |
2046 | array.prototype.flatmap@1.3.3:
2047 | dependencies:
2048 | call-bind: 1.0.8
2049 | define-properties: 1.2.1
2050 | es-abstract: 1.24.0
2051 | es-shim-unscopables: 1.1.0
2052 |
2053 | arraybuffer.prototype.slice@1.0.4:
2054 | dependencies:
2055 | array-buffer-byte-length: 1.0.2
2056 | call-bind: 1.0.8
2057 | define-properties: 1.2.1
2058 | es-abstract: 1.24.0
2059 | es-errors: 1.3.0
2060 | get-intrinsic: 1.3.0
2061 | is-array-buffer: 3.0.5
2062 |
2063 | astral-regex@2.0.0: {}
2064 |
2065 | async-function@1.0.0: {}
2066 |
2067 | at-least-node@1.0.0: {}
2068 |
2069 | available-typed-arrays@1.0.7:
2070 | dependencies:
2071 | possible-typed-array-names: 1.1.0
2072 |
2073 | balanced-match@1.0.2: {}
2074 |
2075 | balanced-match@2.0.0: {}
2076 |
2077 | base64-js@1.5.1: {}
2078 |
2079 | brace-expansion@1.1.11:
2080 | dependencies:
2081 | balanced-match: 1.0.2
2082 | concat-map: 0.0.1
2083 |
2084 | braces@3.0.3:
2085 | dependencies:
2086 | fill-range: 7.1.1
2087 |
2088 | browserslist@4.25.0:
2089 | dependencies:
2090 | caniuse-lite: 1.0.30001721
2091 | electron-to-chromium: 1.5.165
2092 | node-releases: 2.0.19
2093 | update-browserslist-db: 1.1.3(browserslist@4.25.0)
2094 |
2095 | buffer@6.0.3:
2096 | dependencies:
2097 | base64-js: 1.5.1
2098 | ieee754: 1.2.1
2099 |
2100 | cacheable@1.9.0:
2101 | dependencies:
2102 | hookified: 1.9.1
2103 | keyv: 5.3.3
2104 |
2105 | call-bind-apply-helpers@1.0.2:
2106 | dependencies:
2107 | es-errors: 1.3.0
2108 | function-bind: 1.1.2
2109 |
2110 | call-bind@1.0.8:
2111 | dependencies:
2112 | call-bind-apply-helpers: 1.0.2
2113 | es-define-property: 1.0.1
2114 | get-intrinsic: 1.3.0
2115 | set-function-length: 1.2.2
2116 |
2117 | call-bound@1.0.4:
2118 | dependencies:
2119 | call-bind-apply-helpers: 1.0.2
2120 | get-intrinsic: 1.3.0
2121 |
2122 | callsites@3.1.0: {}
2123 |
2124 | caniuse-lite@1.0.30001721: {}
2125 |
2126 | chalk@4.1.2:
2127 | dependencies:
2128 | ansi-styles: 4.3.0
2129 | supports-color: 7.2.0
2130 |
2131 | color-convert@2.0.1:
2132 | dependencies:
2133 | color-name: 1.1.4
2134 |
2135 | color-name@1.1.4: {}
2136 |
2137 | colord@2.9.3: {}
2138 |
2139 | concat-map@0.0.1: {}
2140 |
2141 | content-tag@2.0.3: {}
2142 |
2143 | content-tag@3.1.3: {}
2144 |
2145 | convert-source-map@2.0.0: {}
2146 |
2147 | cosmiconfig@9.0.0(typescript@5.8.3):
2148 | dependencies:
2149 | env-paths: 2.2.1
2150 | import-fresh: 3.3.1
2151 | js-yaml: 4.1.0
2152 | parse-json: 5.2.0
2153 | optionalDependencies:
2154 | typescript: 5.8.3
2155 |
2156 | cross-spawn@7.0.6:
2157 | dependencies:
2158 | path-key: 3.1.1
2159 | shebang-command: 2.0.0
2160 | which: 2.0.2
2161 |
2162 | css-functions-list@3.2.3: {}
2163 |
2164 | css-tree@3.1.0:
2165 | dependencies:
2166 | mdn-data: 2.12.2
2167 | source-map-js: 1.2.1
2168 |
2169 | cssesc@3.0.0: {}
2170 |
2171 | data-view-buffer@1.0.2:
2172 | dependencies:
2173 | call-bound: 1.0.4
2174 | es-errors: 1.3.0
2175 | is-data-view: 1.0.2
2176 |
2177 | data-view-byte-length@1.0.2:
2178 | dependencies:
2179 | call-bound: 1.0.4
2180 | es-errors: 1.3.0
2181 | is-data-view: 1.0.2
2182 |
2183 | data-view-byte-offset@1.0.1:
2184 | dependencies:
2185 | call-bound: 1.0.4
2186 | es-errors: 1.3.0
2187 | is-data-view: 1.0.2
2188 |
2189 | debug@3.2.7:
2190 | dependencies:
2191 | ms: 2.1.3
2192 |
2193 | debug@4.4.1:
2194 | dependencies:
2195 | ms: 2.1.3
2196 |
2197 | deep-is@0.1.4: {}
2198 |
2199 | define-data-property@1.1.4:
2200 | dependencies:
2201 | es-define-property: 1.0.1
2202 | es-errors: 1.3.0
2203 | gopd: 1.2.0
2204 |
2205 | define-properties@1.2.1:
2206 | dependencies:
2207 | define-data-property: 1.1.4
2208 | has-property-descriptors: 1.0.2
2209 | object-keys: 1.1.1
2210 |
2211 | dir-glob@3.0.1:
2212 | dependencies:
2213 | path-type: 4.0.0
2214 |
2215 | doctrine@2.1.0:
2216 | dependencies:
2217 | esutils: 2.0.3
2218 |
2219 | dot-case@3.0.4:
2220 | dependencies:
2221 | no-case: 3.0.4
2222 | tslib: 2.8.1
2223 |
2224 | dunder-proto@1.0.1:
2225 | dependencies:
2226 | call-bind-apply-helpers: 1.0.2
2227 | es-errors: 1.3.0
2228 | gopd: 1.2.0
2229 |
2230 | electron-to-chromium@1.5.165: {}
2231 |
2232 | ember-eslint-parser@0.5.9(@babel/core@7.27.4)(eslint@9.28.0):
2233 | dependencies:
2234 | '@babel/core': 7.27.4
2235 | '@babel/eslint-parser': 7.27.5(@babel/core@7.27.4)(eslint@9.28.0)
2236 | '@glimmer/syntax': 0.92.3
2237 | content-tag: 2.0.3
2238 | eslint-scope: 7.2.2
2239 | html-tags: 3.3.1
2240 | mathml-tag-names: 2.1.3
2241 | svg-tags: 1.0.0
2242 | transitivePeerDependencies:
2243 | - eslint
2244 |
2245 | ember-rfc176-data@0.3.18: {}
2246 |
2247 | ember-template-lint@7.8.1:
2248 | dependencies:
2249 | '@lint-todo/utils': 13.1.1
2250 | content-tag: 3.1.3
2251 |
2252 | emoji-regex@8.0.0: {}
2253 |
2254 | env-paths@2.2.1: {}
2255 |
2256 | error-ex@1.3.2:
2257 | dependencies:
2258 | is-arrayish: 0.2.1
2259 |
2260 | es-abstract@1.24.0:
2261 | dependencies:
2262 | array-buffer-byte-length: 1.0.2
2263 | arraybuffer.prototype.slice: 1.0.4
2264 | available-typed-arrays: 1.0.7
2265 | call-bind: 1.0.8
2266 | call-bound: 1.0.4
2267 | data-view-buffer: 1.0.2
2268 | data-view-byte-length: 1.0.2
2269 | data-view-byte-offset: 1.0.1
2270 | es-define-property: 1.0.1
2271 | es-errors: 1.3.0
2272 | es-object-atoms: 1.1.1
2273 | es-set-tostringtag: 2.1.0
2274 | es-to-primitive: 1.3.0
2275 | function.prototype.name: 1.1.8
2276 | get-intrinsic: 1.3.0
2277 | get-proto: 1.0.1
2278 | get-symbol-description: 1.1.0
2279 | globalthis: 1.0.4
2280 | gopd: 1.2.0
2281 | has-property-descriptors: 1.0.2
2282 | has-proto: 1.2.0
2283 | has-symbols: 1.1.0
2284 | hasown: 2.0.2
2285 | internal-slot: 1.1.0
2286 | is-array-buffer: 3.0.5
2287 | is-callable: 1.2.7
2288 | is-data-view: 1.0.2
2289 | is-negative-zero: 2.0.3
2290 | is-regex: 1.2.1
2291 | is-set: 2.0.3
2292 | is-shared-array-buffer: 1.0.4
2293 | is-string: 1.1.1
2294 | is-typed-array: 1.1.15
2295 | is-weakref: 1.1.1
2296 | math-intrinsics: 1.1.0
2297 | object-inspect: 1.13.4
2298 | object-keys: 1.1.1
2299 | object.assign: 4.1.7
2300 | own-keys: 1.0.1
2301 | regexp.prototype.flags: 1.5.4
2302 | safe-array-concat: 1.1.3
2303 | safe-push-apply: 1.0.0
2304 | safe-regex-test: 1.1.0
2305 | set-proto: 1.0.0
2306 | stop-iteration-iterator: 1.1.0
2307 | string.prototype.trim: 1.2.10
2308 | string.prototype.trimend: 1.0.9
2309 | string.prototype.trimstart: 1.0.8
2310 | typed-array-buffer: 1.0.3
2311 | typed-array-byte-length: 1.0.3
2312 | typed-array-byte-offset: 1.0.4
2313 | typed-array-length: 1.0.7
2314 | unbox-primitive: 1.1.0
2315 | which-typed-array: 1.1.19
2316 |
2317 | es-define-property@1.0.1: {}
2318 |
2319 | es-errors@1.3.0: {}
2320 |
2321 | es-object-atoms@1.1.1:
2322 | dependencies:
2323 | es-errors: 1.3.0
2324 |
2325 | es-set-tostringtag@2.1.0:
2326 | dependencies:
2327 | es-errors: 1.3.0
2328 | get-intrinsic: 1.3.0
2329 | has-tostringtag: 1.0.2
2330 | hasown: 2.0.2
2331 |
2332 | es-shim-unscopables@1.1.0:
2333 | dependencies:
2334 | hasown: 2.0.2
2335 |
2336 | es-to-primitive@1.3.0:
2337 | dependencies:
2338 | is-callable: 1.2.7
2339 | is-date-object: 1.1.0
2340 | is-symbol: 1.1.1
2341 |
2342 | escalade@3.2.0: {}
2343 |
2344 | escape-string-regexp@4.0.0: {}
2345 |
2346 | eslint-import-resolver-node@0.3.9:
2347 | dependencies:
2348 | debug: 3.2.7
2349 | is-core-module: 2.16.1
2350 | resolve: 1.22.10
2351 | transitivePeerDependencies:
2352 | - supports-color
2353 |
2354 | eslint-module-utils@2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.28.0):
2355 | dependencies:
2356 | debug: 3.2.7
2357 | optionalDependencies:
2358 | eslint: 9.28.0
2359 | eslint-import-resolver-node: 0.3.9
2360 | transitivePeerDependencies:
2361 | - supports-color
2362 |
2363 | eslint-plugin-decorator-position@6.0.0(@babel/eslint-parser@7.27.5(@babel/core@7.27.4)(eslint@9.28.0))(eslint@9.28.0):
2364 | dependencies:
2365 | '@babel/core': 7.27.4
2366 | '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.4)
2367 | '@ember-data/rfc395-data': 0.0.4
2368 | ember-rfc176-data: 0.3.18
2369 | eslint: 9.28.0
2370 | snake-case: 3.0.4
2371 | optionalDependencies:
2372 | '@babel/eslint-parser': 7.27.5(@babel/core@7.27.4)(eslint@9.28.0)
2373 | transitivePeerDependencies:
2374 | - supports-color
2375 |
2376 | eslint-plugin-ember@12.5.0(@babel/core@7.27.4)(eslint@9.28.0):
2377 | dependencies:
2378 | '@ember-data/rfc395-data': 0.0.4
2379 | css-tree: 3.1.0
2380 | ember-eslint-parser: 0.5.9(@babel/core@7.27.4)(eslint@9.28.0)
2381 | ember-rfc176-data: 0.3.18
2382 | eslint: 9.28.0
2383 | eslint-utils: 3.0.0(eslint@9.28.0)
2384 | estraverse: 5.3.0
2385 | lodash.camelcase: 4.3.0
2386 | lodash.kebabcase: 4.1.1
2387 | requireindex: 1.2.0
2388 | snake-case: 3.0.4
2389 | transitivePeerDependencies:
2390 | - '@babel/core'
2391 |
2392 | eslint-plugin-import@2.31.0(eslint@9.28.0):
2393 | dependencies:
2394 | '@rtsao/scc': 1.1.0
2395 | array-includes: 3.1.9
2396 | array.prototype.findlastindex: 1.2.6
2397 | array.prototype.flat: 1.3.3
2398 | array.prototype.flatmap: 1.3.3
2399 | debug: 3.2.7
2400 | doctrine: 2.1.0
2401 | eslint: 9.28.0
2402 | eslint-import-resolver-node: 0.3.9
2403 | eslint-module-utils: 2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.28.0)
2404 | hasown: 2.0.2
2405 | is-core-module: 2.16.1
2406 | is-glob: 4.0.3
2407 | minimatch: 3.1.2
2408 | object.fromentries: 2.0.8
2409 | object.groupby: 1.0.3
2410 | object.values: 1.2.1
2411 | semver: 6.3.1
2412 | string.prototype.trimend: 1.0.9
2413 | tsconfig-paths: 3.15.0
2414 | transitivePeerDependencies:
2415 | - eslint-import-resolver-typescript
2416 | - eslint-import-resolver-webpack
2417 | - supports-color
2418 |
2419 | eslint-plugin-qunit@8.1.2(eslint@9.28.0):
2420 | dependencies:
2421 | eslint-utils: 3.0.0(eslint@9.28.0)
2422 | requireindex: 1.2.0
2423 | transitivePeerDependencies:
2424 | - eslint
2425 |
2426 | eslint-plugin-simple-import-sort@12.1.1(eslint@9.28.0):
2427 | dependencies:
2428 | eslint: 9.28.0
2429 |
2430 | eslint-plugin-sort-class-members@1.21.0(eslint@9.28.0):
2431 | dependencies:
2432 | eslint: 9.28.0
2433 |
2434 | eslint-scope@5.1.1:
2435 | dependencies:
2436 | esrecurse: 4.3.0
2437 | estraverse: 4.3.0
2438 |
2439 | eslint-scope@7.2.2:
2440 | dependencies:
2441 | esrecurse: 4.3.0
2442 | estraverse: 5.3.0
2443 |
2444 | eslint-scope@8.3.0:
2445 | dependencies:
2446 | esrecurse: 4.3.0
2447 | estraverse: 5.3.0
2448 |
2449 | eslint-utils@3.0.0(eslint@9.28.0):
2450 | dependencies:
2451 | eslint: 9.28.0
2452 | eslint-visitor-keys: 2.1.0
2453 |
2454 | eslint-visitor-keys@2.1.0: {}
2455 |
2456 | eslint-visitor-keys@3.4.3: {}
2457 |
2458 | eslint-visitor-keys@4.2.0: {}
2459 |
2460 | eslint@9.28.0:
2461 | dependencies:
2462 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0)
2463 | '@eslint-community/regexpp': 4.12.1
2464 | '@eslint/config-array': 0.20.0
2465 | '@eslint/config-helpers': 0.2.2
2466 | '@eslint/core': 0.14.0
2467 | '@eslint/eslintrc': 3.3.1
2468 | '@eslint/js': 9.28.0
2469 | '@eslint/plugin-kit': 0.3.1
2470 | '@humanfs/node': 0.16.6
2471 | '@humanwhocodes/module-importer': 1.0.1
2472 | '@humanwhocodes/retry': 0.4.3
2473 | '@types/estree': 1.0.7
2474 | '@types/json-schema': 7.0.15
2475 | ajv: 6.12.6
2476 | chalk: 4.1.2
2477 | cross-spawn: 7.0.6
2478 | debug: 4.4.1
2479 | escape-string-regexp: 4.0.0
2480 | eslint-scope: 8.3.0
2481 | eslint-visitor-keys: 4.2.0
2482 | espree: 10.3.0
2483 | esquery: 1.6.0
2484 | esutils: 2.0.3
2485 | fast-deep-equal: 3.1.3
2486 | file-entry-cache: 8.0.0
2487 | find-up: 5.0.0
2488 | glob-parent: 6.0.2
2489 | ignore: 5.3.2
2490 | imurmurhash: 0.1.4
2491 | is-glob: 4.0.3
2492 | json-stable-stringify-without-jsonify: 1.0.1
2493 | lodash.merge: 4.6.2
2494 | minimatch: 3.1.2
2495 | natural-compare: 1.4.0
2496 | optionator: 0.9.4
2497 | transitivePeerDependencies:
2498 | - supports-color
2499 |
2500 | espree@10.3.0:
2501 | dependencies:
2502 | acorn: 8.14.1
2503 | acorn-jsx: 5.3.2(acorn@8.14.1)
2504 | eslint-visitor-keys: 4.2.0
2505 |
2506 | esquery@1.6.0:
2507 | dependencies:
2508 | estraverse: 5.3.0
2509 |
2510 | esrecurse@4.3.0:
2511 | dependencies:
2512 | estraverse: 5.3.0
2513 |
2514 | estraverse@4.3.0: {}
2515 |
2516 | estraverse@5.3.0: {}
2517 |
2518 | esutils@2.0.3: {}
2519 |
2520 | fast-deep-equal@3.1.3: {}
2521 |
2522 | fast-glob@3.3.3:
2523 | dependencies:
2524 | '@nodelib/fs.stat': 2.0.5
2525 | '@nodelib/fs.walk': 1.2.8
2526 | glob-parent: 5.1.2
2527 | merge2: 1.4.1
2528 | micromatch: 4.0.8
2529 |
2530 | fast-json-stable-stringify@2.1.0: {}
2531 |
2532 | fast-levenshtein@2.0.6: {}
2533 |
2534 | fast-uri@3.0.6: {}
2535 |
2536 | fastest-levenshtein@1.0.16: {}
2537 |
2538 | fastq@1.19.1:
2539 | dependencies:
2540 | reusify: 1.1.0
2541 |
2542 | file-entry-cache@10.1.0:
2543 | dependencies:
2544 | flat-cache: 6.1.9
2545 |
2546 | file-entry-cache@8.0.0:
2547 | dependencies:
2548 | flat-cache: 4.0.1
2549 |
2550 | fill-range@7.1.1:
2551 | dependencies:
2552 | to-regex-range: 5.0.1
2553 |
2554 | find-up@5.0.0:
2555 | dependencies:
2556 | locate-path: 6.0.0
2557 | path-exists: 4.0.0
2558 |
2559 | flat-cache@4.0.1:
2560 | dependencies:
2561 | flatted: 3.3.3
2562 | keyv: 4.5.4
2563 |
2564 | flat-cache@6.1.9:
2565 | dependencies:
2566 | cacheable: 1.9.0
2567 | flatted: 3.3.3
2568 | hookified: 1.9.1
2569 |
2570 | flatted@3.3.3: {}
2571 |
2572 | for-each@0.3.5:
2573 | dependencies:
2574 | is-callable: 1.2.7
2575 |
2576 | fs-extra@9.1.0:
2577 | dependencies:
2578 | at-least-node: 1.0.0
2579 | graceful-fs: 4.2.11
2580 | jsonfile: 6.1.0
2581 | universalify: 2.0.1
2582 |
2583 | function-bind@1.1.2: {}
2584 |
2585 | function.prototype.name@1.1.8:
2586 | dependencies:
2587 | call-bind: 1.0.8
2588 | call-bound: 1.0.4
2589 | define-properties: 1.2.1
2590 | functions-have-names: 1.2.3
2591 | hasown: 2.0.2
2592 | is-callable: 1.2.7
2593 |
2594 | functions-have-names@1.2.3: {}
2595 |
2596 | gensync@1.0.0-beta.2: {}
2597 |
2598 | get-intrinsic@1.3.0:
2599 | dependencies:
2600 | call-bind-apply-helpers: 1.0.2
2601 | es-define-property: 1.0.1
2602 | es-errors: 1.3.0
2603 | es-object-atoms: 1.1.1
2604 | function-bind: 1.1.2
2605 | get-proto: 1.0.1
2606 | gopd: 1.2.0
2607 | has-symbols: 1.1.0
2608 | hasown: 2.0.2
2609 | math-intrinsics: 1.1.0
2610 |
2611 | get-proto@1.0.1:
2612 | dependencies:
2613 | dunder-proto: 1.0.1
2614 | es-object-atoms: 1.1.1
2615 |
2616 | get-symbol-description@1.1.0:
2617 | dependencies:
2618 | call-bound: 1.0.4
2619 | es-errors: 1.3.0
2620 | get-intrinsic: 1.3.0
2621 |
2622 | glob-parent@5.1.2:
2623 | dependencies:
2624 | is-glob: 4.0.3
2625 |
2626 | glob-parent@6.0.2:
2627 | dependencies:
2628 | is-glob: 4.0.3
2629 |
2630 | global-modules@2.0.0:
2631 | dependencies:
2632 | global-prefix: 3.0.0
2633 |
2634 | global-prefix@3.0.0:
2635 | dependencies:
2636 | ini: 1.3.8
2637 | kind-of: 6.0.3
2638 | which: 1.3.1
2639 |
2640 | globals@11.12.0: {}
2641 |
2642 | globals@14.0.0: {}
2643 |
2644 | globals@16.2.0: {}
2645 |
2646 | globalthis@1.0.4:
2647 | dependencies:
2648 | define-properties: 1.2.1
2649 | gopd: 1.2.0
2650 |
2651 | globby@11.1.0:
2652 | dependencies:
2653 | array-union: 2.1.0
2654 | dir-glob: 3.0.1
2655 | fast-glob: 3.3.3
2656 | ignore: 5.3.2
2657 | merge2: 1.4.1
2658 | slash: 3.0.0
2659 |
2660 | globjoin@0.1.4: {}
2661 |
2662 | gopd@1.2.0: {}
2663 |
2664 | graceful-fs@4.2.11: {}
2665 |
2666 | has-bigints@1.1.0: {}
2667 |
2668 | has-flag@4.0.0: {}
2669 |
2670 | has-property-descriptors@1.0.2:
2671 | dependencies:
2672 | es-define-property: 1.0.1
2673 |
2674 | has-proto@1.2.0:
2675 | dependencies:
2676 | dunder-proto: 1.0.1
2677 |
2678 | has-symbols@1.1.0: {}
2679 |
2680 | has-tostringtag@1.0.2:
2681 | dependencies:
2682 | has-symbols: 1.1.0
2683 |
2684 | hasown@2.0.2:
2685 | dependencies:
2686 | function-bind: 1.1.2
2687 |
2688 | hookified@1.9.1: {}
2689 |
2690 | html-tags@3.3.1: {}
2691 |
2692 | ieee754@1.2.1: {}
2693 |
2694 | ignore@5.3.2: {}
2695 |
2696 | ignore@7.0.5: {}
2697 |
2698 | import-fresh@3.3.1:
2699 | dependencies:
2700 | parent-module: 1.0.1
2701 | resolve-from: 4.0.0
2702 |
2703 | imurmurhash@0.1.4: {}
2704 |
2705 | ini@1.3.8: {}
2706 |
2707 | internal-slot@1.1.0:
2708 | dependencies:
2709 | es-errors: 1.3.0
2710 | hasown: 2.0.2
2711 | side-channel: 1.1.0
2712 |
2713 | is-array-buffer@3.0.5:
2714 | dependencies:
2715 | call-bind: 1.0.8
2716 | call-bound: 1.0.4
2717 | get-intrinsic: 1.3.0
2718 |
2719 | is-arrayish@0.2.1: {}
2720 |
2721 | is-async-function@2.1.1:
2722 | dependencies:
2723 | async-function: 1.0.0
2724 | call-bound: 1.0.4
2725 | get-proto: 1.0.1
2726 | has-tostringtag: 1.0.2
2727 | safe-regex-test: 1.1.0
2728 |
2729 | is-bigint@1.1.0:
2730 | dependencies:
2731 | has-bigints: 1.1.0
2732 |
2733 | is-boolean-object@1.2.2:
2734 | dependencies:
2735 | call-bound: 1.0.4
2736 | has-tostringtag: 1.0.2
2737 |
2738 | is-callable@1.2.7: {}
2739 |
2740 | is-core-module@2.16.1:
2741 | dependencies:
2742 | hasown: 2.0.2
2743 |
2744 | is-data-view@1.0.2:
2745 | dependencies:
2746 | call-bound: 1.0.4
2747 | get-intrinsic: 1.3.0
2748 | is-typed-array: 1.1.15
2749 |
2750 | is-date-object@1.1.0:
2751 | dependencies:
2752 | call-bound: 1.0.4
2753 | has-tostringtag: 1.0.2
2754 |
2755 | is-extglob@2.1.1: {}
2756 |
2757 | is-finalizationregistry@1.1.1:
2758 | dependencies:
2759 | call-bound: 1.0.4
2760 |
2761 | is-fullwidth-code-point@3.0.0: {}
2762 |
2763 | is-generator-function@1.1.0:
2764 | dependencies:
2765 | call-bound: 1.0.4
2766 | get-proto: 1.0.1
2767 | has-tostringtag: 1.0.2
2768 | safe-regex-test: 1.1.0
2769 |
2770 | is-glob@4.0.3:
2771 | dependencies:
2772 | is-extglob: 2.1.1
2773 |
2774 | is-map@2.0.3: {}
2775 |
2776 | is-negative-zero@2.0.3: {}
2777 |
2778 | is-number-object@1.1.1:
2779 | dependencies:
2780 | call-bound: 1.0.4
2781 | has-tostringtag: 1.0.2
2782 |
2783 | is-number@7.0.0: {}
2784 |
2785 | is-plain-object@5.0.0: {}
2786 |
2787 | is-regex@1.2.1:
2788 | dependencies:
2789 | call-bound: 1.0.4
2790 | gopd: 1.2.0
2791 | has-tostringtag: 1.0.2
2792 | hasown: 2.0.2
2793 |
2794 | is-set@2.0.3: {}
2795 |
2796 | is-shared-array-buffer@1.0.4:
2797 | dependencies:
2798 | call-bound: 1.0.4
2799 |
2800 | is-string@1.1.1:
2801 | dependencies:
2802 | call-bound: 1.0.4
2803 | has-tostringtag: 1.0.2
2804 |
2805 | is-symbol@1.1.1:
2806 | dependencies:
2807 | call-bound: 1.0.4
2808 | has-symbols: 1.1.0
2809 | safe-regex-test: 1.1.0
2810 |
2811 | is-typed-array@1.1.15:
2812 | dependencies:
2813 | which-typed-array: 1.1.19
2814 |
2815 | is-weakmap@2.0.2: {}
2816 |
2817 | is-weakref@1.1.1:
2818 | dependencies:
2819 | call-bound: 1.0.4
2820 |
2821 | is-weakset@2.0.4:
2822 | dependencies:
2823 | call-bound: 1.0.4
2824 | get-intrinsic: 1.3.0
2825 |
2826 | isarray@2.0.5: {}
2827 |
2828 | isexe@2.0.0: {}
2829 |
2830 | js-tokens@4.0.0: {}
2831 |
2832 | js-yaml@4.1.0:
2833 | dependencies:
2834 | argparse: 2.0.1
2835 |
2836 | jsesc@3.1.0: {}
2837 |
2838 | json-buffer@3.0.1: {}
2839 |
2840 | json-parse-even-better-errors@2.3.1: {}
2841 |
2842 | json-schema-traverse@0.4.1: {}
2843 |
2844 | json-schema-traverse@1.0.0: {}
2845 |
2846 | json-stable-stringify-without-jsonify@1.0.1: {}
2847 |
2848 | json5@1.0.2:
2849 | dependencies:
2850 | minimist: 1.2.8
2851 |
2852 | json5@2.2.3: {}
2853 |
2854 | jsonfile@6.1.0:
2855 | dependencies:
2856 | universalify: 2.0.1
2857 | optionalDependencies:
2858 | graceful-fs: 4.2.11
2859 |
2860 | keyv@4.5.4:
2861 | dependencies:
2862 | json-buffer: 3.0.1
2863 |
2864 | keyv@5.3.3:
2865 | dependencies:
2866 | '@keyv/serialize': 1.0.3
2867 |
2868 | kind-of@6.0.3: {}
2869 |
2870 | known-css-properties@0.36.0: {}
2871 |
2872 | levn@0.4.1:
2873 | dependencies:
2874 | prelude-ls: 1.2.1
2875 | type-check: 0.4.0
2876 |
2877 | lines-and-columns@1.2.4: {}
2878 |
2879 | locate-path@6.0.0:
2880 | dependencies:
2881 | p-locate: 5.0.0
2882 |
2883 | lodash.camelcase@4.3.0: {}
2884 |
2885 | lodash.kebabcase@4.1.1: {}
2886 |
2887 | lodash.merge@4.6.2: {}
2888 |
2889 | lodash.truncate@4.4.2: {}
2890 |
2891 | lower-case@2.0.2:
2892 | dependencies:
2893 | tslib: 2.8.1
2894 |
2895 | lru-cache@5.1.1:
2896 | dependencies:
2897 | yallist: 3.1.1
2898 |
2899 | math-intrinsics@1.1.0: {}
2900 |
2901 | mathml-tag-names@2.1.3: {}
2902 |
2903 | mdn-data@2.12.2: {}
2904 |
2905 | mdn-data@2.21.0: {}
2906 |
2907 | meow@13.2.0: {}
2908 |
2909 | merge2@1.4.1: {}
2910 |
2911 | micromatch@4.0.8:
2912 | dependencies:
2913 | braces: 3.0.3
2914 | picomatch: 2.3.1
2915 |
2916 | minimatch@3.1.2:
2917 | dependencies:
2918 | brace-expansion: 1.1.11
2919 |
2920 | minimist@1.2.8: {}
2921 |
2922 | ms@2.1.3: {}
2923 |
2924 | nanoid@3.3.11: {}
2925 |
2926 | natural-compare@1.4.0: {}
2927 |
2928 | no-case@3.0.4:
2929 | dependencies:
2930 | lower-case: 2.0.2
2931 | tslib: 2.8.1
2932 |
2933 | node-releases@2.0.19: {}
2934 |
2935 | normalize-path@3.0.0: {}
2936 |
2937 | object-inspect@1.13.4: {}
2938 |
2939 | object-keys@1.1.1: {}
2940 |
2941 | object.assign@4.1.7:
2942 | dependencies:
2943 | call-bind: 1.0.8
2944 | call-bound: 1.0.4
2945 | define-properties: 1.2.1
2946 | es-object-atoms: 1.1.1
2947 | has-symbols: 1.1.0
2948 | object-keys: 1.1.1
2949 |
2950 | object.fromentries@2.0.8:
2951 | dependencies:
2952 | call-bind: 1.0.8
2953 | define-properties: 1.2.1
2954 | es-abstract: 1.24.0
2955 | es-object-atoms: 1.1.1
2956 |
2957 | object.groupby@1.0.3:
2958 | dependencies:
2959 | call-bind: 1.0.8
2960 | define-properties: 1.2.1
2961 | es-abstract: 1.24.0
2962 |
2963 | object.values@1.2.1:
2964 | dependencies:
2965 | call-bind: 1.0.8
2966 | call-bound: 1.0.4
2967 | define-properties: 1.2.1
2968 | es-object-atoms: 1.1.1
2969 |
2970 | optionator@0.9.4:
2971 | dependencies:
2972 | deep-is: 0.1.4
2973 | fast-levenshtein: 2.0.6
2974 | levn: 0.4.1
2975 | prelude-ls: 1.2.1
2976 | type-check: 0.4.0
2977 | word-wrap: 1.2.5
2978 |
2979 | own-keys@1.0.1:
2980 | dependencies:
2981 | get-intrinsic: 1.3.0
2982 | object-keys: 1.1.1
2983 | safe-push-apply: 1.0.0
2984 |
2985 | p-limit@3.1.0:
2986 | dependencies:
2987 | yocto-queue: 0.1.0
2988 |
2989 | p-locate@5.0.0:
2990 | dependencies:
2991 | p-limit: 3.1.0
2992 |
2993 | parent-module@1.0.1:
2994 | dependencies:
2995 | callsites: 3.1.0
2996 |
2997 | parse-json@5.2.0:
2998 | dependencies:
2999 | '@babel/code-frame': 7.27.1
3000 | error-ex: 1.3.2
3001 | json-parse-even-better-errors: 2.3.1
3002 | lines-and-columns: 1.2.4
3003 |
3004 | path-exists@4.0.0: {}
3005 |
3006 | path-key@3.1.1: {}
3007 |
3008 | path-parse@1.0.7: {}
3009 |
3010 | path-type@4.0.0: {}
3011 |
3012 | picocolors@1.1.1: {}
3013 |
3014 | picomatch@2.3.1: {}
3015 |
3016 | possible-typed-array-names@1.1.0: {}
3017 |
3018 | postcss-media-query-parser@0.2.3: {}
3019 |
3020 | postcss-resolve-nested-selector@0.1.6: {}
3021 |
3022 | postcss-safe-parser@7.0.1(postcss@8.5.4):
3023 | dependencies:
3024 | postcss: 8.5.4
3025 |
3026 | postcss-scss@4.0.9(postcss@8.5.4):
3027 | dependencies:
3028 | postcss: 8.5.4
3029 |
3030 | postcss-selector-parser@7.1.0:
3031 | dependencies:
3032 | cssesc: 3.0.0
3033 | util-deprecate: 1.0.2
3034 |
3035 | postcss-value-parser@4.2.0: {}
3036 |
3037 | postcss@8.5.4:
3038 | dependencies:
3039 | nanoid: 3.3.11
3040 | picocolors: 1.1.1
3041 | source-map-js: 1.2.1
3042 |
3043 | prelude-ls@1.2.1: {}
3044 |
3045 | prettier-plugin-ember-template-tag@2.0.5(prettier@3.5.3):
3046 | dependencies:
3047 | '@babel/core': 7.27.4
3048 | content-tag: 3.1.3
3049 | prettier: 3.5.3
3050 | transitivePeerDependencies:
3051 | - supports-color
3052 |
3053 | prettier@3.5.3: {}
3054 |
3055 | proper-lockfile@4.1.2:
3056 | dependencies:
3057 | graceful-fs: 4.2.11
3058 | retry: 0.12.0
3059 | signal-exit: 3.0.7
3060 |
3061 | punycode@2.3.1: {}
3062 |
3063 | queue-microtask@1.2.3: {}
3064 |
3065 | reflect.getprototypeof@1.0.10:
3066 | dependencies:
3067 | call-bind: 1.0.8
3068 | define-properties: 1.2.1
3069 | es-abstract: 1.24.0
3070 | es-errors: 1.3.0
3071 | es-object-atoms: 1.1.1
3072 | get-intrinsic: 1.3.0
3073 | get-proto: 1.0.1
3074 | which-builtin-type: 1.2.1
3075 |
3076 | regexp.prototype.flags@1.5.4:
3077 | dependencies:
3078 | call-bind: 1.0.8
3079 | define-properties: 1.2.1
3080 | es-errors: 1.3.0
3081 | get-proto: 1.0.1
3082 | gopd: 1.2.0
3083 | set-function-name: 2.0.2
3084 |
3085 | require-from-string@2.0.2: {}
3086 |
3087 | requireindex@1.2.0: {}
3088 |
3089 | resolve-from@4.0.0: {}
3090 |
3091 | resolve-from@5.0.0: {}
3092 |
3093 | resolve@1.22.10:
3094 | dependencies:
3095 | is-core-module: 2.16.1
3096 | path-parse: 1.0.7
3097 | supports-preserve-symlinks-flag: 1.0.0
3098 |
3099 | retry@0.12.0: {}
3100 |
3101 | reusify@1.1.0: {}
3102 |
3103 | run-parallel@1.2.0:
3104 | dependencies:
3105 | queue-microtask: 1.2.3
3106 |
3107 | safe-array-concat@1.1.3:
3108 | dependencies:
3109 | call-bind: 1.0.8
3110 | call-bound: 1.0.4
3111 | get-intrinsic: 1.3.0
3112 | has-symbols: 1.1.0
3113 | isarray: 2.0.5
3114 |
3115 | safe-push-apply@1.0.0:
3116 | dependencies:
3117 | es-errors: 1.3.0
3118 | isarray: 2.0.5
3119 |
3120 | safe-regex-test@1.1.0:
3121 | dependencies:
3122 | call-bound: 1.0.4
3123 | es-errors: 1.3.0
3124 | is-regex: 1.2.1
3125 |
3126 | semver@6.3.1: {}
3127 |
3128 | set-function-length@1.2.2:
3129 | dependencies:
3130 | define-data-property: 1.1.4
3131 | es-errors: 1.3.0
3132 | function-bind: 1.1.2
3133 | get-intrinsic: 1.3.0
3134 | gopd: 1.2.0
3135 | has-property-descriptors: 1.0.2
3136 |
3137 | set-function-name@2.0.2:
3138 | dependencies:
3139 | define-data-property: 1.1.4
3140 | es-errors: 1.3.0
3141 | functions-have-names: 1.2.3
3142 | has-property-descriptors: 1.0.2
3143 |
3144 | set-proto@1.0.0:
3145 | dependencies:
3146 | dunder-proto: 1.0.1
3147 | es-errors: 1.3.0
3148 | es-object-atoms: 1.1.1
3149 |
3150 | shebang-command@2.0.0:
3151 | dependencies:
3152 | shebang-regex: 3.0.0
3153 |
3154 | shebang-regex@3.0.0: {}
3155 |
3156 | side-channel-list@1.0.0:
3157 | dependencies:
3158 | es-errors: 1.3.0
3159 | object-inspect: 1.13.4
3160 |
3161 | side-channel-map@1.0.1:
3162 | dependencies:
3163 | call-bound: 1.0.4
3164 | es-errors: 1.3.0
3165 | get-intrinsic: 1.3.0
3166 | object-inspect: 1.13.4
3167 |
3168 | side-channel-weakmap@1.0.2:
3169 | dependencies:
3170 | call-bound: 1.0.4
3171 | es-errors: 1.3.0
3172 | get-intrinsic: 1.3.0
3173 | object-inspect: 1.13.4
3174 | side-channel-map: 1.0.1
3175 |
3176 | side-channel@1.1.0:
3177 | dependencies:
3178 | es-errors: 1.3.0
3179 | object-inspect: 1.13.4
3180 | side-channel-list: 1.0.0
3181 | side-channel-map: 1.0.1
3182 | side-channel-weakmap: 1.0.2
3183 |
3184 | signal-exit@3.0.7: {}
3185 |
3186 | signal-exit@4.1.0: {}
3187 |
3188 | simple-html-tokenizer@0.5.11: {}
3189 |
3190 | slash@3.0.0: {}
3191 |
3192 | slice-ansi@4.0.0:
3193 | dependencies:
3194 | ansi-styles: 4.3.0
3195 | astral-regex: 2.0.0
3196 | is-fullwidth-code-point: 3.0.0
3197 |
3198 | snake-case@3.0.4:
3199 | dependencies:
3200 | dot-case: 3.0.4
3201 | tslib: 2.8.1
3202 |
3203 | source-map-js@1.2.1: {}
3204 |
3205 | stop-iteration-iterator@1.1.0:
3206 | dependencies:
3207 | es-errors: 1.3.0
3208 | internal-slot: 1.1.0
3209 |
3210 | string-width@4.2.3:
3211 | dependencies:
3212 | emoji-regex: 8.0.0
3213 | is-fullwidth-code-point: 3.0.0
3214 | strip-ansi: 6.0.1
3215 |
3216 | string.prototype.trim@1.2.10:
3217 | dependencies:
3218 | call-bind: 1.0.8
3219 | call-bound: 1.0.4
3220 | define-data-property: 1.1.4
3221 | define-properties: 1.2.1
3222 | es-abstract: 1.24.0
3223 | es-object-atoms: 1.1.1
3224 | has-property-descriptors: 1.0.2
3225 |
3226 | string.prototype.trimend@1.0.9:
3227 | dependencies:
3228 | call-bind: 1.0.8
3229 | call-bound: 1.0.4
3230 | define-properties: 1.2.1
3231 | es-object-atoms: 1.1.1
3232 |
3233 | string.prototype.trimstart@1.0.8:
3234 | dependencies:
3235 | call-bind: 1.0.8
3236 | define-properties: 1.2.1
3237 | es-object-atoms: 1.1.1
3238 |
3239 | strip-ansi@6.0.1:
3240 | dependencies:
3241 | ansi-regex: 5.0.1
3242 |
3243 | strip-bom@3.0.0: {}
3244 |
3245 | strip-json-comments@3.1.1: {}
3246 |
3247 | stylelint-config-recommended-scss@15.0.1(postcss@8.5.4)(stylelint@16.20.0(typescript@5.8.3)):
3248 | dependencies:
3249 | postcss-scss: 4.0.9(postcss@8.5.4)
3250 | stylelint: 16.20.0(typescript@5.8.3)
3251 | stylelint-config-recommended: 16.0.0(stylelint@16.20.0(typescript@5.8.3))
3252 | stylelint-scss: 6.12.0(stylelint@16.20.0(typescript@5.8.3))
3253 | optionalDependencies:
3254 | postcss: 8.5.4
3255 |
3256 | stylelint-config-recommended@16.0.0(stylelint@16.20.0(typescript@5.8.3)):
3257 | dependencies:
3258 | stylelint: 16.20.0(typescript@5.8.3)
3259 |
3260 | stylelint-config-standard-scss@15.0.1(postcss@8.5.4)(stylelint@16.20.0(typescript@5.8.3)):
3261 | dependencies:
3262 | stylelint: 16.20.0(typescript@5.8.3)
3263 | stylelint-config-recommended-scss: 15.0.1(postcss@8.5.4)(stylelint@16.20.0(typescript@5.8.3))
3264 | stylelint-config-standard: 38.0.0(stylelint@16.20.0(typescript@5.8.3))
3265 | optionalDependencies:
3266 | postcss: 8.5.4
3267 |
3268 | stylelint-config-standard@38.0.0(stylelint@16.20.0(typescript@5.8.3)):
3269 | dependencies:
3270 | stylelint: 16.20.0(typescript@5.8.3)
3271 | stylelint-config-recommended: 16.0.0(stylelint@16.20.0(typescript@5.8.3))
3272 |
3273 | stylelint-scss@6.12.0(stylelint@16.20.0(typescript@5.8.3)):
3274 | dependencies:
3275 | css-tree: 3.1.0
3276 | is-plain-object: 5.0.0
3277 | known-css-properties: 0.36.0
3278 | mdn-data: 2.21.0
3279 | postcss-media-query-parser: 0.2.3
3280 | postcss-resolve-nested-selector: 0.1.6
3281 | postcss-selector-parser: 7.1.0
3282 | postcss-value-parser: 4.2.0
3283 | stylelint: 16.20.0(typescript@5.8.3)
3284 |
3285 | stylelint@16.20.0(typescript@5.8.3):
3286 | dependencies:
3287 | '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
3288 | '@csstools/css-tokenizer': 3.0.4
3289 | '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
3290 | '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0)
3291 | '@dual-bundle/import-meta-resolve': 4.1.0
3292 | balanced-match: 2.0.0
3293 | colord: 2.9.3
3294 | cosmiconfig: 9.0.0(typescript@5.8.3)
3295 | css-functions-list: 3.2.3
3296 | css-tree: 3.1.0
3297 | debug: 4.4.1
3298 | fast-glob: 3.3.3
3299 | fastest-levenshtein: 1.0.16
3300 | file-entry-cache: 10.1.0
3301 | global-modules: 2.0.0
3302 | globby: 11.1.0
3303 | globjoin: 0.1.4
3304 | html-tags: 3.3.1
3305 | ignore: 7.0.5
3306 | imurmurhash: 0.1.4
3307 | is-plain-object: 5.0.0
3308 | known-css-properties: 0.36.0
3309 | mathml-tag-names: 2.1.3
3310 | meow: 13.2.0
3311 | micromatch: 4.0.8
3312 | normalize-path: 3.0.0
3313 | picocolors: 1.1.1
3314 | postcss: 8.5.4
3315 | postcss-resolve-nested-selector: 0.1.6
3316 | postcss-safe-parser: 7.0.1(postcss@8.5.4)
3317 | postcss-selector-parser: 7.1.0
3318 | postcss-value-parser: 4.2.0
3319 | resolve-from: 5.0.0
3320 | string-width: 4.2.3
3321 | supports-hyperlinks: 3.2.0
3322 | svg-tags: 1.0.0
3323 | table: 6.9.0
3324 | write-file-atomic: 5.0.1
3325 | transitivePeerDependencies:
3326 | - supports-color
3327 | - typescript
3328 |
3329 | supports-color@7.2.0:
3330 | dependencies:
3331 | has-flag: 4.0.0
3332 |
3333 | supports-hyperlinks@3.2.0:
3334 | dependencies:
3335 | has-flag: 4.0.0
3336 | supports-color: 7.2.0
3337 |
3338 | supports-preserve-symlinks-flag@1.0.0: {}
3339 |
3340 | svg-tags@1.0.0: {}
3341 |
3342 | table@6.9.0:
3343 | dependencies:
3344 | ajv: 8.17.1
3345 | lodash.truncate: 4.4.2
3346 | slice-ansi: 4.0.0
3347 | string-width: 4.2.3
3348 | strip-ansi: 6.0.1
3349 |
3350 | to-regex-range@5.0.1:
3351 | dependencies:
3352 | is-number: 7.0.0
3353 |
3354 | tsconfig-paths@3.15.0:
3355 | dependencies:
3356 | '@types/json5': 0.0.29
3357 | json5: 1.0.2
3358 | minimist: 1.2.8
3359 | strip-bom: 3.0.0
3360 |
3361 | tslib@2.8.1: {}
3362 |
3363 | type-check@0.4.0:
3364 | dependencies:
3365 | prelude-ls: 1.2.1
3366 |
3367 | typed-array-buffer@1.0.3:
3368 | dependencies:
3369 | call-bound: 1.0.4
3370 | es-errors: 1.3.0
3371 | is-typed-array: 1.1.15
3372 |
3373 | typed-array-byte-length@1.0.3:
3374 | dependencies:
3375 | call-bind: 1.0.8
3376 | for-each: 0.3.5
3377 | gopd: 1.2.0
3378 | has-proto: 1.2.0
3379 | is-typed-array: 1.1.15
3380 |
3381 | typed-array-byte-offset@1.0.4:
3382 | dependencies:
3383 | available-typed-arrays: 1.0.7
3384 | call-bind: 1.0.8
3385 | for-each: 0.3.5
3386 | gopd: 1.2.0
3387 | has-proto: 1.2.0
3388 | is-typed-array: 1.1.15
3389 | reflect.getprototypeof: 1.0.10
3390 |
3391 | typed-array-length@1.0.7:
3392 | dependencies:
3393 | call-bind: 1.0.8
3394 | for-each: 0.3.5
3395 | gopd: 1.2.0
3396 | is-typed-array: 1.1.15
3397 | possible-typed-array-names: 1.1.0
3398 | reflect.getprototypeof: 1.0.10
3399 |
3400 | typescript@5.8.3: {}
3401 |
3402 | unbox-primitive@1.1.0:
3403 | dependencies:
3404 | call-bound: 1.0.4
3405 | has-bigints: 1.1.0
3406 | has-symbols: 1.1.0
3407 | which-boxed-primitive: 1.1.1
3408 |
3409 | universalify@2.0.1: {}
3410 |
3411 | upath@2.0.1: {}
3412 |
3413 | update-browserslist-db@1.1.3(browserslist@4.25.0):
3414 | dependencies:
3415 | browserslist: 4.25.0
3416 | escalade: 3.2.0
3417 | picocolors: 1.1.1
3418 |
3419 | uri-js@4.4.1:
3420 | dependencies:
3421 | punycode: 2.3.1
3422 |
3423 | util-deprecate@1.0.2: {}
3424 |
3425 | which-boxed-primitive@1.1.1:
3426 | dependencies:
3427 | is-bigint: 1.1.0
3428 | is-boolean-object: 1.2.2
3429 | is-number-object: 1.1.1
3430 | is-string: 1.1.1
3431 | is-symbol: 1.1.1
3432 |
3433 | which-builtin-type@1.2.1:
3434 | dependencies:
3435 | call-bound: 1.0.4
3436 | function.prototype.name: 1.1.8
3437 | has-tostringtag: 1.0.2
3438 | is-async-function: 2.1.1
3439 | is-date-object: 1.1.0
3440 | is-finalizationregistry: 1.1.1
3441 | is-generator-function: 1.1.0
3442 | is-regex: 1.2.1
3443 | is-weakref: 1.1.1
3444 | isarray: 2.0.5
3445 | which-boxed-primitive: 1.1.1
3446 | which-collection: 1.0.2
3447 | which-typed-array: 1.1.19
3448 |
3449 | which-collection@1.0.2:
3450 | dependencies:
3451 | is-map: 2.0.3
3452 | is-set: 2.0.3
3453 | is-weakmap: 2.0.2
3454 | is-weakset: 2.0.4
3455 |
3456 | which-typed-array@1.1.19:
3457 | dependencies:
3458 | available-typed-arrays: 1.0.7
3459 | call-bind: 1.0.8
3460 | call-bound: 1.0.4
3461 | for-each: 0.3.5
3462 | get-proto: 1.0.1
3463 | gopd: 1.2.0
3464 | has-tostringtag: 1.0.2
3465 |
3466 | which@1.3.1:
3467 | dependencies:
3468 | isexe: 2.0.0
3469 |
3470 | which@2.0.2:
3471 | dependencies:
3472 | isexe: 2.0.0
3473 |
3474 | word-wrap@1.2.5: {}
3475 |
3476 | write-file-atomic@5.0.1:
3477 | dependencies:
3478 | imurmurhash: 0.1.4
3479 | signal-exit: 4.1.0
3480 |
3481 | yallist@3.1.1: {}
3482 |
3483 | yocto-queue@0.1.0: {}
3484 |
--------------------------------------------------------------------------------