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 b82bb8b..91b4c81 100644 Binary files a/README.md and b/README.md differ diff --git a/__mocks__/rule.ts b/__mocks__/rule.ts new file mode 100644 index 0000000..c9eb6e7 --- /dev/null +++ b/__mocks__/rule.ts @@ -0,0 +1,2886 @@ +const cssSyntax = { + type: 'string', + enum: ["<'--*'>", "<'-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 0000000..6b367a8 Binary files /dev/null and b/public/vscode.png differ diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..eef220f --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,449 @@ +import type { ConsoleOutputRef } from './components/ConsoleOutput'; +import type { ExampleData } from './examples'; +import type { DistTag } from './modules/dist-tag'; +import type { PlaygroundValues } from './modules/save-values'; +import type { Violations } from './modules/violations'; +import type { Config } from '@markuplint/ml-config'; + +import { Popover, PopoverButton, PopoverPanel, Tab, TabGroup, TabList, TabPanel, TabPanels } from '@headlessui/react'; +import { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react'; +import Split from 'react-split'; + +import logo from './assets/images/logo-horizontal.svg'; +import { CodeEditor } from './components/CodeEditor'; +import { ConfigEditor } from './components/ConfigEditor'; +import { ConfigForm } from './components/ConfigForm'; +import { ConsoleOutput } from './components/ConsoleOutput'; +import { DependencyPanel } from './components/DependencyPanel'; +import { ExampleSelector } from './components/ExampleSelector'; +import { ProblemsOutput } from './components/ProblemsOutput'; +import { examples } from './examples'; +import { debounce } from './modules/debounce'; +import { parseJsonc } from './modules/json'; +import { loadValues, saveValues } from './modules/save-values'; +import { setupContainerServer } from './server'; + +const defaultCategory = examples[Object.keys(examples).sort()[0]].examples; +const defaultExample = defaultCategory[Object.keys(defaultCategory).sort()[0]]; + +let boot = false; + +const fallbackValues = { + code: '', + codeFileType: '.html', + config: '', +} as const satisfies PlaygroundValues; +const initialValues = { + ...fallbackValues, + ...(loadValues() ?? defaultExample), +} as const; +const { config: initialConfig, codeFileType: initialCodeFileType, code: initialCode } = initialValues; + +type StringSet = Readonly>; +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 ( +
+ +

+ + Learn more about using to besides HTML + (Open in new tab) + +

+
+ ); +}; 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==