From 5846d254f4f6018bb80eb6dce21d66415f72afcc Mon Sep 17 00:00:00 2001 From: kagan Date: Sun, 25 Aug 2024 21:25:00 +0900 Subject: [PATCH] feat: move files from the `playground` dir in the `markuplint` repo --- .eslintrc | 81 + .gitignore | 28 + .markuplintrc | 21 + .prettierrc.mjs | 15 + README.md | Bin 52 -> 433 bytes __mocks__/rule.ts | 2886 +++++++++ __mocks__/schema.ts | 329 + cspell.json | 6 + e2e/playground.spec.ts | 66 + index.html | 21 + netlify.toml | 6 + package.json | 70 + playwright.config.ts | 41 + public/favicon.svg | 1 + public/logo.svg | 1 + public/vscode.png | Bin 0 -> 113029 bytes src/App.tsx | 449 ++ src/assets/images/logo-horizontal.svg | 1 + src/components/CodeEditor.spec.tsx | 34 + src/components/CodeEditor.tsx | 91 + src/components/ConfigEditor.spec.tsx | 38 + src/components/ConfigEditor.tsx | 41 + src/components/ConfigForm.spec.tsx | 34 + src/components/ConfigForm.tsx | 133 + src/components/ConsoleOutput.spec.tsx | 20 + src/components/ConsoleOutput.tsx | 50 + src/components/DependencyPanel.spec.tsx | 43 + src/components/DependencyPanel.tsx | 69 + src/components/ExampleSelector.spec.tsx | 58 + src/components/ExampleSelector.tsx | 99 + src/components/FileTypeSelector.spec.tsx | 37 + src/components/FileTypeSelector.tsx | 40 + src/components/PresetsSelector.spec.tsx | 81 + src/components/PresetsSelector.tsx | 145 + src/components/ProblemsOutput.spec.tsx | 53 + src/components/ProblemsOutput.tsx | 78 + src/components/RuleConfig.spec.tsx | 43 + src/components/RuleConfig.tsx | 618 ++ src/components/RulesSelector.spec.tsx | 34 + src/components/RulesSelector.tsx | 94 + src/examples/.editorconfig | 3 + .../01-presets/01-recommended/.markuplintrc | 3 + .../files/01-presets/01-recommended/code.html | 53 + .../01-presets/01-recommended/metadata.json | 3 + .../02-recommended-static-html/.markuplintrc | 3 + .../02-recommended-static-html/code.html | 55 + .../02-recommended-static-html/metadata.json | 3 + src/examples/files/01-presets/metadata.json | 3 + .../02-besides-html/01-react/.markuplintrc | 9 + .../files/02-besides-html/01-react/code.jsx | 12 + .../02-besides-html/01-react/metadata.json | 3 + .../02-besides-html/02-vue/.markuplintrc | 9 + .../files/02-besides-html/02-vue/code.vue | 22 + .../02-besides-html/02-vue/metadata.json | 3 + .../02-besides-html/03-svelte/.markuplintrc | 9 + .../02-besides-html/03-svelte/code.svelte | 11 + .../02-besides-html/03-svelte/metadata.json | 3 + .../files/02-besides-html/metadata.json | 3 + .../03-usecases/01-style-rules/.markuplintrc | 12 + .../03-usecases/01-style-rules/code.html | 13 + .../03-usecases/01-style-rules/metadata.json | 3 + .../03-usecases/02-class-naming/.markuplintrc | 18 + .../03-usecases/02-class-naming/code.html | 7 + .../03-usecases/02-class-naming/metadata.json | 3 + .../03-image-file-naming/.markuplintrc | 36 + .../03-image-file-naming/code.html | 14 + .../03-image-file-naming/metadata.json | 3 + src/examples/files/03-usecases/metadata.json | 3 + src/examples/index.ts | 49 + src/index.css | 60 + src/main.tsx | 11 + src/modules/debounce.ts | 7 + src/modules/dist-tag.ts | 1 + src/modules/json-schema.ts | 161 + src/modules/json.ts | 43 + src/modules/monaco-editor.ts | 47 + src/modules/save-values.ts | 32 + src/modules/violations.ts | 27 + src/reset.d.ts | 1 + src/server/index.ts | 248 + src/server/linter/constants.json | 4 + src/server/linter/index.mjs | 84 + src/vite-env.d.ts | 2 + tailwind.config.js | 43 + tsconfig.json | 24 + tsconfig.node.json | 10 + tsconfig.test.json | 4 + vite.config.ts | 20 + vitest.config.ts | 11 + vitest.setup.tsx | 25 + yarn.lock | 5467 +++++++++++++++++ 91 files changed, 12658 insertions(+) create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 .markuplintrc create mode 100644 .prettierrc.mjs create mode 100644 __mocks__/rule.ts create mode 100644 __mocks__/schema.ts create mode 100644 cspell.json create mode 100644 e2e/playground.spec.ts create mode 100644 index.html create mode 100644 netlify.toml create mode 100644 package.json create mode 100644 playwright.config.ts create mode 100644 public/favicon.svg create mode 100644 public/logo.svg create mode 100644 public/vscode.png create mode 100644 src/App.tsx create mode 100644 src/assets/images/logo-horizontal.svg create mode 100644 src/components/CodeEditor.spec.tsx create mode 100644 src/components/CodeEditor.tsx create mode 100644 src/components/ConfigEditor.spec.tsx create mode 100644 src/components/ConfigEditor.tsx create mode 100644 src/components/ConfigForm.spec.tsx create mode 100644 src/components/ConfigForm.tsx create mode 100644 src/components/ConsoleOutput.spec.tsx create mode 100644 src/components/ConsoleOutput.tsx create mode 100644 src/components/DependencyPanel.spec.tsx create mode 100644 src/components/DependencyPanel.tsx create mode 100644 src/components/ExampleSelector.spec.tsx create mode 100644 src/components/ExampleSelector.tsx create mode 100644 src/components/FileTypeSelector.spec.tsx create mode 100644 src/components/FileTypeSelector.tsx create mode 100644 src/components/PresetsSelector.spec.tsx create mode 100644 src/components/PresetsSelector.tsx create mode 100644 src/components/ProblemsOutput.spec.tsx create mode 100644 src/components/ProblemsOutput.tsx create mode 100644 src/components/RuleConfig.spec.tsx create mode 100644 src/components/RuleConfig.tsx create mode 100644 src/components/RulesSelector.spec.tsx create mode 100644 src/components/RulesSelector.tsx create mode 100644 src/examples/.editorconfig create mode 100644 src/examples/files/01-presets/01-recommended/.markuplintrc create mode 100644 src/examples/files/01-presets/01-recommended/code.html create mode 100644 src/examples/files/01-presets/01-recommended/metadata.json create mode 100644 src/examples/files/01-presets/02-recommended-static-html/.markuplintrc create mode 100644 src/examples/files/01-presets/02-recommended-static-html/code.html create mode 100644 src/examples/files/01-presets/02-recommended-static-html/metadata.json create mode 100644 src/examples/files/01-presets/metadata.json create mode 100644 src/examples/files/02-besides-html/01-react/.markuplintrc create mode 100644 src/examples/files/02-besides-html/01-react/code.jsx create mode 100644 src/examples/files/02-besides-html/01-react/metadata.json create mode 100644 src/examples/files/02-besides-html/02-vue/.markuplintrc create mode 100644 src/examples/files/02-besides-html/02-vue/code.vue create mode 100644 src/examples/files/02-besides-html/02-vue/metadata.json create mode 100644 src/examples/files/02-besides-html/03-svelte/.markuplintrc create mode 100644 src/examples/files/02-besides-html/03-svelte/code.svelte create mode 100644 src/examples/files/02-besides-html/03-svelte/metadata.json create mode 100644 src/examples/files/02-besides-html/metadata.json create mode 100644 src/examples/files/03-usecases/01-style-rules/.markuplintrc create mode 100644 src/examples/files/03-usecases/01-style-rules/code.html create mode 100644 src/examples/files/03-usecases/01-style-rules/metadata.json create mode 100644 src/examples/files/03-usecases/02-class-naming/.markuplintrc create mode 100644 src/examples/files/03-usecases/02-class-naming/code.html create mode 100644 src/examples/files/03-usecases/02-class-naming/metadata.json create mode 100644 src/examples/files/03-usecases/03-image-file-naming/.markuplintrc create mode 100644 src/examples/files/03-usecases/03-image-file-naming/code.html create mode 100644 src/examples/files/03-usecases/03-image-file-naming/metadata.json create mode 100644 src/examples/files/03-usecases/metadata.json create mode 100644 src/examples/index.ts create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/modules/debounce.ts create mode 100644 src/modules/dist-tag.ts create mode 100644 src/modules/json-schema.ts create mode 100644 src/modules/json.ts create mode 100644 src/modules/monaco-editor.ts create mode 100644 src/modules/save-values.ts create mode 100644 src/modules/violations.ts create mode 100644 src/reset.d.ts create mode 100644 src/server/index.ts create mode 100644 src/server/linter/constants.json create mode 100644 src/server/linter/index.mjs create mode 100644 src/vite-env.d.ts create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 tsconfig.test.json create mode 100644 vite.config.ts create mode 100644 vitest.config.ts create mode 100644 vitest.setup.tsx create mode 100644 yarn.lock diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..e72b8b0 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,81 @@ +{ + "root": true, + "extends": [ + "@markuplint-dev/eslint-config", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "plugin:testing-library/react" + ], + "plugins": ["react", "react-hooks", "react-refresh", "testing-library", "vitest"], + "env": { + "browser": true + }, + "parserOptions": { + "ecmaFeatures": { + "jsx": true + } + }, + "settings": { + "react": { + "version": "detect" + }, + "import/resolver": { + "typescript": [] + } + }, + "rules": { + "@typescript-eslint/no-unused-vars": [2, { "argsIgnorePattern": "^_", "ignoreRestSiblings": true }], + "@typescript-eslint/prefer-readonly-parameter-types": [ + 1, + { + "allow": [ + { "from": "lib", "name": "URL" }, + { "from": "package", "package": "json-schema", "name": "JSONSchema7" }, + { "from": "package", "package": "json-schema", "name": "JSONSchema7Definition" } + ], + "checkParameterProperties": false, + "ignoreInferredTypes": true + } + ], + "react/display-name": 0, + "react/prop-types": 0, + "react-refresh/only-export-components": "warn" + }, + "globals": { + "React": true, + "JSX": true + }, + "overrides": [ + { + "files": ["./*.js"], + "rules": { + "@typescript-eslint/no-var-requires": 0 + } + }, + { + "files": ["./*.mjs"], + "rules": { + "import/no-named-as-default-member": 0 + } + }, + { + "files": ["./**/*.tsx"], + "rules": { + "unicorn/filename-case": 0 + } + }, + { + "files": ["./**/*.spec.ts", "./**/*.spec.tsx"], + "rules": { + "testing-library/prefer-user-event": 2, + "testing-library/no-manual-cleanup": 0 + } + }, + { + "files": ["./vitest.config.ts"], + "rules": { + "import/no-default-export": 0 + } + } + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8208276 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Playwright +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/.markuplintrc b/.markuplintrc new file mode 100644 index 0000000..c6b999d --- /dev/null +++ b/.markuplintrc @@ -0,0 +1,21 @@ +{ + "excludeFiles": ["./src/examples/**/*"], + "extends": ["markuplint:recommended-react"], + "parser": { + "\\.tsx$": "@markuplint/jsx-parser" + }, + "specs": { + "\\.tsx$": "@markuplint/react-spec" + }, + "rules": { + "heading-levels": false + }, + "nodeRules": [ + { + "selector": "option", + "rules": { + "permitted-contents": false + } + } + ] +} diff --git a/.prettierrc.mjs b/.prettierrc.mjs new file mode 100644 index 0000000..d4133d6 --- /dev/null +++ b/.prettierrc.mjs @@ -0,0 +1,15 @@ +import config from '../.prettierrc.mjs'; + +export default { + ...config, + plugins: ['prettier-plugin-tailwindcss'], + overrides: [ + { + files: ['./src/examples/files/**'], + options: { + tabWidth: 2, + useTabs: false, + }, + }, + ], +}; diff --git a/README.md b/README.md index b82bb8b4d2030c859058eea551050492d739ec88..91b4c81e68a051bda34815beb001b827f6daf164 100644 GIT binary patch literal 433 zcmZvYL2JV>42AFh6@pxvL*siGJ9W1W2JLMO;?-JW>exnh0*3wg$q8u~-BHr_o}^d7 zo1)tktZ@n6t;#+5$!Q@j148r@T@n2E{}3FWhLl2Vr3`mvGv56gjkA2N8zHI+PB^3W zVMLeM+(VBEVp5b)w?cGX7YDRfWJL~);|UksUD$;K1?;zZKt!669;7rm2z|@ss^-m? zLAhHjADIaIp}-X{3WiX_S7xUpe4JCZxMXp{(SIJc|KiqfjF*~6vM%_``SovZy8>ge gX*~5yI4i#g3_p-^z<4DS(s6}%@x!RBEvMJw7vnLPwEzGB literal 52 zcmezWPnki1A(tVMp@<=yp_HM3A%`K8A&;SiK^M$UWT<3F2g>CG", "<'-moz-appearance'>", "<'-moz-background-clip'>", '...more many types'], +}; + +const extendedType = { + type: 'string', + enum: [ + "<'color-profile'>", + "<'color-rendering'>", + "<'enable-background'>", + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + 'AbsoluteURL', + 'Accept', + 'Any', + 'AutoComplete', + 'BCP47', + 'BaseURL', + 'BrowsingContextName', + 'BrowsingContextNameOrKeyword', + 'CustomElementName', + 'DOMID', + 'DateTime', + 'FunctionBody', + 'HTTPSchemaURL', + 'HashName', + 'IconSize', + 'Int', + 'ItemProp', + 'MIMEType', + 'NavigableTargetName', + 'NavigableTargetNameOrKeyword', + 'NoEmptyAny', + 'Number', + 'OneCodePointChar', + 'OneLineAny', + 'Pattern', + 'SerializedPermissionsPolicy', + 'SourceSizeList', + 'Srcset', + 'TabIndex', + 'URL', + 'Uint', + 'XMLName', + 'Zero', + ], +}; + +const htmlAttrRequirement = { + type: 'string', + enum: ['Boolean'], +}; + +const keywordDefinedType = { + oneOf: [cssSyntax, extendedType, htmlAttrRequirement], +}; + +const list = { + description: + '- [Space-separated tokens](https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#space-separated-tokens)\n- [Comma-separated tokens](https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#comma-separated-tokens)', + type: 'object', + additionalProperties: false, + required: ['token', 'separator'], + properties: { + token: { + oneOf: [ + extendedType, + { + description: + '[Enumerated attributes](https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#enumerated-attribute)', + type: 'object', + additionalProperties: false, + required: ['enum'], + properties: { + enum: { + type: 'array', + minItems: 1, + uniqueItems: true, + items: { + type: 'string', + }, + }, + disallowToSurroundBySpaces: { + type: 'boolean', + }, + caseInsensitive: { + type: 'boolean', + }, + invalidValueDefault: { + type: 'string', + }, + missingValueDefault: { + type: 'string', + }, + sameStates: { + type: 'object', + additionalProperties: true, + patternProperties: { + '.*': { + type: 'array', + minItems: 1, + uniqueItems: true, + items: { + type: 'string', + }, + }, + }, + }, + }, + }, + ], + }, + disallowToSurroundBySpaces: { + type: 'boolean', + }, + allowEmpty: { + type: 'boolean', + }, + ordered: { + type: 'boolean', + }, + unique: { + type: 'boolean', + }, + caseInsensitive: { + type: 'boolean', + }, + number: { + oneOf: [ + { + type: 'string', + enum: ['zeroOrMore', 'oneOrMore'], + }, + { + type: 'object', + additionalProperties: false, + required: ['min', 'max'], + properties: { + min: { + type: 'number', + }, + max: { + type: 'number', + }, + }, + }, + ], + }, + separator: { + type: 'string', + enum: ['space', 'comma'], + }, + }, +}; + +const enumType = { + description: + '[Enumerated attributes](https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#enumerated-attribute)', + type: 'object', + additionalProperties: false, + required: ['enum'], + properties: { + enum: { + type: 'array', + minItems: 1, + uniqueItems: true, + items: { + type: 'string', + }, + }, + disallowToSurroundBySpaces: { + type: 'boolean', + }, + caseInsensitive: { + type: 'boolean', + }, + invalidValueDefault: { + type: 'string', + }, + missingValueDefault: { + type: 'string', + }, + sameStates: { + type: 'object', + additionalProperties: true, + patternProperties: { + '.*': { + type: 'array', + minItems: 1, + uniqueItems: true, + items: { + type: 'string', + }, + }, + }, + }, + }, +}; + +const numbers = { + description: '[Numbers](https://html.spec.whatwg.org/dev/common-microsyntaxes.html#numbers)', + type: 'object', + required: ['type'], + additionalProperties: false, + properties: { + type: { + type: 'string', + enum: ['float', 'integer'], + }, + gt: { + type: 'number', + }, + gte: { + type: 'number', + }, + lt: { + type: 'number', + }, + lte: { + type: 'number', + }, + clampable: { + type: 'boolean', + }, + }, +}; + +export const rules = { + oneOf: [ + { + type: 'object', + additionalProperties: false, + properties: { + 'attr-duplication': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'validation', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'attr-value-quotes': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'style', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'string', + enum: ['double', 'single'], + default: 'double', + _description: { + double: 'Warns if the attribute value is not quoted on double quotation mark.', + single: 'Warns if the attribute value is not quoted on single quotation mark.', + }, + '_description:ja': { + double: 'ダブルクオーテーションで囲われていない場合に警告をします。', + single: 'シングルクオーテーションで囲われていない場合に警告をします。', + }, + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'string', + enum: ['double', 'single'], + default: 'double', + _description: { + double: 'Warns if the attribute value is not quoted on double quotation mark.', + single: 'Warns if the attribute value is not quoted on single quotation mark.', + }, + '_description:ja': { + double: 'ダブルクオーテーションで囲われていない場合に警告をします。', + single: 'シングルクオーテーションで囲われていない場合に警告をします。', + }, + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'case-sensitive-attr-name': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'style', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'string', + default: 'lower', + enum: ['lower', 'upper'], + _description: { + lower: 'Warns that the attribute name is not in lowercase.', + upper: 'Warns that the attribute name is not in uppercase.', + }, + '_description:ja': { + lower: '属性名が小文字に統一されていないと警告します(外来要素は対象外)。', + upper: '属性名が小文字に統一されていないと警告します(外来要素は対象外)。', + }, + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'string', + default: 'lower', + enum: ['lower', 'upper'], + _description: { + lower: 'Warns that the attribute name is not in lowercase.', + upper: 'Warns that the attribute name is not in uppercase.', + }, + '_description:ja': { + lower: '属性名が小文字に統一されていないと警告します(外来要素は対象外)。', + upper: '属性名が小文字に統一されていないと警告します(外来要素は対象外)。', + }, + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'case-sensitive-tag-name': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'style', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'string', + default: 'lower', + enum: ['lower', 'upper'], + _description: { + lower: 'Warns that the tag name is not in lowercase.', + upper: 'Warns that the tag name is not in uppercase.', + }, + '_description:ja': { + lower: 'タグ名が小文字に統一されていないと警告します(外来要素は対象外)。', + upper: 'タグ名が小文字に統一されていないと警告します(外来要素は対象外)。', + }, + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'string', + default: 'lower', + enum: ['lower', 'upper'], + _description: { + lower: 'Warns that the tag name is not in lowercase.', + upper: 'Warns that the tag name is not in uppercase.', + }, + '_description:ja': { + lower: 'タグ名が小文字に統一されていないと警告します(外来要素は対象外)。', + upper: 'タグ名が小文字に統一されていないと警告します(外来要素は対象外)。', + }, + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'character-reference': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'style', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'class-naming': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'naming-convention', + oneOf: [ + { + type: 'boolean', + }, + { + oneOf: [ + { + type: 'string', + minLength: 1, + }, + { + type: 'array', + uniqueItems: true, + minItems: 1, + items: { + type: 'string', + minLength: 1, + }, + }, + ], + description: + 'Sets a string that represents a regular expression or its array. Regular expressions are interpreted as regular expressions by enclosing them in `/`. It is possible to add a flag like `/.*/ ig` (regular expressions can only be interpreted by JavaScript).', + 'description:ja': + '正規表現を表す文字列かその配列を設定します。正規表現は `/` で囲むことで正規表現として解釈されます。 `/.*/ig` のようにフラグをつけることも可能です(正規表現はJavaScriptで解釈できるもに限ります)。', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + oneOf: [ + { + type: 'string', + minLength: 1, + }, + { + type: 'array', + uniqueItems: true, + minItems: 1, + items: { + type: 'string', + minLength: 1, + }, + }, + ], + description: + 'Sets a string that represents a regular expression or its array. Regular expressions are interpreted as regular expressions by enclosing them in `/`. It is possible to add a flag like `/.*/ ig` (regular expressions can only be interpreted by JavaScript).', + 'description:ja': + '正規表現を表す文字列かその配列を設定します。正規表現は `/` で囲むことで正規表現として解釈されます。 `/.*/ig` のようにフラグをつけることも可能です(正規表現はJavaScriptで解釈できるもに限ります)。', + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'deprecated-attr': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'validation', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'deprecated-element': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'validation', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'disallowed-element': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'validation', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'array', + items: { + type: 'string', + }, + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'array', + items: { + type: 'string', + }, + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + doctype: { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'validation', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'string', + enum: ['always'], + default: 'always', + _description: { + always: "Warns when doesn't declare Doctype. Ignore when document is fragment.", + }, + '_description:ja': { + always: 'Doctype宣言が書かれていないと警告します(要素の断片は対象外)。', + }, + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'string', + enum: ['always'], + default: 'always', + _description: { + always: "Warns when doesn't declare Doctype. Ignore when document is fragment.", + }, + '_description:ja': { + always: 'Doctype宣言が書かれていないと警告します(要素の断片は対象外)。', + }, + }, + options: { + type: 'object', + additionalProperties: false, + properties: { + denyObsoleteType: { + type: 'boolean', + default: 'true', + description: 'Warns that the type is not ``.', + 'description:ja': '``以外のDoctypeだと警告します。', + }, + }, + }, + option: { + deprecated: true, + type: 'object', + additionalProperties: false, + properties: { + denyObsoleteType: { + type: 'boolean', + default: 'true', + description: 'Warns that the type is not ``.', + 'description:ja': '``以外のDoctypeだと警告します。', + }, + }, + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'id-duplication': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'validation', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'end-tag': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'style', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'ineffective-attr': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'style', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'invalid-attr': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'validation', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + options: { + type: 'object', + additionalProperties: false, + description: + '```ts\ntype Attr = {\n name: string;\n value: AttributeType | ValueRule;\n}\n\ntype ValueRule =\n | { enum: [string, ...string[]]; }\n | { pattern: string; }\n | { type: AttributeType; };\n```\n\n`AttributeType` is [The type API](/docs/api/types).', + 'description:ja': + '```ts\ntype Attr = {\n name: string;\n value: AttributeType | ValueRule;\n}\n\ntype ValueRule =\n | { enum: [string, ...string[]]; }\n | { pattern: string; }\n | { type: AttributeType; };\n```\n\n`AttributeType`は[タイプAPI](/docs/api/types)を参照してください。', + properties: { + allowAttrs: { + oneOf: [ + { + type: 'array', + items: { + oneOf: [ + { + type: 'string', + }, + { + type: 'object', + _type: 'Attr', + additionalProperties: false, + required: ['name', 'value'], + properties: { + name: { + type: 'string', + }, + value: { + oneOf: [ + { + type: 'object', + additionalProperties: false, + required: ['enum'], + properties: { + enum: { + type: 'array', + uniqueItems: true, + items: { + type: 'string', + minimum: 1, + }, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['pattern'], + properties: { + pattern: { + type: 'string', + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['type'], + properties: { + type: { + oneOf: [ + keywordDefinedType, + list, + enumType, + numbers, + ], + }, + }, + }, + { + oneOf: [ + keywordDefinedType, + list, + enumType, + numbers, + ], + }, + ], + }, + }, + }, + ], + }, + }, + { + type: 'object', + _type: 'Record', + additionalProperties: { + type: 'object', + oneOf: [ + { + $ref: '#/definitions/enum', + }, + { + $ref: '#/definitions/pattern', + }, + { + $ref: '#/definitions/type', + }, + ], + }, + }, + ], + description: + 'Specify the attributes **to allow**. This is useful when you want to intentionally specify attributes not present in the HTML Standard or when you want to avoid warnings for attributes required by frameworks. You can specify the attribute name only or provide patterns and data types for attribute values.', + 'description:ja': + '**許可する**属性を指定します。これは、HTML標準に存在しない属性をあえて指定したい場合や、フレームワークなどで必要な属性を警告されないようにするものです。属性名だけの指定もできますし、属性値に対してのパターンやデータ型の指定が可能です。', + }, + disallowAttrs: { + oneOf: [ + { + type: 'array', + items: { + oneOf: [ + { + type: 'string', + }, + { + type: 'object', + _type: 'Attr', + additionalProperties: false, + required: ['name', 'value'], + properties: { + name: { + type: 'string', + }, + value: { + oneOf: [ + { + type: 'object', + additionalProperties: false, + required: ['enum'], + properties: { + enum: { + type: 'array', + uniqueItems: true, + items: { + type: 'string', + minimum: 1, + }, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['pattern'], + properties: { + pattern: { + type: 'string', + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['type'], + properties: { + type: { + oneOf: [ + keywordDefinedType, + list, + enumType, + numbers, + ], + }, + }, + }, + { + oneOf: [ + keywordDefinedType, + list, + enumType, + numbers, + ], + }, + ], + }, + }, + }, + ], + }, + }, + { + type: 'object', + _type: 'Record', + additionalProperties: { + type: 'object', + oneOf: [ + { + $ref: '#/definitions/enum', + }, + { + $ref: '#/definitions/pattern', + }, + { + $ref: '#/definitions/type', + }, + ], + }, + }, + ], + description: + "Specify the attributes **to disallow**. Even if they are allowed in the HTML Standard, you can use this option to intentionally prohibit them based on your project's rules. The format for specifying disallowed attributes is the same as for `allowAttrs`, **but the meanings are reversed**.", + 'description:ja': + '**許可しない**属性を指定します。HTML標準で許可されていたとしても、あえてプロジェクトのルールで禁止するような場合に利用します。指定内容は`allowAttrs`と同じ形式を受け取りますが、**その意味はすべて逆になります**。', + }, + ignoreAttrNamePrefix: { + oneOf: [ + { + type: 'string', + }, + { + type: 'array', + uniqueItems: true, + minItems: 1, + items: { + type: 'string', + }, + }, + ], + description: + 'Set prefixes to exclude special attributes or directives for the library and template engine that do not exist in the HTML specifications.', + 'description:ja': + 'HTMLの仕様には存在しない、Viewライブラリやテンプレートエンジン固有の属性およびディレクティブを除外するために、プレフィックスを設定します。', + }, + allowToAddPropertiesForPretender: { + type: 'boolean', + default: 'true', + description: + 'Allow adding properties for a component that pretends to be an HTML native element. The default is `true`. It warns of finding a non-existence attribute if it is set `false` and you use the `pretenders` option.', + 'description:ja': + 'HTML要素に偽装しているコンポーネントのプロパティを追加できるようにします。デフォルトは`true`です。`pretenders`オプションを使用している場合に`false`に設定されていると、存在しない属性が見つかると警告します。', + }, + attrs: { + deprecated: true, + type: 'object', + additionalProperties: { + type: 'object', + oneOf: [ + { + $ref: '#/definitions/enum', + }, + { + $ref: '#/definitions/pattern', + }, + { + $ref: '#/definitions/type', + }, + { + type: 'object', + additionalProperties: false, + required: ['disallowed'], + properties: { + disallowed: { + type: 'boolean', + }, + }, + }, + ], + }, + description: + '[Deprecated (since v3.7.0): Use `allowAttrs` or `disallowAttrs` instead.] Setting custom rule. Set either `enum`, `pattern`, `type` or `disallowed`.', + 'description:ja': + '[非推奨(v3.7.0より): `allowAttrs`か`disallowAttrs`を利用してください] `enum` `pattern` `type` `disallowed` のいずれかで設定します。', + }, + }, + }, + option: { + deprecated: true, + type: 'object', + additionalProperties: false, + description: + '```ts\ntype Attr = {\n name: string;\n value: AttributeType | ValueRule;\n}\n\ntype ValueRule =\n | { enum: [string, ...string[]]; }\n | { pattern: string; }\n | { type: AttributeType; };\n```\n\n`AttributeType` is [The type API](/docs/api/types).', + 'description:ja': + '```ts\ntype Attr = {\n name: string;\n value: AttributeType | ValueRule;\n}\n\ntype ValueRule =\n | { enum: [string, ...string[]]; }\n | { pattern: string; }\n | { type: AttributeType; };\n```\n\n`AttributeType`は[タイプAPI](/docs/api/types)を参照してください。', + properties: { + allowAttrs: { + oneOf: [ + { + type: 'array', + items: { + oneOf: [ + { + type: 'string', + }, + { + type: 'object', + _type: 'Attr', + additionalProperties: false, + required: ['name', 'value'], + properties: { + name: { + type: 'string', + }, + value: { + oneOf: [ + { + type: 'object', + additionalProperties: false, + required: ['enum'], + properties: { + enum: { + type: 'array', + uniqueItems: true, + items: { + type: 'string', + minimum: 1, + }, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['pattern'], + properties: { + pattern: { + type: 'string', + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['type'], + properties: { + type: { + oneOf: [ + keywordDefinedType, + list, + enumType, + numbers, + ], + }, + }, + }, + { + oneOf: [ + keywordDefinedType, + list, + enumType, + numbers, + ], + }, + ], + }, + }, + }, + ], + }, + }, + { + type: 'object', + _type: 'Record', + additionalProperties: { + type: 'object', + oneOf: [ + { + $ref: '#/definitions/enum', + }, + { + $ref: '#/definitions/pattern', + }, + { + $ref: '#/definitions/type', + }, + ], + }, + }, + ], + description: + 'Specify the attributes **to allow**. This is useful when you want to intentionally specify attributes not present in the HTML Standard or when you want to avoid warnings for attributes required by frameworks. You can specify the attribute name only or provide patterns and data types for attribute values.', + 'description:ja': + '**許可する**属性を指定します。これは、HTML標準に存在しない属性をあえて指定したい場合や、フレームワークなどで必要な属性を警告されないようにするものです。属性名だけの指定もできますし、属性値に対してのパターンやデータ型の指定が可能です。', + }, + disallowAttrs: { + oneOf: [ + { + type: 'array', + items: { + oneOf: [ + { + type: 'string', + }, + { + type: 'object', + _type: 'Attr', + additionalProperties: false, + required: ['name', 'value'], + properties: { + name: { + type: 'string', + }, + value: { + oneOf: [ + { + type: 'object', + additionalProperties: false, + required: ['enum'], + properties: { + enum: { + type: 'array', + uniqueItems: true, + items: { + type: 'string', + minimum: 1, + }, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['pattern'], + properties: { + pattern: { + type: 'string', + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['type'], + properties: { + type: { + oneOf: [ + keywordDefinedType, + list, + enumType, + numbers, + ], + }, + }, + }, + { + oneOf: [ + keywordDefinedType, + list, + enumType, + numbers, + ], + }, + ], + }, + }, + }, + ], + }, + }, + { + type: 'object', + _type: 'Record', + additionalProperties: { + type: 'object', + oneOf: [ + { + $ref: '#/definitions/enum', + }, + { + $ref: '#/definitions/pattern', + }, + { + $ref: '#/definitions/type', + }, + ], + }, + }, + ], + description: + "Specify the attributes **to disallow**. Even if they are allowed in the HTML Standard, you can use this option to intentionally prohibit them based on your project's rules. The format for specifying disallowed attributes is the same as for `allowAttrs`, **but the meanings are reversed**.", + 'description:ja': + '**許可しない**属性を指定します。HTML標準で許可されていたとしても、あえてプロジェクトのルールで禁止するような場合に利用します。指定内容は`allowAttrs`と同じ形式を受け取りますが、**その意味はすべて逆になります**。', + }, + ignoreAttrNamePrefix: { + oneOf: [ + { + type: 'string', + }, + { + type: 'array', + uniqueItems: true, + minItems: 1, + items: { + type: 'string', + }, + }, + ], + description: + 'Set prefixes to exclude special attributes or directives for the library and template engine that do not exist in the HTML specifications.', + 'description:ja': + 'HTMLの仕様には存在しない、Viewライブラリやテンプレートエンジン固有の属性およびディレクティブを除外するために、プレフィックスを設定します。', + }, + allowToAddPropertiesForPretender: { + type: 'boolean', + default: 'true', + description: + 'Allow adding properties for a component that pretends to be an HTML native element. The default is `true`. It warns of finding a non-existence attribute if it is set `false` and you use the `pretenders` option.', + 'description:ja': + 'HTML要素に偽装しているコンポーネントのプロパティを追加できるようにします。デフォルトは`true`です。`pretenders`オプションを使用している場合に`false`に設定されていると、存在しない属性が見つかると警告します。', + }, + attrs: { + deprecated: true, + type: 'object', + additionalProperties: { + type: 'object', + oneOf: [ + { + $ref: '#/definitions/enum', + }, + { + $ref: '#/definitions/pattern', + }, + { + $ref: '#/definitions/type', + }, + { + type: 'object', + additionalProperties: false, + required: ['disallowed'], + properties: { + disallowed: { + type: 'boolean', + }, + }, + }, + ], + }, + description: + '[Deprecated (since v3.7.0): Use `allowAttrs` or `disallowAttrs` instead.] Setting custom rule. Set either `enum`, `pattern`, `type` or `disallowed`.', + 'description:ja': + '[非推奨(v3.7.0より): `allowAttrs`か`disallowAttrs`を利用してください] `enum` `pattern` `type` `disallowed` のいずれかで設定します。', + }, + }, + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'label-has-control': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'a11y', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'landmark-roles': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'a11y', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + options: { + type: 'object', + additionalProperties: false, + properties: { + ignoreRoles: { + type: 'array', + uniqueItems: true, + minItems: 1, + items: { + type: 'string', + enum: [ + 'banner', + 'main', + 'complementary', + 'contentinfo', + 'form', + 'navigation', + 'region', + ], + }, + default: '[]', + description: 'Excludes the specified landmark roll from the warning.', + 'description:ja': '指定したランドマークロールを警告の対象から除外します。', + }, + labelEachArea: { + type: 'boolean', + default: 'true', + description: + 'Warn if there is a unique label if a particular landmark role is used multiple times on the page.', + 'description:ja': + '特定のランドマークロールがページで複数回使用される場合、一意のラベルがあるか警告します。', + }, + }, + }, + option: { + deprecated: true, + type: 'object', + additionalProperties: false, + properties: { + ignoreRoles: { + type: 'array', + uniqueItems: true, + minItems: 1, + items: { + type: 'string', + enum: [ + 'banner', + 'main', + 'complementary', + 'contentinfo', + 'form', + 'navigation', + 'region', + ], + }, + default: '[]', + description: 'Excludes the specified landmark roll from the warning.', + 'description:ja': '指定したランドマークロールを警告の対象から除外します。', + }, + labelEachArea: { + type: 'boolean', + default: 'true', + description: + 'Warn if there is a unique label if a particular landmark role is used multiple times on the page.', + 'description:ja': + '特定のランドマークロールがページで複数回使用される場合、一意のラベルがあるか警告します。', + }, + }, + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'no-boolean-attr-value': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'style', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'no-default-value': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'style', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'no-empty-palpable-content': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'validation', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + options: { + type: 'object', + additionalProperties: false, + properties: { + extendsExposableElements: { + type: 'boolean', + default: 'true', + description: + "Include elements that are not palpable content, but are exposed to the accessibility tree. The palpable content model doesn't include some elements that are `li`, `dt`, `dd`, `th`, `td`, and more. This option exists to that detect those elements that are empty.", + 'description:ja': + 'アクセシビリティツリーに公開されているパルパブルコンテンツではない要素を含めます。パルパブルコンテンツモデルには、`li`、`dt`、`dd`、`th`、`td`などの一部の要素が含まれません。このオプションは、それらの要素が空であることを検出するために存在します。', + }, + ignoreIfAriaBusy: { + type: 'boolean', + default: 'true', + description: 'Avoid evaluating it if the element has `aria-busy=true`.', + 'description:ja': '要素に`aria-busy=true`がある場合は無視されます。', + }, + }, + }, + option: { + deprecated: true, + type: 'object', + additionalProperties: false, + properties: { + extendsExposableElements: { + type: 'boolean', + default: 'true', + description: + "Include elements that are not palpable content, but are exposed to the accessibility tree. The palpable content model doesn't include some elements that are `li`, `dt`, `dd`, `th`, `td`, and more. This option exists to that detect those elements that are empty.", + 'description:ja': + 'アクセシビリティツリーに公開されているパルパブルコンテンツではない要素を含めます。パルパブルコンテンツモデルには、`li`、`dt`、`dd`、`th`、`td`などの一部の要素が含まれません。このオプションは、それらの要素が空であることを検出するために存在します。', + }, + ignoreIfAriaBusy: { + type: 'boolean', + default: 'true', + description: 'Avoid evaluating it if the element has `aria-busy=true`.', + 'description:ja': '要素に`aria-busy=true`がある場合は無視されます。', + }, + }, + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'no-hard-code-id': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'maintainability', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'no-refer-to-non-existent-id': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'a11y', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + options: { + type: 'object', + additionalProperties: false, + properties: { + ariaVersion: { + type: 'string', + enum: ['1.1', '1.2'], + default: '1.2', + description: 'Choose the version of WAI-ARIA to evaluate.', + 'description:ja': '評価する WAI-ARIA のバージョンを指定します。', + }, + fragmentRefersNameAttr: { + type: 'boolean', + default: false, + description: + 'The fragment refers to IDs but also the value of name attributes.', + 'description:ja': + 'フラグメントの参照先をIDだけでなくname属性の値も含めます。', + }, + }, + }, + option: { + deprecated: true, + type: 'object', + additionalProperties: false, + properties: { + ariaVersion: { + type: 'string', + enum: ['1.1', '1.2'], + default: '1.2', + description: 'Choose the version of WAI-ARIA to evaluate.', + 'description:ja': '評価する WAI-ARIA のバージョンを指定します。', + }, + fragmentRefersNameAttr: { + type: 'boolean', + default: false, + description: + 'The fragment refers to IDs but also the value of name attributes.', + 'description:ja': + 'フラグメントの参照先をIDだけでなくname属性の値も含めます。', + }, + }, + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'no-use-event-handler-attr': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'maintainability', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + options: { + type: 'object', + additionalProperties: false, + properties: { + ignore: { + oneOf: [ + { + type: 'string', + }, + { + type: 'array', + items: { + type: 'string', + }, + }, + ], + description: + 'Specify the event handler to ignore as string or string array. It accepts even in a regex format.', + 'description:ja': + '除外するイベントハンドラを文字列か文字列の配列で指定します。正規表現形式も受け付けます。', + }, + }, + }, + option: { + deprecated: true, + type: 'object', + additionalProperties: false, + properties: { + ignore: { + oneOf: [ + { + type: 'string', + }, + { + type: 'array', + items: { + type: 'string', + }, + }, + ], + description: + 'Specify the event handler to ignore as string or string array. It accepts even in a regex format.', + 'description:ja': + '除外するイベントハンドラを文字列か文字列の配列で指定します。正規表現形式も受け付けます。', + }, + }, + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'permitted-contents': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'validation', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'array', + items: { + type: 'object', + additionalProperties: false, + required: ['tag', 'contents'], + properties: { + tag: { + type: 'string', + }, + contents: { + type: 'array', + items: { + oneOf: [ + { + type: 'object', + additionalProperties: false, + required: ['require'], + properties: { + require: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['optional'], + properties: { + optional: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + min: { + type: 'integer', + minimum: 0, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['oneOrMore'], + properties: { + oneOrMore: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + min: { + type: 'integer', + minimum: 0, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['choice'], + properties: { + choice: { + type: 'array', + items: { + oneOf: [ + { + type: 'object', + additionalProperties: false, + required: ['require'], + properties: { + require: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['optional'], + properties: { + optional: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + min: { + type: 'integer', + minimum: 0, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['oneOrMore'], + properties: { + oneOrMore: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + min: { + type: 'integer', + minimum: 0, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['choice'], + properties: { + choice: {}, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['interleave'], + properties: { + interleave: {}, + }, + }, + ], + }, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['interleave'], + properties: { + interleave: { + type: 'array', + items: { + oneOf: [ + { + type: 'object', + additionalProperties: false, + required: ['require'], + properties: { + require: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['optional'], + properties: { + optional: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + min: { + type: 'integer', + minimum: 0, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['oneOrMore'], + properties: { + oneOrMore: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + min: { + type: 'integer', + minimum: 0, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['choice'], + properties: { + choice: {}, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['interleave'], + properties: { + interleave: {}, + }, + }, + ], + }, + }, + }, + }, + ], + }, + }, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'array', + items: { + type: 'object', + additionalProperties: false, + required: ['tag', 'contents'], + properties: { + tag: { + type: 'string', + }, + contents: { + type: 'array', + items: { + oneOf: [ + { + type: 'object', + additionalProperties: false, + required: ['require'], + properties: { + require: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['optional'], + properties: { + optional: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + min: { + type: 'integer', + minimum: 0, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['oneOrMore'], + properties: { + oneOrMore: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + min: { + type: 'integer', + minimum: 0, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['choice'], + properties: { + choice: { + type: 'array', + items: { + oneOf: [ + { + type: 'object', + additionalProperties: false, + required: ['require'], + properties: { + require: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['optional'], + properties: { + optional: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + min: { + type: 'integer', + minimum: 0, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['oneOrMore'], + properties: { + oneOrMore: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + min: { + type: 'integer', + minimum: 0, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['choice'], + properties: { + choice: {}, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['interleave'], + properties: { + interleave: {}, + }, + }, + ], + }, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['interleave'], + properties: { + interleave: { + type: 'array', + items: { + oneOf: [ + { + type: 'object', + additionalProperties: false, + required: ['require'], + properties: { + require: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['optional'], + properties: { + optional: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + min: { + type: 'integer', + minimum: 0, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['oneOrMore'], + properties: { + oneOrMore: { + type: 'string', + }, + max: { + type: 'integer', + minimum: 1, + }, + min: { + type: 'integer', + minimum: 0, + }, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['choice'], + properties: { + choice: {}, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['interleave'], + properties: { + interleave: {}, + }, + }, + ], + }, + }, + }, + }, + ], + }, + }, + }, + }, + }, + options: { + type: 'object', + additionalProperties: false, + properties: { + ignoreHasMutableChildren: { + type: 'boolean', + default: 'true', + description: 'Ignore if it has mutable child elements in a dynamic syntax.', + 'description:ja': + '動的な構文などで、ミュータブルな子要素を持つ場合は無視します。', + }, + }, + }, + option: { + deprecated: true, + type: 'object', + additionalProperties: false, + properties: { + ignoreHasMutableChildren: { + type: 'boolean', + default: 'true', + description: 'Ignore if it has mutable child elements in a dynamic syntax.', + 'description:ja': + '動的な構文などで、ミュータブルな子要素を持つ場合は無視します。', + }, + }, + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'placeholder-label-option': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'validation', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'require-accessible-name': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'a11y', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + options: { + type: 'object', + additionalProperties: false, + properties: { + ariaVersion: { + type: 'string', + enum: ['1.1', '1.2'], + default: '1.2', + description: 'Choose the version of WAI-ARIA to evaluate.', + 'description:ja': '評価するWAI-ARIAのバージョンを指定します。', + }, + }, + }, + option: { + deprecated: true, + type: 'object', + additionalProperties: false, + properties: { + ariaVersion: { + type: 'string', + enum: ['1.1', '1.2'], + default: '1.2', + description: 'Choose the version of WAI-ARIA to evaluate.', + 'description:ja': '評価するWAI-ARIAのバージョンを指定します。', + }, + }, + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'require-datetime': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'validation', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + options: { + type: 'object', + additionalProperties: false, + properties: { + langs: { + type: 'array', + items: { + type: 'string', + enum: ['en', 'ja', 'fr', 'nl', 'ru', 'de', 'pt', 'zh'], + uniqueItems: true, + minItems: 1, + }, + default: ['en', 'ja', 'fr', 'nl', 'ru', 'de', 'pt', 'zh'], + description: + 'Specify languages that are parsing the content, and its order. They are parsable depending on [Chrono](https://github.com/wanasit/chrono).', + 'description:ja': + 'コンテンツを解析する言語、またその優先順位を指定します。解析可能かどうかは[Chrono](https://github.com/wanasit/chrono)次第です。', + }, + }, + }, + option: { + deprecated: true, + type: 'object', + additionalProperties: false, + properties: { + langs: { + type: 'array', + items: { + type: 'string', + enum: ['en', 'ja', 'fr', 'nl', 'ru', 'de', 'pt', 'zh'], + uniqueItems: true, + minItems: 1, + }, + default: ['en', 'ja', 'fr', 'nl', 'ru', 'de', 'pt', 'zh'], + description: + 'Specify languages that are parsing the content, and its order. They are parsable depending on [Chrono](https://github.com/wanasit/chrono).', + 'description:ja': + 'コンテンツを解析する言語、またその優先順位を指定します。解析可能かどうかは[Chrono](https://github.com/wanasit/chrono)次第です。', + }, + }, + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'required-attr': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'validation', + oneOf: [ + { + type: 'boolean', + }, + { + oneOf: [ + { + type: 'string', + }, + { + type: 'array', + minItems: 1, + items: { + oneOf: [ + { + type: 'string', + }, + { + type: 'object', + _type: 'Attr', + required: ['name'], + properties: { + name: { + type: 'string', + }, + value: { + oneOf: [ + { + type: 'string', + }, + { + type: 'array', + minItems: 1, + items: { + type: 'string', + }, + }, + ], + }, + }, + }, + ], + }, + }, + ], + description: '```ts\ntype Attr = {\n name: string;\n value?: string | string[];\n};\n```', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + oneOf: [ + { + type: 'string', + }, + { + type: 'array', + minItems: 1, + items: { + oneOf: [ + { + type: 'string', + }, + { + type: 'object', + _type: 'Attr', + required: ['name'], + properties: { + name: { + type: 'string', + }, + value: { + oneOf: [ + { + type: 'string', + }, + { + type: 'array', + minItems: 1, + items: { + type: 'string', + }, + }, + ], + }, + }, + }, + ], + }, + }, + ], + description: + '```ts\ntype Attr = {\n name: string;\n value?: string | string[];\n};\n```', + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'required-element': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'validation', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'array', + items: { + type: 'string', + }, + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'array', + items: { + type: 'string', + }, + }, + options: { + type: 'object', + additionalProperties: false, + properties: { + ignoreHasMutableContents: { + type: 'boolean', + default: 'true', + description: + 'Ignore if it has mutable child elements in a preprocessor language like _Pug_ or a component library like _Vue_. (If use _Pug_ or _Vue_ need each [@markuplint/pug-parser](https://github.com/markuplint/markuplint/tree/main/packages/%40markuplint/pug-parser) and [@markuplint/vue-parser](https://github.com/markuplint/markuplint/tree/main/packages/%40markuplint/vue-parser))', + 'description:ja': + '*Pug*のようなプリプロセッサ言語や*Vue*のようなコンポーネントライブラリにおけるミュータブルな子要素を含む場合、無視します。(*Pug*も、*Vue*も、それぞれ[@markuplint/pug-parser](https://github.com/markuplint/markuplint/tree/main/packages/%40markuplint/pug-parser)や[@markuplint/vue-parser](https://github.com/markuplint/markuplint/tree/main/packages/%40markuplint/vue-parser)が必要です)', + }, + }, + }, + option: { + deprecated: true, + type: 'object', + additionalProperties: false, + properties: { + ignoreHasMutableContents: { + type: 'boolean', + default: 'true', + description: + 'Ignore if it has mutable child elements in a preprocessor language like _Pug_ or a component library like _Vue_. (If use _Pug_ or _Vue_ need each [@markuplint/pug-parser](https://github.com/markuplint/markuplint/tree/main/packages/%40markuplint/pug-parser) and [@markuplint/vue-parser](https://github.com/markuplint/markuplint/tree/main/packages/%40markuplint/vue-parser))', + 'description:ja': + '*Pug*のようなプリプロセッサ言語や*Vue*のようなコンポーネントライブラリにおけるミュータブルな子要素を含む場合、無視します。(*Pug*も、*Vue*も、それぞれ[@markuplint/pug-parser](https://github.com/markuplint/markuplint/tree/main/packages/%40markuplint/pug-parser)や[@markuplint/vue-parser](https://github.com/markuplint/markuplint/tree/main/packages/%40markuplint/vue-parser)が必要です)', + }, + }, + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'required-h1': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'a11y', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + options: { + type: 'object', + additionalProperties: false, + properties: { + 'expected-once': { + type: 'boolean', + default: 'true', + description: 'Warn if there is a duplicate `h1` tag in the document.', + 'description:ja': 'ドキュメント内で `h1`タグに重複があると警告します。', + }, + 'in-document-fragment': { + type: 'boolean', + default: 'false', + description: + 'Set it to `true` if you want this rule to apply within document fragment rather than the entire document.', + 'description:ja': + 'ドキュメント全体ではなく、コードの断片内でこのルールを適用させたい場合、`true`にしてください。', + }, + }, + }, + option: { + deprecated: true, + type: 'object', + additionalProperties: false, + properties: { + 'expected-once': { + type: 'boolean', + default: 'true', + description: 'Warn if there is a duplicate `h1` tag in the document.', + 'description:ja': 'ドキュメント内で `h1`タグに重複があると警告します。', + }, + 'in-document-fragment': { + type: 'boolean', + default: 'false', + description: + 'Set it to `true` if you want this rule to apply within document fragment rather than the entire document.', + 'description:ja': + 'ドキュメント全体ではなく、コードの断片内でこのルールを適用させたい場合、`true`にしてください。', + }, + }, + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'use-list': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'a11y', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'array', + items: { + type: 'string', + minItems: 1, + }, + description: + 'Specify the characters of the bullet that you expect to interpret as a list. It expects an array of code points. Default value is [Bullets](https://github.com/markuplint/markuplint/blob/main/packages/%40markuplint/rules/src/use-list/index.ts#L11-L52).\n\nIt executes after decoding character references to be a code point. For example, it decodes `"•"` to be `"•"`. **Note: You must specify a code point instead of the character reference you need.** It supports the surrogate pair code points.', + 'description:ja': + 'リストとして解釈されることを期待するビュレット文字などを指定します。コードポイントで構成される配列を指定します。デフォルト値は[Bullets](https://github.com/markuplint/markuplint/blob/main/packages/%40markuplint/rules/src/use-list/index.ts#L11-L52)です。HTML中の文字参照はコードポイントにデコードされた後、評価されます。たとえば、`"&bullet;"`は`"•"`にデコードされます。 **注: 設定側では、期待する文字参照は代わりにコードポイントを指定する必要があります。** コードポイントはサロゲートペアをサポートしています。', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'array', + items: { + type: 'string', + minItems: 1, + }, + description: + 'Specify the characters of the bullet that you expect to interpret as a list. It expects an array of code points. Default value is [Bullets](https://github.com/markuplint/markuplint/blob/main/packages/%40markuplint/rules/src/use-list/index.ts#L11-L52).\n\nIt executes after decoding character references to be a code point. For example, it decodes `"•"` to be `"•"`. **Note: You must specify a code point instead of the character reference you need.** It supports the surrogate pair code points.', + 'description:ja': + 'リストとして解釈されることを期待するビュレット文字などを指定します。コードポイントで構成される配列を指定します。デフォルト値は[Bullets](https://github.com/markuplint/markuplint/blob/main/packages/%40markuplint/rules/src/use-list/index.ts#L11-L52)です。HTML中の文字参照はコードポイントにデコードされた後、評価されます。たとえば、`"&bullet;"`は`"•"`にデコードされます。 **注: 設定側では、期待する文字参照は代わりにコードポイントを指定する必要があります。** コードポイントはサロゲートペアをサポートしています。', + }, + options: { + type: 'object', + additionalProperties: false, + properties: { + spaceNeededBullets: { + type: 'array', + items: { + type: 'string', + minItems: 1, + }, + default: '["-", "*", "+"]', + description: 'Bullets that require space to detect as a list item.', + 'description:ja': 'リストとして検出するためにスペースを必要とする文字。', + }, + }, + }, + option: { + deprecated: true, + type: 'object', + additionalProperties: false, + properties: { + spaceNeededBullets: { + type: 'array', + items: { + type: 'string', + minItems: 1, + }, + default: '["-", "*", "+"]', + description: 'Bullets that require space to detect as a list item.', + 'description:ja': 'リストとして検出するためにスペースを必要とする文字。', + }, + }, + }, + severity: { + default: 'warning', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + 'wai-aria': { + $schema: 'http://json-schema.org/draft-07/schema#', + _category: 'a11y', + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + type: 'boolean', + }, + options: { + type: 'object', + additionalProperties: false, + properties: { + checkingValue: { + type: 'boolean', + default: 'true', + description: + "Warn if use an invalid value of the property/state. You can temporarily disable this option if the WAI-ARIA spec update rather than markuplint add new value to the allowed list ahead. Don't recommend disabling basically.", + 'description:ja': + 'プロパティ/ステートの値をチェックします。このオプションは、Markuplintが許可リストに追加するよりも先にWAI-ARIAの仕様が更新された場合などに、必要に応じて一時的に無効化できるようにしています。基本的に無効化を推奨しません。', + }, + checkingDeprecatedProps: { + type: 'boolean', + default: 'true', + description: + "Warn if use deprecated property/state. You can temporarily disable this not to evaluate WAI-ARIA old version. Don't recommend disabling basically.", + 'description:ja': + '非推奨(廃止予定)のプロパティ/ステートの値をチェックします。WAI-ARIAの古いバージョンのためにこの評価を無効化できます。基本的に無効化を推奨しません。', + }, + permittedAriaRoles: { + type: 'boolean', + default: 'true', + description: + 'Warn if use the not permitted role according to ARIA in HTML. This is based on the spec ARIA in HTML and is not strictly the spec WAI-ARIA, so it is an option.', + 'description:ja': + 'ARIA in HTMLの仕様において要素に許可されているロールかチェックします。ARIA in HTMLによるもので厳密にはWAI-ARIAの仕様ではないためオプションとしています。', + }, + disallowSetImplicitRole: { + type: 'boolean', + default: 'true', + description: + 'Disallow set the implicit role explicitly. This is based on the spec ARIA in HTML and is not strictly the spec WAI-ARIA, so it is an option.', + 'description:ja': + '暗黙的なロールの明示的な設定を禁止します。ARIA in HTMLによるもので厳密にはWAI-ARIAの仕様ではないためオプションとしています。', + }, + disallowSetImplicitProps: { + type: 'boolean', + default: 'true', + description: + 'Disallow set the implicit property/state explicitly. This is based on the spec ARIA in HTML and is not strictly the spec WAI-ARIA, so it is an option.', + 'description:ja': + '暗黙的なプロパティ/ステートの明示的な設定を禁止します。ARIA in HTMLによるもので厳密にはWAI-ARIAの仕様ではないためオプションとしています。', + }, + disallowDefaultValue: { + type: 'boolean', + default: 'true', + description: + 'Disallow set the default value of the property/state explicitly.', + 'description:ja': + 'プロパティ/ステートのデフォルト値の明示的な設定を禁止します。', + }, + version: { + type: 'string', + enum: ['1.1', '1.2'], + default: '1.2', + description: 'Choose the version of WAI-ARIA to evaluate.', + 'description:ja': '評価するWAI-ARIAのバージョンを指定します。', + }, + }, + }, + option: { + deprecated: true, + type: 'object', + additionalProperties: false, + properties: { + checkingValue: { + type: 'boolean', + default: 'true', + description: + "Warn if use an invalid value of the property/state. You can temporarily disable this option if the WAI-ARIA spec update rather than markuplint add new value to the allowed list ahead. Don't recommend disabling basically.", + 'description:ja': + 'プロパティ/ステートの値をチェックします。このオプションは、Markuplintが許可リストに追加するよりも先にWAI-ARIAの仕様が更新された場合などに、必要に応じて一時的に無効化できるようにしています。基本的に無効化を推奨しません。', + }, + checkingDeprecatedProps: { + type: 'boolean', + default: 'true', + description: + "Warn if use deprecated property/state. You can temporarily disable this not to evaluate WAI-ARIA old version. Don't recommend disabling basically.", + 'description:ja': + '非推奨(廃止予定)のプロパティ/ステートの値をチェックします。WAI-ARIAの古いバージョンのためにこの評価を無効化できます。基本的に無効化を推奨しません。', + }, + permittedAriaRoles: { + type: 'boolean', + default: 'true', + description: + 'Warn if use the not permitted role according to ARIA in HTML. This is based on the spec ARIA in HTML and is not strictly the spec WAI-ARIA, so it is an option.', + 'description:ja': + 'ARIA in HTMLの仕様において要素に許可されているロールかチェックします。ARIA in HTMLによるもので厳密にはWAI-ARIAの仕様ではないためオプションとしています。', + }, + disallowSetImplicitRole: { + type: 'boolean', + default: 'true', + description: + 'Disallow set the implicit role explicitly. This is based on the spec ARIA in HTML and is not strictly the spec WAI-ARIA, so it is an option.', + 'description:ja': + '暗黙的なロールの明示的な設定を禁止します。ARIA in HTMLによるもので厳密にはWAI-ARIAの仕様ではないためオプションとしています。', + }, + disallowSetImplicitProps: { + type: 'boolean', + default: 'true', + description: + 'Disallow set the implicit property/state explicitly. This is based on the spec ARIA in HTML and is not strictly the spec WAI-ARIA, so it is an option.', + 'description:ja': + '暗黙的なプロパティ/ステートの明示的な設定を禁止します。ARIA in HTMLによるもので厳密にはWAI-ARIAの仕様ではないためオプションとしています。', + }, + disallowDefaultValue: { + type: 'boolean', + default: 'true', + description: + 'Disallow set the default value of the property/state explicitly.', + 'description:ja': + 'プロパティ/ステートのデフォルト値の明示的な設定を禁止します。', + }, + version: { + type: 'string', + enum: ['1.1', '1.2'], + default: '1.2', + description: 'Choose the version of WAI-ARIA to evaluate.', + 'description:ja': '評価するWAI-ARIAのバージョンを指定します。', + }, + }, + }, + severity: { + default: 'error', + type: 'string', + enum: ['error', 'warning'], + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + }, + }, + { + title: 'Custom rule', + description: '@see https://markuplint.dev/docs/guides/applying-rules#applying-custom-rules', + examples: ['[plugin-name]/[rule-name]'], + type: 'object', + additionalProperties: false, + patternProperties: { + '^[^/]+/[^/]+$': { + oneOf: [ + { + $ref: '#/definitions/custom-rule-value', + }, + { + type: 'object', + additionalProperties: false, + properties: { + value: { + $ref: '#/definitions/custom-rule-value', + }, + severity: { + $ref: 'https://raw.githubusercontent.com/markuplint/markuplint/main/packages/%40markuplint/ml-config/schema.json#/definitions/severity', + }, + reason: { + type: 'string', + }, + }, + }, + ], + }, + }, + }, + ], +}; diff --git a/__mocks__/schema.ts b/__mocks__/schema.ts new file mode 100644 index 0000000..fdea08c --- /dev/null +++ b/__mocks__/schema.ts @@ -0,0 +1,329 @@ +import { rules } from './rule'; + +export const schema = { + $schema: 'http://json-schema.org/draft-07/schema#', + type: 'object', + additionalProperties: false, + properties: { + extends: { + type: 'array', + items: { + type: 'string', + }, + }, + plugins: { + type: 'array', + items: { + oneOf: [ + { + type: 'string', + }, + { + type: 'object', + required: ['name'], + additionalProperties: false, + properties: { + name: { + type: 'string', + }, + settings: { + type: 'object', + }, + }, + }, + ], + }, + }, + parser: { + type: 'object', + additionalProperties: { + type: 'string', + }, + }, + parserOptions: { + type: 'object', + additionalProperties: false, + properties: { + ignoreFrontMatter: { + type: 'boolean', + }, + authoredElementName: { + oneOf: [ + { + type: 'array', + items: { + type: 'string', + }, + }, + { + type: 'string', + }, + ], + }, + }, + }, + excludeFiles: { + type: 'array', + items: { + type: 'string', + }, + }, + specs: { + oneOf: [ + { + type: 'object', + additionalProperties: { + type: 'string', + }, + }, + { + description: 'This format is deprecated', + type: 'array', + items: { + type: 'string', + }, + }, + ], + }, + rules: rules, + nodeRules: { + type: 'array', + items: { + oneOf: [ + { + type: 'object', + additionalProperties: false, + required: ['selector', 'rules'], + properties: { + selector: { + type: 'string', + }, + rules: rules, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['regexSelector', 'rules'], + properties: { + regexSelector: { + allOf: [ + { + $ref: '#/definitions/regexSelectorWithoutCombination', + }, + { + type: 'object', + properties: { + combination: { + allOf: [ + { + type: 'object', + required: ['combinator'], + properties: { + combinator: { + $ref: '#/definitions/regexSelectorCombinator', + }, + }, + }, + { + $ref: '#/definitions/regexSelector', + }, + ], + }, + }, + }, + ], + }, + rules: rules, + }, + }, + ], + }, + }, + childNodeRules: { + type: 'array', + items: { + oneOf: [ + { + type: 'object', + additionalProperties: false, + required: ['selector', 'rules'], + properties: { + selector: { + type: 'string', + }, + inheritance: { + type: 'boolean', + }, + rules: rules, + }, + }, + { + type: 'object', + additionalProperties: false, + required: ['regexSelector', 'rules'], + properties: { + regexSelector: { + allOf: [ + { + $ref: '#/definitions/regexSelectorWithoutCombination', + }, + { + type: 'object', + properties: { + combination: { + allOf: [ + { + type: 'object', + required: ['combinator'], + properties: { + combinator: { + $ref: '#/definitions/regexSelectorCombinator', + }, + }, + }, + { + $ref: '#/definitions/regexSelector', + }, + ], + }, + }, + }, + ], + }, + inheritance: { + type: 'boolean', + }, + rules: rules, + }, + }, + ], + }, + }, + pretenders: { + type: 'array', + items: { + type: 'object', + additionalProperties: false, + required: ['selector', 'as'], + properties: { + selector: { + type: 'string', + }, + as: { + oneOf: [ + { + type: 'string', + }, + { + type: 'object', + additionalProperties: false, + required: ['element'], + properties: { + element: { + type: 'string', + }, + namespace: { + type: 'string', + enum: ['svg'], + }, + attrs: { + type: 'array', + items: { + type: 'object', + additionalProperties: false, + required: ['name'], + properties: { + name: { + type: 'string', + }, + value: { + oneOf: [ + { + type: 'string', + }, + { + type: 'object', + additionalProperties: false, + required: ['fromAttr'], + properties: { + fromAttr: { + type: 'string', + }, + }, + }, + ], + }, + }, + }, + }, + aria: { + type: 'object', + additionalProperties: false, + required: ['name'], + properties: { + name: { + type: 'string', + }, + value: { + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + required: ['fromAttr'], + properties: { + fromAttr: { + type: 'string', + }, + }, + }, + ], + }, + }, + }, + }, + }, + ], + }, + }, + }, + }, + overrides: { + type: 'object', + minProperties: 1, + additionalProperties: { + type: 'object', + additionalProperties: false, + properties: { + plugins: { + $ref: '#/definitions/plugins', + }, + parser: { + $ref: '#/definitions/parser', + }, + parserOptions: { + $ref: '#/definitions/parserOptions', + }, + excludeFiles: { + $ref: '#/definitions/excludeFiles', + }, + specs: { + $ref: '#/definitions/specs', + }, + rules: { + $ref: '#/definitions/rules', + }, + nodeRules: { + $ref: '#/definitions/nodeRules', + }, + childNodeRules: { + $ref: '#/definitions/childNodeRules', + }, + }, + }, + }, + }, +}; diff --git a/cspell.json b/cspell.json new file mode 100644 index 0000000..d564c9e --- /dev/null +++ b/cspell.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json", + "version": "0.2", + "import": ["../cspell.json"], + "words": ["shiki", "shikijs"] +} diff --git a/e2e/playground.spec.ts b/e2e/playground.spec.ts new file mode 100644 index 0000000..c47c912 --- /dev/null +++ b/e2e/playground.spec.ts @@ -0,0 +1,66 @@ +import { test, expect, Page } from '@playwright/test'; + +test.setTimeout(2 * 60 * 1000); +const TIMEOUT_FOR_INSTALL = 60 * 1000; +const TIMEOUT_FOR_LOAD_SCHEMA = 60 * 1000; + +const getPanels = async (page: Page) => { + const codePanel = page.getByRole('region', { name: /Code/ }); + const codeEditor = codePanel.getByRole('textbox', { name: /Editor content/ }); + const configPanel = page.getByRole('region', { name: /Config/ }); + const problemsPanel = page.getByRole('region', { name: /Problems/ }); + return { codeEditor, configPanel, problemsPanel }; +}; + +test.describe('Playground', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/'); + }); + + test('Initial load', async ({ page }) => { + const problemsPanel = page.getByRole('region', { name: /Problems/ }); + await expect(problemsPanel).toBeVisible(); + await expect(problemsPanel.getByRole('list')).toBeVisible({ timeout: TIMEOUT_FOR_INSTALL }); + }); + + test('No problems', async ({ page }) => { + const { codeEditor, problemsPanel } = await getPanels(page); + // Delete all content + await codeEditor.press('ControlOrMeta+a'); + await codeEditor.press('Delete'); + + await expect(problemsPanel).toContainText('No problems found.', { timeout: TIMEOUT_FOR_INSTALL }); + }); + + test('Select an example', async ({ page }) => { + const { problemsPanel, configPanel, codeEditor } = await getPanels(page); + const initialCode = await codeEditor.inputValue(); + await page.getByRole('button', { name: /Examples/ }).click(); + await page.getByRole('button', { name: /React/ }).click(); + await expect(configPanel).toBeVisible(); + await configPanel.getByRole('tab', { name: /Visual/ }).click(); + await expect(codeEditor).not.toHaveValue(initialCode); + await expect(configPanel.getByRole('combobox', { name: 'Code file type:' })).toHaveValue('.jsx'); + await expect(configPanel.getByRole('checkbox', { name: 'markuplint:recommended-react' })).toBeChecked(); + await expect(problemsPanel.getByRole('list')).toBeVisible({ timeout: TIMEOUT_FOR_INSTALL }); + }); + + test('Change config via visual editor', async ({ page }) => { + const { codeEditor, configPanel, problemsPanel } = await getPanels(page); + + await codeEditor.press('ControlOrMeta+a'); + await codeEditor.press('Delete'); + await codeEditor.fill('
'); + await configPanel.getByRole('tab', { name: 'Visual' }).click(); + await configPanel.getByRole('checkbox', { name: 'markuplint:recommended', exact: true }).uncheck(); + await configPanel + .getByRole('combobox', { name: 'attr-duplication' }) + .selectOption('true', { timeout: TIMEOUT_FOR_LOAD_SCHEMA }); + + await configPanel.getByRole('tab', { name: 'JSON' }).click(); + const configEditor = configPanel.getByRole('textbox', { name: /Editor content/ }); + const configValue = (await configEditor.inputValue()).replace(/\s|\n/g, ''); // ignore the whitespacess + expect(configValue).toMatch('{"rules":{"attr-duplication":true}}'); + await expect(problemsPanel.getByRole('list')).toBeVisible({ timeout: TIMEOUT_FOR_INSTALL }); + }); +}); diff --git a/index.html b/index.html new file mode 100644 index 0000000..dc40e41 --- /dev/null +++ b/index.html @@ -0,0 +1,21 @@ + + + + + + + Markuplint Playground + + + + + + + +
+ + + diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 0000000..3667ff1 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,6 @@ +# https://webcontainers.io/guides/configuring-headers#netlify +[[headers]] + for = "/*" + [headers.values] + Cross-Origin-Embedder-Policy = "require-corp" + Cross-Origin-Opener-Policy = "same-origin" \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..6bf1c90 --- /dev/null +++ b/package.json @@ -0,0 +1,70 @@ +{ + "name": "@markuplint/playground", + "version": "4.0.0-alpha.6", + "private": true, + "type": "module", + "scripts": { + "pg:dev": "vite", + "pg:build": "tsc && vite build", + "pg:lint": "run-s pg:lint:eslint pg:lint:markuplint pg:lint:prettier pg:lint:cspell", + "pg:lint:eslint": "eslint src --ext ts,tsx", + "pg:lint:markuplint": "markuplint 'src/**/*.tsx'", + "pg:lint:prettier": "prettier --check 'src/**/*.{js,ts,tsx}'", + "pg:lint:cspell": "cspell '**' --no-progress", + "pg:test": "vitest run", + "pg:preview": "vite preview", + "pg:up": "yarn upgrade-interactive --latest" + }, + "dependencies": { + "@headlessui/react": "^2.1.2", + "@markuplint/parser-utils": "4.6.5", + "@monaco-editor/react": "4.6.0", + "@shikijs/monaco": "^1.12.0", + "@webcontainer/api": "1.3.0-internal.2", + "lz-string": "1.5.0", + "markuplint": "4.9.2", + "monaco-editor": "0.50.0", + "react": "18.3.1", + "react-dom": "18.3.1", + "react-split": "2.0.14", + "semver": "7.6.3", + "shiki": "^1.12.0", + "strip-json-comments": "5.0.1", + "xterm": "5.3.0" + }, + "devDependencies": { + "@egoist/tailwindcss-icons": "1.8.1", + "@iconify-json/heroicons-solid": "1.1.12", + "@iconify-json/majesticons": "1.1.12", + "@markuplint/jsx-parser": "4.7.5", + "@markuplint/react-spec": "4.5.5", + "@playwright/test": "1.46.0", + "@testing-library/dom": "10.4.0", + "@testing-library/jest-dom": "6.4.8", + "@testing-library/react": "16.0.0", + "@testing-library/user-event": "14.5.2", + "@total-typescript/ts-reset": "0.5.1", + "@types/json-schema": "7.0.15", + "@types/react": "18.3.3", + "@types/react-dom": "18.3.0", + "@types/semver": "7.5.8", + "@vitejs/plugin-react": "4.3.1", + "autoprefixer": "10.4.20", + "cspell": "8.13.3", + "eslint": "9.9.0", + "eslint-plugin-react": "7.35.0", + "eslint-plugin-react-hooks": "4.6.2", + "eslint-plugin-react-refresh": "0.4.9", + "eslint-plugin-testing-library": "6.3.0", + "eslint-plugin-vitest": "0.5.4", + "jsdom": "24.1.1", + "npm-run-all2": "6.2.2", + "postcss": "8.4.41", + "prettier": "3.3.3", + "prettier-plugin-tailwindcss": "0.6.6", + "tailwindcss": "3.4.9", + "typescript": "5.5.4", + "vite": "5.4.0", + "vitest": "2.0.5" + } +} diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..3102a77 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,41 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './e2e', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: 'http://localhost:5173', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'yarn run pg:dev', + url: 'http://localhost:5173', + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..bdbc1ea --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..25d8bfc --- /dev/null +++ b/public/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/vscode.png b/public/vscode.png new file mode 100644 index 0000000000000000000000000000000000000000..6b367a8fd937bd9554636dec1ccc7d9a16e5fdff GIT binary patch literal 113029 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

^@=oGmKmBXIPg>db@&AlU4u75E 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�$_wT8F$7wa|rhJu#NX^G& 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

=|V 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 +const areSetsEqual = (set1: StringSet, set2: StringSet) => { + if (set1.size !== set2.size) return false; + return [...set1].every(item => set2.has(item)); +}; + +export function App() { + const consoleRef = useRef(null); + const [code, setCode] = useState(initialCode); + const [fileType, setFileType] = useState(initialCodeFileType); + const filename = `index${fileType}`; + const [configString, setConfigString] = useState(initialConfig); + const parsedConfig: Config = useMemo(() => parseJsonc(configString) ?? {}, [configString]); + const handleChangeConfig = useCallback((config: Config) => { + setConfigString(JSON.stringify(config, null, 2)); + }, []); + const [depsPackages, setDepsPackages] = useState(new Set(['markuplint'])); + const [distTag, setDistTag] = useState('latest'); + const [violations, setViolations] = useState(null); + const [lintTrigger, setLintTrigger] = useState(0); + const [installedPackages, setInstalledPackages] = useState>>({}); + const [depsStatus, setDepsStatus] = useState<'success' | 'error' | 'loading' | null>(null); + const [status, setStatus] = useState< + | 'not-started' + | 'deps-installing' + | 'deps-error' + | 'config-updating' + | 'config-error' + | 'lint-skipped' + | 'lint-checked' + | 'lint-error' + >('not-started'); + const [containerServer, setContainerServer] = useState>>(); + const [selectedTab, setSelectedTab] = useState<'code' | 'config' | null>(null); + const [version, setVersion] = useState(); + const tabsRef = useRef(null); + const configHeadingId = useId(); + const handleSelectExample = useCallback((example: ExampleData) => { + setConfigString(example.config); + setFileType(example.codeFileType); + setCode(example.code); + }, []); + useEffect(() => { + // get version + void (async () => { + const response = await fetch('https://registry.npmjs.org/markuplint'); + const json = await response.json(); + const version = json['dist-tags'][distTag]; + if (typeof version !== 'string') { + throw new TypeError('Invalid version'); + } + setVersion(version); + })(); + }, [distTag]); + + useEffect(() => { + const observer = new IntersectionObserver( + entries => { + const entry = entries[0]; + if (entry.isIntersecting) { + // mobile + setSelectedTab('code'); + } else { + // desktop + setSelectedTab(null); + } + }, + { root: document.body }, + ); + if (tabsRef.current) { + observer.observe(tabsRef.current); + } + return () => { + observer.disconnect(); + }; + }, []); + + // boot container server + useEffect(() => { + if (!boot) { + boot = true; + void (async () => { + setContainerServer(await setupContainerServer(consoleRef.current!)); + })(); + } + }, []); + + // update dependencies when config changed + useEffect(() => { + // find @markuplint/* packages from config + const additionalPackages = configString.match(/@markuplint\/[^"]+/g) ?? []; + const candidate = new Set(['markuplint', ...additionalPackages]); + setDepsPackages(prev => { + if (areSetsEqual(prev, candidate)) { + return prev; + } else { + return candidate; + } + }); + }, [configString]); + + // update config when config changed + useEffect(() => { + if (!containerServer) { + return; + } + + if (parseJsonc(configString) === null) { + setStatus('config-error'); + } else { + void (async () => { + setViolations(null); + setStatus('config-updating'); + try { + await containerServer.updateConfig('.markuplintrc', configString); + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + } + setLintTrigger(prev => prev + 1); + })(); + } + }, [configString, containerServer]); + + // npm install when dependencies changed + useEffect(() => { + if (!containerServer) { + return; + } + + setViolations(null); + setDepsStatus('loading'); + setStatus('deps-installing'); + + void (async () => { + try { + const dependencies = [...depsPackages].map(name => `${name}@${distTag}`); + const installed = await containerServer.updateDeps(dependencies); + setInstalledPackages(installed); + setDepsStatus('success'); + setLintTrigger(prev => prev + 1); + } catch { + setDepsStatus('error'); + setStatus('deps-error'); + } + })(); + }, [depsPackages, distTag, containerServer]); + + // lint + useEffect(() => { + if (!containerServer) { + return; + } + if (depsStatus !== 'success') { + return; + } + void (async () => { + const result = await containerServer.lint(filename, code); + if (result === null) { + setStatus('lint-skipped'); + } else if (result === 'error') { + setStatus('lint-error'); + } else { + setStatus('lint-checked'); + setViolations(result); + } + })(); + }, [code, containerServer, depsStatus, filename, lintTrigger]); + + // save values + const debouncedSaveValues = useMemo(() => debounce(saveValues, 200), []); + useEffect(() => { + if (!containerServer) { + return; + } + debouncedSaveValues({ + config: configString, + codeFileType: fileType, + code: code, + }); + }, [configString, code, debouncedSaveValues, containerServer, fileType]); + + return ( + <> +

+

+ Markuplint{' '} + Playground +

+ +
+
+ + { + const gutterElement = document.createElement('div'); + gutterElement.className = + 'w-[2px] box-content border-x-4 border-transparent bg-slate-300 cursor-col-resize hover:bg-ml-blue hidden md:block'; + return gutterElement; + }} + gutterStyle={() => ({})} + className="flex h-full" + minSize={0} + > + { + const gutterElement = document.createElement('div'); + gutterElement.className = + 'w-full h-[2px] box-content border-y-4 border-transparent bg-slate-300 cursor-row-resize hover:bg-ml-blue'; + return gutterElement; + }} + gutterStyle={() => ({})} + className={ + selectedTab === null ? 'overflow-x-hidden' : selectedTab === 'code' ? '!w-full' : 'hidden' + } + > + + +
+ +
+
+
+ +
+
+

+ + Config +

+

+ .markuplintrc +

+
+ + {(['JSON', 'Visual'] as const).map((label, i) => ( + + + {label} + + ))} + +
+ + + + + + + + + +
+
+
+
+
+ + { + { + 'not-started': <>, + 'deps-installing': ( + <> + + + + Installing dependencies... (may take 10-30 sec.) + + ), + 'deps-error': ( + <> + + Install error! + + ), + 'config-updating': ( + <> + + + + Updating config... + + ), + 'config-error': ( + <> + + Config file is invalid! + + ), + 'lint-skipped': ( + <> + + Linting was skipped! Please check your parser settings. + + ), + 'lint-checked': ( + <> + + Checked! + + ), + 'lint-error': ( + <> + + An error occurred while linting! + + ), + }[status] + } + + + + + Console + + + + + + + + + {`v${version}`} + + + + + +
+ + ); +} diff --git a/src/assets/images/logo-horizontal.svg b/src/assets/images/logo-horizontal.svg new file mode 100644 index 0000000..3b5a776 --- /dev/null +++ b/src/assets/images/logo-horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/CodeEditor.spec.tsx b/src/components/CodeEditor.spec.tsx new file mode 100644 index 0000000..88fa5a9 --- /dev/null +++ b/src/components/CodeEditor.spec.tsx @@ -0,0 +1,34 @@ +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { useState, type ComponentProps } from 'react'; +import { describe, expect, test, vi } from 'vitest'; + +import { CodeEditor } from './CodeEditor'; + +const ControllingComponent = ({ value: defaultValue, onChange, ...rest }: ComponentProps) => { + const [value, setValue] = useState(defaultValue); + vi.mocked(onChange!).mockImplementation(v => setValue(v)); + return ; +}; + +const user = userEvent.setup(); + +describe('CodeEditor', () => { + const value = '
initial code
'; + const filename = 'example.html'; + const violations: ComponentProps['violations'] = []; + const onChange = vi.fn(); + render(); + + test('renders code editor with correct filename', () => { + const filenameElement = screen.getByText(filename); + expect(filenameElement).toBeInTheDocument(); + }); + + test('calls onChange when code is changed', async () => { + const codeEditor = screen.getByRole('textbox'); + await user.clear(codeEditor); + await user.type(codeEditor, 'Modified code'); + expect(onChange).toHaveBeenCalledWith('Modified code'); + }); +}); diff --git a/src/components/CodeEditor.tsx b/src/components/CodeEditor.tsx new file mode 100644 index 0000000..6b81aee --- /dev/null +++ b/src/components/CodeEditor.tsx @@ -0,0 +1,91 @@ +import type { Violations } from '../modules/violations'; +import type { editor } from 'monaco-editor'; + +import MonacoEditor, { type Monaco } from '@monaco-editor/react'; +import { shikiToMonaco } from '@shikijs/monaco'; +import { useRef, useEffect, useId } from 'react'; +import { getHighlighter } from 'shiki/bundle/web'; + +import { getLanguage } from '../modules/monaco-editor'; +import { convertToMarkerData } from '../modules/violations'; + +type Props = Readonly<{ + value: string; + filename: string; + violations: Violations; + onChange?: (code: string) => void; +}>; + +export const CodeEditor = ({ value, filename, violations, onChange }: Props) => { + const headingId = useId(); + const monacoRef = useRef(null); + const editorRef = useRef(null); + + useEffect(() => { + const markers = convertToMarkerData(violations); + const model = editorRef.current?.getModel(); + if (model) { + monacoRef.current?.editor.setModelMarkers(model, 'Markuplint', markers); + } + }, [violations]); + + return ( +
+
+
+
+

+ + Code +

+

+ {filename} +

+
+
+ { + editorRef.current = editor; + monacoRef.current = monaco; + + void (async () => { + const ADDITIONAL_LANGUAGES = ['jsx', 'tsx', 'vue', 'svelte'] as const satisfies Parameters< + typeof getHighlighter + >[0]['langs']; + + for (const lang of ADDITIONAL_LANGUAGES) { + monacoRef.current?.languages.register({ id: lang }); + } + + const highlighter = await getHighlighter({ + themes: ['dark-plus'], + langs: ADDITIONAL_LANGUAGES, + }); + + // https://shiki.matsu.io/packages/monaco + shikiToMonaco(highlighter, monacoRef.current); + })(); + }} + onChange={value => { + if (value !== undefined) { + onChange?.(value); + } + }} + /> +
+
+ ); +}; diff --git a/src/components/ConfigEditor.spec.tsx b/src/components/ConfigEditor.spec.tsx new file mode 100644 index 0000000..577cd1c --- /dev/null +++ b/src/components/ConfigEditor.spec.tsx @@ -0,0 +1,38 @@ +import type { ComponentProps } from 'react'; + +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { useState } from 'react'; +import { describe, test, expect, vi } from 'vitest'; + +import { ConfigEditor } from './ConfigEditor'; + +const ControllingComponent = ({ value: defaultValue, onChange, ...rest }: ComponentProps) => { + const [value, setValue] = useState(defaultValue); + vi.mocked(onChange!).mockImplementation(v => setValue(v)); + return ; +}; + +/** @see https://testing-library.com/docs/user-event/keyboard/ */ +const escapeInput = (value: string) => value.replaceAll('{', '{{').replaceAll('}', '}}'); + +const user = userEvent.setup(); + +describe('ConfigEditor', () => { + const value = '{ "key": "value" }'; + const onChange = vi.fn(); + render(); + + test('renders the editor with the provided value', () => { + const editor = screen.getByRole('textbox'); + expect(editor.value).toBe(value); + }); + + test('calls onChange when the editor value changes', async () => { + const editor = screen.getByRole('textbox'); + const newValue = '{ "key": "new value" }'; + await user.clear(editor); + await user.type(editor, escapeInput(newValue)); + expect(onChange).toHaveBeenCalledWith(newValue); + }); +}); diff --git a/src/components/ConfigEditor.tsx b/src/components/ConfigEditor.tsx new file mode 100644 index 0000000..95d6fef --- /dev/null +++ b/src/components/ConfigEditor.tsx @@ -0,0 +1,41 @@ +import type { editor } from 'monaco-editor'; + +import MonacoEditor from '@monaco-editor/react'; +import { useRef } from 'react'; + +type Props = Readonly<{ + value: string; + onChange?: (code: string) => void; +}>; + +export const ConfigEditor = ({ value, onChange }: Props) => { + const editorRef = useRef(null); + + return ( +
+ { + editorRef.current = editor; + monaco.languages.json.jsonDefaults.setDiagnosticsOptions({ + comments: 'ignore', + }); + }} + onChange={value => { + if (value !== undefined) { + onChange?.(value); + } + }} + /> +
+ ); +}; diff --git a/src/components/ConfigForm.spec.tsx b/src/components/ConfigForm.spec.tsx new file mode 100644 index 0000000..9a957ba --- /dev/null +++ b/src/components/ConfigForm.spec.tsx @@ -0,0 +1,34 @@ +import { render, screen } from '@testing-library/react'; +import { describe, test, expect, vi } from 'vitest'; + +import { ConfigForm } from './ConfigForm'; + +describe('ConfigForm', () => { + const fileType = '.jsx'; + const config = { + parser: { '\\.jsx$': '@markuplint/jsx-parser' }, + specs: { '\\.jsx$': '@markuplint/react-spec' }, + rules: { + 'attr-duplication': false, + }, + extends: ['markuplint:recommended'], + }; + const version = '3.0.0'; + const onChangeFileType = vi.fn(); + const onChangeConfig = vi.fn(); + + render( + , + ); + + test('renders sections', () => { + const fileTypeSelector = screen.getAllByRole('heading', { level: 3 }); + expect(fileTypeSelector.length).toBe(3); + }); +}); diff --git a/src/components/ConfigForm.tsx b/src/components/ConfigForm.tsx new file mode 100644 index 0000000..883ac96 --- /dev/null +++ b/src/components/ConfigForm.tsx @@ -0,0 +1,133 @@ +import type { Rules, Config } from '@markuplint/ml-config'; + +import { useCallback, useEffect, useMemo, useState } from 'react'; + +import { FileTypeSelector } from './FileTypeSelector'; +import { PresetsSelector } from './PresetsSelector'; +import { RulesSelector } from './RulesSelector'; + +const mapping: Readonly>> = { + '.jsx': { + parser: { '\\.jsx$': '@markuplint/jsx-parser' }, + specs: { '\\.jsx$': '@markuplint/react-spec' }, + }, + '.vue': { + parser: { '\\.vue$': '@markuplint/vue-parser' }, + specs: { '\\.vue$': '@markuplint/vue-spec' }, + }, + '.svelte': { + parser: { '\\.svelte$': '@markuplint/svelte-parser' }, + specs: { '\\.svelte$': '@markuplint/svelte-spec' }, + }, +}; + +type Props = Readonly<{ + version?: string; + fileType: string; + config: Config; + onChangeFileType: (fileType: string) => void; + onChangeConfig: (config: Config) => void; +}>; + +export const ConfigForm = ({ fileType, config, version, onChangeFileType, onChangeConfig }: Props) => { + const [, setConfigState] = useState(config); + useEffect(() => { + setConfigState(config); + }, [config]); + + const handleChangeFileType = useCallback( + (newFileType: string) => { + onChangeFileType(newFileType); + const parserAndSpecs = mapping[newFileType] ?? {}; + + setConfigState(prev => { + const writableConfig = { ...prev }; + if (parserAndSpecs.parser) { + writableConfig.parser = parserAndSpecs.parser; + } else { + delete writableConfig.parser; + } + if (parserAndSpecs.specs) { + writableConfig.specs = parserAndSpecs.specs; + } else { + delete writableConfig.specs; + } + onChangeConfig(writableConfig); + return writableConfig; + }); + }, + [onChangeConfig, onChangeFileType], + ); + + const rules = useMemo((): Rules => { + const { rules } = config; + return rules ?? {}; + }, [config]); + const handleChangeRules = useCallback( + (newRules: Rules) => { + setConfigState(prev => { + const writableConfig = { ...prev }; + if (Object.keys(newRules).length === 0) { + delete writableConfig.rules; + } else { + writableConfig.rules = newRules; + } + onChangeConfig(writableConfig); + return writableConfig; + }); + }, + [onChangeConfig], + ); + + const presets = useMemo((): readonly string[] => { + const { extends: extendsValue } = config; + return Array.isArray(extendsValue) ? extendsValue : []; + }, [config]); + const handleChangePresets = useCallback( + (newPresets: readonly string[]) => { + setConfigState(prev => { + const writableConfig = { ...prev }; + if (newPresets.length === 0) { + delete writableConfig.extends; + } else { + writableConfig.extends = newPresets; + } + onChangeConfig(writableConfig); + return writableConfig; + }); + }, + [onChangeConfig], + ); + + return ( +
+
+ +

+ Parser & Specs + +

+
+ +
+
+ +

+ Presets + +

+
+ +
+
+ +

+ Rules + +

+
+ {version && } +
+
+ ); +}; diff --git a/src/components/ConsoleOutput.spec.tsx b/src/components/ConsoleOutput.spec.tsx new file mode 100644 index 0000000..91e4125 --- /dev/null +++ b/src/components/ConsoleOutput.spec.tsx @@ -0,0 +1,20 @@ +import type { ConsoleOutputRef } from './ConsoleOutput'; + +import { cleanup, render, screen } from '@testing-library/react'; +import { describe, test, expect, afterEach } from 'vitest'; + +import { ConsoleOutput } from './ConsoleOutput'; + +describe('ConsoleOutput', () => { + let consoleOutputRef: ConsoleOutputRef | null = null; + + afterEach(() => { + cleanup(); + }); + + test('renders without errors', () => { + render( (consoleOutputRef = ref)} />); + expect(screen.getByRole('textbox')).toBeInTheDocument(); + expect(consoleOutputRef).not.toBeNull(); + }); +}); diff --git a/src/components/ConsoleOutput.tsx b/src/components/ConsoleOutput.tsx new file mode 100644 index 0000000..842bcb2 --- /dev/null +++ b/src/components/ConsoleOutput.tsx @@ -0,0 +1,50 @@ +import 'xterm/css/xterm.css'; +import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react'; +import { Terminal } from 'xterm'; + +export type ConsoleOutputRef = { + appendLine: (string: string) => void; + append: (string: string) => void; + clear: () => void; +}; + +type Props = {}; + +export const ConsoleOutput = forwardRef((_, ref) => { + const terminalRef = useRef(null); + const wrapperRef = useRef(null); + + useEffect(() => { + if (wrapperRef.current) { + const elementStyle = window.getComputedStyle(wrapperRef.current); + const terminal = new Terminal({ + theme: { + background: elementStyle.backgroundColor, + foreground: elementStyle.color, + }, + }); + terminalRef.current = terminal; + terminal.open(wrapperRef.current); + return () => { + terminal.dispose(); + terminalRef.current = null; + }; + } + }, []); + + useImperativeHandle(ref, () => { + return { + appendLine: (line: string) => { + terminalRef.current?.writeln(line); + }, + append: (string: string) => { + terminalRef.current?.write(string); + }, + clear: () => { + terminalRef.current?.clear(); + }, + }; + }, []); + + return
; +}); diff --git a/src/components/DependencyPanel.spec.tsx b/src/components/DependencyPanel.spec.tsx new file mode 100644 index 0000000..d91893c --- /dev/null +++ b/src/components/DependencyPanel.spec.tsx @@ -0,0 +1,43 @@ +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, test, expect, vi } from 'vitest'; + +import { DependencyPanel } from './DependencyPanel'; + +const user = userEvent.setup(); + +describe('DependencyPanel', () => { + const depsPackages = new Set(['markuplint', '@markuplint/svelte-parser']); + const installedPackages = { markuplint: '^3.15.0', '@markuplint/svelte-parser': '^3.12.0' }; + const onChange = vi.fn(); + + render( + , + ); + + test('default value', () => { + const versionSelect = screen.getByRole('combobox', { name: /Version/ }); + expect(versionSelect.value).toBe('latest'); + }); + + test('renders install command', () => { + const installCommand = screen.getByText(/npm install -D markuplint@latest @markuplint\/svelte-parser@latest/); + expect(installCommand).toBeTruthy(); + }); + + test('renders package.json content based on status', () => { + const packageJsonContent = screen.getByText(/"devDependencies":/); + expect(packageJsonContent).toBeTruthy(); + }); + + test('calls onChange when selecting a version', async () => { + const versionSelect = screen.getByLabelText(/Version/, { selector: 'select' }); + await user.selectOptions(versionSelect, 'next'); + expect(onChange).toHaveBeenCalledWith('next'); + }); +}); diff --git a/src/components/DependencyPanel.tsx b/src/components/DependencyPanel.tsx new file mode 100644 index 0000000..f0d27e7 --- /dev/null +++ b/src/components/DependencyPanel.tsx @@ -0,0 +1,69 @@ +import type { DistTag } from '../modules/dist-tag'; + +import { memo } from 'react'; + +type Props = Readonly<{ + status: 'success' | 'loading' | 'error' | null; + depsPackages: Readonly>; + installedPackages: Readonly>; + distTag?: DistTag; + onChange?: (value: DistTag) => void; +}>; + +const DependencyPanelRaw = ({ depsPackages, installedPackages, status, distTag = 'latest', onChange }: Props) => { + return ( +
+

+ +

+ +
+

Install

+ {depsPackages.size > 0 && ( +
+ {`npm install -D ${[...depsPackages].map(name => `${name}@${distTag}`).join(' ')}`} +
+ )} +
+ +
+

+ package.json +

+
+ {status === null ? ( +

Waiting...

+ ) : ( + { + loading:

Installing packages...

, + error:

Installation error

, + success: ( +
+
+										{JSON.stringify({ devDependencies: installedPackages }, null, 2)}
+									
+
+ ), + }[status] + )} +
+
+
+ ); +}; +export const DependencyPanel = memo(DependencyPanelRaw); diff --git a/src/components/ExampleSelector.spec.tsx b/src/components/ExampleSelector.spec.tsx new file mode 100644 index 0000000..db80b23 --- /dev/null +++ b/src/components/ExampleSelector.spec.tsx @@ -0,0 +1,58 @@ +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, test, expect, vi } from 'vitest'; + +import { ExampleSelector } from './ExampleSelector'; + +// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types +HTMLDialogElement.prototype.show = vi.fn(function mock(this: HTMLDialogElement) { + this.open = true; +}); + +// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types +HTMLDialogElement.prototype.showModal = vi.fn(function mock(this: HTMLDialogElement) { + this.open = true; +}); + +// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types +HTMLDialogElement.prototype.close = vi.fn(function mock(this: HTMLDialogElement) { + this.open = false; +}); + +const user = userEvent.setup(); + +describe('ExampleSelector', () => { + const onSelect = vi.fn(); + const disabled = false; + + render(); + + test('renders button', () => { + const button = screen.getByRole('button', { name: /Examples\.{3}/ }); + expect(button).toBeInTheDocument(); + }); + + test('opens dialog on button click', async () => { + const button = screen.getByRole('button', { name: /Examples\.{3}/ }); + await user.click(button); + const dialog = screen.getByRole('dialog'); + expect(dialog).toBeInTheDocument(); + }); + + test('closes dialog on close button click', async () => { + const closeButton = screen.getByRole('button', { name: /Close/ }); + await user.click(closeButton); + const dialog = screen.queryByRole('dialog'); + expect(dialog).not.toBeInTheDocument(); + }); + + test('calls onSelect and closes dialog on example button click', async () => { + const button = screen.getByRole('button', { name: /Examples\.{3}/ }); + await user.click(button); + const applyButton = screen.getByRole('button', { name: /React/ }); + await user.click(applyButton); + expect(onSelect).toHaveBeenCalled(); + const dialog = screen.queryByRole('dialog'); + expect(dialog).not.toBeInTheDocument(); + }); +}); diff --git a/src/components/ExampleSelector.tsx b/src/components/ExampleSelector.tsx new file mode 100644 index 0000000..f1acc92 --- /dev/null +++ b/src/components/ExampleSelector.tsx @@ -0,0 +1,99 @@ +import type { ExampleData } from '../examples'; + +import { memo, type FC, useRef, useId } from 'react'; + +import { examples } from '../examples'; + +type Props = { onSelect?: (files: Readonly) => void; disabled?: boolean }; + +const ExampleSelectorRaw: FC = ({ onSelect, disabled = false }) => { + const dialogRef = useRef(null); + const dialogId = useId(); + const handleOpen = () => { + dialogRef.current?.showModal(); + }; + const handleClose = () => { + dialogRef.current?.close(); + }; + return ( + <> + + { + if (event.target === event.currentTarget) { + handleClose(); + } + }} + className="relative w-[calc(100%-4%*2)] max-w-md rounded-2xl bg-white p-6 text-left align-middle shadow-xl backdrop:bg-black backdrop:bg-opacity-50" + > + {/* `div` is needed for light dismiss */} +
+ +

+ Choose an example +

+
    + {Object.keys(examples) + .sort() + .map(categoryKey => { + const category = examples[categoryKey]; + return ( +
  • +

    + {category.metadata.title} + +

    +
      + {Object.keys(category.examples) + .sort() + .map(exampleKey => { + const example = category.examples[exampleKey]; + return ( +
    • + +
    • + ); + })} +
    +
  • + ); + })} +
+
+
+ + ); +}; + +export const ExampleSelector = memo(ExampleSelectorRaw); diff --git a/src/components/FileTypeSelector.spec.tsx b/src/components/FileTypeSelector.spec.tsx new file mode 100644 index 0000000..e998ae6 --- /dev/null +++ b/src/components/FileTypeSelector.spec.tsx @@ -0,0 +1,37 @@ +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, test, expect, vi } from 'vitest'; + +import { FileTypeSelector } from './FileTypeSelector'; + +const user = userEvent.setup(); + +describe('FileTypeSelector', () => { + const value = '.html'; + const onChange = vi.fn(); + + render(); + + test('renders select element with correct value', () => { + const selectElement = screen.getByRole('combobox', { name: /Code file type/ }); + expect(selectElement.value).toBe(value); + }); + + test('calls onChange when selecting a different value', async () => { + const selectElement = screen.getByRole('combobox', { name: /Code file type/ }); + const newValue = '.vue'; + await user.selectOptions(selectElement, newValue); + expect(onChange).toHaveBeenCalledWith(newValue); + }); + + test('renders learn more link with correct href', () => { + const learnMoreLink = screen.getByText(/Learn more about using to besides HTML/); + expect(learnMoreLink).toHaveAttribute('href', 'https://markuplint.dev/docs/guides/besides-html'); + }); + + test('renders learn more link with correct target and rel attributes', () => { + const learnMoreLink = screen.getByText(/Learn more about using to besides HTML/); + expect(learnMoreLink).toHaveAttribute('target', '_blank'); + expect(learnMoreLink).toHaveAttribute('rel', 'noreferrer'); + }); +}); diff --git a/src/components/FileTypeSelector.tsx b/src/components/FileTypeSelector.tsx new file mode 100644 index 0000000..6551c67 --- /dev/null +++ b/src/components/FileTypeSelector.tsx @@ -0,0 +1,40 @@ +import { fileTypes } from '../modules/save-values'; + +type Props = Readonly<{ + value: string; + onChange?: (value: string) => void; +}>; + +export const FileTypeSelector = ({ value, onChange }: Props) => { + return ( +
+ ); +}; diff --git a/src/components/PresetsSelector.spec.tsx b/src/components/PresetsSelector.spec.tsx new file mode 100644 index 0000000..6dd2d0a --- /dev/null +++ b/src/components/PresetsSelector.spec.tsx @@ -0,0 +1,81 @@ +import { render, screen, cleanup } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { useState } from 'react'; +import { describe, test, expect, vi, afterEach } from 'vitest'; + +import { PresetsSelector } from './PresetsSelector'; + +const user = userEvent.setup(); + +const PresetsSelectorWithControllingComponent = ({ + value: defaultValue, + onChange, + ...rest +}: Parameters[0]) => { + const [value, setValue] = useState(defaultValue); + vi.mocked(onChange!).mockImplementation(v => setValue(v)); + return ; +}; + +describe('PresetsSelector', () => { + const fileType = '.html'; + const value = ['markuplint:html-standard']; + const onChange = vi.fn(); + + afterEach(cleanup); + + test('renders presets', () => { + render(); + const specificRecommendedPresetCheckbox = screen.getByLabelText('markuplint:recommended-static-html'); + expect(specificRecommendedPresetCheckbox).toBeTruthy(); + + const recommendedPresetCheckbox = screen.getByLabelText('markuplint:recommended'); + expect(recommendedPresetCheckbox).toBeTruthy(); + + const basePresetsCheckboxes = screen.getAllByLabelText(/^markuplint:/); + expect(basePresetsCheckboxes.length).toBe(7); + }); + + test('calls onChange when base preset is checked', async () => { + render(); + await user.click(screen.getByLabelText('markuplint:html-standard')); + expect(onChange).toHaveBeenCalledWith(['markuplint:html-standard']); + await user.click(screen.getByLabelText('markuplint:a11y')); + expect(onChange).toHaveBeenCalledWith(['markuplint:html-standard', 'markuplint:a11y']); + }); + + test('when recommended preset is checked', async () => { + render(); + await user.click(screen.getByLabelText('markuplint:recommended')); + expect(onChange).toHaveBeenCalledWith(['markuplint:recommended']); + expect(screen.getAllByRole('checkbox', { checked: true }).length).toBe(6); + }); + + test('when specific recommended preset is checked', async () => { + render(); + await user.click(screen.getByLabelText('markuplint:recommended-static-html')); + expect(onChange).toHaveBeenCalledWith(['markuplint:recommended-static-html']); + expect(screen.getAllByRole('checkbox', { checked: true }).length).toBe(7); + }); + + test('calls onChange when checkbox is unchecked', async () => { + render(); + const specificRecommendedPresetCheckbox = screen.getByLabelText('markuplint:html-standard'); + await user.click(specificRecommendedPresetCheckbox); + expect(onChange).toHaveBeenCalledWith([]); + }); + + describe('Besides HTML', () => { + test('React', () => { + render(); + const specificRecommendedPresetCheckbox = screen.getByLabelText('markuplint:recommended-react'); + expect(specificRecommendedPresetCheckbox).toBeTruthy(); + }); + + test('Vue', () => { + render(); + const specificRecommendedPresetCheckbox = screen.getByLabelText('markuplint:recommended-vue'); + expect(specificRecommendedPresetCheckbox).toBeTruthy(); + }); + }); +}); diff --git a/src/components/PresetsSelector.tsx b/src/components/PresetsSelector.tsx new file mode 100644 index 0000000..7d3e36e --- /dev/null +++ b/src/components/PresetsSelector.tsx @@ -0,0 +1,145 @@ +import type { ChangeEvent } from 'react'; + +import { useCallback, useEffect, useState } from 'react'; + +const specificRecommendedPresets: Readonly<{ [key: string]: string | undefined }> = { + '.html': 'markuplint:recommended-static-html', + '.jsx': 'markuplint:recommended-react', + '.vue': 'markuplint:recommended-vue', + '.svelte': 'markuplint:recommended-svelte', +}; + +const basePresets = [ + 'markuplint:html-standard', + 'markuplint:a11y', + 'markuplint:performance', + 'markuplint:security', + 'markuplint:rdfa', +] as const; + +const getImplicitPresets = (explicitPresets: readonly string[]) => { + if (explicitPresets.some(p => p.startsWith('markuplint:recommended-'))) { + return [...new Set([...basePresets, 'markuplint:recommended', ...explicitPresets])]; + } else if (explicitPresets.includes('markuplint:recommended')) { + return [...new Set([...basePresets, 'markuplint:recommended'])]; + } else { + return [...new Set(explicitPresets)]; + } +}; +type Props = Readonly<{ + fileType: string; + value: readonly string[]; + onChange?: (value: readonly string[]) => void; +}>; + +export const PresetsSelector = ({ fileType, value, onChange }: Props) => { + const presets = value; + const [implicitPresets, setImplicitPresets] = useState([]); + const handleChange = useCallback( + // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types + (e: Readonly>) => { + const { checked, value } = e.currentTarget; + let newPresets: readonly string[]; + if (checked) { + if (value.startsWith('markuplint:recommended-')) { + newPresets = [ + ...presets.filter(p => !basePresets.includes(p) && !(p === 'markuplint:recommended')), + value, + ]; + } else if (value === 'markuplint:recommended') { + newPresets = [...presets.filter(p => !basePresets.includes(p)), value]; + } else { + newPresets = [...presets, value]; + } + } else { + newPresets = presets.filter(p => p !== value); + } + setImplicitPresets(getImplicitPresets(newPresets)); + onChange?.(newPresets); + }, + [onChange, presets], + ); + useEffect(() => { + setImplicitPresets(getImplicitPresets(value)); + }, [value]); + + useEffect(() => { + if ( + presets.some( + p => + Object.values(specificRecommendedPresets).includes(p) && p !== specificRecommendedPresets[fileType], + ) + ) { + const newPresets = presets.filter(p => !Object.values(specificRecommendedPresets).includes(p)); + onChange?.(newPresets); + } + }, [fileType, onChange, presets]); + + const specificRecommendedPreset = specificRecommendedPresets[fileType]; + return ( +
+
+ {specificRecommendedPreset && ( + + )} +
+ +
+ {basePresets.map((presetName, i) => ( + + ))} +
+
+
+

+ + Learn more about presets + (Open in new tab) + +

+
+ ); +}; diff --git a/src/components/ProblemsOutput.spec.tsx b/src/components/ProblemsOutput.spec.tsx new file mode 100644 index 0000000..75d8f84 --- /dev/null +++ b/src/components/ProblemsOutput.spec.tsx @@ -0,0 +1,53 @@ +import type { ComponentProps } from 'react'; + +import { render, screen } from '@testing-library/react'; +import { describe, test, expect } from 'vitest'; + +import { ProblemsOutput } from './ProblemsOutput'; + +const mockViolations: ComponentProps['violations'] = [ + { + severity: 'info', + message: 'Info message', + ruleId: 'rule1', + line: 1, + col: 1, + raw: 'raw code', + }, + { + severity: 'warning', + message: 'Warning message', + ruleId: 'rule2', + line: 2, + col: 2, + raw: 'raw code', + }, + { + severity: 'error', + message: 'Error message', + ruleId: 'rule3', + line: 3, + col: 3, + raw: 'raw code', + }, +]; + +describe('ProblemsOutput', () => { + test('renders loading message when violations is null', () => { + render(); + const loadingMessage = screen.getByText(/Loading.../); + expect(loadingMessage).toBeInTheDocument(); + }); + + test('renders no problems found message when violations is an empty array', () => { + render(); + const noProblemsMessage = screen.getByText(/No problems found./); + expect(noProblemsMessage).toBeInTheDocument(); + }); + + test('renders the correct number of violations', () => { + render(); + const violationItems = screen.getAllByRole('listitem'); + expect(violationItems).toHaveLength(mockViolations.length); + }); +}); diff --git a/src/components/ProblemsOutput.tsx b/src/components/ProblemsOutput.tsx new file mode 100644 index 0000000..2607a34 --- /dev/null +++ b/src/components/ProblemsOutput.tsx @@ -0,0 +1,78 @@ +import type { Violations } from '../modules/violations'; + +import { useId } from 'react'; + +export const ProblemsOutput = ({ violations }: Readonly<{ violations: Violations | null }>) => { + const headingId = useId(); + return ( +
+

+ Problems + {violations && ( + + {violations.length} + + )} +

+
+ {violations === null ? ( +

Loading...

+ ) : violations.length === 0 ? ( +

+ + Info + + No problems found. +

+ ) : ( +
    + {[...violations] + .sort((a, b) => { + const lineDiff = a.line - b.line; + const colDiff = a.col - b.col; + if (lineDiff === 0) { + return colDiff; + } else { + return lineDiff; + } + }) + .map((violation, i) => ( +
  • + {icon(violation.severity)} + + {violation.message} ({violation.ruleId}) [{violation.line}:{violation.col}] + +
  • + ))} +
+ )} +
+
+ ); +}; + +const icon = (severity: Violations[number]['severity']) => { + switch (severity) { + case 'info': { + return ( + + Info + + ); + } + case 'warning': { + return ( + + Warning + + ); + } + case 'error': { + return ( + + Error + + ); + } + } +}; diff --git a/src/components/RuleConfig.spec.tsx b/src/components/RuleConfig.spec.tsx new file mode 100644 index 0000000..f37ea24 --- /dev/null +++ b/src/components/RuleConfig.spec.tsx @@ -0,0 +1,43 @@ +import type { JSONSchema } from '../modules/json-schema'; + +import { render, screen, cleanup } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, test, expect, vi, afterEach } from 'vitest'; + +import { rules } from '../../__mocks__/rule'; + +import { RuleConfig } from './RuleConfig'; + +const user = userEvent.setup(); + +describe('RuleConfig', () => { + const value = true; + const ruleName = 'attr-duplication'; + const schema = rules.oneOf[0].properties!['attr-duplication'] as JSONSchema; + const onChange = vi.fn(); + + afterEach(() => { + cleanup(); + }); + + test('renders rule name', () => { + render(); + const ruleNameElement = screen.getByRole('heading', { name: /attr-duplication/ }); + expect(ruleNameElement).toBeTruthy(); + const ruleNameLink = screen.getByRole('link', { name: /attr-duplication/ }); + expect(ruleNameLink).toBeTruthy(); + }); + + test('renders select element', () => { + render(); + const selectElement = screen.getByRole('combobox'); + expect(selectElement).toBeTruthy(); + }); + + test('calls onChange when selecting a value', async () => { + render(); + const selectElement = screen.getByRole('combobox'); + await user.selectOptions(selectElement, 'false'); + expect(onChange).toHaveBeenCalledWith('attr-duplication', false); + }); +}); diff --git a/src/components/RuleConfig.tsx b/src/components/RuleConfig.tsx new file mode 100644 index 0000000..a3bb7a6 --- /dev/null +++ b/src/components/RuleConfig.tsx @@ -0,0 +1,618 @@ +import type { JsonValue } from '../modules/json'; +import type { AnyRule } from '@markuplint/ml-config'; +import type { JSONSchema7Definition } from 'json-schema'; +import type { ReactNode } from 'react'; + +import { createContext, useContext, useCallback, useEffect, useState, useMemo, memo, useId } from 'react'; + +import { isJSONSchema, type JSONSchema } from '../modules/json-schema'; + +const locale = navigator.language; +const localeWithoutRegion = locale.split('-')[0]; + +type Props = Readonly<{ + value: AnyRule; + ruleName: string; + schema: JSONSchema; + onChange: (ruleName: string, rule: AnyRule) => void; +}>; +const RuleConfigRaw = ({ value, ruleName, schema, onChange }: Props) => { + const [valueSelect, setValueSelect] = useState('unset'); + const [customConfig, setCustomConfig] = useState>>({}); + const headingId = useId(); + const handleChangeCustom = useCallback( + (value: any | undefined) => { + const newCustomConfig = value ?? {}; + setCustomConfig(newCustomConfig); + onChange(ruleName, newCustomConfig); + }, + [onChange, ruleName], + ); + + useEffect(() => { + switch (value) { + case true: { + setValueSelect('true'); + break; + } + case false: { + setValueSelect('false'); + break; + } + case null: + case undefined: { + setValueSelect('unset'); + break; + } + default: { + if (typeof value === 'string') { + setValueSelect(value); + } else if (typeof value === 'object') { + setValueSelect('custom'); + setCustomConfig(value); + } + } + } + }, [value]); + + // Rule's schema has `oneOf` property + if (!schema.oneOf) { + return ; + } + + const customs = schema.oneOf.find( + one => typeof one !== 'boolean' && one.properties && 'value' in one.properties && one.properties?.['severity'], + ); + + const defaultValue = schema.oneOf + .filter((one): one is Exclude => typeof one !== 'boolean' && one.type !== 'boolean') + .find(one => one.default !== undefined)?.default; + + return ( +
+
+

+ + + {ruleName} + + (Open in new tab) + + + : + +

+ +
+ {isJSONSchema(customs) && valueSelect === 'custom' && ( +
+ +
+ )} +
+ ); +}; +export const RuleConfig = memo(RuleConfigRaw); + +const Nested = ({ + value, + schema, + onChange, +}: Readonly<{ + value: any; + schema: JSONSchema7Definition; + onChange?: (value: any) => void; +}>): ReactNode => { + if (typeof schema === 'boolean') { + return null; + } else if (schema.oneOf) { + return ; + } else if ( + schema.type !== undefined && + !Array.isArray(schema.type) // array is not supported + ) { + switch (schema.type) { + case 'boolean': { + return ; + } + case 'string': { + return ; + } + case 'number': + case 'integer': { + return ; + } + case 'array': { + return ; + } + case 'object': { + return ; + } + case 'null': { + return null; + } + default: { + schema.type satisfies never; + throw new Error('This code should not be called'); + } + } + } else { + return ; + } +}; + +const NestedArray = ({ + value, + schema, + onChange, +}: Readonly<{ + value: readonly any[]; + schema: JSONSchema; + onChange?: (value: readonly any[]) => void; +}>): ReactNode => { + const { depth, parentType } = useContext(NestContext); + const [values, setValues] = useState([null]); + useEffect(() => { + // not supported + // TODO: support this pattern + }, [value]); + const handleChange = useCallback( + (index: number) => (value: any) => { + const newValues = [...values]; + newValues[index] = value; + setValues(newValues); + onChange?.(newValues); + }, + [values, onChange], + ); + const handleAdd = useCallback(() => { + const newValues = [...values, null]; + setValues(newValues); + onChange?.(newValues); + }, [values, onChange]); + const handleRemove = useCallback( + (index: number) => () => { + const newValues = [...values]; + newValues.splice(index, 1); + setValues(newValues); + onChange?.(newValues); + }, + [values, onChange], + ); + + const schemaItems = schema.items; + + if (Array.isArray(schemaItems) || schemaItems === undefined) { + return ; + } + return ( +
+
+ +
    + {values.map((v, i) => ( +
  • +
    + +
    + +
  • + ))} +
+
+

+ +

+
+
+ ); +}; + +const flattenSchemas = (schemas: readonly JSONSchema7Definition[]): readonly JSONSchema7Definition[] => + schemas.flatMap(schema => + typeof schema === 'boolean' ? schema : schema.oneOf ? flattenSchemas(schema.oneOf) : schema, + ); + +const NestedOneOf = ({ + value, + schemas, + onChange, +}: Readonly<{ + value: any; + schemas: readonly JSONSchema7Definition[]; + onChange?: (value: any) => void; +}>): ReactNode => { + const flattenedSchemas = useMemo(() => flattenSchemas(schemas), [schemas]); + const [selected, setSelected] = useState(0); + const [valueStates, setValueStates] = useState(Array.from({ length: flattenedSchemas.length }).fill(null)); + const selectedSchema = flattenedSchemas[selected]; + + useEffect(() => { + // not supported + // TODO: support this pattern + }, [value]); + const handleChange = useCallback( + (index: number) => (value: any) => { + onChange?.(value); + const newValue = [...valueStates]; + newValue[index] = value; + setValueStates(newValue); + }, + [onChange, valueStates], + ); + + const getSummary = (schema: JSONSchema7Definition): string => { + if (typeof schema === 'boolean') { + return String(schema); + } + if (schema.oneOf) { + return 'oneOf...'; + } + if (schema.type === undefined || Array.isArray(schema.type)) { + return '(not supported)'; + } + switch (schema.type) { + case 'array': { + return 'array'; + } + case 'object': { + return schema.properties ? `object (${Object.keys(schema.properties).join(', ')})` : 'object'; + } + case 'string': { + return schema.enum ? 'string (enum)' : 'string'; + } + case 'integer': + case 'number': { + return 'number'; + } + case 'boolean': { + return 'boolean'; + } + case 'null': { + return 'null'; + } + default: { + schema.type satisfies never; + return ''; + } + } + }; + return ( + <> + + + {/* NOTE: `schema.description` may be useful */} + + ); +}; + +const NestContext = createContext<{ depth: number; parentType: 'object' | 'array' | 'oneOf' | undefined }>({ + depth: 0, + parentType: undefined, +}); + +const NestedObject = ({ + value, + schema, + onChange, +}: Readonly<{ + value: Readonly> | undefined; + schema: JSONSchema; + onChange?: (value: Readonly> | undefined) => void; +}>): ReactNode => { + const { depth, parentType } = useContext(NestContext); + const [valueState, setValueState] = useState>(value ?? {}); + useEffect(() => { + setValueState(value ?? {}); + }, [value]); + + const handleChange = useCallback( + (key: string) => (value: JsonValue) => { + const updated = (() => { + if (value == null) { + const { [key]: _, ...updated } = valueState; + return Object.keys(updated).length === 0 ? undefined : updated; + } else { + return { ...valueState, [key]: value }; + } + })(); + setValueState(updated ?? {}); + onChange?.(updated); + }, + [valueState, onChange], + ); + + if (!schema.properties) { + return ; + } + return ( + +
    + {Object.entries(schema.properties).map(([key, property]) => + // @ts-expect-error + property.deprecated === true ? null : ( +
  • +
    + + + {key}: + + +
    +
  • + ), + )} +
+
+ ); +}; + +const NestedBoolean = ({ + value, + schema, + onChange, +}: Readonly<{ + value: boolean | undefined; + schema: JSONSchema; + onChange?: (value: boolean | undefined) => void; +}>): ReactNode => { + const [valueState, setValueState] = useState('unset'); + useEffect(() => { + switch (value) { + case true: { + setValueState('true'); + break; + } + case false: { + setValueState('false'); + break; + } + case undefined: { + setValueState('unset'); + break; + } + } + }, [value]); + const handleChange = useCallback( + (value: string) => { + setValueState(value); + const newValue = (() => { + switch (value) { + case 'true': { + return true; + } + case 'false': { + return false; + } + case 'unset': { + return; + } + } + })(); + onChange?.(newValue); + }, + [onChange], + ); + + const defaultValue = schema.default; + return ( + + ); +}; + +const NestedNumber = ({ + value, + schema, + onChange, +}: Readonly<{ + value: number | undefined; + schema: JSONSchema; + onChange?: (value: number | undefined) => void; +}>): ReactNode => { + const [valueState, setValueState] = useState(''); + useEffect(() => { + setValueState(value === undefined ? '' : String(value)); + }, [value]); + const handleChange = useCallback( + (value: string) => { + setValueState(value); + onChange?.(value === '' ? undefined : Number(value)); + }, + [onChange], + ); + + return ( + { + const value = e.currentTarget.value; + handleChange(value); + }} + /> + ); +}; + +const NestedString = ({ + value, + schema, + onChange, +}: Readonly<{ + value: string | undefined; + schema: JSONSchema; + onChange?: (value: string | undefined) => void; +}>): ReactNode => { + const [valueState, setValueState] = useState(''); + useEffect(() => { + setValueState(value ?? ''); + }, [value]); + const handleChange = useCallback( + (value: string) => { + setValueState(value); + onChange?.(value === '' ? undefined : value); + }, + [onChange], + ); + + return ( + <> + {schema.enum ? ( + + ) : ( + + "{' '} + { + handleChange(e.currentTarget.value); + }} + />{' '} + " + + )} + + ); +}; + +const NotSupported = ({ schema }: Readonly<{ schema: JSONSchema }>): ReactNode => { + return ( +
+

Sorry! This type is not supported in visual editor

+
+ + Show JSON Schema + +
{JSON.stringify(schema, null, 2)}
+
+
+ ); +}; diff --git a/src/components/RulesSelector.spec.tsx b/src/components/RulesSelector.spec.tsx new file mode 100644 index 0000000..a025a7f --- /dev/null +++ b/src/components/RulesSelector.spec.tsx @@ -0,0 +1,34 @@ +import { render, screen, cleanup, waitForElementToBeRemoved } from '@testing-library/react'; +import { describe, test, expect, vi, afterEach } from 'vitest'; + +import { schema } from '../../__mocks__/schema'; + +import { RulesSelector } from './RulesSelector'; + +vi.mock('../modules/json-schema', async () => ({ + ...(await vi.importActual('../modules/json-schema')), + fetchDereferencedSchema: vi.fn().mockResolvedValue(schema), +})); + +describe('RulesSelector', () => { + const value = {}; + const version = '3.15.0'; + const onChange = vi.fn(); + + afterEach(() => { + cleanup(); + }); + + test('renders loading message while fetching schema', () => { + render(); + const loadingMessage = screen.getByText(/loading schema.../i); + expect(loadingMessage).toBeInTheDocument(); + }); + + test('renders rule config components after fetching schema', async () => { + render(); + + await waitForElementToBeRemoved(() => screen.queryByText(/loading schema.../i)); + expect(screen.getByText(/attr-duplication/)).toBeInTheDocument(); + }); +}); diff --git a/src/components/RulesSelector.tsx b/src/components/RulesSelector.tsx new file mode 100644 index 0000000..a01701c --- /dev/null +++ b/src/components/RulesSelector.tsx @@ -0,0 +1,94 @@ +import type { Rules, AnyRule } from '@markuplint/ml-config'; +import type { JSONSchema7Definition } from 'json-schema'; + +import { memo, useCallback, useEffect, useState } from 'react'; +import { satisfies } from 'semver'; + +import { fetchDereferencedSchema, isJSONSchema } from '../modules/json-schema'; + +import { RuleConfig } from './RuleConfig'; + +type Props = Readonly<{ + value: Rules; + version: string; + onChange: (rules: Rules) => void; +}>; + +const RulesSelectorRaw = ({ value, version, onChange }: Props) => { + const [, setRulesState] = useState({}); + const [ruleSchemas, setRuleSchemas] = useState | null>(null); + + useEffect(() => { + setRulesState(value); + }, [value]); + + useEffect(() => { + void (async () => { + setRuleSchemas(null); + try { + // get schema + const url = `https://raw.githubusercontent.com/markuplint/markuplint/v${version}/config.schema.json`; + const dereferencedSchema = await fetchDereferencedSchema(new URL(url)); + if (!isJSONSchema(dereferencedSchema)) return; + + const rulesDefinition = dereferencedSchema?.properties?.rules; + if (!isJSONSchema(rulesDefinition)) return; + + if (satisfies(version, '>=4.0.0')) { + setRuleSchemas(rulesDefinition.properties ?? null); + } else if (satisfies(version, '>=3.13.0')) { + const builtinRulesDefinition = rulesDefinition.oneOf?.[0]; + if (!isJSONSchema(builtinRulesDefinition)) return; + setRuleSchemas(builtinRulesDefinition.properties ?? null); + } else if (satisfies(version, '>=3.0.0')) { + setRuleSchemas(rulesDefinition.properties ?? null); + } else { + // eslint-disable-next-line no-console + console.error('Given version is not supported'); + } + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + } + })(); + }, [version]); + + const handleChange = useCallback( + (ruleName: string, rule: AnyRule) => { + setRulesState(prev => { + const writableConfig = { ...prev }; + if (rule == null) { + delete writableConfig[ruleName]; + } else { + writableConfig[ruleName] = rule; + } + onChange(writableConfig); + return writableConfig; + }); + }, + [onChange], + ); + + return ( +
+ {ruleSchemas == null ? ( +

Loading schema...

+ ) : ( + Object.entries(ruleSchemas).map( + ([key, ruleSchema]) => + typeof ruleSchema !== 'boolean' && ( + + ), + ) + )} +
+ ); +}; + +export const RulesSelector = memo(RulesSelectorRaw); diff --git a/src/examples/.editorconfig b/src/examples/.editorconfig new file mode 100644 index 0000000..76a93c0 --- /dev/null +++ b/src/examples/.editorconfig @@ -0,0 +1,3 @@ +[*] +indent_style = space +indent_size = 2 diff --git a/src/examples/files/01-presets/01-recommended/.markuplintrc b/src/examples/files/01-presets/01-recommended/.markuplintrc new file mode 100644 index 0000000..1a73107 --- /dev/null +++ b/src/examples/files/01-presets/01-recommended/.markuplintrc @@ -0,0 +1,3 @@ +{ + "extends": ["markuplint:recommended"] +} diff --git a/src/examples/files/01-presets/01-recommended/code.html b/src/examples/files/01-presets/01-recommended/code.html new file mode 100644 index 0000000..5f41561 --- /dev/null +++ b/src/examples/files/01-presets/01-recommended/code.html @@ -0,0 +1,53 @@ + + + + + + deprecated-element and deprecated-attr + +

duplicated-id

+

duplicated-id

+ + + +
    +

    permitted-contents

    +
+ + require-datetime + + required-attr + + + + + + + + no-refer-to-non-existent-id + + + + +

character-reference & " > < '

+ + ineffective-attr + + + wai-aria +
+ Pass + Error + +

Accessibility

+ + +

Performance

+ + + + diff --git a/src/examples/files/01-presets/01-recommended/metadata.json b/src/examples/files/01-presets/01-recommended/metadata.json new file mode 100644 index 0000000..f4a7f0c --- /dev/null +++ b/src/examples/files/01-presets/01-recommended/metadata.json @@ -0,0 +1,3 @@ +{ + "title": "markuplint:recommended" +} diff --git a/src/examples/files/01-presets/02-recommended-static-html/.markuplintrc b/src/examples/files/01-presets/02-recommended-static-html/.markuplintrc new file mode 100644 index 0000000..0270887 --- /dev/null +++ b/src/examples/files/01-presets/02-recommended-static-html/.markuplintrc @@ -0,0 +1,3 @@ +{ + "extends": ["markuplint:recommended-static-html"] +} diff --git a/src/examples/files/01-presets/02-recommended-static-html/code.html b/src/examples/files/01-presets/02-recommended-static-html/code.html new file mode 100644 index 0000000..c3ad6b8 --- /dev/null +++ b/src/examples/files/01-presets/02-recommended-static-html/code.html @@ -0,0 +1,55 @@ + + + +
end-tag + + + + deprecated-element and deprecated-attr + +

duplicated-id

+

duplicated-id

+ + + +
    +

    permitted-contents

    +
+ + require-datetime + + required-attr + + + + + + + + no-refer-to-non-existent-id + + + + +

character-reference & " > < '

+ + ineffective-attr + + + wai-aria +
+ Pass + Error + +

Accessibility

+ + +

Performance

+ + + + diff --git a/src/examples/files/01-presets/02-recommended-static-html/metadata.json b/src/examples/files/01-presets/02-recommended-static-html/metadata.json new file mode 100644 index 0000000..24ffbaa --- /dev/null +++ b/src/examples/files/01-presets/02-recommended-static-html/metadata.json @@ -0,0 +1,3 @@ +{ + "title": "markuplint:recommended-static-html" +} diff --git a/src/examples/files/01-presets/metadata.json b/src/examples/files/01-presets/metadata.json new file mode 100644 index 0000000..1d496d4 --- /dev/null +++ b/src/examples/files/01-presets/metadata.json @@ -0,0 +1,3 @@ +{ + "title": "Presets" +} diff --git a/src/examples/files/02-besides-html/01-react/.markuplintrc b/src/examples/files/02-besides-html/01-react/.markuplintrc new file mode 100644 index 0000000..665cffc --- /dev/null +++ b/src/examples/files/02-besides-html/01-react/.markuplintrc @@ -0,0 +1,9 @@ +{ + "extends": ["markuplint:recommended-react"], + "parser": { + "\\.jsx$": "@markuplint/jsx-parser" + }, + "specs": { + "\\.jsx$": "@markuplint/react-spec" + } +} diff --git a/src/examples/files/02-besides-html/01-react/code.jsx b/src/examples/files/02-besides-html/01-react/code.jsx new file mode 100644 index 0000000..0383a3c --- /dev/null +++ b/src/examples/files/02-besides-html/01-react/code.jsx @@ -0,0 +1,12 @@ +export const Component = ({ list, id }) => { + return ( + <> +

+
    + {list.map(item => ( +
  • {item.text}
  • + ))} +
+ + ); +}; diff --git a/src/examples/files/02-besides-html/01-react/metadata.json b/src/examples/files/02-besides-html/01-react/metadata.json new file mode 100644 index 0000000..63ab62a --- /dev/null +++ b/src/examples/files/02-besides-html/01-react/metadata.json @@ -0,0 +1,3 @@ +{ + "title": "React" +} diff --git a/src/examples/files/02-besides-html/02-vue/.markuplintrc b/src/examples/files/02-besides-html/02-vue/.markuplintrc new file mode 100644 index 0000000..56516c7 --- /dev/null +++ b/src/examples/files/02-besides-html/02-vue/.markuplintrc @@ -0,0 +1,9 @@ +{ + "extends": ["markuplint:recommended-vue"], + "parser": { + "\\.vue$": "@markuplint/vue-parser" + }, + "specs": { + "\\.vue$": "@markuplint/vue-spec" + } +} diff --git a/src/examples/files/02-besides-html/02-vue/code.vue b/src/examples/files/02-besides-html/02-vue/code.vue new file mode 100644 index 0000000..cfc3fb0 --- /dev/null +++ b/src/examples/files/02-besides-html/02-vue/code.vue @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/src/examples/files/02-besides-html/02-vue/metadata.json b/src/examples/files/02-besides-html/02-vue/metadata.json new file mode 100644 index 0000000..c27c443 --- /dev/null +++ b/src/examples/files/02-besides-html/02-vue/metadata.json @@ -0,0 +1,3 @@ +{ + "title": "Vue" +} diff --git a/src/examples/files/02-besides-html/03-svelte/.markuplintrc b/src/examples/files/02-besides-html/03-svelte/.markuplintrc new file mode 100644 index 0000000..978abb0 --- /dev/null +++ b/src/examples/files/02-besides-html/03-svelte/.markuplintrc @@ -0,0 +1,9 @@ +{ + "extends": ["markuplint:recommended-svelte"], + "parser": { + "\\.svelte$": "@markuplint/svelte-parser" + }, + "specs": { + "\\.svelte$": "@markuplint/svelte-spec" + } +} diff --git a/src/examples/files/02-besides-html/03-svelte/code.svelte b/src/examples/files/02-besides-html/03-svelte/code.svelte new file mode 100644 index 0000000..e199555 --- /dev/null +++ b/src/examples/files/02-besides-html/03-svelte/code.svelte @@ -0,0 +1,11 @@ + + +

+
    + {#each list as { key, text }, i} +
  • {text}
  • + {/each} +
\ No newline at end of file diff --git a/src/examples/files/02-besides-html/03-svelte/metadata.json b/src/examples/files/02-besides-html/03-svelte/metadata.json new file mode 100644 index 0000000..ff67b0a --- /dev/null +++ b/src/examples/files/02-besides-html/03-svelte/metadata.json @@ -0,0 +1,3 @@ +{ + "title": "Svelte" +} diff --git a/src/examples/files/02-besides-html/metadata.json b/src/examples/files/02-besides-html/metadata.json new file mode 100644 index 0000000..41eb8f6 --- /dev/null +++ b/src/examples/files/02-besides-html/metadata.json @@ -0,0 +1,3 @@ +{ + "title": "Besides HTML" +} diff --git a/src/examples/files/03-usecases/01-style-rules/.markuplintrc b/src/examples/files/03-usecases/01-style-rules/.markuplintrc new file mode 100644 index 0000000..8e786b8 --- /dev/null +++ b/src/examples/files/03-usecases/01-style-rules/.markuplintrc @@ -0,0 +1,12 @@ +{ + "rules": { + "attr-value-quotes": true, + "case-sensitive-attr-name": true, + "case-sensitive-tag-name": true, + "character-reference": true, + "end-tag": true, + "ineffective-attr": true, + "no-boolean-attr-value": true, + "no-default-value": true + } +} diff --git a/src/examples/files/03-usecases/01-style-rules/code.html b/src/examples/files/03-usecases/01-style-rules/code.html new file mode 100644 index 0000000..464113e --- /dev/null +++ b/src/examples/files/03-usecases/01-style-rules/code.html @@ -0,0 +1,13 @@ +
+
+ +
+
+ + + +There is not an end tag. + + + + diff --git a/src/examples/files/03-usecases/01-style-rules/metadata.json b/src/examples/files/03-usecases/01-style-rules/metadata.json new file mode 100644 index 0000000..946d12d --- /dev/null +++ b/src/examples/files/03-usecases/01-style-rules/metadata.json @@ -0,0 +1,3 @@ +{ + "title": "Style rules" +} diff --git a/src/examples/files/03-usecases/02-class-naming/.markuplintrc b/src/examples/files/03-usecases/02-class-naming/.markuplintrc new file mode 100644 index 0000000..e295cb2 --- /dev/null +++ b/src/examples/files/03-usecases/02-class-naming/.markuplintrc @@ -0,0 +1,18 @@ +{ + "rules": { + "class-naming": "/^[a-z][a-z0-9-]*$/" + }, + "childNodeRules": [ + { + "regexSelector": { + "attrName": "class", + "attrValue": "/^(?[a-z][a-z0-9-]*)(?:__[a-z][a-z0-9-]*)?$/" + }, + "rules": { + "class-naming": { + "value": ["/^{{BlockName}}__[a-z][a-z0-9-]*$/", "/^([a-z][a-z0-9-]*)$/"] + } + } + } + ] +} diff --git a/src/examples/files/03-usecases/02-class-naming/code.html b/src/examples/files/03-usecases/02-class-naming/code.html new file mode 100644 index 0000000..495ff6d --- /dev/null +++ b/src/examples/files/03-usecases/02-class-naming/code.html @@ -0,0 +1,7 @@ +
+

+
+ +
+

+
diff --git a/src/examples/files/03-usecases/02-class-naming/metadata.json b/src/examples/files/03-usecases/02-class-naming/metadata.json new file mode 100644 index 0000000..b555d76 --- /dev/null +++ b/src/examples/files/03-usecases/02-class-naming/metadata.json @@ -0,0 +1,3 @@ +{ + "title": "BEM (MindBEMding) style class naming" +} diff --git a/src/examples/files/03-usecases/03-image-file-naming/.markuplintrc b/src/examples/files/03-usecases/03-image-file-naming/.markuplintrc new file mode 100644 index 0000000..287bfc4 --- /dev/null +++ b/src/examples/files/03-usecases/03-image-file-naming/.markuplintrc @@ -0,0 +1,36 @@ +{ + "rules": { + "invalid-attr": true + }, + "nodeRules": [ + { + "regexSelector": { + "nodeName": "img", + "attrName": "src", + "attrValue": + // Capture a file name and its extension from img elements while... + "/^(?.+)\\.(?png|jpg|webp|gif)$/", + // Use together combinator to select preceding-sibling source elements + "combination": { + "combinator": ":has(~)", + "nodeName": "source" + } + }, + "rules": { + "invalid-attr": { + "options": { + "allowAttrs": [ + { + "name": "srcset", + "value": { + // Expand a file name and its extension by Mustache format + "enum": ["{{FileName}}@2x.{{Exp}} 2x", "{{FileName}}@3x.{{Exp}} 3x"] + } + } + ] + } + } + } + } + ] +} diff --git a/src/examples/files/03-usecases/03-image-file-naming/code.html b/src/examples/files/03-usecases/03-image-file-naming/code.html new file mode 100644 index 0000000..cf47b60 --- /dev/null +++ b/src/examples/files/03-usecases/03-image-file-naming/code.html @@ -0,0 +1,14 @@ + + + + + + + + + + + + + logo + \ No newline at end of file diff --git a/src/examples/files/03-usecases/03-image-file-naming/metadata.json b/src/examples/files/03-usecases/03-image-file-naming/metadata.json new file mode 100644 index 0000000..8cd150e --- /dev/null +++ b/src/examples/files/03-usecases/03-image-file-naming/metadata.json @@ -0,0 +1,3 @@ +{ + "title": "Consistent image file naming" +} diff --git a/src/examples/files/03-usecases/metadata.json b/src/examples/files/03-usecases/metadata.json new file mode 100644 index 0000000..292478c --- /dev/null +++ b/src/examples/files/03-usecases/metadata.json @@ -0,0 +1,3 @@ +{ + "title": "Usecases" +} diff --git a/src/examples/index.ts b/src/examples/index.ts new file mode 100644 index 0000000..8bb56ca --- /dev/null +++ b/src/examples/index.ts @@ -0,0 +1,49 @@ +import { fileTypes, type PlaygroundValues } from '../modules/save-values'; + +const configFormats = ['.markuplintrc'] as const; +const exampleFiles = import.meta.glob(['./files/**/*', './files/**/.markuplintrc'], { as: 'raw', eager: true }); + +type Metadata = Readonly<{ + title: string; + description?: string; +}>; + +export type ExampleData = PlaygroundValues & + Readonly<{ + metadata: Metadata; + }>; + +const exampleDir: { + [category in string]: Readonly<{ + examples: { [example in string]: ExampleData }; + metadata: Metadata; + }>; +} = {}; +for (const [path, load] of Object.entries(exampleFiles)) { + // eslint-disable-next-line unicorn/no-unreadable-array-destructuring + const [, , category, dirOrMetadata, file] = path.split('/'); + exampleDir[category] = exampleDir[category] ?? { examples: {}, metadata: {} }; + if (dirOrMetadata === 'metadata.json') { + const metadata = exampleDir[category]['metadata']; + Object.assign(metadata, JSON.parse(load)); + } else { + const dirName = dirOrMetadata; + const dirObj = exampleDir[category]['examples'][dirName] ?? {}; + exampleDir[category]['examples'][dirName] = dirObj; + if (configFormats.includes(file)) { + Object.assign(dirObj, { config: load } as const satisfies Partial); + } else if (file === 'metadata.json') { + Object.assign(dirObj, { metadata: JSON.parse(load) } as const satisfies Partial); + } else { + const ext = file.toLowerCase().split('.').pop(); + const maybeFileType = `.${ext}`; + Object.assign(dirObj, { code: load } as const satisfies Partial); + if (fileTypes.includes(maybeFileType)) { + Object.assign(dirObj, { codeFileType: maybeFileType } as const satisfies Partial); + } + } + } +} + +const examples = Object.freeze(exampleDir); +export { examples }; diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..e05b1db --- /dev/null +++ b/src/index.css @@ -0,0 +1,60 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +select { + background-color: transparent; + cursor: pointer; +} + +summary { + cursor: pointer; + list-style: none; +} +summary::-webkit-details-marker { + display: none; +} + +:root, +body, +#root { + height: 100%; + min-height: 30rem; +} +#root { + display: grid; + grid-template-rows: auto minmax(0, 1fr) auto; + grid-template-columns: minmax(0, auto); +} + +.monaco-editor, +.monaco-editor .overflow-guard { + height: 100% !important; +} + +.xterm-screen { + width: initial !important; + overflow: hidden; +} + +.xterm-rows > * { + width: initial !important; + height: initial !important; + min-height: 1em; + overflow: visible !important; + text-wrap: initial !important; +} + +@layer utilities { + .select-arrow { + appearance: none; + background-image: var(--icon-arrow-down); + background-position: right 0.25rem center; + background-repeat: no-repeat; + background-size: 1.5em 1.5em; + padding-right: 2rem; + padding-left: 0.5rem; + padding-block: 0.125rem; + --icon-arrow-down: url('data:image/svg+xml;charset=UTF-8,'); + } +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..7b79eb3 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,11 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; + +import { App } from './App.tsx'; +import './index.css'; + +createRoot(document.getElementById('root') as HTMLElement).render( + + + , +); diff --git a/src/modules/debounce.ts b/src/modules/debounce.ts new file mode 100644 index 0000000..bffd4f1 --- /dev/null +++ b/src/modules/debounce.ts @@ -0,0 +1,7 @@ +export const debounce = void>(fn: F, interval: number) => { + let timer: ReturnType | undefined; + return (...args: Parameters) => { + clearTimeout(timer); + timer = setTimeout(() => fn(...args), interval); + }; +}; diff --git a/src/modules/dist-tag.ts b/src/modules/dist-tag.ts new file mode 100644 index 0000000..fd80cca --- /dev/null +++ b/src/modules/dist-tag.ts @@ -0,0 +1 @@ +export type DistTag = 'latest' | 'next'; diff --git a/src/modules/json-schema.ts b/src/modules/json-schema.ts new file mode 100644 index 0000000..aae8936 --- /dev/null +++ b/src/modules/json-schema.ts @@ -0,0 +1,161 @@ +import type { JSONSchema7, JSONSchema7Definition } from 'json-schema'; +export type JSONSchema = JSONSchema7; + +export const isJSONSchema = (value: JSONSchema7Definition | undefined): value is JSONSchema => { + if (value != null && typeof value !== 'boolean') { + value satisfies JSONSchema; + return true; + } else { + return false; + } +}; + +const definitionMap = new Map>(); +const jsonCache = new Map(); +const dereferencingSet = new Set(); + +/** + * Fetch JSON Schema or JSON Schema Definition + * (Schema URL: https://example.com/.../config.schema.json ) + * (Schema Definition URL: https://example.com/.../config.schema.json#/definitions/rules ) + */ +async function fetchSchema(urlString: string): Promise { + const url = new URL(urlString); + const { hash } = url; + const [urlWithoutHash] = urlString.split('#'); + + try { + let schema: JSONSchema | undefined; + + if (jsonCache.has(urlWithoutHash)) { + schema = jsonCache.get(urlWithoutHash); + } else { + const res = await fetch(urlWithoutHash); + schema = await res.json(); + if (schema === undefined) { + return undefined; + } else { + jsonCache.set(urlWithoutHash, schema); + } + } + + if (schema && /^#\/definitions\//i.test(hash)) { + const key = hash.replace(/^#\/definitions\//i, ''); + const def = schema.definitions?.[key]; + return def; + } + + return schema; + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + } +} + +export async function fetchDereferencedSchema(url: URL) { + const dereferencingSetKey = url.toString(); + // Avoid circular reference + if (dereferencingSet.has(dereferencingSetKey)) { + return; + } else { + dereferencingSet.add(dereferencingSetKey); + } + + const schema = await fetchSchema(url.toString()); + if (schema === undefined) { + return schema; + } + const result = await dereference(schema, url); + + dereferencingSet.delete(dereferencingSetKey); + return result; +} + +const isURLString = (value: string) => { + try { + new URL(value); + return true; + } catch { + return false; + } +}; + +export async function dereference( + schema: JSONSchema | JSONSchema7Definition, + url: URL, +): Promise { + // Already dereferenced + if (schema == null || typeof schema === 'boolean') { + return schema; + } + + const { origin, pathname } = url; + const urlWithoutHash = `${origin}${pathname}`; + + // Store the definitions + if (schema.definitions) { + for (const [key, definition] of Object.entries(schema.definitions)) { + const definitionUrlString = `${urlWithoutHash}#/definitions/${key}`; + const definitionUrl = new URL(definitionUrlString); + const dereferenced = await dereference(definition, definitionUrl); + if (dereferenced !== undefined) { + definitionMap.set(definitionUrlString, dereferenced); + schema.definitions[key] = dereferenced; + } + } + delete schema.definitions; + } + + // Dereference $ref + if (schema.$ref) { + const { $ref } = schema; + const cachedRef = definitionMap.get($ref) ?? definitionMap.get(`${urlWithoutHash}${$ref}`); + let ref = cachedRef; + if (cachedRef === undefined) { + if (isURLString(schema.$ref)) { + // external reference + ref = await fetchDereferencedSchema(new URL(schema.$ref)); + } else if (schema.$ref.startsWith('#/definitions/')) { + // internal reference + if (url.hash === schema.$ref) { + // FIXME: circular reference is not supported + ref = undefined; + } else { + ref = await fetchDereferencedSchema(new URL(`${urlWithoutHash}${schema.$ref}`)); + } + } + } + + delete schema.$ref; + if (ref !== undefined) { + Object.assign(schema, ref); + } + } + + if (typeof schema === 'boolean') { + return schema; + } + + if (schema.items !== undefined) { + schema.items = Array.isArray(schema.items) + ? await Promise.all(schema.items.map(async item => await dereference(item, url))) + : await dereference(schema.items, url); + } + if (schema.oneOf !== undefined) { + schema.oneOf = await Promise.all(schema.oneOf.map(async item => await dereference(item, url))); + } + if (schema.properties !== undefined) { + schema.properties = await recursive(schema.properties, url); + } + + return schema; +} + +// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types -- intentionally mutable +async function recursive(properties: Record, url: URL) { + const keys = Object.keys(properties); + for (const key of keys) { + properties[key] = await dereference(properties[key], url); + } + return properties; +} diff --git a/src/modules/json.ts b/src/modules/json.ts new file mode 100644 index 0000000..485ae8f --- /dev/null +++ b/src/modules/json.ts @@ -0,0 +1,43 @@ +import stripJsonComments from 'strip-json-comments'; + +type JsonPrimitive = boolean | number | string | null; +type JsonArray = readonly JsonPrimitive[] | readonly JsonObject[]; +type JsonObject = Readonly<{ + [key: string]: JsonPrimitive | JsonObject | JsonArray; +}>; +export type JsonValue = JsonPrimitive | JsonArray | JsonObject; + +/** type safe JSON.parse */ +export const parseJson = (json: string): JsonValue => { + return JSON.parse(json); +}; + +export const isJsonArray = (json: JsonValue): json is JsonArray => { + if (Array.isArray(json)) { + return true; + } else { + return false; + } +}; + +export const isJsonObject = (json: JsonValue): json is JsonObject => { + if (typeof json === 'object' && json !== null && !isJsonArray(json)) { + json satisfies JsonObject; + return true; + } else { + return false; + } +}; + +export const parseJsonc = (maybeJson: string): JsonObject | null => { + try { + const parsed = parseJson(stripJsonComments(maybeJson)); + if (isJsonObject(parsed)) { + return parsed; + } else { + return null; + } + } catch { + return null; + } +}; diff --git a/src/modules/monaco-editor.ts b/src/modules/monaco-editor.ts new file mode 100644 index 0000000..45bfbb7 --- /dev/null +++ b/src/modules/monaco-editor.ts @@ -0,0 +1,47 @@ +export const getLanguage = (filename: string) => { + const ext = filename.toLowerCase().split('.').pop(); + switch (ext) { + case 'html': + case 'htm': { + return 'html'; + } + case 'css': { + return 'css'; + } + case 'js': + case 'cjs': + case 'mjs': { + return 'javascript'; + } + case 'jsx': { + return 'jsx'; + } + case 'ts': + case 'cts': + case 'mts': { + return 'typescript'; + } + case 'tsx': { + return 'tsx'; + } + case 'vue': { + return 'vue'; + } + case 'svelte': { + return 'svelte'; + } + case 'json': { + return 'json'; + } + case 'yaml': + case 'yml': { + return 'yaml'; + } + case 'md': { + return 'markdown'; + } + default: { + return; + } + } +}; diff --git a/src/modules/save-values.ts b/src/modules/save-values.ts new file mode 100644 index 0000000..78b7083 --- /dev/null +++ b/src/modules/save-values.ts @@ -0,0 +1,32 @@ +import { compressToEncodedURIComponent, decompressFromEncodedURIComponent } from 'lz-string'; + +import { isJsonObject, parseJson } from './json'; + +export const fileTypes = ['.html', '.jsx', '.vue', '.svelte'] as const; + +export type PlaygroundValues = Readonly<{ + code: string; + codeFileType: string; + config: string; +}>; + +const encode = (values: PlaygroundValues): string => { + return compressToEncodedURIComponent(JSON.stringify(values)); +}; +const decode = (string: string): Partial => { + const decoded = decompressFromEncodedURIComponent(string); + + try { + const parsed = parseJson(decoded); + return isJsonObject(parsed) ? parsed : {}; + } catch { + return {}; + } +}; + +export const saveValues = (values: PlaygroundValues) => { + history.replaceState(null, '', `#${encode(values)}`); +}; +export const loadValues = (): Partial | null => { + return location.hash ? decode(location.hash.slice(1)) : null; +}; diff --git a/src/modules/violations.ts b/src/modules/violations.ts new file mode 100644 index 0000000..9a0d8bb --- /dev/null +++ b/src/modules/violations.ts @@ -0,0 +1,27 @@ +import type { MLResultInfo } from 'markuplint'; +import type { editor } from 'monaco-editor'; + +import { getEndCol, getEndLine } from '@markuplint/parser-utils/location'; + +export type Violations = MLResultInfo['violations']; +export type Violation = Violations[number]; +type MarkerData = Readonly; + +export const convertToMarkerData = (violations: Violations) => { + const SEVERITY_MAP = { + info: 2, + warning: 4, + error: 8, + } as const satisfies Record; + + const reports: MarkerData[] = violations.map(violation => ({ + severity: SEVERITY_MAP[violation.severity], + startLineNumber: violation.line, + startColumn: violation.col, + endLineNumber: getEndLine(violation.raw, violation.line), + endColumn: getEndCol(violation.raw, violation.col), + message: `${violation.message} (${violation.ruleId})`, + })); + + return reports; +}; diff --git a/src/reset.d.ts b/src/reset.d.ts new file mode 100644 index 0000000..eea29f3 --- /dev/null +++ b/src/reset.d.ts @@ -0,0 +1 @@ +import '@total-typescript/ts-reset/array-includes'; diff --git a/src/server/index.ts b/src/server/index.ts new file mode 100644 index 0000000..c2435da --- /dev/null +++ b/src/server/index.ts @@ -0,0 +1,248 @@ +import type { FileSystemTree, WebContainerProcess } from '@webcontainer/api'; + +import { WebContainer } from '@webcontainer/api'; + +import { parseJson } from '../modules/json'; + +import constants from './linter/constants.json'; + +/** + * Extracts a JSON object from the linter output. + */ +const extractJson = (str: string) => { + const { DIRECTIVE_OPEN, DIRECTIVE_CLOSE } = constants; + if (str.startsWith(DIRECTIVE_OPEN) && str.endsWith(DIRECTIVE_CLOSE)) { + return parseJson(str.slice(DIRECTIVE_OPEN.length, -DIRECTIVE_CLOSE.length)); + } +}; + +let webContainer: WebContainer; + +type ConsoleMethods = Readonly<{ + appendLine: (string: string) => void; + append: (string: string) => void; + clear: () => void; +}>; + +export const setupContainerServer = async ({ appendLine, append, clear }: ConsoleMethods) => { + clear(); + appendLine('[Playground] Starting WebContainer...'); + try { + webContainer = await WebContainer.boot(); + appendLine('[Playground] WebContainer started'); + } catch { + // For local development + // eslint-disable-next-line no-console + console.warn('[Playground] WebContainer already booted'); + appendLine('[Playground] WebContainer already booted'); + // appendLine('Reloading...'); + // window.location.reload(); + } + + const linterFiles = import.meta.glob('./linter/*', { as: 'raw', eager: true }); + const linterDir: FileSystemTree = {}; + for (const [path, load] of Object.entries(linterFiles)) { + const file = path.split('/').pop() as string; + linterDir[file] = { + file: { contents: load }, + }; + } + const serverFiles: FileSystemTree = { + linter: { directory: linterDir }, + code: { directory: {} }, + }; + await webContainer.mount(serverFiles); + + const linterServer = new LinterServer({ appendLine, append, clear }); + let installProcess: WebContainerProcess | undefined; + let updatingDeps = Promise.resolve>({}); + let updatingConfig = Promise.resolve(); + let restartingServer = Promise.resolve(); + let configFilename = '.markuplintrc'; + + const containerServer = { + installationExit: Promise.resolve(-1), + updateDeps: async (packages: readonly string[], reset = false) => { + updatingDeps = (async () => { + if (installProcess) { + installProcess.kill(); + } + const args = ['install', '-D', ...packages]; + appendLine(`npm ${args.join(' ')}`); + + if (reset) { + try { + await webContainer.fs.rm('node_modules', { recursive: true }); + } catch { + // ignore if it doesn't exist + } + try { + await webContainer.fs.rm('package-lock.json'); + } catch { + // ignore if it doesn't exist + } + } + + installProcess = await webContainer.spawn('npm', args); + void installProcess.output.pipeTo( + new WritableStream({ + write(data) { + append(data); + }, + }), + ); + containerServer.installationExit = installProcess.exit; + switch (await containerServer.installationExit) { + case 0: { + appendLine('[Playground] Installation succeeded'); + const json = await webContainer.fs.readFile('package.json', 'utf8'); + const parsed = JSON.parse(json); + return parsed.devDependencies; + } + case 1: { + appendLine('[Playground] Installation failed'); + throw new Error('Installation failed'); + } + default: // process was killed. do nothing + } + })(); + const result = await updatingDeps; + if ((await containerServer.installationExit) === 0) { + appendLine('[Playground] Dependencies updated. Restarting linter server...'); + restartingServer = linterServer.restart(); + await restartingServer; + } else { + throw new Error('Installation failed'); + } + return result; + }, + updateConfig: async (filename: string, contents: string) => { + updatingConfig = (async () => { + if (filename !== configFilename) { + await webContainer.fs.rm(configFilename); + configFilename = filename; + } + await webContainer.fs.writeFile(filename, contents, 'utf8'); + })(); + await updatingConfig; + + if ((await containerServer.installationExit) === 0) { + appendLine('[Playground] Configuration updated. Restarting linter server...'); + restartingServer = linterServer.restart(); + await restartingServer; + } else { + throw new Error('Installation failed'); + } + }, + lint: async (filename: string, contents: string) => { + const path = `code/${filename}`; + await webContainer.fs.writeFile(path, contents, 'utf8'); + + await Promise.all([updatingDeps, updatingConfig, restartingServer]); + if ((await containerServer.installationExit) !== 0) { + throw new Error('Installation failed'); + } + const result = await linterServer.request( + path, + (output): output is any[] | null | 'error' => + Array.isArray(output) || output === null || output === 'error', + ); + return result; + }, + restart: async () => { + await linterServer.restart(); + }, + }; + + return containerServer; +}; + +class LinterServer { + private readonly consoleMethods: ConsoleMethods; + private serverInternal: Awaited> | undefined; + + constructor(consoleMethods: ConsoleMethods) { + this.consoleMethods = consoleMethods; + } + + public async request(input: string, test: (output: any) => output is T) { + if (!this.serverInternal) { + this.serverInternal = await this.start(); + } + await this.serverInternal.ready(); + return await this.serverInternal.request(input, test); + } + + public async restart() { + if (this.serverInternal) { + this.serverInternal.process.kill(); + await this.serverInternal.process.exit; + } + this.serverInternal = await this.start(); + } + + private async start() { + const { appendLine } = this.consoleMethods; + const locale = navigator.language; + const localeWithoutRegion = locale.split('-')[0]; + const callbacks: ((output: any) => void)[] = []; + appendLine('[Playground] Linter server starting...'); + const process = await webContainer.spawn('node', ['./linter/index.mjs', '--locale', localeWithoutRegion]); + const writer = process.input.getWriter(); + const DEBUG_LOG = false; + const sentInputs: string[] = []; + void process.output.pipeTo( + new WritableStream({ + write(data) { + if (DEBUG_LOG) { + // eslint-disable-next-line no-console + console.log('debug log:', data); + } + if (extractJson(data) === undefined) { + if (sentInputs.includes(data)) { + sentInputs.splice(sentInputs.indexOf(data), 1); + } else { + appendLine(data); + } + } else { + for (const callback of callbacks) callback(extractJson(data)); + } + }, + }), + ); + void process.exit.then(() => { + this.serverInternal = undefined; + }); + + /** + * Pass input to the linter process and wait for the output to match the test. + */ + const request = (input: string, test: (output: any) => output is T) => { + const promise = new Promise(resolve => { + const callback = (output: any) => { + if (test(output)) { + callbacks.splice(callbacks.indexOf(callback), 1); + resolve(output); + if (DEBUG_LOG) { + // eslint-disable-next-line no-console + console.log('test passed', output); + } + } + }; + callbacks.push(callback); + }); + void writer.write(input); + sentInputs.push(input); + return promise; + }; + + /** + * Wait for the linter process to be ready. + */ + const ready = async () => { + await request('ready?', (output): output is 'ready' => output === 'ready'); + }; + + return { process, request, ready }; + } +} diff --git a/src/server/linter/constants.json b/src/server/linter/constants.json new file mode 100644 index 0000000..ce727ba --- /dev/null +++ b/src/server/linter/constants.json @@ -0,0 +1,4 @@ +{ + "DIRECTIVE_OPEN": "{{{ml-json-start}}}", + "DIRECTIVE_CLOSE": "{{{ml-json-end}}}" +} diff --git a/src/server/linter/index.mjs b/src/server/linter/index.mjs new file mode 100644 index 0000000..679245e --- /dev/null +++ b/src/server/linter/index.mjs @@ -0,0 +1,84 @@ +// @ts-check +// This file is executed in WebContainer. + +// NOTE: Actually, it refers to the installed packages in WebContainer. +import { MLEngine } from 'markuplint'; +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const content = fs.readFileSync(path.resolve(__dirname, './constants.json'), { encoding: 'utf-8' }); +const constants = JSON.parse(content); + +main(); + +function main() { + const options = getOptions(); + process.stdin.setEncoding('utf8'); + process.stdin.setRawMode(true); + process.stdin.resume(); + process.stdin.on('data', (/** @type {string} */ data) => { + if ( + data === 'ready?' || + data.includes('ready?') + // FIXME: only data === 'ready?' is correct, but it doesn't work. Sometimes data is 'ready?ready?'. + ) { + process.stdout.write(createJsonPayload('ready')); + return; + } + void (async () => { + const target = data; + try { + const file = await MLEngine.toMLFile(target); + if (file == null) { + return; + } + const engine = new MLEngine(file, { locale: options.locale }); + const result = await engine.exec(); + if (result === null) { + process.stdout.write(createJsonPayload(null)); + return; + } else { + process.stdout.write(createJsonPayload(result.violations)); + } + } catch (error) { + process.stdout.write(createJsonPayload('error')); + throw error; + } + })(); + }); +} + +/** + * Parse command line options. + * From `node index.mjs --locale ja` + * to `{ locale: 'ja' }` + */ +function getOptions() { + const args = process.argv.slice(2); + /** @type {{ locale?: string }} */ + const options = {}; + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + if (arg.startsWith('--')) { + const key = arg.replace(/^--/, ''); + const value = args[i + 1]; + if (value && !value.startsWith('--')) { + if (key === 'locale') { + options[key] = value; + } + i++; + } + } + } + return options; +} + +/** + * Convert the linter output to distinguish it from other logs. + */ +export function createJsonPayload(/** @type {any} */ payload) { + const { DIRECTIVE_OPEN, DIRECTIVE_CLOSE } = constants; + return `${DIRECTIVE_OPEN}${JSON.stringify(payload)}${DIRECTIVE_CLOSE}`; +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..8849895 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..2188335 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,43 @@ +import { iconsPlugin, getIconCollections } from '@egoist/tailwindcss-icons'; + +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./index.html', './src/**/*.{jsx,tsx}'], + theme: { + extend: { + colors: { + 'ml-blue': '#1572EB', + 'ml-blue-darker': '#0f55b1', + 'ml-ink': '#333333', + }, + }, + }, + plugins: [ + iconsPlugin({ + prefix: 'icon', + collections: { + ...getIconCollections([ + // https://heroicons.com/ + 'heroicons-solid', + // https://www.majesticons.com/ + // https://icon-sets.iconify.design/majesticons/ + 'majesticons', + ]), + custom: { + icons: { + 'loading-wrapper': { + body: '', + width: 24, + height: 24, + }, + loading: { + body: '', + width: 24, + height: 24, + }, + }, + }, + }, + }), + ], +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..37ffebc --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2021", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2021", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "jsx": "react-jsx", + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "__mocks__"] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 0000000..809d584 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["**/*.spec.tsx", "vitest.config.ts", "vitest.setup.tsx"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..3629987 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,20 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import tailwindcss from 'tailwindcss'; +import autoprefixer from 'autoprefixer'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + server: { + headers: { + 'Cross-Origin-Embedder-Policy': 'require-corp', + 'Cross-Origin-Opener-Policy': 'same-origin', + }, + }, + css: { + postcss: { + plugins: [tailwindcss, autoprefixer], + }, + }, +}); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..eae7f05 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,11 @@ +/// + +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + environment: 'jsdom', + include: ['src/**/*.spec.{js,ts,jsx,tsx}'], + setupFiles: ['./vitest.setup.tsx'], + }, +}); diff --git a/vitest.setup.tsx b/vitest.setup.tsx new file mode 100644 index 0000000..76d748f --- /dev/null +++ b/vitest.setup.tsx @@ -0,0 +1,25 @@ +import * as React from 'react'; +import { vi } from 'vitest'; +import '@testing-library/jest-dom/vitest'; + +vi.mock('@monaco-editor/react', () => { + const FakeEditor = vi.fn(props => ( + + )); + return { + default: FakeEditor, + }; +}); + +global.matchMedia = vi.fn().mockImplementation(() => ({ + matches: false, + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn(), + addListener: vi.fn(), // Deprecated + removeListener: vi.fn(), // Deprecated +})); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..d5b04c6 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,5467 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adobe/css-tools@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.0.tgz#728c484f4e10df03d5a3acd0d8adcbbebff8ad63" + integrity sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ== + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@antfu/install-pkg@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-0.1.1.tgz#157bb04f0de8100b9e4c01734db1a6c77e98bbb5" + integrity sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ== + dependencies: + execa "^5.1.1" + find-up "^5.0.0" + +"@antfu/utils@^0.7.10": + version "0.7.10" + resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.7.10.tgz#ae829f170158e297a9b6a28f161a8e487d00814d" + integrity sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww== + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + +"@babel/compat-data@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.2.tgz#e41928bd33475305c586f6acbbb7e3ade7a6f7f5" + integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ== + +"@babel/core@^7.24.5": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e" + integrity sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw== + dependencies: + "@babel/types" "^7.25.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" + +"@babel/helper-plugin-utils@^7.24.7": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + +"@babel/helpers@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" + integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== + dependencies: + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.3": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.3.tgz#91fb126768d944966263f0657ab222a642b82065" + integrity sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw== + dependencies: + "@babel/types" "^7.25.2" + +"@babel/plugin-transform-react-jsx-self@^7.24.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab" + integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-transform-react-jsx-source@^7.24.1": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3" + integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.9.2": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" + integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2": + version "7.25.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.3.tgz#f1b901951c83eda2f3e29450ce92743783373490" + integrity sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/parser" "^7.25.3" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.2" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.2.tgz#55fb231f7dc958cd69ea141a4c2997e819646125" + integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + +"@cspell/cspell-bundled-dicts@8.13.3": + version "8.13.3" + resolved "https://registry.yarnpkg.com/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.13.3.tgz#7b214ae6eb6442ef6391765f98c1b9294e3c455e" + integrity sha512-OfCxUBMyayxKyeDaUZG3LQpiyH8MFUbg9nbIZCGh2x8U6N0fHaP9uR6R+gPzdi/bJp32Kr+RC/Yebojd+AQCGA== + dependencies: + "@cspell/dict-ada" "^4.0.2" + "@cspell/dict-aws" "^4.0.3" + "@cspell/dict-bash" "^4.1.3" + "@cspell/dict-companies" "^3.1.4" + "@cspell/dict-cpp" "^5.1.12" + "@cspell/dict-cryptocurrencies" "^5.0.0" + "@cspell/dict-csharp" "^4.0.2" + "@cspell/dict-css" "^4.0.12" + "@cspell/dict-dart" "^2.0.3" + "@cspell/dict-django" "^4.1.0" + "@cspell/dict-docker" "^1.1.7" + "@cspell/dict-dotnet" "^5.0.2" + "@cspell/dict-elixir" "^4.0.3" + "@cspell/dict-en-common-misspellings" "^2.0.4" + "@cspell/dict-en-gb" "1.1.33" + "@cspell/dict-en_us" "^4.3.23" + "@cspell/dict-filetypes" "^3.0.4" + "@cspell/dict-fonts" "^4.0.0" + "@cspell/dict-fsharp" "^1.0.1" + "@cspell/dict-fullstack" "^3.2.0" + "@cspell/dict-gaming-terms" "^1.0.5" + "@cspell/dict-git" "^3.0.0" + "@cspell/dict-golang" "^6.0.9" + "@cspell/dict-google" "^1.0.1" + "@cspell/dict-haskell" "^4.0.1" + "@cspell/dict-html" "^4.0.5" + "@cspell/dict-html-symbol-entities" "^4.0.0" + "@cspell/dict-java" "^5.0.7" + "@cspell/dict-julia" "^1.0.1" + "@cspell/dict-k8s" "^1.0.6" + "@cspell/dict-latex" "^4.0.0" + "@cspell/dict-lorem-ipsum" "^4.0.0" + "@cspell/dict-lua" "^4.0.3" + "@cspell/dict-makefile" "^1.0.0" + "@cspell/dict-monkeyc" "^1.0.6" + "@cspell/dict-node" "^5.0.1" + "@cspell/dict-npm" "^5.0.18" + "@cspell/dict-php" "^4.0.8" + "@cspell/dict-powershell" "^5.0.5" + "@cspell/dict-public-licenses" "^2.0.7" + "@cspell/dict-python" "^4.2.4" + "@cspell/dict-r" "^2.0.1" + "@cspell/dict-ruby" "^5.0.2" + "@cspell/dict-rust" "^4.0.5" + "@cspell/dict-scala" "^5.0.3" + "@cspell/dict-software-terms" "^4.0.6" + "@cspell/dict-sql" "^2.1.5" + "@cspell/dict-svelte" "^1.0.2" + "@cspell/dict-swift" "^2.0.1" + "@cspell/dict-terraform" "^1.0.0" + "@cspell/dict-typescript" "^3.1.6" + "@cspell/dict-vue" "^3.0.0" + +"@cspell/cspell-json-reporter@8.13.3": + version "8.13.3" + resolved "https://registry.yarnpkg.com/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.13.3.tgz#dbce6f3b1104ba1dca15c645f2a005a228104ef0" + integrity sha512-QrHxWkm0cfD+rTjFOxm5lpE4+wBANDzMIM8NOeQC6v8Dc1L8PUkm6hF6CsEv2tKmuwvdVr+jy6GilDMkPXalCg== + dependencies: + "@cspell/cspell-types" "8.13.3" + +"@cspell/cspell-pipe@8.13.3": + version "8.13.3" + resolved "https://registry.yarnpkg.com/@cspell/cspell-pipe/-/cspell-pipe-8.13.3.tgz#eca94cd30a97fcea6abffd6189db916505acbce0" + integrity sha512-6a9Zd+fDltgXoJ0fosWqEMx0UdXBXZ7iakhslMNPRmv7GhVAoHBoIXzMVilOE4kYT2Mh/9NM/QW/NbNEpneZIQ== + +"@cspell/cspell-resolver@8.13.3": + version "8.13.3" + resolved "https://registry.yarnpkg.com/@cspell/cspell-resolver/-/cspell-resolver-8.13.3.tgz#423c96b7834aa33b8f487412e82083652d05406a" + integrity sha512-vlwtMTEWsPPtWfktzT75eGQ0n+0M+9kN+89eSvUUYdCfvY9XAS6z+bTmhS2ULJgntgWtX6gUjABQK0PYYVedOg== + dependencies: + global-directory "^4.0.1" + +"@cspell/cspell-service-bus@8.13.3": + version "8.13.3" + resolved "https://registry.yarnpkg.com/@cspell/cspell-service-bus/-/cspell-service-bus-8.13.3.tgz#058121ff78c25afc7bc6218233e6b15e660dbfd5" + integrity sha512-mFkeWXwGQSDxRiN6Kez77GaMNGNgG7T6o9UE42jyXEgf/bLJTpefbUy4fY5pU3p2mA0eoMzmnJX8l+TC5YJpbA== + +"@cspell/cspell-types@8.13.3": + version "8.13.3" + resolved "https://registry.yarnpkg.com/@cspell/cspell-types/-/cspell-types-8.13.3.tgz#180fcebfd1ca21cf09986470de0898b8c7893545" + integrity sha512-lA5GbhLOL6FlKCWNMbooRFgNGfTsM6NJnHz60+EEN7XD9OgpFc7w+MBcK4aHsVCxcrIvnejIc8xQDqPnrdmN3w== + +"@cspell/dict-ada@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-ada/-/dict-ada-4.0.2.tgz#8da2216660aeb831a0d9055399a364a01db5805a" + integrity sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA== + +"@cspell/dict-aws@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-aws/-/dict-aws-4.0.3.tgz#7d36d4d5439d1c39b815e0ae19f79e48a823e047" + integrity sha512-0C0RQ4EM29fH0tIYv+EgDQEum0QI6OrmjENC9u98pB8UcnYxGG/SqinuPxo+TgcEuInj0Q73MsBpJ1l5xUnrsw== + +"@cspell/dict-bash@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-bash/-/dict-bash-4.1.3.tgz#25fba40825ac10083676ab2c777e471c3f71b36e" + integrity sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw== + +"@cspell/dict-companies@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-companies/-/dict-companies-3.1.4.tgz#2e7094416432b8547ec335683f5aac9a49dce47e" + integrity sha512-y9e0amzEK36EiiKx3VAA+SHQJPpf2Qv5cCt5eTUSggpTkiFkCh6gRKQ97rVlrKh5GJrqinDwYIJtTsxuh2vy2Q== + +"@cspell/dict-cpp@^5.1.12": + version "5.1.12" + resolved "https://registry.yarnpkg.com/@cspell/dict-cpp/-/dict-cpp-5.1.12.tgz#52d5ed8b96268e8282f6d7694ee2434b20bafb21" + integrity sha512-6lXLOFIa+k/qBcu0bjaE/Kc6v3sh9VhsDOXD1Dalm3zgd0QIMjp5XBmkpSdCAK3pWCPV0Se7ysVLDfCea1BuXg== + +"@cspell/dict-cryptocurrencies@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.0.tgz#19fbc7bdbec76ce64daf7d53a6d0f3cfff7d0038" + integrity sha512-Z4ARIw5+bvmShL+4ZrhDzGhnc9znaAGHOEMaB/GURdS/jdoreEDY34wdN0NtdLHDO5KO7GduZnZyqGdRoiSmYA== + +"@cspell/dict-csharp@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-csharp/-/dict-csharp-4.0.2.tgz#e55659dbe594e744d86b1baf0f3397fe57b1e283" + integrity sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g== + +"@cspell/dict-css@^4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@cspell/dict-css/-/dict-css-4.0.12.tgz#59abf3512ae729835c933c38f64a3d8a5f09ce3d" + integrity sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw== + +"@cspell/dict-dart@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-dart/-/dict-dart-2.0.3.tgz#75e7ffe47d5889c2c831af35acdd92ebdbd4cf12" + integrity sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw== + +"@cspell/dict-data-science@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-data-science/-/dict-data-science-2.0.1.tgz#ef8040821567786d76c6153ac3e4bc265ca65b59" + integrity sha512-xeutkzK0eBe+LFXOFU2kJeAYO6IuFUc1g7iRLr7HeCmlC4rsdGclwGHh61KmttL3+YHQytYStxaRBdGAXWC8Lw== + +"@cspell/dict-django@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-django/-/dict-django-4.1.0.tgz#2d4b765daf3c83e733ef3e06887ea34403a4de7a" + integrity sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w== + +"@cspell/dict-docker@^1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@cspell/dict-docker/-/dict-docker-1.1.7.tgz#bcf933283fbdfef19c71a642e7e8c38baf9014f2" + integrity sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A== + +"@cspell/dict-dotnet@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-dotnet/-/dict-dotnet-5.0.2.tgz#d89ca8fa2e546b5e1b1f1288746d26bb627d9f38" + integrity sha512-UD/pO2A2zia/YZJ8Kck/F6YyDSpCMq0YvItpd4YbtDVzPREfTZ48FjZsbYi4Jhzwfvc6o8R56JusAE58P+4sNQ== + +"@cspell/dict-elixir@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-elixir/-/dict-elixir-4.0.3.tgz#57c25843e46cf3463f97da72d9ef8e37c818296f" + integrity sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q== + +"@cspell/dict-en-common-misspellings@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.0.4.tgz#725c5b2c83faff71fcd2183dd04a154c78eed674" + integrity sha512-lvOiRjV/FG4pAGZL3PN2GCVHSTCE92cwhfLGGkOsQtxSmef6WCHfHwp9auafkBlX0yFQSKDfq6/TlpQbjbJBtQ== + +"@cspell/dict-en-gb@1.1.33": + version "1.1.33" + resolved "https://registry.yarnpkg.com/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz#7f1fd90fc364a5cb77111b5438fc9fcf9cc6da0e" + integrity sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g== + +"@cspell/dict-en_us@^4.3.23": + version "4.3.23" + resolved "https://registry.yarnpkg.com/@cspell/dict-en_us/-/dict-en_us-4.3.23.tgz#3362b75a5051405816728ea1bb5ce997582ed383" + integrity sha512-l0SoEQBsi3zDSl3OuL4/apBkxjuj4hLIg/oy6+gZ7LWh03rKdF6VNtSZNXWAmMY+pmb1cGA3ouleTiJIglbsIg== + +"@cspell/dict-filetypes@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-filetypes/-/dict-filetypes-3.0.4.tgz#aca71c7bb8c8805b54f382d98ded5ec75ebc1e36" + integrity sha512-IBi8eIVdykoGgIv5wQhOURi5lmCNJq0we6DvqKoPQJHthXbgsuO1qrHSiUVydMiQl/XvcnUWTMeAlVUlUClnVg== + +"@cspell/dict-fonts@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-fonts/-/dict-fonts-4.0.0.tgz#9bc8beb2a7b068b4fdb45cb994b36fd184316327" + integrity sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q== + +"@cspell/dict-fsharp@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-fsharp/-/dict-fsharp-1.0.1.tgz#d62c699550a39174f182f23c8c1330a795ab5f53" + integrity sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ== + +"@cspell/dict-fullstack@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-fullstack/-/dict-fullstack-3.2.0.tgz#16dd2bd3f03166c8f48600ef032ae1ce184c7b8e" + integrity sha512-sIGQwU6G3rLTo+nx0GKyirR5dQSFeTIzFTOrURw51ISf+jKG9a3OmvsVtc2OANfvEAOLOC9Wfd8WYhmsO8KRDQ== + +"@cspell/dict-gaming-terms@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.0.5.tgz#d6ca40eb34a4c99847fd58a7354cd2c651065156" + integrity sha512-C3riccZDD3d9caJQQs1+MPfrUrQ+0KHdlj9iUR1QD92FgTOF6UxoBpvHUUZ9YSezslcmpFQK4xQQ5FUGS7uWfw== + +"@cspell/dict-git@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-git/-/dict-git-3.0.0.tgz#c275af86041a2b59a7facce37525e2af05653b95" + integrity sha512-simGS/lIiXbEaqJu9E2VPoYW1OTC2xrwPPXNXFMa2uo/50av56qOuaxDrZ5eH1LidFXwoc8HROCHYeKoNrDLSw== + +"@cspell/dict-golang@^6.0.9": + version "6.0.9" + resolved "https://registry.yarnpkg.com/@cspell/dict-golang/-/dict-golang-6.0.9.tgz#b26ee13fb34a8cd40fb22380de8a46b25739fcab" + integrity sha512-etDt2WQauyEQDA+qPS5QtkYTb2I9l5IfQftAllVoB1aOrT6bxxpHvMEpJ0Hsn/vezxrCqa/BmtUbRxllIxIuSg== + +"@cspell/dict-google@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-google/-/dict-google-1.0.1.tgz#34701471a616011aeaaf480d4834436b6b6b1da5" + integrity sha512-dQr4M3n95uOhtloNSgB9tYYGXGGEGEykkFyRtfcp5pFuEecYUa0BSgtlGKx9RXVtJtKgR+yFT/a5uQSlt8WjqQ== + +"@cspell/dict-haskell@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-haskell/-/dict-haskell-4.0.1.tgz#e9fca7c452411ff11926e23ffed2b50bb9b95e47" + integrity sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ== + +"@cspell/dict-html-symbol-entities@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.0.tgz#4d86ac18a4a11fdb61dfb6f5929acd768a52564f" + integrity sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw== + +"@cspell/dict-html@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-html/-/dict-html-4.0.5.tgz#03a5182148d80e6c25f71339dbb2b7c5b9894ef8" + integrity sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w== + +"@cspell/dict-java@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@cspell/dict-java/-/dict-java-5.0.7.tgz#c0b32d3c208b6419a5eddd010e87196976be2694" + integrity sha512-ejQ9iJXYIq7R09BScU2y5OUGrSqwcD+J5mHFOKbduuQ5s/Eh/duz45KOzykeMLI6KHPVxhBKpUPBWIsfewECpQ== + +"@cspell/dict-julia@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-julia/-/dict-julia-1.0.1.tgz#900001417f1c4ea689530adfcc034c848458a0aa" + integrity sha512-4JsCLCRhhLMLiaHpmR7zHFjj1qOauzDI5ZzCNQS31TUMfsOo26jAKDfo0jljFAKgw5M2fEG7sKr8IlPpQAYrmQ== + +"@cspell/dict-k8s@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-k8s/-/dict-k8s-1.0.6.tgz#d46c97136f1504b65dfb6a188005d4ac81d3f461" + integrity sha512-srhVDtwrd799uxMpsPOQqeDJY+gEocgZpoK06EFrb4GRYGhv7lXo9Fb+xQMyQytzOW9dw4DNOEck++nacDuymg== + +"@cspell/dict-latex@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-latex/-/dict-latex-4.0.0.tgz#85054903db834ea867174795d162e2a8f0e9c51e" + integrity sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ== + +"@cspell/dict-lorem-ipsum@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.0.tgz#2793a5dbfde474a546b0caecc40c38fdf076306e" + integrity sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw== + +"@cspell/dict-lua@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-lua/-/dict-lua-4.0.3.tgz#2d23c8f7e74b4e62000678d80e7d1ebb10b003e0" + integrity sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg== + +"@cspell/dict-makefile@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-makefile/-/dict-makefile-1.0.0.tgz#5afb2910873ebbc01ab8d9c38661c4c93d0e5a40" + integrity sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ== + +"@cspell/dict-monkeyc@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.6.tgz#042d042fc34a20194c8de032130808f44b241375" + integrity sha512-oO8ZDu/FtZ55aq9Mb67HtaCnsLn59xvhO/t2mLLTHAp667hJFxpp7bCtr2zOrR1NELzFXmKln/2lw/PvxMSvrA== + +"@cspell/dict-node@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-node/-/dict-node-5.0.1.tgz#77e17c576a897a3391fce01c1cc5da60bb4c2268" + integrity sha512-lax/jGz9h3Dv83v8LHa5G0bf6wm8YVRMzbjJPG/9rp7cAGPtdrga+XANFq+B7bY5+jiSA3zvj10LUFCFjnnCCg== + +"@cspell/dict-npm@^5.0.18": + version "5.0.18" + resolved "https://registry.yarnpkg.com/@cspell/dict-npm/-/dict-npm-5.0.18.tgz#7ec5640c97bd25a64de0c9e74eb19dda86fba025" + integrity sha512-weMTyxWpzz19q4wv9n183BtFvdD5fCjtze+bFKpl+4rO/YlPhHL2cXLAeexJz/VDSBecwX4ybTZYoknd1h2J4w== + +"@cspell/dict-php@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@cspell/dict-php/-/dict-php-4.0.8.tgz#fedce3109dff13a0f3d8d88ba604d6edd2b9fb70" + integrity sha512-TBw3won4MCBQ2wdu7kvgOCR3dY2Tb+LJHgDUpuquy3WnzGiSDJ4AVelrZdE1xu7mjFJUr4q48aB21YT5uQqPZA== + +"@cspell/dict-powershell@^5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-powershell/-/dict-powershell-5.0.5.tgz#3319d2fbad740e164a78386d711668bfe335c1f2" + integrity sha512-3JVyvMoDJesAATYGOxcUWPbQPUvpZmkinV3m8HL1w1RrjeMVXXuK7U1jhopSneBtLhkU+9HKFwgh9l9xL9mY2Q== + +"@cspell/dict-public-licenses@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.7.tgz#ccd67a91a6bd5ed4b5117c2f34e9361accebfcb7" + integrity sha512-KlBXuGcN3LE7tQi/GEqKiDewWGGuopiAD0zRK1QilOx5Co8XAvs044gk4MNIQftc8r0nHeUI+irJKLGcR36DIQ== + +"@cspell/dict-python@^4.2.4": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-python/-/dict-python-4.2.4.tgz#add81749939c6f123dbd0662385153506be951e0" + integrity sha512-sCtLBqMreb+8zRW2bXvFsfSnRUVU6IFm4mT6Dc4xbz0YajprbaPPh/kOUTw5IJRP8Uh+FFb7Xp2iH03CNWRq/A== + dependencies: + "@cspell/dict-data-science" "^2.0.1" + +"@cspell/dict-r@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-r/-/dict-r-2.0.1.tgz#73474fb7cce45deb9094ebf61083fbf5913f440a" + integrity sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA== + +"@cspell/dict-ruby@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-ruby/-/dict-ruby-5.0.2.tgz#cf1a71380c633dec0857143d3270cb503b10679a" + integrity sha512-cIh8KTjpldzFzKGgrqUX4bFyav5lC52hXDKo4LbRuMVncs3zg4hcSf4HtURY+f2AfEZzN6ZKzXafQpThq3dl2g== + +"@cspell/dict-rust@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-rust/-/dict-rust-4.0.5.tgz#41f3e26fdd3d121c3a24c122d4a703abbb48c4c3" + integrity sha512-DIvlPRDemjKQy8rCqftAgGNZxY5Bg+Ps7qAIJjxkSjmMETyDgl0KTVuaJPt7EK4jJt6uCZ4ILy96npsHDPwoXA== + +"@cspell/dict-scala@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-scala/-/dict-scala-5.0.3.tgz#85a469b2d139766b6307befc89243928e3d82b39" + integrity sha512-4yGb4AInT99rqprxVNT9TYb1YSpq58Owzq7zi3ZS5T0u899Y4VsxsBiOgHnQ/4W+ygi+sp+oqef8w8nABR2lkg== + +"@cspell/dict-software-terms@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-software-terms/-/dict-software-terms-4.0.6.tgz#df1efb809a50ae4292f85a90d1481dafcc13b414" + integrity sha512-UDhUzNSf7GN529a0Ip9hlSoGbpscz0YlUYBEJmZBXi8otpkrbCJqs50T74Ppd+SWqNil04De8urv4af2c6SY5Q== + +"@cspell/dict-sql@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-sql/-/dict-sql-2.1.5.tgz#068c7a8840d75418fd46a0b062c0ed2d5742f2b8" + integrity sha512-FmxanytHXss7GAWAXmgaxl3icTCW7YxlimyOSPNfm+njqeUDjw3kEv4mFNDDObBJv8Ec5AWCbUDkWIpkE3IpKg== + +"@cspell/dict-svelte@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-svelte/-/dict-svelte-1.0.2.tgz#0c866b08a7a6b33bbc1a3bdbe6a1b484ca15cdaa" + integrity sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q== + +"@cspell/dict-swift@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-swift/-/dict-swift-2.0.1.tgz#06ec86e52e9630c441d3c19605657457e33d7bb6" + integrity sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw== + +"@cspell/dict-terraform@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-terraform/-/dict-terraform-1.0.0.tgz#c7b073bb3a03683f64cc70ccaa55ce9742c46086" + integrity sha512-Ak+vy4HP/bOgzf06BAMC30+ZvL9mzv21xLM2XtfnBLTDJGdxlk/nK0U6QT8VfFLqJ0ZZSpyOxGsUebWDCTr/zQ== + +"@cspell/dict-typescript@^3.1.6": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-typescript/-/dict-typescript-3.1.6.tgz#2d5351786787bf3609da65ba17d9bc345995a36d" + integrity sha512-1beC6O4P/j23VuxX+i0+F7XqPVc3hhiAzGJHEKqnWf5cWAXQtg0xz3xQJ5MvYx2a7iLaSa+lu7+05vG9UHyu9Q== + +"@cspell/dict-vue@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-vue/-/dict-vue-3.0.0.tgz#68ccb432ad93fcb0fd665352d075ae9a64ea9250" + integrity sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A== + +"@cspell/dynamic-import@8.13.3": + version "8.13.3" + resolved "https://registry.yarnpkg.com/@cspell/dynamic-import/-/dynamic-import-8.13.3.tgz#6809ae3c5f46766145ae7f615889a1e1686d59ac" + integrity sha512-YN83CFWnMkt9B0q0RBadfEoptUaDRqBikh8b91MOQ0haEnUo6t57j4jAaLnbIEP4ynzMhgruWFKpIC/QaEtCuA== + dependencies: + import-meta-resolve "^4.1.0" + +"@cspell/strong-weak-map@8.13.3": + version "8.13.3" + resolved "https://registry.yarnpkg.com/@cspell/strong-weak-map/-/strong-weak-map-8.13.3.tgz#069f5e95f70d884415feec1bf53a1c20854b33f9" + integrity sha512-/QYUEthesPuDarOHa6kcWKJmVq0HIotjPrmAWQ5QpH+dDik1Qin4G/9QdnWX75ueR4DC4WFjBNBU14C4TVSwHQ== + +"@cspell/url@8.13.3": + version "8.13.3" + resolved "https://registry.yarnpkg.com/@cspell/url/-/url-8.13.3.tgz#2c400e581570fe2fb95197a2e6c64ceeeb6ceb8b" + integrity sha512-hsxoTnZHwtdR2x9QEE6yfDBB1LUwAj67o1GyKTvI8A2OE/AfzAttirZs+9sxgOGWoBdTOxM9sMLtqB3SxtDB3A== + +"@egoist/tailwindcss-icons@1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@egoist/tailwindcss-icons/-/tailwindcss-icons-1.8.1.tgz#bd47cdd5fc490760561a0bb3d8ea0ff275369405" + integrity sha512-hqZeASrhT6BOeaBHYDPB0yBH/zgMKqmm7y2Rsq0c4iRnNVv1RWEiXMBMJB38JsDMTHME450FKa/wvdaIhED+Iw== + dependencies: + "@iconify/utils" "^2.1.24" + +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + +"@eslint/config-array@^0.17.1": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.17.1.tgz#d9b8b8b6b946f47388f32bedfd3adf29ca8f8910" + integrity sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA== + dependencies: + "@eslint/object-schema" "^2.1.4" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/eslintrc@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.9.0": + version "9.9.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.9.0.tgz#d8437adda50b3ed4401964517b64b4f59b0e2638" + integrity sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug== + +"@eslint/object-schema@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" + integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== + +"@floating-ui/core@^1.6.0": + version "1.6.7" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.7.tgz#7602367795a390ff0662efd1c7ae8ca74e75fb12" + integrity sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g== + dependencies: + "@floating-ui/utils" "^0.2.7" + +"@floating-ui/dom@^1.0.0": + version "1.6.10" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.10.tgz#b74c32f34a50336c86dcf1f1c845cf3a39e26d6f" + integrity sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A== + dependencies: + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.7" + +"@floating-ui/react-dom@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.1.tgz#cca58b6b04fc92b4c39288252e285e0422291fb0" + integrity sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/react@^0.26.16": + version "0.26.22" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.22.tgz#b46f645f9cd19a591da706aed24608c23cdb89a2" + integrity sha512-LNv4azPt8SpT4WW7Kku5JNVjLk2GcS0bGGjFTAgqOONRFo9r/aaGHHPpdiIuQbB1t8shmWyWqTTUDmZ9fcNshg== + dependencies: + "@floating-ui/react-dom" "^2.1.1" + "@floating-ui/utils" "^0.2.7" + tabbable "^6.0.0" + +"@floating-ui/utils@^0.2.7": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.7.tgz#d0ece53ce99ab5a8e37ebdfe5e32452a2bfc073e" + integrity sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA== + +"@headlessui/react@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-2.1.2.tgz#3ca9378d7d0db6aefdb135f957815790786214ef" + integrity sha512-Kb3hgk9gRNRcTZktBrKdHhF3xFhYkca1Rk6e1/im2ENf83dgN54orMW0uSKTXFnUpZOUFZ+wcY05LlipwgZIFQ== + dependencies: + "@floating-ui/react" "^0.26.16" + "@react-aria/focus" "^3.17.1" + "@react-aria/interactions" "^3.21.3" + "@tanstack/react-virtual" "^3.8.1" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" + integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== + +"@iconify-json/heroicons-solid@1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@iconify-json/heroicons-solid/-/heroicons-solid-1.1.12.tgz#04983c5c2c69e18e6e8f989d5711d1aad82c8d08" + integrity sha512-2Fq9fTQIdwivWNeE0hv6qUQ9VcnxtkfzXZp6goWOS5itXcJ5WYnMRQSgoADLPDACc5veWYvDHndDhYNc241ZnQ== + dependencies: + "@iconify/types" "*" + +"@iconify-json/majesticons@1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@iconify-json/majesticons/-/majesticons-1.1.12.tgz#31a2b1900ae28680eaf09ec1ee3346fb2c9a3c69" + integrity sha512-TJiJXwfDhzrtj6tVZkPilqeQst6g0PdkiJRxfd3obByb9KQqFDwq4doyFBeZHJRPKWpiP1AbRK0YNuGLGRyrxQ== + dependencies: + "@iconify/types" "*" + +"@iconify/types@*", "@iconify/types@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" + integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== + +"@iconify/utils@^2.1.24": + version "2.1.30" + resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.1.30.tgz#ea3df5e8c322703082a6d867226e29939f1aae03" + integrity sha512-bY0IO5xLOlbzJBnjWLxknp6Sss3yla03sVY9VeUz9nT6dbc+EGKlLfCt+6uytJnWm5CUvTF/BNotsLWF7kI61A== + dependencies: + "@antfu/install-pkg" "^0.1.1" + "@antfu/utils" "^0.7.10" + "@iconify/types" "^2.0.0" + debug "^4.3.5" + kolorist "^1.8.0" + local-pkg "^0.5.0" + mlly "^1.7.1" + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@markuplint/cli-utils@4.4.3": + version "4.4.3" + resolved "https://registry.yarnpkg.com/@markuplint/cli-utils/-/cli-utils-4.4.3.tgz#93769c4726c7d87aded7625b111f74f2c61c2674" + integrity sha512-Xfp4WkSLlyWflLfN2itw5teyaszqK6Mgt9g0TRmP6GxezmP//rELXjhcFaByg6pjvCSRZ8Di3RuaKc9RS/dzkg== + dependencies: + cli-color "2.0.4" + detect-installed "2.0.4" + eastasianwidth "0.3.0" + enquirer "2.4.1" + has-yarn "3.0.0" + strip-ansi "7.1.0" + +"@markuplint/config-presets@4.5.4": + version "4.5.4" + resolved "https://registry.yarnpkg.com/@markuplint/config-presets/-/config-presets-4.5.4.tgz#3938c509079d03c4519c04f740bb065c245c6ef3" + integrity sha512-Zj9e3IzTiHP4TMfbFZYS5e9wKmh//opGSNmorM5mNxfkM8sdt0q5InY2no6qAU47MuXbzQopjFny3pnT+WFggQ== + +"@markuplint/file-resolver@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@markuplint/file-resolver/-/file-resolver-4.9.0.tgz#65926bc494bd5011fafdbc6a2995b6240c373986" + integrity sha512-oo9meB537devkZP4hqnFPfsblHfjKsIKC7PqlOex6FafU8PldgOGzZUgaBezQmvo+UzYPraVX6t7bNlxkK4xBw== + dependencies: + "@markuplint/html-parser" "4.6.5" + "@markuplint/ml-ast" "4.4.2" + "@markuplint/ml-config" "4.7.2" + "@markuplint/ml-core" "4.8.2" + "@markuplint/ml-spec" "4.6.3" + "@markuplint/parser-utils" "4.6.5" + "@markuplint/selector" "4.6.5" + "@markuplint/shared" "4.4.3" + cosmiconfig "9.0.0" + debug "4.3.5" + glob "10.4.2" + ignore "5.3.1" + import-meta-resolve "4.1.0" + jsonc "2.0.0" + minimatch "9.0.4" + +"@markuplint/html-parser@4.6.5": + version "4.6.5" + resolved "https://registry.yarnpkg.com/@markuplint/html-parser/-/html-parser-4.6.5.tgz#6d268deaa2fc43688ed14f5d0823a2bd29a74174" + integrity sha512-uY4eCtYybrAvDLUymqYNhS2pCdd8iwlIZWESafVcRUQvb579vwqcM9FubC+Zh43LyJNfhrkN9ReUzWSjie+1fA== + dependencies: + "@markuplint/ml-ast" "4.4.2" + "@markuplint/parser-utils" "4.6.5" + parse5 "7.1.2" + type-fest "4.20.1" + +"@markuplint/html-spec@4.8.2": + version "4.8.2" + resolved "https://registry.yarnpkg.com/@markuplint/html-spec/-/html-spec-4.8.2.tgz#2d9b3f2f5d5a303f1f2652a8956036667ae4be46" + integrity sha512-7HmAyqNZrZQd1DkKk5zfal9Q6bp2+iT+mJga2bLkns3ept+JX+QvwX45+1dVP2OKXvbZw1Gc0g2Dk9tG2/lZ5Q== + dependencies: + "@markuplint/ml-spec" "4.6.3" + +"@markuplint/i18n@4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@markuplint/i18n/-/i18n-4.5.1.tgz#cd769a9e14819a24a22dd4c277ab34788104d9a9" + integrity sha512-I0mPNnskOyV1zulPET9alIJF81iZjisfKOJGOWDbOpDIrU7h2u4R1BVVzlxa2aoPoDib4up12pyM6fJ7YSN9+g== + +"@markuplint/jsx-parser@4.7.5": + version "4.7.5" + resolved "https://registry.yarnpkg.com/@markuplint/jsx-parser/-/jsx-parser-4.7.5.tgz#eaf2dbba385711025ded17b85291892f500b61fb" + integrity sha512-Xqfy0tLhnHa253LAN3EPju+hrFml4mg1O51+HDl4TD5nwNaDJvsd7eRQu5+1tIuuicL1DERXvUTwrSN6sgiP6w== + dependencies: + "@markuplint/html-parser" "4.6.5" + "@markuplint/ml-ast" "4.4.2" + "@markuplint/parser-utils" "4.6.5" + "@typescript-eslint/types" "7.14.1" + "@typescript-eslint/typescript-estree" "7.14.1" + +"@markuplint/ml-ast@4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@markuplint/ml-ast/-/ml-ast-4.4.2.tgz#90080443dae5d9fcb74226bf17d96212696bf187" + integrity sha512-KTwDsZtW2t9gN/29QRLyvndf8S05txBPZydtmbX69NQCDHgWEu72QjmFD2cBupIT1qXwIeSIzdhcTke9Ecuo4Q== + +"@markuplint/ml-config@4.7.2": + version "4.7.2" + resolved "https://registry.yarnpkg.com/@markuplint/ml-config/-/ml-config-4.7.2.tgz#8fb186ab99f1c4a7314543998754a1a93b057c98" + integrity sha512-UCwQQHK+A5+tj99w2vSgSTElmeucL+Pqx2lZxm8eR3B6/fl4p2YHlWI7CHAYaq9YoTO7WjOV4KnOz3IvRRCl6A== + dependencies: + "@markuplint/ml-ast" "4.4.2" + "@markuplint/selector" "4.6.5" + "@markuplint/shared" "4.4.3" + "@types/mustache" "4.2.5" + deepmerge "4.3.1" + is-plain-object "5.0.0" + mustache "4.2.0" + type-fest "4.20.1" + +"@markuplint/ml-core@4.8.2": + version "4.8.2" + resolved "https://registry.yarnpkg.com/@markuplint/ml-core/-/ml-core-4.8.2.tgz#01930cb3beb9d28bcb9b6858bff1c8dd72a6bbfa" + integrity sha512-d8UwVtAZ5FrDhU0qJZq6Zf9a6blVEhocQkOzTOn65Pxn7366ybR7b4sthMdTrdJJPh0uje4D+SzByxD0AwshEg== + dependencies: + "@markuplint/config-presets" "4.5.4" + "@markuplint/html-parser" "4.6.5" + "@markuplint/html-spec" "4.8.2" + "@markuplint/i18n" "4.5.1" + "@markuplint/ml-ast" "4.4.2" + "@markuplint/ml-config" "4.7.2" + "@markuplint/ml-spec" "4.6.3" + "@markuplint/parser-utils" "4.6.5" + "@markuplint/selector" "4.6.5" + "@markuplint/shared" "4.4.3" + "@types/debug" "4.1.12" + debug "4.3.5" + is-plain-object "5.0.0" + type-fest "4.20.1" + +"@markuplint/ml-spec@4.6.3": + version "4.6.3" + resolved "https://registry.yarnpkg.com/@markuplint/ml-spec/-/ml-spec-4.6.3.tgz#b656af2a9c3c20ebd00bf6ef11e9eb56f1017e6d" + integrity sha512-Hs5fBHvDVwKPqmBmd4XC+Os0pkrZpZx4zwu5dHh5CAmsMWGRYDILasVX+LeVyfijD6JrUd0iTBPRKNSB+xmwJQ== + dependencies: + "@markuplint/ml-ast" "4.4.2" + "@markuplint/types" "4.5.3" + dom-accessibility-api "0.6.3" + is-plain-object "5.0.0" + type-fest "4.20.1" + +"@markuplint/parser-utils@4.6.5": + version "4.6.5" + resolved "https://registry.yarnpkg.com/@markuplint/parser-utils/-/parser-utils-4.6.5.tgz#564f098974995051cb923d3019442e008067dd22" + integrity sha512-AxZA1Akw/ebUQPWO9HwHhPmUMMmT3nCqlQKxiISHFSXSOcHhld62GgCnBVMPXKGsdivhdDCYJjos7o9mlH8uYg== + dependencies: + "@markuplint/ml-ast" "4.4.2" + "@markuplint/ml-spec" "4.6.3" + "@markuplint/types" "4.5.3" + "@types/uuid" "10.0.0" + debug "4.3.5" + espree "10.1.0" + type-fest "4.20.1" + uuid "10.0.0" + +"@markuplint/react-spec@4.5.5": + version "4.5.5" + resolved "https://registry.yarnpkg.com/@markuplint/react-spec/-/react-spec-4.5.5.tgz#06ffce2eaf8378700add19d36ffe746a840bcdee" + integrity sha512-exEFSIlkCOIB8wUy9grBJD+W8Qdny4m9aRQ3kgUqyiE43YmHc1doyjm9N4fyxFvP7Vv0Z9rCQtrSyftO8WbbMw== + dependencies: + "@markuplint/ml-spec" "4.6.3" + +"@markuplint/rules@4.9.3": + version "4.9.3" + resolved "https://registry.yarnpkg.com/@markuplint/rules/-/rules-4.9.3.tgz#596b4dac68a637e5a5c5fac48edc36222122e2fc" + integrity sha512-lq+cqBHMQHVQvIjk+7g3O4EaMhvQU99ias0+7gq6oR0vsLJcBbYX5vmr8vJl+lVumGFlIcLzvwlouY2uDrvMHg== + dependencies: + "@markuplint/html-spec" "4.8.2" + "@markuplint/ml-core" "4.8.2" + "@markuplint/ml-spec" "4.6.3" + "@markuplint/selector" "4.6.5" + "@markuplint/shared" "4.4.3" + "@markuplint/types" "4.5.3" + "@types/debug" "4.1.12" + "@ungap/structured-clone" "1.2.0" + ansi-colors "4.1.3" + chrono-node "2.7.6" + debug "4.3.5" + type-fest "4.20.1" + +"@markuplint/selector@4.6.5": + version "4.6.5" + resolved "https://registry.yarnpkg.com/@markuplint/selector/-/selector-4.6.5.tgz#dbb833a04684c42bc3b2c6e08e39aedb756c1b70" + integrity sha512-CxvpaE87UzvtYidmPvlPoe1B6XPQ2Jkd7G3s4E9FC4fhv5dzGaQGMqDHVbqDOHEooeJ2QTK8Ikgijbumsxwpzw== + dependencies: + "@markuplint/ml-spec" "4.6.3" + "@types/debug" "4.1.12" + debug "4.3.5" + postcss-selector-parser "6.1.0" + type-fest "4.20.1" + +"@markuplint/shared@4.4.3": + version "4.4.3" + resolved "https://registry.yarnpkg.com/@markuplint/shared/-/shared-4.4.3.tgz#9a811e251049b6aff26430d008864841dc56db8b" + integrity sha512-QIlyIrJJ2WG7c0St/oujUJ62SIzh+YuotTMwsftA6bahScF/j/NhWYLCLI5Wb22H2/H7xmKyHI/bXOyevNuQIw== + dependencies: + html-entities "2.5.2" + +"@markuplint/types@4.5.3": + version "4.5.3" + resolved "https://registry.yarnpkg.com/@markuplint/types/-/types-4.5.3.tgz#66d5ffb99b48836c4c726697dd9ec340ddd4f739" + integrity sha512-WeE2LhNfNbviKZhyRHVFId0xCzN67Wv8zalcVNE8cTcro6F4WOulGANgSqvQ3TuMYSP691UAjgE5w8oA1t4myA== + dependencies: + "@markuplint/shared" "4.4.3" + "@types/css-tree" "2.3.8" + "@types/debug" "4.1.12" + "@types/whatwg-mimetype" "3.0.2" + bcp-47 "2.1.0" + css-tree "2.3.1" + debug "4.3.5" + leven "4.0.0" + type-fest "4.20.1" + whatwg-mimetype "4.0.0" + +"@monaco-editor/loader@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.4.0.tgz#f08227057331ec890fa1e903912a5b711a2ad558" + integrity sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg== + dependencies: + state-local "^1.0.6" + +"@monaco-editor/react@4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.6.0.tgz#bcc68671e358a21c3814566b865a54b191e24119" + integrity sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw== + dependencies: + "@monaco-editor/loader" "^1.4.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@playwright/test@1.46.0": + version "1.46.0" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.46.0.tgz#ccea6d22c40ee7fa567e4192fafbdf2a907e2714" + integrity sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w== + dependencies: + playwright "1.46.0" + +"@react-aria/focus@^3.17.1": + version "3.18.1" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.18.1.tgz#b54b88e78662549ddae917e3143723c8dd7a4e90" + integrity sha512-N0Cy61WCIv+57mbqC7hiZAsB+3rF5n4JKabxUmg/2RTJL6lq7hJ5N4gx75ymKxkN8GnVDwt4pKZah48Wopa5jw== + dependencies: + "@react-aria/interactions" "^3.22.1" + "@react-aria/utils" "^3.25.1" + "@react-types/shared" "^3.24.1" + "@swc/helpers" "^0.5.0" + clsx "^2.0.0" + +"@react-aria/interactions@^3.21.3", "@react-aria/interactions@^3.22.1": + version "3.22.1" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.1.tgz#f2219a100c886cee383da7be9ae05e9dd940d39a" + integrity sha512-5TLzQaDAQQ5C70yG8GInbO4wIylKY67RfTIIwQPGR/4n5OIjbUD8BOj3NuSsuZ/frUPaBXo1VEBBmSO23fxkjw== + dependencies: + "@react-aria/ssr" "^3.9.5" + "@react-aria/utils" "^3.25.1" + "@react-types/shared" "^3.24.1" + "@swc/helpers" "^0.5.0" + +"@react-aria/ssr@^3.9.5": + version "3.9.5" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.5.tgz#775d84f51f90934ff51ae74eeba3728daac1a381" + integrity sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-aria/utils@^3.25.1": + version "3.25.1" + resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.25.1.tgz#f6530ce47aa28617924cc6868b4cf1c113a909c5" + integrity sha512-5Uj864e7T5+yj78ZfLnfHqmypLiqW2mN+nsdslog2z5ssunTqjolVeM15ootXskjISlZ7MojLpq97kIC4nlnAw== + dependencies: + "@react-aria/ssr" "^3.9.5" + "@react-stately/utils" "^3.10.2" + "@react-types/shared" "^3.24.1" + "@swc/helpers" "^0.5.0" + clsx "^2.0.0" + +"@react-stately/utils@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.2.tgz#09377f771592ff537c901aa64178cb3a004a916f" + integrity sha512-fh6OTQtbeQC0ywp6LJuuKs6tKIgFvt/DlIZEcIpGho6/oZG229UnIk6TUekwxnDbumuYyan6D9EgUtEMmT8UIg== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-types/shared@^3.24.1": + version "3.24.1" + resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.24.1.tgz#fa06cb681d144fce9c515d8bd296d81440a45d25" + integrity sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw== + +"@rollup/rollup-android-arm-eabi@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz#c3f5660f67030c493a981ac1d34ee9dfe1d8ec0f" + integrity sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA== + +"@rollup/rollup-android-arm64@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz#64161f0b67050023a3859e723570af54a82cff5c" + integrity sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ== + +"@rollup/rollup-darwin-arm64@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz#25f3d57b1da433097cfebc89341b355901615763" + integrity sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q== + +"@rollup/rollup-darwin-x64@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz#d8ddaffb636cc2f59222c50316e27771e48966df" + integrity sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz#41bd4fcffa20fb84f3dbac6c5071638f46151885" + integrity sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA== + +"@rollup/rollup-linux-arm-musleabihf@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz#842077c5113a747eb5686f19f2f18c33ecc0acc8" + integrity sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw== + +"@rollup/rollup-linux-arm64-gnu@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz#65d1d5b6778848f55b7823958044bf3e8737e5b7" + integrity sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ== + +"@rollup/rollup-linux-arm64-musl@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz#50eef7d6e24d0fe3332200bb666cad2be8afcf86" + integrity sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q== + +"@rollup/rollup-linux-powerpc64le-gnu@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz#8837e858f53c84607f05ad0602943e96d104c6b4" + integrity sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw== + +"@rollup/rollup-linux-riscv64-gnu@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz#c894ade2300caa447757ddf45787cca246e816a4" + integrity sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA== + +"@rollup/rollup-linux-s390x-gnu@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz#5841e5390d4c82dd5cdf7b2c95a830e3c2f47dd3" + integrity sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg== + +"@rollup/rollup-linux-x64-gnu@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz#cc1f26398bf777807a99226dc13f47eb0f6c720d" + integrity sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew== + +"@rollup/rollup-linux-x64-musl@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz#1507465d9056e0502a590d4c1a00b4d7b1fda370" + integrity sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg== + +"@rollup/rollup-win32-arm64-msvc@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz#86a221f01a2c248104dd0defb4da119f2a73642e" + integrity sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA== + +"@rollup/rollup-win32-ia32-msvc@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz#8bc8f77e02760aa664694b4286d6fbea7f1331c5" + integrity sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A== + +"@rollup/rollup-win32-x64-msvc@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz#601fffee719a1e8447f908aca97864eec23b2784" + integrity sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg== + +"@shikijs/core@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.12.1.tgz#32626494bef573cce01f9e0a36d5776cbc1b2e58" + integrity sha512-biCz/mnkMktImI6hMfMX3H9kOeqsInxWEyCHbSlL8C/2TR1FqfmGxTLRNwYCKsyCyxWLbB8rEqXRVZuyxuLFmA== + dependencies: + "@types/hast" "^3.0.4" + +"@shikijs/monaco@^1.12.0": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@shikijs/monaco/-/monaco-1.12.1.tgz#7ab7ca02d3c9f8c48832bc4a5f8a438f89ee8609" + integrity sha512-1VQHS8666UBZVY8i9cn6vNeWFlZfFD4EExC3pgHHksBOCX2ulj5NI2Qw9hYaAqvJzpotpAMwBH/zXmOwvMi2Dg== + dependencies: + "@shikijs/core" "1.12.1" + +"@swc/helpers@^0.5.0": + version "0.5.12" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.12.tgz#37aaca95284019eb5d2207101249435659709f4b" + integrity sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g== + dependencies: + tslib "^2.4.0" + +"@tanstack/react-virtual@^3.8.1": + version "3.8.6" + resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.8.6.tgz#4806eb468668d89399a2520ec8f201fb31302ebe" + integrity sha512-YcOQAxccjIqiC8cQ8QQiDU6F+JZtfpKNvYsw/ju5Q6S5/m9KDs5SaJvKz1kLj3RKNAOBMIFA9snN2MDmyT9lBQ== + dependencies: + "@tanstack/virtual-core" "3.8.6" + +"@tanstack/virtual-core@3.8.6": + version "3.8.6" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.8.6.tgz#ccecf84099a9a0e9732b4f17bf021b82f215d15e" + integrity sha512-UJeU4SBrx3hqULNzJ3oC0kgJ5miIAg+FwomxMTlQNxob6ppTInifANHd9ukETvzdzxr6zt3CjQ0rttQpVjbt6Q== + +"@testing-library/dom@10.4.0": + version "10.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8" + integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.3.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@6.4.8": + version "6.4.8" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz#9c435742b20c6183d4e7034f2b329d562c079daa" + integrity sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw== + dependencies: + "@adobe/css-tools" "^4.4.0" + "@babel/runtime" "^7.9.2" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.6.3" + lodash "^4.17.21" + redent "^3.0.0" + +"@testing-library/react@16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.0.0.tgz#0a1e0c7a3de25841c3591b8cb7fb0cf0c0a27321" + integrity sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ== + dependencies: + "@babel/runtime" "^7.12.5" + +"@testing-library/user-event@14.5.2": + version "14.5.2" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" + integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== + +"@total-typescript/ts-reset@0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@total-typescript/ts-reset/-/ts-reset-0.5.1.tgz#93b0535d00faa588518bcfb0db30182e63e4f7af" + integrity sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ== + +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/css-tree@2.3.8": + version "2.3.8" + resolved "https://registry.yarnpkg.com/@types/css-tree/-/css-tree-2.3.8.tgz#0eabc115e45051b2f7abe51ee1531074b234ed19" + integrity sha512-zABG3nI2UENsx7AQv63tI5/ptoAG/7kQR1H0OvG+WTWYHOR5pfAT3cGgC8SdyCrgX/TTxJBZNmx82IjCXs1juQ== + +"@types/debug@4.1.12": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/estree@1.0.5", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/hast@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" + +"@types/json-schema@7.0.15", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/mustache@4.2.5": + version "4.2.5" + resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-4.2.5.tgz#9129f0d6857f976e00e171bbb3460e4b702f84ef" + integrity sha512-PLwiVvTBg59tGFL/8VpcGvqOu3L4OuveNvPi0EYbWchRdEVP++yRUXJPFl+CApKEq13017/4Nf7aQ5lTtHUNsA== + +"@types/prop-types@*": + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + +"@types/react-dom@18.3.0": + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@18.3.3": + version "18.3.3" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" + integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/semver@7.5.8", "@types/semver@^7.3.12": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/unist@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" + integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== + +"@types/uuid@10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" + integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== + +"@types/whatwg-mimetype@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz#e5e06dcd3e92d4e622ef0129637707d66c28d6a4" + integrity sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA== + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/types@7.14.1": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.14.1.tgz#a43a540dbe5df7f2a11269683d777fc50b4350aa" + integrity sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg== + +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@7.14.1": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz#ba7c9bac8744487749d19569e254d057754a1575" + integrity sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA== + dependencies: + "@typescript-eslint/types" "7.14.1" + "@typescript-eslint/visitor-keys" "7.14.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@^5.58.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/utils@^7.7.1": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@7.14.1": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz#cc79b5ea154aea734b2a13b983670749f5742274" + integrity sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA== + dependencies: + "@typescript-eslint/types" "7.14.1" + eslint-visitor-keys "^3.4.3" + +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== + dependencies: + "@typescript-eslint/types" "7.18.0" + eslint-visitor-keys "^3.4.3" + +"@ungap/structured-clone@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@vitejs/plugin-react@4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz#d0be6594051ded8957df555ff07a991fb618b48e" + integrity sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg== + dependencies: + "@babel/core" "^7.24.5" + "@babel/plugin-transform-react-jsx-self" "^7.24.5" + "@babel/plugin-transform-react-jsx-source" "^7.24.1" + "@types/babel__core" "^7.20.5" + react-refresh "^0.14.2" + +"@vitest/expect@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.0.5.tgz#f3745a6a2c18acbea4d39f5935e913f40d26fa86" + integrity sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA== + dependencies: + "@vitest/spy" "2.0.5" + "@vitest/utils" "2.0.5" + chai "^5.1.1" + tinyrainbow "^1.2.0" + +"@vitest/pretty-format@2.0.5", "@vitest/pretty-format@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.5.tgz#91d2e6d3a7235c742e1a6cc50e7786e2f2979b1e" + integrity sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ== + dependencies: + tinyrainbow "^1.2.0" + +"@vitest/runner@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.0.5.tgz#89197e712bb93513537d6876995a4843392b2a84" + integrity sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig== + dependencies: + "@vitest/utils" "2.0.5" + pathe "^1.1.2" + +"@vitest/snapshot@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.5.tgz#a2346bc5013b73c44670c277c430e0334690a162" + integrity sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew== + dependencies: + "@vitest/pretty-format" "2.0.5" + magic-string "^0.30.10" + pathe "^1.1.2" + +"@vitest/spy@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.5.tgz#590fc07df84a78b8e9dd976ec2090920084a2b9f" + integrity sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA== + dependencies: + tinyspy "^3.0.0" + +"@vitest/utils@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.5.tgz#6f8307a4b6bc6ceb9270007f73c67c915944e926" + integrity sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ== + dependencies: + "@vitest/pretty-format" "2.0.5" + estree-walker "^3.0.3" + loupe "^3.1.1" + tinyrainbow "^1.2.0" + +"@webcontainer/api@1.3.0-internal.2": + version "1.3.0-internal.2" + resolved "https://registry.yarnpkg.com/@webcontainer/api/-/api-1.3.0-internal.2.tgz#26afa0548bcf468b74f03dc56993ba287ebfb0e8" + integrity sha512-lLSlSehbuYc9E7ecK+tMRX4BbWETNX1OgRlS+NerQh3X3sHNbxLD86eScEMAiA5VBnUeSnLtLe7eC/ftM8fR3Q== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.11.3, acorn@^8.12.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + +agent-base@^7.0.2, agent-base@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@4.1.3, ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-styles@^6.1.0, ansi-styles@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@5.3.0, aria-query@^5.0.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array-timsort@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" + integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +autoprefixer@10.4.20: + version "10.4.20" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" + integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== + dependencies: + browserslist "^4.23.3" + caniuse-lite "^1.0.30001646" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.0.1" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bcp-47@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/bcp-47/-/bcp-47-2.1.0.tgz#7e80734c3338fe8320894981dccf4968c3092df6" + integrity sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w== + dependencies: + is-alphabetical "^2.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.23.1, browserslist@^4.23.3: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== + dependencies: + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0, callsites@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001646: + version "1.0.30001651" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz#52de59529e8b02b1aedcaaf5c05d9e23c0c28138" + integrity sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg== + +chai@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.1.tgz#f035d9792a22b481ead1c65908d14bb62ec1c82c" + integrity sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + +chalk-template@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-1.1.0.tgz#ffc55db6dd745e9394b85327c8ac8466edb7a7b1" + integrity sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg== + dependencies: + chalk "^5.2.0" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.2.0, chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== + +chokidar@3.6.0, chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrono-node@2.7.6: + version "2.7.6" + resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-2.7.6.tgz#46d338e5c515b4dcedc5b5f56b1239b0217bf4aa" + integrity sha512-yugKSRLHc6B6kXxm/DwNc94zhaddAjCSO9IOGH3w7NIWNM+gUoLl/2/XLndiw4I+XhU4H2LOhC5Ab2JjS6JWsA== + dependencies: + dayjs "^1.10.0" + +clear-module@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/clear-module/-/clear-module-4.1.2.tgz#5a58a5c9f8dccf363545ad7284cad3c887352a80" + integrity sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw== + dependencies: + parent-module "^2.0.0" + resolve-from "^5.0.0" + +cli-color@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.4.tgz#d658080290968816b322248b7306fad2346fb2c8" + integrity sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA== + dependencies: + d "^1.0.1" + es5-ext "^0.10.64" + es6-iterator "^2.0.3" + memoizee "^0.4.15" + timers-ext "^0.1.7" + +clsx@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +comment-json@^4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.2.5.tgz#482e085f759c2704b60bc6f97f55b8c01bc41e70" + integrity sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw== + dependencies: + array-timsort "^1.0.3" + core-util-is "^1.0.3" + esprima "^4.0.1" + has-own-prop "^2.0.0" + repeat-string "^1.6.1" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +confbox@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.7.tgz#ccfc0a2bcae36a84838e83a3b7f770fb17d6c579" + integrity sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +core-util-is@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cspell-config-lib@8.13.3: + version "8.13.3" + resolved "https://registry.yarnpkg.com/cspell-config-lib/-/cspell-config-lib-8.13.3.tgz#06e574328d701dc34410f4b8fd14e8fd07b4d152" + integrity sha512-dzVdar8Kenwxho0PnUxOxwjUvyFYn6Q9mQAMHcQNXQrvo32bdpoF+oNtWC/5FfrQgUgyl19CVQ607bRigYWoOQ== + dependencies: + "@cspell/cspell-types" "8.13.3" + comment-json "^4.2.5" + yaml "^2.5.0" + +cspell-dictionary@8.13.3: + version "8.13.3" + resolved "https://registry.yarnpkg.com/cspell-dictionary/-/cspell-dictionary-8.13.3.tgz#622798ef6f8575d9ceb21dba20e8eace4177f74b" + integrity sha512-DQ3Tee7LIoy+9Mu52ht32O/MNBZ6i4iUeSTY2sMDDwogno3361BLRyfEjyiYNo3Fqf0Pcnt5MqY2DqIhrF/H/Q== + dependencies: + "@cspell/cspell-pipe" "8.13.3" + "@cspell/cspell-types" "8.13.3" + cspell-trie-lib "8.13.3" + fast-equals "^5.0.1" + +cspell-gitignore@8.13.3: + version "8.13.3" + resolved "https://registry.yarnpkg.com/cspell-gitignore/-/cspell-gitignore-8.13.3.tgz#d9bb175feb86899ed2e2af1bd714785f02b08aaa" + integrity sha512-0OZXuP33CXV4P95ySHGNqhq3VR5RaLwpyo0nGvLHOjPm3mCsQSjURLBKHvyQ3r2M7LWsGV1Xc81FfTx30FBZLg== + dependencies: + "@cspell/url" "8.13.3" + cspell-glob "8.13.3" + cspell-io "8.13.3" + find-up-simple "^1.0.0" + +cspell-glob@8.13.3: + version "8.13.3" + resolved "https://registry.yarnpkg.com/cspell-glob/-/cspell-glob-8.13.3.tgz#7533828ac52eb7ae87e8d58869ffc6fb9299a24e" + integrity sha512-+jGIMYyKDLmoOJIxNPXRdI7utcvw+9FMSmj1ApIdEff5dCkehi0gtzK4H7orXGYEvRdKQvfaXiyduVi79rXsZQ== + dependencies: + "@cspell/url" "8.13.3" + micromatch "^4.0.7" + +cspell-grammar@8.13.3: + version "8.13.3" + resolved "https://registry.yarnpkg.com/cspell-grammar/-/cspell-grammar-8.13.3.tgz#147e97a54ad2c8e4925bd84ae2afed7ff14960e2" + integrity sha512-xPSgKk9HY5EsI8lkMPC9hiZCeAUs+RY/IVliUBW1xEicAJhP4RZIGRdIwtDNNJGwKfNXazjqYhcS4LS0q7xPAQ== + dependencies: + "@cspell/cspell-pipe" "8.13.3" + "@cspell/cspell-types" "8.13.3" + +cspell-io@8.13.3: + version "8.13.3" + resolved "https://registry.yarnpkg.com/cspell-io/-/cspell-io-8.13.3.tgz#9f2323aa7ea6edce84c16964c95ee4c83b5b880e" + integrity sha512-AeMIkz7+4VuJaPKO/v1pUpyUSOOTyLOAfzeTRRAXEt+KRKOUe36MyUmBMza6gzNcX2yD04VgJukRL408TY9ntw== + dependencies: + "@cspell/cspell-service-bus" "8.13.3" + "@cspell/url" "8.13.3" + +cspell-lib@8.13.3: + version "8.13.3" + resolved "https://registry.yarnpkg.com/cspell-lib/-/cspell-lib-8.13.3.tgz#4d2516bbb09148079d634f73c65ffa05a62ae02c" + integrity sha512-aEqxIILeqDtNoCa47/oSl5c926b50ue3PobYs4usn0Ymf0434RopCP+DCGsF7BPtog4j4XWnEmvkcJs57DYWDg== + dependencies: + "@cspell/cspell-bundled-dicts" "8.13.3" + "@cspell/cspell-pipe" "8.13.3" + "@cspell/cspell-resolver" "8.13.3" + "@cspell/cspell-types" "8.13.3" + "@cspell/dynamic-import" "8.13.3" + "@cspell/strong-weak-map" "8.13.3" + "@cspell/url" "8.13.3" + clear-module "^4.1.2" + comment-json "^4.2.5" + cspell-config-lib "8.13.3" + cspell-dictionary "8.13.3" + cspell-glob "8.13.3" + cspell-grammar "8.13.3" + cspell-io "8.13.3" + cspell-trie-lib "8.13.3" + env-paths "^3.0.0" + fast-equals "^5.0.1" + gensequence "^7.0.0" + import-fresh "^3.3.0" + resolve-from "^5.0.0" + vscode-languageserver-textdocument "^1.0.12" + vscode-uri "^3.0.8" + xdg-basedir "^5.1.0" + +cspell-trie-lib@8.13.3: + version "8.13.3" + resolved "https://registry.yarnpkg.com/cspell-trie-lib/-/cspell-trie-lib-8.13.3.tgz#3fe376106faef310c3874685fc6e2ddaa2551066" + integrity sha512-Z0iLGi9HI+Vf+WhVVeru6dYgQdtaYCKWRlc1SayLfAZhw9BcjrXL8KTXDfAfv/lUgnRu6xwP1isLlDNZECsKVQ== + dependencies: + "@cspell/cspell-pipe" "8.13.3" + "@cspell/cspell-types" "8.13.3" + gensequence "^7.0.0" + +cspell@8.13.3: + version "8.13.3" + resolved "https://registry.yarnpkg.com/cspell/-/cspell-8.13.3.tgz#cebe77faeed2d6d3e0a6dc244d5c1c3fad5b3ad5" + integrity sha512-2wv4Eby7g8wDB553fI8IoZjyitoKrD2kmtdeoYUN2EjVs3RMpIOver3fL+0VaFAaN0uLfAoeAAIB5xJEakvZYQ== + dependencies: + "@cspell/cspell-json-reporter" "8.13.3" + "@cspell/cspell-pipe" "8.13.3" + "@cspell/cspell-types" "8.13.3" + "@cspell/dynamic-import" "8.13.3" + "@cspell/url" "8.13.3" + chalk "^5.3.0" + chalk-template "^1.1.0" + commander "^12.1.0" + cspell-dictionary "8.13.3" + cspell-gitignore "8.13.3" + cspell-glob "8.13.3" + cspell-io "8.13.3" + cspell-lib "8.13.3" + fast-glob "^3.3.2" + fast-json-stable-stringify "^2.1.0" + file-entry-cache "^9.0.0" + get-stdin "^9.0.0" + semver "^7.6.3" + strip-ansi "^7.1.0" + +css-tree@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssstyle@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.0.1.tgz#ef29c598a1e90125c870525490ea4f354db0660a" + integrity sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ== + dependencies: + rrweb-cssom "^0.6.0" + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +d@1, d@^1.0.1, d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de" + integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== + dependencies: + es5-ext "^0.10.64" + type "^2.7.2" + +data-urls@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde" + integrity sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg== + dependencies: + whatwg-mimetype "^4.0.0" + whatwg-url "^14.0.0" + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +dayjs@^1.10.0: + version "1.11.12" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.12.tgz#5245226cc7f40a15bf52e0b99fd2a04669ccac1d" + integrity sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg== + +debug@4, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + +debug@4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + +decimal.js@^10.4.3: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +detect-installed@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-installed/-/detect-installed-2.0.4.tgz#a0850465e7c3ebcff979d6b6535ad344b80dd7c5" + integrity sha512-IpGo06Ff/rMGTKjFvVPbY9aE4mRT2XP3eYHC/ZS25LKDr2h8Gbv74Ez2q/qd7IYDqD9ZjI/VGedHNXsbKZ/Eig== + dependencies: + get-installed-path "^2.0.3" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@0.6.3, dom-accessibility-api@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== + +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +eastasianwidth@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.3.0.tgz#f40078088bf791bc0bb2583a6d439e9e5d0d116b" + integrity sha512-JqasYqGO32J2c91uYKdhu1vNmXGADaLB7OOgjAhjMvpjdvGb0tsYcuwn381MwqCg4YBQDtByQcNlFYuv2kmOug== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +electron-to-chromium@^1.5.4: + version "1.5.6" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.6.tgz#c81d9938b5a877314ad370feb73b4e5409b36abd" + integrity sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enquirer@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +env-paths@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" + integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-iterator-helpers@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14, es5-ext@~0.10.2: + version "0.10.64" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714" + integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + esniff "^2.0.1" + next-tick "^1.1.0" + +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c" + integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== + dependencies: + d "^1.0.2" + ext "^1.7.0" + +es6-weak-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-plugin-react-hooks@4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== + +eslint-plugin-react-refresh@0.4.9: + version "0.4.9" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.9.tgz#bf870372b353b12e1e6fb7fc41b282d9cbc8d93d" + integrity sha512-QK49YrBAo5CLNLseZ7sZgvgTy21E6NEw22eZqc4teZfH8pxV3yXc9XXOYfUI6JNpw7mfHNkAeWtBxrTyykB6HA== + +eslint-plugin-react@7.35.0: + version "7.35.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz#00b1e4559896710e58af6358898f2ff917ea4c41" + integrity sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.2" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.19" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.0" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.11" + string.prototype.repeat "^1.0.0" + +eslint-plugin-testing-library@6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.3.0.tgz#9c31a9941a860efdff3c06180151ab9c8142f685" + integrity sha512-GYcEErTt6EGwE0bPDY+4aehfEBpB2gDBFKohir8jlATSUvzStEyzCx8QWB/14xeKc/AwyXkzScSzMHnFojkWrA== + dependencies: + "@typescript-eslint/utils" "^5.58.0" + +eslint-plugin-vitest@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-vitest/-/eslint-plugin-vitest-0.5.4.tgz#2838a40ee116ba7c15eb6132df31371d960e3bf5" + integrity sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ== + dependencies: + "@typescript-eslint/utils" "^7.7.1" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.0.2.tgz#5cbb33d4384c9136083a71190d548158fe128f94" + integrity sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" + integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== + +eslint@9.9.0: + version "9.9.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.9.0.tgz#8d214e69ae4debeca7ae97daebbefe462072d975" + integrity sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.11.0" + "@eslint/config-array" "^0.17.1" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "9.9.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.3.0" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.0.2" + eslint-visitor-keys "^4.0.0" + espree "^10.1.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +esniff@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" + integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== + dependencies: + d "^1.0.1" + es5-ext "^0.10.62" + event-emitter "^0.3.5" + type "^2.7.2" + +espree@10.1.0, espree@^10.0.1, espree@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.1.0.tgz#8788dae611574c0f070691f522e4116c5a11fc56" + integrity sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA== + dependencies: + acorn "^8.12.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.0.0" + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== + dependencies: + d "1" + es5-ext "~0.10.14" + +execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== + dependencies: + homedir-polyfill "^1.0.1" + +ext@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-equals@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d" + integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ== + +fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-safe-stringify@^2.0.6: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +file-entry-cache@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-9.0.0.tgz#4478e7ceaa5191fa9676a2daa7030211c31b1e7e" + integrity sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw== + dependencies: + flat-cache "^5.0.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up-simple@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.0.tgz#21d035fde9fdbd56c8f4d2f63f32fd93a1cfc368" + integrity sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw== + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flat-cache@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-5.0.0.tgz#26c4da7b0f288b408bb2b506b2cb66c240ddf062" + integrity sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ== + dependencies: + flatted "^3.3.1" + keyv "^4.5.4" + +flatted@^3.2.9, flatted@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +fsevents@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensequence@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/gensequence/-/gensequence-7.0.0.tgz#bb6aedec8ff665e3a6c42f92823121e3a6ea7718" + integrity sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-func-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +get-installed-path@^2.0.3: + version "2.1.1" + resolved "https://registry.yarnpkg.com/get-installed-path/-/get-installed-path-2.1.1.tgz#a1f33dc6b8af542c9331084e8edbe37fe2634152" + integrity sha512-Qkn9eq6tW5/q9BDVdMpB8tOHljX9OSP0jRC5TRNVA4qRc839t4g8KQaR8t0Uv0EFVL0MlyG7m/ofjEgAROtYsA== + dependencies: + global-modules "1.0.0" + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-stdin@9.0.0, get-stdin@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" + integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@10.4.2: + version "10.4.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5" + integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== + dependencies: + ini "4.1.1" + +global-modules@1.0.0, global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globalthis@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.15: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-own-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-own-prop/-/has-own-prop-2.0.0.tgz#f0f95d58f65804f5d218db32563bb85b8e0417af" + integrity sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +has-yarn@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" + integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +html-encoding-sniffer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz#696df529a7cfd82446369dc5193e590a3735b448" + integrity sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ== + dependencies: + whatwg-encoding "^3.1.1" + +html-entities@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" + integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== + +http-proxy-agent@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +https-proxy-agent@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + dependencies: + agent-base "^7.0.2" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ignore@5.3.1, ignore@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-meta-resolve@4.1.0, import-meta-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" + integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +invert-kv@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-3.0.1.tgz#a93c7a3d4386a1dc8325b97da9bb1620c0282523" + integrity sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw== + +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" + integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== + dependencies: + hasown "^2.0.2" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-object@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-promise@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jiti@^1.21.0: + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@24.1.1: + version "24.1.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-24.1.1.tgz#f41df8f4f3b2fbfa7e1bdc5df62c9804fd14a9d0" + integrity sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ== + dependencies: + cssstyle "^4.0.1" + data-urls "^5.0.0" + decimal.js "^10.4.3" + form-data "^4.0.0" + html-encoding-sniffer "^4.0.0" + http-proxy-agent "^7.0.2" + https-proxy-agent "^7.0.5" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.12" + parse5 "^7.1.2" + rrweb-cssom "^0.7.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.4" + w3c-xmlserializer "^5.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^3.1.1" + whatwg-mimetype "^4.0.0" + whatwg-url "^14.0.0" + ws "^8.18.0" + xml-name-validator "^5.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-parse-even-better-errors@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz#b43d35e89c0f3be6b5fbbe9dc6c82467b30c28da" + integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/jsonc/-/jsonc-2.0.0.tgz#9e2a25100d164a9bb864c57517563717fa882551" + integrity sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw== + dependencies: + fast-safe-stringify "^2.0.6" + graceful-fs "^4.1.15" + mkdirp "^0.5.1" + parse-json "^4.0.0" + strip-bom "^4.0.0" + strip-json-comments "^3.0.1" + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kolorist@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" + integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== + +lcid@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-3.1.1.tgz#9030ec479a058fc36b5e8243ebaac8b6ac582fd0" + integrity sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg== + dependencies: + invert-kv "^3.0.0" + +leven@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-4.0.0.tgz#b9c39c803f835950fabef9e122a9b47b95708710" + integrity sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lilconfig@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +local-pkg@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c" + integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== + dependencies: + mlly "^1.4.2" + pkg-types "^1.0.3" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loupe@^3.1.0, loupe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.1.tgz#71d038d59007d890e3247c5db97c1ec5a92edc54" + integrity sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw== + dependencies: + get-func-name "^2.0.1" + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + integrity sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ== + dependencies: + es5-ext "~0.10.2" + +lz-string@1.5.0, lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + +magic-string@^0.30.10: + version "0.30.11" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" + integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + +markuplint@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/markuplint/-/markuplint-4.9.2.tgz#42592560790f0975c3c9f0413ed23f056752ab67" + integrity sha512-t7yvzHy7x2eaHWarMLpLAo3oqXhmZA9wwN922t1cauDhEQdnCTXkS5KL3q4WwadnF8kKUfpgJHPM8Q4epFv/6g== + dependencies: + "@markuplint/cli-utils" "4.4.3" + "@markuplint/file-resolver" "4.9.0" + "@markuplint/html-parser" "4.6.5" + "@markuplint/html-spec" "4.8.2" + "@markuplint/i18n" "4.5.1" + "@markuplint/ml-ast" "4.4.2" + "@markuplint/ml-config" "4.7.2" + "@markuplint/ml-core" "4.8.2" + "@markuplint/ml-spec" "4.6.3" + "@markuplint/rules" "4.9.3" + "@markuplint/shared" "4.4.3" + "@types/debug" "4.1.12" + chokidar "3.6.0" + debug "4.3.5" + get-stdin "9.0.0" + meow "13.2.0" + os-locale "6.0.2" + strict-event-emitter "0.5.1" + strip-ansi "7.1.0" + type-fest "4.20.1" + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + +memoizee@^0.4.15: + version "0.4.17" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.17.tgz#942a5f8acee281fa6fb9c620bddc57e3b7382949" + integrity sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA== + dependencies: + d "^1.0.2" + es5-ext "^0.10.64" + es6-weak-map "^2.0.3" + event-emitter "^0.3.5" + is-promise "^2.2.2" + lru-queue "^0.1.0" + next-tick "^1.1.0" + timers-ext "^0.1.7" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +meow@13.2.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" + integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimatch@9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.0, minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mlly@^1.4.2, mlly@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.1.tgz#e0336429bb0731b6a8e887b438cbdae522c8f32f" + integrity sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA== + dependencies: + acorn "^8.11.3" + pathe "^1.1.2" + pkg-types "^1.1.1" + ufo "^1.5.3" + +monaco-editor@0.50.0: + version "0.50.0" + resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.50.0.tgz#44e62b124c8aed224e1d310bbbe6ffd6d5122413" + integrity sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mustache@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-run-all2@6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/npm-run-all2/-/npm-run-all2-6.2.2.tgz#cd98d7c94dfa92e36724a1064609cca7a8991f5f" + integrity sha512-Q+alQAGIW7ZhKcxLt8GcSi3h3ryheD6xnmXahkMRVM5LYmajcUrSITm8h+OPC9RYWMV2GR0Q1ntTUCfxaNoOJw== + dependencies: + ansi-styles "^6.2.1" + cross-spawn "^7.0.3" + memorystream "^0.3.1" + minimatch "^9.0.0" + pidtree "^0.6.0" + read-package-json-fast "^3.0.2" + shell-quote "^1.7.3" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + +nwsapi@^2.2.12: + version "2.2.12" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" + integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.values@^1.1.6, object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +os-locale@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-6.0.2.tgz#2e5122600f48cd9b846524c07f898db1c596bf20" + integrity sha512-qIb8bzRqaN/vVqEYZ7lTAg6PonskO7xOmM7OClD28F6eFa4s5XGe4bGpHUHMoCHbNNuR0pDYFeSLiW5bnjWXIA== + dependencies: + lcid "^3.1.1" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parent-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-2.0.0.tgz#fa71f88ff1a50c27e15d8ff74e0e3a9523bf8708" + integrity sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg== + dependencies: + callsites "^3.1.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + +parse5@7.1.2, parse5@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== + +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-types@^1.0.3, pkg-types@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.1.3.tgz#161bb1242b21daf7795036803f28e30222e476e3" + integrity sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA== + dependencies: + confbox "^0.1.7" + mlly "^1.7.1" + pathe "^1.1.2" + +playwright-core@1.46.0: + version "1.46.0" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.46.0.tgz#2336ac453a943abf0dc95a76c117f9d3ebd390eb" + integrity sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A== + +playwright@1.46.0: + version "1.46.0" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.46.0.tgz#c7ff490deae41fc1e814bf2cb62109dd9351164d" + integrity sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw== + dependencies: + playwright-core "1.46.0" + optionalDependencies: + fsevents "2.3.2" + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + +postcss-nested@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" + integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== + dependencies: + postcss-selector-parser "^6.1.1" + +postcss-selector-parser@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" + integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz#5be94b277b8955904476a2400260002ce6c56e38" + integrity sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.41, postcss@^8.4.23, postcss@^8.4.40: + version "8.4.41" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" + integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.1" + source-map-js "^1.2.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-plugin-tailwindcss@0.6.6: + version "0.6.6" + resolved "https://registry.yarnpkg.com/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.6.tgz#93e524d3c30f3fb45dc9e99de985b2a584ff063f" + integrity sha512-OPva5S7WAsPLEsOuOWXATi13QrCKACCiIonFgIR6V4lYv4QLp++UXVhZSzRbZxXGimkQtQT86CC6fQqTOybGng== + +prettier@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +prop-types@^15.5.7, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-dom@18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-refresh@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" + integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== + +react-split@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/react-split/-/react-split-2.0.14.tgz#ef198259bf43264d605f792fb3384f15f5b34432" + integrity sha512-bKWydgMgaKTg/2JGQnaJPg51T6dmumTWZppFgEbbY0Fbme0F5TuatAScCLaqommbGQQf/ZT1zaejuPDriscISA== + dependencies: + prop-types "^15.5.7" + split.js "^1.6.0" + +react@18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +read-package-json-fast@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== + dependencies: + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-dir@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.1.7, resolve@^1.22.2: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rollup@^4.13.0: + version "4.20.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.20.0.tgz#f9d602161d29e178f0bf1d9f35f0a26f83939492" + integrity sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.20.0" + "@rollup/rollup-android-arm64" "4.20.0" + "@rollup/rollup-darwin-arm64" "4.20.0" + "@rollup/rollup-darwin-x64" "4.20.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.20.0" + "@rollup/rollup-linux-arm-musleabihf" "4.20.0" + "@rollup/rollup-linux-arm64-gnu" "4.20.0" + "@rollup/rollup-linux-arm64-musl" "4.20.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.20.0" + "@rollup/rollup-linux-riscv64-gnu" "4.20.0" + "@rollup/rollup-linux-s390x-gnu" "4.20.0" + "@rollup/rollup-linux-x64-gnu" "4.20.0" + "@rollup/rollup-linux-x64-musl" "4.20.0" + "@rollup/rollup-win32-arm64-msvc" "4.20.0" + "@rollup/rollup-win32-ia32-msvc" "4.20.0" + "@rollup/rollup-win32-x64-msvc" "4.20.0" + fsevents "~2.3.2" + +rrweb-cssom@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" + integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== + +rrweb-cssom@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz#c73451a484b86dd7cfb1e0b2898df4b703183e4b" + integrity sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +semver@7.6.3, semver@^7.3.7, semver@^7.6.0, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +shiki@^1.12.0: + version "1.12.1" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.12.1.tgz#72d9d230a8d68ddaf8cf7c94a1dc6a5f2625324e" + integrity sha512-nwmjbHKnOYYAe1aaQyEBHvQymJgfm86ZSS7fT8OaPRr4sbAcBNz7PbfAikMEFSDQ6se2j2zobkXvVKcBOm0ysg== + dependencies: + "@shikijs/core" "1.12.1" + "@types/hast" "^3.0.4" + +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1, signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-js@^1.0.1, source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +split.js@^1.6.0: + version "1.6.5" + resolved "https://registry.yarnpkg.com/split.js/-/split.js-1.6.5.tgz#f7f61da1044c9984cb42947df4de4fadb5a3f300" + integrity sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw== + +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +state-local@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" + integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w== + +std-env@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== + +strict-event-emitter@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" + integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@7.1.0, strip-ansi@^7.0.1, strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.1.tgz#0d8b7d01b23848ed7dbdf4baaaa31a8250d8cfa0" + integrity sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw== + +strip-json-comments@^3.0.1, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +sucrase@^3.32.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tabbable@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== + +tailwindcss@3.4.9: + version "3.4.9" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.9.tgz#9e04cddce1924d530df62af37d3520f0e2a9d85e" + integrity sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.0" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +timers-ext@^0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.8.tgz#b4e442f10b7624a29dd2aa42c295e257150cf16c" + integrity sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww== + dependencies: + es5-ext "^0.10.64" + next-tick "^1.1.0" + +tinybench@^2.8.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinypool@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.0.tgz#a68965218e04f4ad9de037d2a1cd63cda9afb238" + integrity sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ== + +tinyrainbow@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" + integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== + +tinyspy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.0.tgz#cb61644f2713cd84dee184863f4642e06ddf0585" + integrity sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tough-cookie@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.0.0.tgz#3b46d583613ec7283020d79019f1335723801cec" + integrity sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g== + dependencies: + punycode "^2.3.1" + +ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.4.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@4.20.1: + version "4.20.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.20.1.tgz#d97bb1e923bf524e5b4b43421d586760fb2ee8be" + integrity sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg== + +type@^2.7.2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.3.tgz#436981652129285cc3ba94f392886c2637ea0486" + integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ== + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typescript@5.5.4: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + +ufo@^1.5.3: + version "1.5.4" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" + integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== + +vite-node@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.0.5.tgz#36d909188fc6e3aba3da5fc095b3637d0d18e27b" + integrity sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q== + dependencies: + cac "^6.7.14" + debug "^4.3.5" + pathe "^1.1.2" + tinyrainbow "^1.2.0" + vite "^5.0.0" + +vite@5.4.0, vite@^5.0.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.0.tgz#11dca8a961369ba8b5cae42d068c7ad684d5370f" + integrity sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.40" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + +vitest@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.0.5.tgz#2f15a532704a7181528e399cc5b754c7f335fd62" + integrity sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA== + dependencies: + "@ampproject/remapping" "^2.3.0" + "@vitest/expect" "2.0.5" + "@vitest/pretty-format" "^2.0.5" + "@vitest/runner" "2.0.5" + "@vitest/snapshot" "2.0.5" + "@vitest/spy" "2.0.5" + "@vitest/utils" "2.0.5" + chai "^5.1.1" + debug "^4.3.5" + execa "^8.0.1" + magic-string "^0.30.10" + pathe "^1.1.2" + std-env "^3.7.0" + tinybench "^2.8.0" + tinypool "^1.0.0" + tinyrainbow "^1.2.0" + vite "^5.0.0" + vite-node "2.0.5" + why-is-node-running "^2.3.0" + +vscode-languageserver-textdocument@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz#457ee04271ab38998a093c68c2342f53f6e4a631" + integrity sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== + +vscode-uri@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" + integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== + +w3c-xmlserializer@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz#f925ba26855158594d907313cedd1476c5967f6c" + integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== + dependencies: + xml-name-validator "^5.0.0" + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5" + integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@4.0.0, whatwg-mimetype@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" + integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== + +whatwg-url@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.0.0.tgz#00baaa7fd198744910c4b1ef68378f2200e4ceb6" + integrity sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw== + dependencies: + tr46 "^5.0.0" + webidl-conversions "^7.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" + integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== + dependencies: + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.2" + which-typed-array "^1.1.15" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^1.2.14: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +ws@^8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== + +xml-name-validator@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673" + integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xterm@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.3.0.tgz#867daf9cc826f3d45b5377320aabd996cb0fce46" + integrity sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yaml@^2.3.4, yaml@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d" + integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==