` tag."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "XmlWrongRootElement",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "XML",
+ "index": 50,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlUnknownAttribute",
+ "shortDescription": {
+ "text": "Unknown attribute"
+ },
+ "fullDescription": {
+ "text": "Reports an unknown HTML attribute. Suggests configuring attributes that should not be reported.",
+ "markdown": "Reports an unknown HTML attribute. Suggests configuring attributes that should not be reported."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "HtmlUnknownAttribute",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpRedundantEscape",
+ "shortDescription": {
+ "text": "Redundant character escape"
+ },
+ "fullDescription": {
+ "text": "Reports redundant character escape sequences that can be replaced with unescaped characters preserving the meaning. Many escape sequences that are necessary outside of a character class are redundant inside square brackets '[]' of a character class. Although unescaped opening curly braces '{' outside of character classes are allowed in some dialects (JavaScript, Python, and so on), it can cause confusion and make the pattern less portable, because there are dialects that require escaping curly braces as characters. For this reason the inspection does not report escaped opening curly braces. Example: '\\-\\;[\\.]' After the quick-fix is applied: '-;[.]' The Ignore escaped closing brackets '}' and ']' option specifies whether to report '\\}' and '\\]' outside of a character class when they are allowed to be unescaped by the RegExp dialect. New in 2017.3",
+ "markdown": "Reports redundant character escape sequences that can be replaced with unescaped characters preserving the meaning. Many escape sequences that are necessary outside of a character class are redundant inside square brackets `[]` of a character class.\n\n\nAlthough unescaped opening curly braces `{` outside of character classes are allowed in some dialects (JavaScript, Python, and so on),\nit can cause confusion and make the pattern less portable, because there are dialects that require escaping curly braces as characters.\nFor this reason the inspection does not report escaped opening curly braces.\n\n**Example:**\n\n\n \\-\\;[\\.]\n\nAfter the quick-fix is applied:\n\n\n -;[.]\n\n\nThe **Ignore escaped closing brackets '}' and '\\]'** option specifies whether to report `\\}` and `\\]` outside of a character class\nwhen they are allowed to be unescaped by the RegExp dialect.\n\nNew in 2017.3"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RegExpRedundantEscape",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CustomRegExpInspection",
+ "shortDescription": {
+ "text": "Custom RegExp inspection"
+ },
+ "fullDescription": {
+ "text": "Custom Regex Inspection",
+ "markdown": "Custom Regex Inspection"
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CustomRegExpInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "IncorrectFormatting",
+ "shortDescription": {
+ "text": "Incorrect formatting"
+ },
+ "fullDescription": {
+ "text": "Reports formatting issues that appear if your code doesn't follow your project's code style settings. This inspection is not compatible with languages that require third-party formatters for code formatting, for example, Go or C with CLangFormat enabled.",
+ "markdown": "Reports formatting issues that appear if your code doesn't\nfollow your project's code style settings.\n\n\nThis inspection is not compatible with languages that require\nthird-party formatters for code formatting, for example, Go or\nC with CLangFormat enabled."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "IncorrectFormatting",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "General",
+ "index": 35,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlExtraClosingTag",
+ "shortDescription": {
+ "text": "Redundant closing tag"
+ },
+ "fullDescription": {
+ "text": "Reports redundant closing tags on empty elements, for example, 'img' or 'br'. Example: '\n \n
\n \n ' After the quick-fix is applied: '\n \n
\n \n '",
+ "markdown": "Reports redundant closing tags on empty elements, for example, `img` or `br`.\n\n**Example:**\n\n\n \n \n
\n \n \n\nAfter the quick-fix is applied:\n\n\n \n \n
\n \n \n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "HtmlExtraClosingTag",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpUnexpectedAnchor",
+ "shortDescription": {
+ "text": "Begin or end anchor in unexpected position"
+ },
+ "fullDescription": {
+ "text": "Reports '^' or '\\A' anchors not at the beginning of the pattern and '$', '\\Z' or '\\z' anchors not at the end of the pattern. In the wrong position these RegExp anchors prevent the pattern from matching anything. In case of the '^' and '$' anchors, most likely the literal character was meant and the escape forgotten. Example: '(Price $10)' New in 2018.1",
+ "markdown": "Reports `^` or `\\A` anchors not at the beginning of the pattern and `$`, `\\Z` or `\\z` anchors not at the end of the pattern. In the wrong position these RegExp anchors prevent the pattern from matching anything. In case of the `^` and `$` anchors, most likely the literal character was meant and the escape forgotten.\n\n**Example:**\n\n\n (Price $10)\n\n\nNew in 2018.1"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RegExpUnexpectedAnchor",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "SpellCheckingInspection",
+ "shortDescription": {
+ "text": "Typo"
+ },
+ "fullDescription": {
+ "text": "Reports typos and misspellings in your code, comments, and literals and fixes them with one click.",
+ "markdown": "Reports typos and misspellings in your code, comments, and literals and fixes them with one click."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "SpellCheckingInspection",
+ "ideaSeverity": "TYPO",
+ "qodanaSeverity": "Low"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Proofreading",
+ "index": 75,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CheckXmlFileWithXercesValidator",
+ "shortDescription": {
+ "text": "Failed external validation"
+ },
+ "fullDescription": {
+ "text": "Reports a discrepancy in an XML file with the specified DTD or schema detected by the Xerces validator.",
+ "markdown": "Reports a discrepancy in an XML file with the specified DTD or schema detected by the Xerces validator."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CheckXmlFileWithXercesValidator",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "XML",
+ "index": 50,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlUnknownTag",
+ "shortDescription": {
+ "text": "Unknown tag"
+ },
+ "fullDescription": {
+ "text": "Reports an unknown HTML tag. Suggests configuring tags that should not be reported.",
+ "markdown": "Reports an unknown HTML tag. Suggests configuring tags that should not be reported."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "HtmlUnknownTag",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpEscapedMetaCharacter",
+ "shortDescription": {
+ "text": "Escaped meta character"
+ },
+ "fullDescription": {
+ "text": "Reports escaped meta characters. Some RegExp coding styles specify that meta characters should be placed inside a character class, to make the regular expression easier to understand. This inspection does not warn about the meta character '[', ']' and '^', because those would need additional escaping inside a character class. Example: '\\d+\\.\\d+' After the quick-fix is applied: '\\d+[.]\\d+' New in 2017.1",
+ "markdown": "Reports escaped meta characters. Some RegExp coding styles specify that meta characters should be placed inside a character class, to make the regular expression easier to understand. This inspection does not warn about the meta character `[`, `]` and `^`, because those would need additional escaping inside a character class.\n\n**Example:**\n\n\n \\d+\\.\\d+\n\nAfter the quick-fix is applied:\n\n\n \\d+[.]\\d+\n\nNew in 2017.1"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "RegExpEscapedMetaCharacter",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "XmlHighlighting",
+ "shortDescription": {
+ "text": "XML highlighting"
+ },
+ "fullDescription": {
+ "text": "Reports XML validation problems in the results of a batch code inspection.",
+ "markdown": "Reports XML validation problems in the results of a batch code inspection."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "XmlHighlighting",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "XML",
+ "index": 50,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "XmlDuplicatedId",
+ "shortDescription": {
+ "text": "Duplicate 'id' attribute"
+ },
+ "fullDescription": {
+ "text": "Reports a duplicate 'id' attribute in XML.",
+ "markdown": "Reports a duplicate `id` attribute in XML."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "XmlDuplicatedId",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "XML",
+ "index": 50,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpDuplicateCharacterInClass",
+ "shortDescription": {
+ "text": "Duplicate character in character class"
+ },
+ "fullDescription": {
+ "text": "Reports duplicate characters inside a RegExp character class. Duplicate characters are unnecessary and can be removed without changing the semantics of the regex. Example: '[aabc]' After the quick-fix is applied: '[abc]'",
+ "markdown": "Reports duplicate characters inside a RegExp character class. Duplicate characters are unnecessary and can be removed without changing the semantics of the regex.\n\n**Example:**\n\n\n [aabc]\n\nAfter the quick-fix is applied:\n\n\n [abc]\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RegExpDuplicateCharacterInClass",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "XmlUnboundNsPrefix",
+ "shortDescription": {
+ "text": "Unbound namespace prefix"
+ },
+ "fullDescription": {
+ "text": "Reports an unbound namespace prefix in XML.",
+ "markdown": "Reports an unbound namespace prefix in XML."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "XmlUnboundNsPrefix",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "XML",
+ "index": 50,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RequiredAttributes",
+ "shortDescription": {
+ "text": "Missing required attribute"
+ },
+ "fullDescription": {
+ "text": "Reports a missing mandatory attribute in an XML/HTML tag. Suggests configuring attributes that should not be reported.",
+ "markdown": "Reports a missing mandatory attribute in an XML/HTML tag. Suggests configuring attributes that should not be reported."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RequiredAttributes",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "XmlUnusedNamespaceDeclaration",
+ "shortDescription": {
+ "text": "Unused schema declaration"
+ },
+ "fullDescription": {
+ "text": "Reports an unused namespace declaration or location hint in XML.",
+ "markdown": "Reports an unused namespace declaration or location hint in XML."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "XmlUnusedNamespaceDeclaration",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "XML",
+ "index": 50,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpRedundantClassElement",
+ "shortDescription": {
+ "text": "Redundant '\\d', '[:digit:]', or '\\D' class elements"
+ },
+ "fullDescription": {
+ "text": "Reports redundant '\\d' or '[:digit:]' that are used in one class with '\\w' or '[:word:]' ('\\D' with '\\W') and can be removed. Example: '[\\w\\d]' After the quick-fix is applied: '[\\w]' New in 2022.2",
+ "markdown": "Reports redundant `\\d` or `[:digit:]` that are used in one class with `\\w` or `[:word:]` (`\\D` with `\\W`) and can be removed.\n\n**Example:**\n\n\n [\\w\\d]\n\nAfter the quick-fix is applied:\n\n\n [\\w]\n\nNew in 2022.2"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "RegExpRedundantClassElement",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpSimplifiable",
+ "shortDescription": {
+ "text": "Regular expression can be simplified"
+ },
+ "fullDescription": {
+ "text": "Reports regular expressions that can be simplified. Example: '[a] xx* [ah-hz]' After the quick-fix is applied: 'a x+ [ahz]' New in 2022.1",
+ "markdown": "Reports regular expressions that can be simplified.\n\n**Example:**\n\n\n [a] xx* [ah-hz]\n\nAfter the quick-fix is applied:\n\n\n a x+ [ahz]\n\nNew in 2022.1"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "RegExpSimplifiable",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpEmptyAlternationBranch",
+ "shortDescription": {
+ "text": "Empty branch in alternation"
+ },
+ "fullDescription": {
+ "text": "Reports empty branches in a RegExp alternation. An empty branch will only match the empty string, and in most cases that is not what is desired. This inspection will not report a single empty branch at the start or the end of an alternation. Example: '(alpha||bravo)' After the quick-fix is applied: '(alpha|bravo)' New in 2017.2",
+ "markdown": "Reports empty branches in a RegExp alternation. An empty branch will only match the empty string, and in most cases that is not what is desired. This inspection will not report a single empty branch at the start or the end of an alternation.\n\n**Example:**\n\n\n (alpha||bravo)\n\nAfter the quick-fix is applied:\n\n\n (alpha|bravo)\n\nNew in 2017.2"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RegExpEmptyAlternationBranch",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "XmlPathReference",
+ "shortDescription": {
+ "text": "Unresolved file reference"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved file reference in XML.",
+ "markdown": "Reports an unresolved file reference in XML."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "XmlPathReference",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "XML",
+ "index": 50,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpUnnecessaryNonCapturingGroup",
+ "shortDescription": {
+ "text": "Unnecessary non-capturing group"
+ },
+ "fullDescription": {
+ "text": "Reports unnecessary non-capturing groups, which have no influence on the match result. Example: 'Everybody be cool, (?:this) is a robbery!' After the quick-fix is applied: 'Everybody be cool, this is a robbery!' New in 2021.1",
+ "markdown": "Reports unnecessary non-capturing groups, which have no influence on the match result.\n\n**Example:**\n\n\n Everybody be cool, (?:this) is a robbery!\n\nAfter the quick-fix is applied:\n\n\n Everybody be cool, this is a robbery!\n\nNew in 2021.1"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RegExpUnnecessaryNonCapturingGroup",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TodoComment",
+ "shortDescription": {
+ "text": "TODO comment"
+ },
+ "fullDescription": {
+ "text": "Reports TODO comments in your code. You can configure the format for TODO comments in Settings | Editor | TODO. Enable the Only warn on TODO comments without any details option to only warn on empty TODO comments, that don't provide any description on the task that should be done. Disable to report all TODO comments.",
+ "markdown": "Reports **TODO** comments in your code.\n\nYou can configure the format for **TODO** comments in [Settings \\| Editor \\| TODO](settings://preferences.toDoOptions).\n\nEnable the **Only warn on TODO comments without any details** option to only warn on empty TODO comments, that\ndon't provide any description on the task that should be done. Disable to report all TODO comments."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "TodoComment",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "General",
+ "index": 35,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "Json5StandardCompliance",
+ "shortDescription": {
+ "text": "Compliance with JSON5 standard"
+ },
+ "fullDescription": {
+ "text": "Reports inconsistency with the language specification in a JSON5 file.",
+ "markdown": "Reports inconsistency with [the language specification](http://json5.org) in a JSON5 file."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "Json5StandardCompliance",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JSON and JSON5",
+ "index": 91,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlWrongAttributeValue",
+ "shortDescription": {
+ "text": "Wrong attribute value"
+ },
+ "fullDescription": {
+ "text": "Reports an incorrect HTML attribute value.",
+ "markdown": "Reports an incorrect HTML attribute value."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "HtmlWrongAttributeValue",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "XmlDefaultAttributeValue",
+ "shortDescription": {
+ "text": "Redundant attribute with default value"
+ },
+ "fullDescription": {
+ "text": "Reports a redundant assignment of the default value to an XML attribute.",
+ "markdown": "Reports a redundant assignment of the default value to an XML attribute."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "XmlDefaultAttributeValue",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "XML",
+ "index": 50,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JsonSchemaCompliance",
+ "shortDescription": {
+ "text": "Compliance with JSON schema"
+ },
+ "fullDescription": {
+ "text": "Reports inconsistence between a JSON file and the JSON schema that is assigned to it.",
+ "markdown": "Reports inconsistence between a JSON file and the [JSON schema](https://json-schema.org) that is assigned to it. "
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JsonSchemaCompliance",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JSON and JSON5",
+ "index": 91,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EmptyDirectory",
+ "shortDescription": {
+ "text": "Empty directory"
+ },
+ "fullDescription": {
+ "text": "Reports empty directories. Available only from Code | Inspect Code or Code | Analyze Code | Run Inspection by Name and isn't reported in the editor. Use the Only report empty directories located under a source folder option to have only directories under source roots reported.",
+ "markdown": "Reports empty directories.\n\nAvailable only from **Code \\| Inspect Code** or\n**Code \\| Analyze Code \\| Run Inspection by Name** and isn't reported in the editor.\n\nUse the **Only report empty directories located under a source folder** option to have only directories under source\nroots reported."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EmptyDirectory",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "General",
+ "index": 35,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CheckDtdRefs",
+ "shortDescription": {
+ "text": "Unresolved DTD reference"
+ },
+ "fullDescription": {
+ "text": "Reports inconsistency in a DTD-specific reference, for example, in a reference to an XML entity or to a DTD element declaration. Works in DTD an XML files.",
+ "markdown": "Reports inconsistency in a DTD-specific reference, for example, in a reference to an XML entity or to a DTD element declaration. Works in DTD an XML files."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CheckDtdRefs",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "XML",
+ "index": 50,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "NonAsciiCharacters",
+ "shortDescription": {
+ "text": "Non-ASCII characters"
+ },
+ "fullDescription": {
+ "text": "Reports code elements that use non-ASCII symbols in an unusual context. Example: Non-ASCII characters used in identifiers, strings, or comments. Identifiers written in different languages, such as 'myСollection' with the letter 'C' written in Cyrillic. Comments or strings containing Unicode symbols, such as long dashes and arrows.",
+ "markdown": "Reports code elements that use non-ASCII symbols in an unusual context.\n\nExample:\n\n* Non-ASCII characters used in identifiers, strings, or comments.\n* Identifiers written in different languages, such as `my`**С**`ollection` with the letter **C** written in Cyrillic.\n* Comments or strings containing Unicode symbols, such as long dashes and arrows."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "NonAsciiCharacters",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Internationalization",
+ "index": 94,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "LossyEncoding",
+ "shortDescription": {
+ "text": "Lossy encoding"
+ },
+ "fullDescription": {
+ "text": "Reports characters that cannot be displayed because of the current document encoding. Examples: If you type international characters in a document with the US-ASCII charset, some characters will be lost on save. If you load a UTF-8-encoded file using the ISO-8859-1 one-byte charset, some characters will be displayed incorrectly. You can fix this by changing the file encoding either by specifying the encoding directly in the file, e.g. by editing 'encoding=' attribute in the XML prolog of XML file, or by changing the corresponding options in Settings | Editor | File Encodings.",
+ "markdown": "Reports characters that cannot be displayed because of the current document encoding.\n\nExamples:\n\n* If you type international characters in a document with the **US-ASCII** charset, some characters will be lost on save.\n* If you load a **UTF-8** -encoded file using the **ISO-8859-1** one-byte charset, some characters will be displayed incorrectly.\n\nYou can fix this by changing the file encoding\neither by specifying the encoding directly in the file, e.g. by editing `encoding=` attribute in the XML prolog of XML file,\nor by changing the corresponding options in **Settings \\| Editor \\| File Encodings**."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "LossyEncoding",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Internationalization",
+ "index": 94,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "IgnoreFileDuplicateEntry",
+ "shortDescription": {
+ "text": "Ignore file duplicates"
+ },
+ "fullDescription": {
+ "text": "Reports duplicate entries (patterns) in the ignore file (e.g. .gitignore, .hgignore). Duplicate entries in these files are redundant and can be removed. Example: '# Output directories\n /out/\n /target/\n /out/'",
+ "markdown": "Reports duplicate entries (patterns) in the ignore file (e.g. .gitignore, .hgignore). Duplicate entries in these files are redundant and can be removed.\n\nExample:\n\n\n # Output directories\n /out/\n /target/\n /out/\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "IgnoreFileDuplicateEntry",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Version control",
+ "index": 97,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JsonStandardCompliance",
+ "shortDescription": {
+ "text": "Compliance with JSON standard"
+ },
+ "fullDescription": {
+ "text": "Reports the following discrepancies of a JSON file with the language specification: A line or block comment (configurable). Multiple top-level values (expect for JSON Lines files, configurable for others). A trailing comma in an object or array (configurable). A single quoted string. A property key is a not a double quoted strings. A NaN or Infinity/-Infinity numeric value as a floating point literal (configurable).",
+ "markdown": "Reports the following discrepancies of a JSON file with [the language specification](https://tools.ietf.org/html/rfc7159):\n\n* A line or block comment (configurable).\n* Multiple top-level values (expect for JSON Lines files, configurable for others).\n* A trailing comma in an object or array (configurable).\n* A single quoted string.\n* A property key is a not a double quoted strings.\n* A NaN or Infinity/-Infinity numeric value as a floating point literal (configurable)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "JsonStandardCompliance",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JSON and JSON5",
+ "index": 91,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JsonSchemaDeprecation",
+ "shortDescription": {
+ "text": "Deprecated JSON property"
+ },
+ "fullDescription": {
+ "text": "Reports a deprecated property in a JSON file. Note that deprecation mechanism is not defined in the JSON Schema specification yet, and this inspection uses a non-standard extension 'deprecationMessage'.",
+ "markdown": "Reports a deprecated property in a JSON file. \nNote that deprecation mechanism is not defined in the JSON Schema specification yet, and this inspection uses a non-standard extension 'deprecationMessage'."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JsonSchemaDeprecation",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JSON and JSON5",
+ "index": 91,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JsonSchemaRefReference",
+ "shortDescription": {
+ "text": "Unresolved '$ref' and '$schema' references"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved '$ref' or '$schema' path in a JSON schema.",
+ "markdown": "Reports an unresolved `$ref` or `$schema` path in a JSON schema. "
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JsonSchemaRefReference",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JSON and JSON5",
+ "index": 91,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "SSBasedInspection",
+ "shortDescription": {
+ "text": "Structural search inspection"
+ },
+ "fullDescription": {
+ "text": "Allows configuring Structural Search/Structural Replace templates that you can apply to the file you are editing. All matches will be highlighted and marked with the template name that you have configured. If you configure the Structural Replace pattern as well, the corresponding replace option will be available as a quick-fix.",
+ "markdown": "Allows configuring **Structural Search/Structural Replace** templates that you can apply to the file you are editing.\n\nAll matches will be highlighted and marked with the template name that you have configured.\nIf you configure the **Structural Replace** pattern as well, the corresponding replace option will be available as a quick-fix."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "SSBasedInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Structural search",
+ "index": 98,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PhpSymfonyAnnotationToAttributeInspection",
+ "shortDescription": {
+ "text": "Symfony annotation can be replaced with attribute"
+ },
+ "fullDescription": {
+ "text": "Suggests replacing Symfony annotations with attributes.",
+ "markdown": "Suggests replacing Symfony annotations with attributes."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "PhpSymfonyAnnotationToAttributeInspection",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/General",
+ "index": 8,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CheckValidXmlInScriptTagBody",
+ "shortDescription": {
+ "text": "Malformed content of 'script' tag"
+ },
+ "fullDescription": {
+ "text": "Reports contents of 'script' tags that are invalid XML. Example: '' After the quick-fix is applied: ''",
+ "markdown": "Reports contents of `script` tags that are invalid XML. \n\n**Example:**\n\n\n \n\nAfter the quick-fix is applied:\n\n\n \n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CheckValidXmlInScriptTagBody",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpSuspiciousBackref",
+ "shortDescription": {
+ "text": "Suspicious back reference"
+ },
+ "fullDescription": {
+ "text": "Reports back references that will not be resolvable at runtime. This means that the back reference can never match anything. A back reference will not be resolvable when the group is defined after the back reference, or if the group is defined in a different branch of an alternation. Example of a group defined after its back reference: '\\1(abc)' Example of a group and a back reference in different branches: 'a(b)c|(xy)\\1z' New in 2022.1",
+ "markdown": "Reports back references that will not be resolvable at runtime. This means that the back reference can never match anything. A back reference will not be resolvable when the group is defined after the back reference, or if the group is defined in a different branch of an alternation.\n\n**Example of a group defined after its back reference:**\n\n\n \\1(abc)\n\n**Example of a group and a back reference in different branches:**\n\n\n a(b)c|(xy)\\1z\n\nNew in 2022.1"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RegExpSuspiciousBackref",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpSingleCharAlternation",
+ "shortDescription": {
+ "text": "Single character alternation"
+ },
+ "fullDescription": {
+ "text": "Reports single char alternation in a RegExp. It is simpler to use a character class instead. This may also provide better matching performance. Example: 'a|b|c|d' After the quick-fix is applied: '[abcd]' New in 2017.1",
+ "markdown": "Reports single char alternation in a RegExp. It is simpler to use a character class instead. This may also provide better matching performance.\n\n**Example:**\n\n\n a|b|c|d\n\nAfter the quick-fix is applied:\n\n\n [abcd]\n\n\nNew in 2017.1"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RegExpSingleCharAlternation",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CheckTagEmptyBody",
+ "shortDescription": {
+ "text": "Empty element content"
+ },
+ "fullDescription": {
+ "text": "Reports XML elements without contents. Example: '\n \n ' After the quick-fix is applied: '\n \n '",
+ "markdown": "Reports XML elements without contents.\n\n**Example:**\n\n\n \n \n \n\nAfter the quick-fix is applied:\n\n\n \n \n \n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CheckTagEmptyBody",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "XML",
+ "index": 50,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "UnresolvedReference",
+ "shortDescription": {
+ "text": "Unresolved reference"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved reference to a named pattern ('define') in RELAX-NG files that use XML syntax. Suggests creating the referenced 'define' element.",
+ "markdown": "Reports an unresolved reference to a named pattern (`define`) in RELAX-NG files that use XML syntax. Suggests creating the referenced `define` element."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "UnresolvedReference",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RELAX NG",
+ "index": 101,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlMissingClosingTag",
+ "shortDescription": {
+ "text": "Missing closing tag"
+ },
+ "fullDescription": {
+ "text": "Reports an HTML element without a closing tag. Some coding styles require that HTML elements have closing tags even where this is optional. Example: '\n \n Behold!\n \n ' After the quick-fix is applied: '\n
\n Behold!
\n \n '",
+ "markdown": "Reports an HTML element without a closing tag. Some coding styles require that HTML elements have closing tags even where this is optional.\n\n**Example:**\n\n\n \n \n Behold!\n \n \n\nAfter the quick-fix is applied:\n\n\n \n
\n Behold!
\n \n \n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "HtmlMissingClosingTag",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlUnknownAnchorTarget",
+ "shortDescription": {
+ "text": "Unresolved fragment in a link"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved last part of an URL after the '#' sign.",
+ "markdown": "Reports an unresolved last part of an URL after the `#` sign."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "HtmlUnknownAnchorTarget",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "XmlInvalidId",
+ "shortDescription": {
+ "text": "Unresolved 'id' reference"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved 'id' reference in XML.",
+ "markdown": "Reports an unresolved `id` reference in XML."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "XmlInvalidId",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "XML",
+ "index": 50,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ReassignedToPlainText",
+ "shortDescription": {
+ "text": "Reassigned to plain text"
+ },
+ "fullDescription": {
+ "text": "Reports files that were explicitly re-assigned to Plain Text File Type. This association is unnecessary because the platform auto-detects text files by content automatically. You can dismiss this warning by removing the file type association in Settings | Editor | File Types | Text.",
+ "markdown": "Reports files that were explicitly re-assigned to Plain Text File Type. This association is unnecessary because the platform auto-detects text files by content automatically.\n\nYou can dismiss this warning by removing the file type association\nin **Settings \\| Editor \\| File Types \\| Text**."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ReassignedToPlainText",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "General",
+ "index": 35,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "Annotator",
+ "shortDescription": {
+ "text": "Annotator"
+ },
+ "fullDescription": {
+ "text": "Reports issues essential to this file (e.g., syntax errors) in the result of a batch code inspection run. These issues are usually always highlighted in the editor and can't be configured, unlike inspections. These options control the scope of checks performed by this inspection: Option \"Report syntax errors\": report parser-related issues. Option \"Report issues from language-specific annotators\": report issues found by annotators configured for the relevant language. See Custom Language Support: Annotators for details. Option \"Report other highlighting problems\": report issues specific to the language of the current file (e.g., type mismatches or unreported exceptions). See Custom Language Support: Highlighting for details.",
+ "markdown": "Reports issues essential to this file (e.g., syntax errors) in the result of a batch code inspection run. These issues are usually always highlighted in the editor and can't be configured, unlike inspections. These options control the scope of checks performed by this inspection:\n\n* Option \"**Report syntax errors**\": report parser-related issues.\n* Option \"**Report issues from language-specific annotators** \": report issues found by annotators configured for the relevant language. See [Custom Language Support: Annotators](https://plugins.jetbrains.com/docs/intellij/annotator.html) for details.\n* Option \"**Report other highlighting problems** \": report issues specific to the language of the current file (e.g., type mismatches or unreported exceptions). See [Custom Language Support: Highlighting](https://plugins.jetbrains.com/docs/intellij/syntax-highlighting-and-error-highlighting.html#semantic-highlighting) for details."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "Annotator",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "General",
+ "index": 35,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JsonDuplicatePropertyKeys",
+ "shortDescription": {
+ "text": "Duplicate keys in object literals"
+ },
+ "fullDescription": {
+ "text": "Reports a duplicate key in an object literal.",
+ "markdown": "Reports a duplicate key in an object literal."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JsonDuplicatePropertyKeys",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JSON and JSON5",
+ "index": 91,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpRedundantNestedCharacterClass",
+ "shortDescription": {
+ "text": "Redundant nested character class"
+ },
+ "fullDescription": {
+ "text": "Reports unnecessary nested character classes. Example: '[a-c[x-z]]' After the quick-fix is applied: '[a-cx-z]' New in 2020.2",
+ "markdown": "Reports unnecessary nested character classes.\n\n**Example:**\n\n\n [a-c[x-z]]\n\nAfter the quick-fix is applied:\n\n\n [a-cx-z]\n\nNew in 2020.2"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RegExpRedundantNestedCharacterClass",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "XmlDeprecatedElement",
+ "shortDescription": {
+ "text": "Deprecated symbol"
+ },
+ "fullDescription": {
+ "text": "Reports a deprecated XML element or attribute. Symbols can be marked by XML comment or documentation tag with text 'deprecated'.",
+ "markdown": "Reports a deprecated XML element or attribute.\n\nSymbols can be marked by XML comment or documentation tag with text 'deprecated'."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "XmlDeprecatedElement",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "XML",
+ "index": 50,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpOctalEscape",
+ "shortDescription": {
+ "text": "Octal escape"
+ },
+ "fullDescription": {
+ "text": "Reports octal escapes, which are easily confused with back references. Use hexadecimal escapes to avoid confusion. Example: '\\07' After the quick-fix is applied: '\\x07' New in 2017.1",
+ "markdown": "Reports octal escapes, which are easily confused with back references. Use hexadecimal escapes to avoid confusion.\n\n**Example:**\n\n\n \\07\n\nAfter the quick-fix is applied:\n\n\n \\x07\n\nNew in 2017.1"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "RegExpOctalEscape",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "UnusedDefine",
+ "shortDescription": {
+ "text": "Unused define"
+ },
+ "fullDescription": {
+ "text": "Reports an unused named pattern ('define') in a RELAX-NG file (XML or Compact Syntax). 'define' elements that are used through an include in another file are ignored.",
+ "markdown": "Reports an unused named pattern (`define`) in a RELAX-NG file (XML or Compact Syntax). `define` elements that are used through an include in another file are ignored."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "UnusedDefine",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RELAX NG",
+ "index": 101,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpAnonymousGroup",
+ "shortDescription": {
+ "text": "Anonymous capturing group or numeric back reference"
+ },
+ "fullDescription": {
+ "text": "Reports anonymous capturing groups and numeric back references in a RegExp. These are only reported when the RegExp dialect supports named group and named group references. Named groups and named back references improve code readability and are recommended to use instead. When a capture is not needed, matching can be more performant and use less memory by using a non-capturing group, i.e. '(?:xxx)' instead of '(xxx)'. Example: '(\\d\\d\\d\\d)\\1' A better regex pattern could look like this: '(?\\d\\d\\d\\d)\\k' New in 2017.2",
+ "markdown": "Reports anonymous capturing groups and numeric back references in a RegExp. These are only reported when the RegExp dialect supports named group and named group references. Named groups and named back references improve code readability and are recommended to use instead. When a capture is not needed, matching can be more performant and use less memory by using a non-capturing group, i.e. `(?:xxx)` instead of `(xxx)`.\n\n**Example:**\n\n\n (\\d\\d\\d\\d)\\1\n\nA better regex pattern could look like this:\n\n\n (?\\d\\d\\d\\d)\\k\n\nNew in 2017.2"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RegExpAnonymousGroup",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpRepeatedSpace",
+ "shortDescription": {
+ "text": "Consecutive spaces"
+ },
+ "fullDescription": {
+ "text": "Reports multiple consecutive spaces in a RegExp. Because spaces are not visible by default, it can be hard to see how many spaces are required. The RegExp can be made more clear by replacing the consecutive spaces with a single space and a counted quantifier. Example: '( )' After the quick-fix is applied: '( {5})' New in 2017.1",
+ "markdown": "Reports multiple consecutive spaces in a RegExp. Because spaces are not visible by default, it can be hard to see how many spaces are required. The RegExp can be made more clear by replacing the consecutive spaces with a single space and a counted quantifier.\n\n**Example:**\n\n\n ( )\n\nAfter the quick-fix is applied:\n\n\n ( {5})\n\n\nNew in 2017.1"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RegExpRepeatedSpace",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RegExpDuplicateAlternationBranch",
+ "shortDescription": {
+ "text": "Duplicate branch in alternation"
+ },
+ "fullDescription": {
+ "text": "Reports duplicate branches in a RegExp alternation. Duplicate branches slow down matching and obscure the intent of the expression. Example: '(alpha|bravo|charlie|alpha)' After the quick-fix is applied: '(alpha|bravo|charlie)' New in 2017.1",
+ "markdown": "Reports duplicate branches in a RegExp alternation. Duplicate branches slow down matching and obscure the intent of the expression.\n\n**Example:**\n\n\n (alpha|bravo|charlie|alpha)\n\nAfter the quick-fix is applied:\n\n\n (alpha|bravo|charlie)\n\nNew in 2017.1"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RegExpDuplicateAlternationBranch",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "RegExp",
+ "index": 61,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CheckEmptyScriptTag",
+ "shortDescription": {
+ "text": "Empty tag"
+ },
+ "fullDescription": {
+ "text": "Reports empty tags that do not work in some browsers. Example: '\n \n ' After the quick-fix is applied: '\n \n '",
+ "markdown": "Reports empty tags that do not work in some browsers.\n\n**Example:**\n\n\n \n \n \n\nAfter the quick-fix is applied:\n\n\n \n \n \n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CheckEmptyScriptTag",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "gherkin",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "GherkinScenarioToScenarioOutline",
+ "shortDescription": {
+ "text": "Scenario with Examples section"
+ },
+ "fullDescription": {
+ "text": "Reports Gherkin scenarios that contain an 'Examples' section. Use the quick-fix to convert 'Scenario' to 'Scenario Outline'.",
+ "markdown": "Reports Gherkin scenarios that contain an `Examples` section.\n\nUse the quick-fix to convert `Scenario` to `Scenario Outline`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "GherkinScenarioToScenarioOutline",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Cucumber",
+ "index": 21,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CucumberTableInspection",
+ "shortDescription": {
+ "text": "Unused or missing columns in Cucumber tables"
+ },
+ "fullDescription": {
+ "text": "Reports tables in 'Examples' sections in Cucumber .feature files with unused or missing columns.",
+ "markdown": "Reports tables in `Examples` sections in Cucumber .feature files with unused or missing columns."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CucumberTableInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Cucumber",
+ "index": 21,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "GherkinBrokenTableInspection",
+ "shortDescription": {
+ "text": "Gherkin table is broken"
+ },
+ "fullDescription": {
+ "text": "Reports a table if there is at least one row with the number of cells different from the number of cells in the table header.",
+ "markdown": "Reports a table if there is at least one row with the number of cells different from the number of cells in the table header."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "GherkinBrokenTableInspection",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Cucumber",
+ "index": 21,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "GherkinMisplacedBackground",
+ "shortDescription": {
+ "text": "Misplaced background section"
+ },
+ "fullDescription": {
+ "text": "Reports 'Background' sections that are located incorrectly. The 'Background' section must be located before the 'Scenario' section.",
+ "markdown": "Reports `Background` sections that are located incorrectly. The `Background` section must be located before the `Scenario` section."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "GherkinMisplacedBackground",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Cucumber",
+ "index": 21,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CucumberMissedExamples",
+ "shortDescription": {
+ "text": "Missing examples section"
+ },
+ "fullDescription": {
+ "text": "Reports scenario outlines in Cucumber .feature files that do not have the 'Examples' section. Use the quick-fix to automatically create the 'Examples' section with a pre-filled table header.",
+ "markdown": "Reports scenario outlines in Cucumber .feature files that do not have the `Examples` section.\n\nUse the quick-fix to automatically create the `Examples` section with a pre-filled table header."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CucumberMissedExamples",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Cucumber",
+ "index": 21,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CucumberUndefinedStep",
+ "shortDescription": {
+ "text": "Undefined step"
+ },
+ "fullDescription": {
+ "text": "Reports steps in Cucumber (or some other Gherkin) .feature files that do not have matching step definitions. Use the quick-fix to automatically create a new step definition.",
+ "markdown": "Reports steps in Cucumber (or some other Gherkin) .feature files that do not have matching step definitions.\n\nUse the quick-fix to automatically create a new step definition."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CucumberUndefinedStep",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Cucumber",
+ "index": 21,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CucumberExamplesColon",
+ "shortDescription": {
+ "text": "Missing ':' after examples keyword"
+ },
+ "fullDescription": {
+ "text": "Reports 'Examples' sections in Cucumber .feature files if they do not have ':' after the 'Examples' keyword.",
+ "markdown": "Reports `Examples` sections in Cucumber .feature files if they do not have ':' after the `Examples` keyword."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CucumberExamplesColon",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Cucumber",
+ "index": 21,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "JavaScript",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "JSUnusedAssignment",
+ "shortDescription": {
+ "text": "Unused assignment"
+ },
+ "fullDescription": {
+ "text": "Reports a variable whose value is never used after assignment. Suggests removing the unused variable to shorten the code and to avoid redundant allocations. The following cases are reported: A variable is never read after assignment. The value of a variable is always overwritten with another assignment before the variable is read next time. The initializer of a variable is redundant (for one of the above-mentioned reasons).",
+ "markdown": "Reports a variable whose value is never used after assignment. \nSuggests removing the unused variable to shorten the code and to avoid redundant allocations.\n\nThe following cases are reported:\n\n* A variable is never read after assignment.\n* The value of a variable is always overwritten with another assignment before the variable is read next time.\n* The initializer of a variable is redundant (for one of the above-mentioned reasons)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSUnusedAssignment",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Unused symbols",
+ "index": 22,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "FlowJSError",
+ "shortDescription": {
+ "text": "Flow type checker"
+ },
+ "fullDescription": {
+ "text": "Reports errors from Flow.",
+ "markdown": "Reports errors from [Flow](https://flowtype.org/)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "FlowJSError",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Flow type checker",
+ "index": 23,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ReuseOfLocalVariableJS",
+ "shortDescription": {
+ "text": "Reuse of local variable"
+ },
+ "fullDescription": {
+ "text": "Reports reusing a local variable and overwriting its value with a new value that is not related to the original variable usage. Reusing a local variable in this way may be confusing because the intended semantics of the local variable may vary with each usage. It may also cause bugs, if code changes result in values that were expected to be overwritten while they are actually live. It is good practices to keep variable lifetimes as short as possible, and not reuse local variables for the sake of brevity.",
+ "markdown": "Reports reusing a local variable and overwriting its value with a new value that is not related to the original variable usage. Reusing a local variable in this way may be confusing because the intended semantics of the local variable may vary with each usage. It may also cause bugs, if code changes result in values that were expected to be overwritten while they are actually live. It is good practices to keep variable lifetimes as short as possible, and not reuse local variables for the sake of brevity."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ReuseOfLocalVariableJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Data flow",
+ "index": 25,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ShiftOutOfRangeJS",
+ "shortDescription": {
+ "text": "Shift operation by possibly wrong constant"
+ },
+ "fullDescription": {
+ "text": "Reports a shift operation where the second operand is a constant outside the reasonable range, for example, an integer shift operation outside the range '0..31', shifting by negative or overly large values.",
+ "markdown": "Reports a shift operation where the second operand is a constant outside the reasonable range, for example, an integer shift operation outside the range `0..31`, shifting by negative or overly large values."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ShiftOutOfRangeJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Bitwise operation issues",
+ "index": 30,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSClosureCompilerSyntax",
+ "shortDescription": {
+ "text": "Incorrect usage of JSDoc tags"
+ },
+ "fullDescription": {
+ "text": "Reports warnings implied by Google Closure Compiler annotations including correct use of '@abstract', '@interface', and '@implements' tags.",
+ "markdown": "Reports warnings implied by *Google Closure Compiler* annotations including correct use of `@abstract`, `@interface`, and `@implements` tags."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSClosureCompilerSyntax",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6ConvertLetToConst",
+ "shortDescription": {
+ "text": "'let' is used instead of 'const'"
+ },
+ "fullDescription": {
+ "text": "Reports a 'let' declaration that can be made 'const'.",
+ "markdown": "Reports a `let` declaration that can be made `const`. "
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "ES6ConvertLetToConst",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/ES2015 migration aids",
+ "index": 33,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSXDomNesting",
+ "shortDescription": {
+ "text": "Invalid DOM element nesting"
+ },
+ "fullDescription": {
+ "text": "Detects HTML elements in JSX files which are not nested properly according to the DOM specification. React reports runtime warnings on incorrectly nested elements.",
+ "markdown": "Detects HTML elements in JSX files which are not nested properly according to the DOM specification. React reports runtime warnings on incorrectly nested elements."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSXDomNesting",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/React",
+ "index": 37,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "BadExpressionStatementJS",
+ "shortDescription": {
+ "text": "Expression statement which is not assignment or call"
+ },
+ "fullDescription": {
+ "text": "Reports an expression statement that is neither an assignment nor a call. Such statements usually indicate an error.",
+ "markdown": "Reports an expression statement that is neither an assignment nor a call. Such statements usually indicate an error."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "BadExpressionStatementJS",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Validity issues",
+ "index": 38,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ConfusingFloatingPointLiteralJS",
+ "shortDescription": {
+ "text": "Confusing floating point literal"
+ },
+ "fullDescription": {
+ "text": "Reports any floating point number that does not have a decimal point, or any numbers before the decimal point, or and numbers after the decimal point. Such literals may be confusing, and violate several coding standards.",
+ "markdown": "Reports any floating point number that does not have a decimal point, or any numbers before the decimal point, or and numbers after the decimal point. Such literals may be confusing, and violate several coding standards."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ConfusingFloatingPointLiteralJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ContinueOrBreakFromFinallyBlockJS",
+ "shortDescription": {
+ "text": "'continue' or 'break' inside 'finally' block"
+ },
+ "fullDescription": {
+ "text": "Reports a 'break' or 'continue' statement inside a 'finally' block. Such statements are very confusing, may hide exceptions, and complicate debugging.",
+ "markdown": "Reports a `break` or `continue` statement inside a `finally` block. Such statements are very confusing, may hide exceptions, and complicate debugging."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ContinueOrBreakFromFinallyBlockJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Try statement issues",
+ "index": 45,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "UnnecessaryLocalVariableJS",
+ "shortDescription": {
+ "text": "Redundant local variable"
+ },
+ "fullDescription": {
+ "text": "Reports an unnecessary local variable that does not make a function more comprehensible: a local variable that is immediately returned a local variable that is immediately assigned to another variable and is not used anymore a local variable that always has the same value as another local variable or parameter. Use the checkbox below to have this inspection ignore variables that are immediately returned or thrown. Some coding styles suggest using such variables for clarity and ease of debugging.",
+ "markdown": "Reports an unnecessary local variable that does not make a function more comprehensible:\n\n* a local variable that is immediately returned\n* a local variable that is immediately assigned to another variable and is not used anymore\n* a local variable that always has the same value as another local variable or parameter.\n\n\nUse the checkbox below to have this inspection ignore variables that are immediately\nreturned or thrown. Some coding styles suggest using such variables for clarity and\nease of debugging."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "UnnecessaryLocalVariableJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Data flow",
+ "index": 25,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSMethodCanBeStatic",
+ "shortDescription": {
+ "text": "Method can be made 'static'"
+ },
+ "fullDescription": {
+ "text": "Reports a class method that can be safely made 'static'. A method can be 'static' if it does not reference any of its class' non-static methods and non-static fields and is not overridden in a subclass. Use the first checkbox below to inspect only 'private' methods.",
+ "markdown": "Reports a class method that can be safely made `static`. A method can be `static` if it does not reference any of its class' non-static methods and non-static fields and is not overridden in a subclass.\n\n\nUse the first checkbox below to inspect only `private` methods."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSMethodCanBeStatic",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSXUnresolvedComponent",
+ "shortDescription": {
+ "text": "Unresolved JSX component"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved reference to a JSX component. Suggests adding a missing import statement if the referenced component is defined in the project or its dependencies or creating a new component with this name. The template for a new component can be modified in Editor | File and Code Templates.",
+ "markdown": "Reports an unresolved reference to a JSX component. Suggests adding a missing import statement if the referenced component is defined in the project or its dependencies or creating a new component with this name.\n\nThe template for a new component can be modified in Editor \\| File and Code Templates."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSXUnresolvedComponent",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "UnnecessaryLabelOnBreakStatementJS",
+ "shortDescription": {
+ "text": "Unnecessary label on 'break' statement"
+ },
+ "fullDescription": {
+ "text": "Reports a labeled 'break' statement whose labels may be removed without changing the flow of control.",
+ "markdown": "Reports a labeled `break` statement whose labels may be removed without changing the flow of control."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "UnnecessaryLabelOnBreakStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ContinueStatementJS",
+ "shortDescription": {
+ "text": "'continue' statement"
+ },
+ "fullDescription": {
+ "text": "Reports a 'continue' statement.",
+ "markdown": "Reports a `continue` statement."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ContinueStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially undesirable code constructs",
+ "index": 51,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSUndeclaredVariable",
+ "shortDescription": {
+ "text": "Implicitly declared global JavaScript variable"
+ },
+ "fullDescription": {
+ "text": "Reports an implicit declaration of a global variable. Example: 'var aaa = 1; // good\n bbb = 2; // bad, if bbb is not declared with 'var' somewhere'",
+ "markdown": "Reports an implicit declaration of a global variable.\n\nExample:\n\n\n var aaa = 1; // good\n bbb = 2; // bad, if bbb is not declared with 'var' somewhere\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSUndeclaredVariable",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "DivideByZeroJS",
+ "shortDescription": {
+ "text": "Division by zero"
+ },
+ "fullDescription": {
+ "text": "Reports division by zero or a remainder by zero.",
+ "markdown": "Reports division by zero or a remainder by zero."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "DivideByZeroJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSReferencingMutableVariableFromClosure",
+ "shortDescription": {
+ "text": "Referencing mutable variable from closure"
+ },
+ "fullDescription": {
+ "text": "Reports access to outer mutable variables from functions. Example: 'for (var i = 1; i <= 3; i++) {\n setTimeout(function() {\n console.log(i); // bad\n }, 0);\n }'",
+ "markdown": "Reports access to outer mutable variables from functions.\n\nExample:\n\n\n for (var i = 1; i <= 3; i++) {\n setTimeout(function() {\n console.log(i); // bad\n }, 0);\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSReferencingMutableVariableFromClosure",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ChainedEqualityJS",
+ "shortDescription": {
+ "text": "Chained equality"
+ },
+ "fullDescription": {
+ "text": "Reports a chained equality comparison (i.e. 'a==b==c'). Such comparisons are confusing.",
+ "markdown": "Reports a chained equality comparison (i.e. `a==b==c`). Such comparisons are confusing."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ChainedEqualityComparisonsJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code style issues",
+ "index": 62,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "SillyAssignmentJS",
+ "shortDescription": {
+ "text": "Variable is assigned to itself"
+ },
+ "fullDescription": {
+ "text": "Reports an assignment in the form 'x = x'.",
+ "markdown": "Reports an assignment in the form `x = x`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "SillyAssignmentJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Assignment issues",
+ "index": 63,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6ConvertRequireIntoImport",
+ "shortDescription": {
+ "text": "'require()' is used instead of 'import'"
+ },
+ "fullDescription": {
+ "text": "Reports a 'require()' statement. Suggests converting it to a 'require()' call with an 'import' statement. Enable 'Convert require() inside inner scopes with Fix all action' to convert all 'require()' calls inside the nested functions and statements when using the 'Fix all' action. Please note that converting 'require()' statements inside inner scopes to 'import' statements may cause changes in the semantics of the code. Import statements are static module dependencies and are hoisted, which means that they are moved to the top of the current module. 'require()' calls load modules dynamically. They can be executed conditionally, and their scope is defined by the expression in which they are used. Clear the 'Convert require() inside inner scopes with Fix all action' checkbox to prevent any changes in these complex cases when using the 'Fix all' action.",
+ "markdown": "Reports a `require()` statement. Suggests converting it to a `require()` call with an `import` statement. \n\nEnable 'Convert require() inside inner scopes with Fix all action' to convert all `require()` calls inside the nested functions and statements when using the 'Fix all' action. \n\nPlease note that converting `require()` statements inside inner scopes to `import` statements may cause changes in the semantics of the code. Import statements are static module dependencies and are hoisted, which means that they are moved to the top of the current module. `require()` calls load modules dynamically. They can be executed conditionally, and their scope is defined by the expression in which they are used. \nClear the 'Convert require() inside inner scopes with Fix all action' checkbox to prevent any changes in these complex cases when using the 'Fix all' action."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "ES6ConvertRequireIntoImport",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/ES2015 migration aids",
+ "index": 33,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptCheckImport",
+ "shortDescription": {
+ "text": "Unresolved imported name"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved name or binding in an 'import' declaration in TypeScript code.",
+ "markdown": "Reports an unresolved name or binding in an `import` declaration in TypeScript code."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "TypeScriptCheckImport",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSXSyntaxUsed",
+ "shortDescription": {
+ "text": "JSX syntax used"
+ },
+ "fullDescription": {
+ "text": "Reports a usage of a JSX tag in JavaScript code.",
+ "markdown": "Reports a usage of a JSX tag in JavaScript code."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "JSXSyntaxUsed",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSJoinVariableDeclarationAndAssignment",
+ "shortDescription": {
+ "text": "Variable declaration can be merged with the first assignment to the variable"
+ },
+ "fullDescription": {
+ "text": "Reports a variable that is declared without an initializer and is used much further in the code or in a single nested scope. Suggests moving the variable closer to its usages and joining it with the initializer expression.",
+ "markdown": "Reports a variable that is declared without an initializer and is used much further in the code or in a single nested scope. Suggests moving the variable closer to its usages and joining it with the initializer expression."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSJoinVariableDeclarationAndAssignment",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSRedundantSwitchStatement",
+ "shortDescription": {
+ "text": "'switch' statement is redundant and can be replaced"
+ },
+ "fullDescription": {
+ "text": "Reports a 'switch' statement with an empty body, or with only one 'case' branch, or with a 'default' branch only.",
+ "markdown": "Reports a `switch` statement with an empty body, or with only one `case` branch, or with a `default` branch only."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSRedundantSwitchStatement",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Switch statement issues",
+ "index": 70,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSUnusedGlobalSymbols",
+ "shortDescription": {
+ "text": "Unused global symbol"
+ },
+ "fullDescription": {
+ "text": "Reports an unused globally accessible public function, variable, class, or property.",
+ "markdown": "Reports an unused globally accessible public function, variable, class, or property."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSUnusedGlobalSymbols",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Unused symbols",
+ "index": 22,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6ConvertModuleExportToExport",
+ "shortDescription": {
+ "text": "'module.exports' is used instead of 'export'"
+ },
+ "fullDescription": {
+ "text": "Reports a 'module.export' statement. Suggests replacing it with an 'export' or 'export default' statement. Please note that the quick-fix for converting 'module.export' into 'export' is not available for 'module.export' inside functions or statements because 'export' statements can only be at the top level of a module.",
+ "markdown": "Reports a `module.export` statement. Suggests replacing it with an `export` or `export default` statement. \n\nPlease note that the quick-fix for converting `module.export` into `export` is not available for `module.export` inside functions or statements because `export` statements can only be at the top level of a module."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "ES6ConvertModuleExportToExport",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/ES2015 migration aids",
+ "index": 33,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "DocumentWriteJS",
+ "shortDescription": {
+ "text": "Call to 'document.write()'"
+ },
+ "fullDescription": {
+ "text": "Reports a method call to 'document.write()' or 'document.writeln()'. Most usages of such calls are performed better with explicit DOM calls, such as 'getElementByID()' and 'createElement()'. Additionally, the 'write()' and 'writeln()' calls will not work with XML DOMs, including DOMs for XHTML if viewed as XML. This can result in difficulty to point out bugs.",
+ "markdown": "Reports a method call to `document.write()` or `document.writeln()`. Most usages of such calls are performed better with explicit DOM calls, such as `getElementByID()` and `createElement()`. Additionally, the `write()` and `writeln()` calls will not work with XML DOMs, including DOMs for XHTML if viewed as XML. This can result in difficulty to point out bugs."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "DocumentWriteJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/DOM issues",
+ "index": 72,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "BlockStatementJS",
+ "shortDescription": {
+ "text": "Unnecessary block statement"
+ },
+ "fullDescription": {
+ "text": "Reports a block statement that is not used as the body of 'if', 'for', 'while', 'do', 'with', or 'try' statements, or as the body of a function declaration. Starting from ECMAScript 6, JavaScript blocks introduce new scopes for 'let' and 'const' variables, but still free-standing block statements may be confusing and result in subtle bugs when used with 'var' variables.",
+ "markdown": "Reports a block statement that is not used as the body of `if`, `for`, `while`, `do`, `with`, or `try` statements, or as the body of a function declaration. Starting from ECMAScript 6, JavaScript blocks introduce new scopes for `let` and `const` variables, but still free-standing block statements may be confusing and result in subtle bugs when used with `var` variables."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "BlockStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "InfiniteRecursionJS",
+ "shortDescription": {
+ "text": "Infinite recursion"
+ },
+ "fullDescription": {
+ "text": "Reports a function which must either recurse infinitely or throw an exception. Such functions may not return normally.",
+ "markdown": "Reports a function which must either recurse infinitely or throw an exception. Such functions may not return normally."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "InfiniteRecursionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "NestedConditionalExpressionJS",
+ "shortDescription": {
+ "text": "Nested conditional expression"
+ },
+ "fullDescription": {
+ "text": "Reports a ternary conditional expression within another ternary condition. Such nested conditionals may be extremely confusing, and best replaced by more explicit conditional logic.",
+ "markdown": "Reports a ternary conditional expression within another ternary condition. Such nested conditionals may be extremely confusing, and best replaced by more explicit conditional logic."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "NestedConditionalExpressionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "IncompatibleMaskJS",
+ "shortDescription": {
+ "text": "Incompatible bitwise mask operation"
+ },
+ "fullDescription": {
+ "text": "Reports a bitwise mask expression which for sure evaluates to 'true' or 'false'. Expressions are of the form '(var & constant1) == constant2' or '(var | constant1) == constant2', where 'constant1' and 'constant2' are incompatible bitmask constants. Example: '// Incompatible mask: as the last byte in mask is zero,\n// something like 0x1200 would be possible, but not 0x1234\nif ((mask & 0xFF00) == 0x1234) {...}'",
+ "markdown": "Reports a bitwise mask expression which for sure evaluates to `true` or `false`. Expressions are of the form `(var & constant1) == constant2` or `(var | constant1) == constant2`, where `constant1` and `constant2` are incompatible bitmask constants.\n\nExample:\n\n\n // Incompatible mask: as the last byte in mask is zero,\n // something like 0x1200 would be possible, but not 0x1234\n if ((mask & 0xFF00) == 0x1234) {...}\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "IncompatibleBitwiseMaskOperation",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Bitwise operation issues",
+ "index": 30,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6PossiblyAsyncFunction",
+ "shortDescription": {
+ "text": "'await' in non-async function"
+ },
+ "fullDescription": {
+ "text": "Reports a usage of 'await' in a function that was possibly intended to be async but is actually missing the 'async' modifier. Although 'await' can be used as an identifier, it is likely that it was intended to be used as an operator, so the containing function should be made 'async'.",
+ "markdown": "Reports a usage of `await` in a function that was possibly intended to be async but is actually missing the `async` modifier. Although `await` can be used as an identifier, it is likely that it was intended to be used as an operator, so the containing function should be made `async`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "ES6PossiblyAsyncFunction",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Async code and promises",
+ "index": 73,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TextLabelInSwitchStatementJS",
+ "shortDescription": {
+ "text": "Text label in 'switch' statement"
+ },
+ "fullDescription": {
+ "text": "Reports a labeled statement inside a 'switch' statement, which often results from a typo. Example: 'switch(x)\n {\n case 1:\n case2: //typo!\n case 3:\n break;\n }'",
+ "markdown": "Reports a labeled statement inside a `switch` statement, which often results from a typo.\n\nExample:\n\n\n switch(x)\n {\n case 1:\n case2: //typo!\n case 3:\n break;\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "TextLabelInSwitchStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Switch statement issues",
+ "index": 70,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "FlowJSFlagCommentPlacement",
+ "shortDescription": {
+ "text": "Misplaced @flow flag"
+ },
+ "fullDescription": {
+ "text": "Reports a '@flow' flag comment that is not located at the top of a file.",
+ "markdown": "Reports a `@flow` flag comment that is not located at the top of a file."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "FlowJSFlagCommentPlacement",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Flow type checker",
+ "index": 23,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSDuplicatedDeclaration",
+ "shortDescription": {
+ "text": "Duplicate declaration"
+ },
+ "fullDescription": {
+ "text": "Reports multiple declarations in a scope.",
+ "markdown": "Reports multiple declarations in a scope."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSDuplicatedDeclaration",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSOctalInteger",
+ "shortDescription": {
+ "text": "Octal integer"
+ },
+ "fullDescription": {
+ "text": "Reports a deprecated octal integer literal prefixed with '0' instead of '0o'. Such literals are not allowed in modern ECMAScript code, and using them in the strict mode is an error. To force this inspection for ES5 and ES3 language levels, select the 'Warn about obsolete octal literals in ES5- code' checkbox below.",
+ "markdown": "Reports a deprecated octal integer literal prefixed with `0` instead of `0o`. \nSuch literals are not allowed in modern ECMAScript code, and using them in the strict mode is an error. \nTo force this inspection for ES5 and ES3 language levels, select the 'Warn about obsolete octal literals in ES5- code' checkbox below."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "JSOctalInteger",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Validity issues",
+ "index": 38,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptValidateGenericTypes",
+ "shortDescription": {
+ "text": "Incorrect generic type argument"
+ },
+ "fullDescription": {
+ "text": "Reports an invalid type argument in a function, interface, or class declaration.",
+ "markdown": "Reports an invalid type argument in a function, interface, or class declaration."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "TypeScriptValidateGenericTypes",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSMismatchedCollectionQueryUpdate",
+ "shortDescription": {
+ "text": "Mismatched query and update of collection"
+ },
+ "fullDescription": {
+ "text": "Reports a collection of fields or variables whose contents are either queried and not updated or updated and not queried. Such mismatched queries and updates are pointless and may indicate either dead code or a typographical error. Query methods are automatically detected, based on whether they return something, or a callback is passed to them. Use the table below to specify which methods are update methods.",
+ "markdown": "Reports a collection of fields or variables whose contents are either queried and not updated or updated and not queried. Such mismatched queries and updates are pointless and may indicate either dead code or a typographical error.\n\n\nQuery methods are automatically detected, based on whether they return something, or a callback is passed to them.\nUse the table below to specify which methods are update methods."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSMismatchedCollectionQueryUpdate",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSMissingSwitchDefault",
+ "shortDescription": {
+ "text": "'switch' statement has no 'default' branch"
+ },
+ "fullDescription": {
+ "text": "Reports a 'switch' statement without a 'default' clause when some possible values are not enumerated.",
+ "markdown": "Reports a `switch` statement without a `default` clause when some possible values are not enumerated."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSMissingSwitchDefault",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Switch statement issues",
+ "index": 70,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSXNamespaceValidation",
+ "shortDescription": {
+ "text": "Missing JSX namespace"
+ },
+ "fullDescription": {
+ "text": "Reports a usage of a JSX construction without importing namespace. Having the namespace in the file scope ensures proper code compilation.",
+ "markdown": "Reports a usage of a JSX construction without importing namespace. Having the namespace in the file scope ensures proper code compilation."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSXNamespaceValidation",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Imports and dependencies",
+ "index": 77,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6PreferShortImport",
+ "shortDescription": {
+ "text": "Import can be shortened"
+ },
+ "fullDescription": {
+ "text": "Reports an ES6 import whose 'from' part can be shortened. Suggests importing the parent directory.",
+ "markdown": "Reports an ES6 import whose `from` part can be shortened. Suggests importing the parent directory."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ES6PreferShortImport",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PointlessBitwiseExpressionJS",
+ "shortDescription": {
+ "text": "Bitwise expression can be simplified"
+ },
+ "fullDescription": {
+ "text": "Reports an expression that includes 'and' with zero, 'or' by zero, or shifting by zero. Such expressions may result from not fully completed automated refactorings.",
+ "markdown": "Reports an expression that includes `and` with zero, `or` by zero, or shifting by zero. Such expressions may result from not fully completed automated refactorings."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "PointlessBitwiseExpressionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Bitwise operation issues",
+ "index": 30,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSStringConcatenationToES6Template",
+ "shortDescription": {
+ "text": "String concatenation is used instead of template literal"
+ },
+ "fullDescription": {
+ "text": "Reports a string concatenation. Suggests replacing it with a template literal Example '\"result: \" + a + \".\"' After applying the quick-fix the code looks as follows: '`result: ${a}.`'",
+ "markdown": "Reports a string concatenation. Suggests replacing it with a [template literal](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals)\n\nExample\n\n \"result: \" + a + \".\" \n\nAfter applying the quick-fix the code looks as follows:\n\n `result: ${a}.` \n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSStringConcatenationToES6Template",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/ES2015 migration aids",
+ "index": 33,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ReplaceAssignmentWithOperatorAssignmentJS",
+ "shortDescription": {
+ "text": "Assignment could be replaced with operator assignment"
+ },
+ "fullDescription": {
+ "text": "Reports an assignment operation that can be replaced by an operator assignment to make your code shorter and probably clearer. Example: 'x = x + 3;'\n 'x = x / 3;'\n After the quick fix is applied the result looks like: 'x += 3;'\n 'x /= 3;'",
+ "markdown": "Reports an assignment operation that can be replaced by an operator assignment to make your code shorter and probably clearer.\n\n\nExample:\n\n x = x + 3;\n x = x / 3;\n\nAfter the quick fix is applied the result looks like:\n\n x += 3;\n x /= 3;\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "AssignmentReplaceableWithOperatorAssignmentJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Assignment issues",
+ "index": 63,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSFileReferences",
+ "shortDescription": {
+ "text": "Unresolved file reference"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved file reference in a JavaScript file, including CommonJS and AMD modules references.",
+ "markdown": "Reports an unresolved file reference in a JavaScript file, including CommonJS and AMD modules references."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSFileReferences",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "FunctionWithInconsistentReturnsJS",
+ "shortDescription": {
+ "text": "Function with inconsistent returns"
+ },
+ "fullDescription": {
+ "text": "Reports a function that returns a value in some cases while in other cases no value is returned. This usually indicates an error. Example: 'function foo() {\n if (true)\n return 3;\n return;\n}'",
+ "markdown": "Reports a function that returns a value in some cases while in other cases no value is returned. This usually indicates an error.\n\nExample:\n\n\n function foo() {\n if (true)\n return 3;\n return;\n }\n\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "FunctionWithInconsistentReturnsJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Validity issues",
+ "index": 38,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6ClassMemberInitializationOrder",
+ "shortDescription": {
+ "text": "Use of possibly unassigned property in a static initializer"
+ },
+ "fullDescription": {
+ "text": "Reports a class member initializer which references another non-hoisted class member while the latter may be not initialized yet. Initialization of class members happens consequently for fields, so a field cannot reference another field that is declared later.",
+ "markdown": "Reports a class member initializer which references another non-hoisted class member while the latter may be not initialized yet. \n\nInitialization of class members happens consequently for fields, so a field cannot reference another field that is declared later."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ES6ClassMemberInitializationOrder",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EmptyTryBlockJS",
+ "shortDescription": {
+ "text": "Empty 'try' block"
+ },
+ "fullDescription": {
+ "text": "Reports an empty 'try' block, which usually indicates an error.",
+ "markdown": "Reports an empty `try` block, which usually indicates an error."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EmptyTryBlockJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Try statement issues",
+ "index": 45,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ReservedWordUsedAsNameJS",
+ "shortDescription": {
+ "text": "Reserved word used as name"
+ },
+ "fullDescription": {
+ "text": "Reports a JavaScript reserved word used as a name. The JavaScript specification reserves a number of words which are currently not used as keywords. Using those words as identifiers may result in broken code if later versions of JavaScript start using them as keywords.",
+ "markdown": "Reports a JavaScript reserved word used as a name. The JavaScript specification reserves a number of words which are currently not used as keywords. Using those words as identifiers may result in broken code if later versions of JavaScript start using them as keywords."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ReservedWordAsName",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Validity issues",
+ "index": 38,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "NestedFunctionJS",
+ "shortDescription": {
+ "text": "Nested function"
+ },
+ "fullDescription": {
+ "text": "Reports a function nested inside another function. Although JavaScript allows functions to be nested, such constructs may be confusing. Use the checkbox below to ignore anonymous nested functions.",
+ "markdown": "Reports a function nested inside another function. Although JavaScript allows functions to be nested, such constructs may be confusing.\n\n\nUse the checkbox below to ignore anonymous nested functions."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "NestedFunctionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "IncrementDecrementResultUsedJS",
+ "shortDescription": {
+ "text": "Result of increment or decrement used"
+ },
+ "fullDescription": {
+ "text": "Reports an increment ('++') or decrement ('--') expression where the result of the assignment is used in a containing expression. Such assignments can result in confusion due to the order of operations, as evaluation of the assignment may affect the outer expression in unexpected ways. Example: 'var a = b++'",
+ "markdown": "Reports an increment (`++`) or decrement (`--`) expression where the result of the assignment is used in a containing expression. Such assignments can result in confusion due to the order of operations, as evaluation of the assignment may affect the outer expression in unexpected ways. Example: `var a = b++`"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "IncrementDecrementResultUsedJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "SuspiciousTypeOfGuard",
+ "shortDescription": {
+ "text": "Unsound type guard check"
+ },
+ "fullDescription": {
+ "text": "Reports a 'typeof' or 'instanceof' unsound type guard check. The 'typeof x' type guard can be unsound in one of the following two cases: 'typeof x' never corresponds to the specified value (for example, 'typeof x === 'number'' when 'x' is of the type 'string | boolean') 'typeof x' always corresponds to the specified value (for example, 'typeof x === 'string'' when 'x' is of the type 'string') The 'x instanceof A' type guard can be unsound in one of the following two cases: The type of 'x' is not related to 'A' The type of 'x' is 'A' or a subtype of 'A'",
+ "markdown": "Reports a `typeof` or `instanceof` unsound type guard check. The `typeof x` type guard can be unsound in one of the following two cases:\n\n* `typeof x` never corresponds to the specified value (for example, `typeof x === 'number'` when `x` is of the type 'string \\| boolean')\n* `typeof x` always corresponds to the specified value (for example, `typeof x === 'string'` when `x` is of the type 'string')\n\nThe `x instanceof A` type guard can be unsound in one of the following two cases:\n\n* The type of `x` is not related to `A`\n* The type of `x` is `A` or a subtype of `A`"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "SuspiciousTypeOfGuard",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6DestructuringVariablesMerge",
+ "shortDescription": {
+ "text": "Destructuring properties with the same key"
+ },
+ "fullDescription": {
+ "text": "Reports multiple destructuring properties with identical keys. Suggests merging the properties.",
+ "markdown": "Reports multiple destructuring properties with identical keys. Suggests merging the properties."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "ES6DestructuringVariablesMerge",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "LoopStatementThatDoesntLoopJS",
+ "shortDescription": {
+ "text": "Loop statement that doesn't loop"
+ },
+ "fullDescription": {
+ "text": "Reports a 'for', 'while', or 'do' statement whose bodies are guaranteed to execute at most once. Normally, this indicates an error.",
+ "markdown": "Reports a `for`, `while`, or `do` statement whose bodies are guaranteed to execute at most once. Normally, this indicates an error."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "LoopStatementThatDoesntLoopJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSNonASCIINames",
+ "shortDescription": {
+ "text": "Identifiers with non-ASCII symbols"
+ },
+ "fullDescription": {
+ "text": "Reports a non-ASCII symbol in a name. If the 'Allow only ASCII names' option is selected, reports all names that contain non-ASCII symbols. Otherwise reports all names that contain both ASCII and non-ASCII symbols.",
+ "markdown": "Reports a non-ASCII symbol in a name. \n\nIf the 'Allow only ASCII names' option is selected, reports all names that contain non-ASCII symbols. \nOtherwise reports all names that contain both ASCII and non-ASCII symbols."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSNonASCIINames",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Naming conventions",
+ "index": 83,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptRedundantGenericType",
+ "shortDescription": {
+ "text": "Redundant type arguments"
+ },
+ "fullDescription": {
+ "text": "Reports a type argument that is equal to the default one and can be removed. Example: 'type Foo = T;\nlet z: Foo;'",
+ "markdown": "Reports a type argument that is equal to the default one and can be removed.\n\n\nExample:\n\n\n type Foo = T;\n let z: Foo;\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "TypeScriptRedundantGenericType",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptUMDGlobal",
+ "shortDescription": {
+ "text": "Referenced UMD global variable"
+ },
+ "fullDescription": {
+ "text": "Reports a usage of a Universal Module Definition (UMD) global variable if the current file is a module (ECMAScript or CommonJS). Referencing UMD variables without explicit imports can lead to a runtime error if the library isn't included implicitly.",
+ "markdown": "Reports a usage of a Universal Module Definition (UMD) global variable if the current file is a module (ECMAScript or CommonJS). Referencing UMD variables without explicit imports can lead to a runtime error if the library isn't included implicitly."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "TypeScriptUMDGlobal",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "UnnecessaryReturnJS",
+ "shortDescription": {
+ "text": "Unnecessary 'return' statement"
+ },
+ "fullDescription": {
+ "text": "Reports an unnecessary 'return' statement, that is, a 'return' statement that returns no value and occurs just before the function would have \"fallen through\" the bottom. These statements may be safely removed.",
+ "markdown": "Reports an unnecessary `return` statement, that is, a `return` statement that returns no value and occurs just before the function would have \"fallen through\" the bottom. These statements may be safely removed."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "UnnecessaryReturnStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSLastCommaInObjectLiteral",
+ "shortDescription": {
+ "text": "Unneeded last comma in object literal"
+ },
+ "fullDescription": {
+ "text": "Reports usages of a trailing comma in object literals. The warning is reported only when the JavaScript language version is set to ECMAScript 5.1. Trailing commas in object literals are allowed by the specification, however, some browsers might throw an error when a trailing comma is used. You can configure formatting options for trailing commas in Code Style | JavaScript or TypeScript | Punctuation.",
+ "markdown": "Reports usages of a trailing comma in object literals.\n\nThe warning is reported only when the JavaScript language version is set to ECMAScript 5.1.\n\nTrailing commas in object literals are allowed by the specification, however, some browsers might throw an error when a trailing comma is used.\n\nYou can configure formatting options for trailing commas in **Code Style** \\| **JavaScript** or **TypeScript** \\| **Punctuation**."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSLastCommaInObjectLiteral",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6MissingAwait",
+ "shortDescription": {
+ "text": "Missing await for an async function call"
+ },
+ "fullDescription": {
+ "text": "Reports an 'async' function call without an expected 'await' prefix inside an 'async' function. Such call returns a 'Promise' and control flow is continued immediately. Example: 'async function bar() { /* ... */ }\nasync function foo() {\n bar(); // bad\n}' After the quick-fix is applied, the 'await' prefix is added: 'async function bar() { /* ... */ }\nasync function foo() {\n await bar(); // good\n}' When the 'Report for promises in return statements' checkbox is selected, also suggests adding 'await' in return statements. While this is generally not necessary, it gives two main benefits. You won't forget to add 'await' when surrounding your code with 'try-catch'. An explicit 'await' helps V8 runtime to provide async stack traces.",
+ "markdown": "Reports an `async` function call without an expected `await` prefix inside an `async` function. Such call returns a `Promise` and control flow is continued immediately.\n\nExample:\n\n\n async function bar() { /* ... */ }\n async function foo() {\n bar(); // bad\n }\n\n\nAfter the quick-fix is applied, the `await` prefix is added:\n\n\n async function bar() { /* ... */ }\n async function foo() {\n await bar(); // good\n }\n\nWhen the 'Report for promises in return statements' checkbox is selected, also suggests adding `await` in return statements. \nWhile this is generally not necessary, it gives two main benefits. \n\n* You won't forget to add `await` when surrounding your code with `try-catch`.\n* An explicit `await` helps V8 runtime to provide [async stack traces](https://bit.ly/v8-zero-cost-async-stack-traces)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "ES6MissingAwait",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Async code and promises",
+ "index": 73,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TailRecursionJS",
+ "shortDescription": {
+ "text": "Tail recursion"
+ },
+ "fullDescription": {
+ "text": "Reports a tail recursion, that is, when a function calls itself as its last action before returning. A tail recursion can always be replaced by looping, which will be considerably faster. Some JavaScript engines perform this optimization, while others do not. Thus, tail recursive solutions may have considerably different performance characteristics in different environments.",
+ "markdown": "Reports a tail recursion, that is, when a function calls itself as its last action before returning. A tail recursion can always be replaced by looping, which will be considerably faster. Some JavaScript engines perform this optimization, while others do not. Thus, tail recursive solutions may have considerably different performance characteristics in different environments."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "TailRecursionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "FlowJSCoverage",
+ "shortDescription": {
+ "text": "Code is not covered by Flow"
+ },
+ "fullDescription": {
+ "text": "Reports JavaScript code fragments that are not covered by the Flow type checker. To use this inspection, configure the Flow executable in Settings | Languages & Frameworks | JavaScript.",
+ "markdown": "Reports JavaScript code fragments that are not covered by the Flow type checker. To use this inspection, configure the Flow executable in [Settings \\| Languages \\& Frameworks \\| JavaScript](settings://Settings.JavaScript)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "FlowJSCoverage",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Flow type checker",
+ "index": 23,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "StandardJS",
+ "shortDescription": {
+ "text": "Standard code style"
+ },
+ "fullDescription": {
+ "text": "Reports a discrepancy detected by the JavaScript Standard Style linter. The highlighting severity in the editor is based on the severity level the linter reports.",
+ "markdown": "Reports a discrepancy detected by the [JavaScript Standard Style](https://standardjs.com/) linter. \n\nThe highlighting severity in the editor is based on the severity level the linter reports."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "StandardJS",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code quality tools",
+ "index": 85,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "NestedAssignmentJS",
+ "shortDescription": {
+ "text": "Nested assignment"
+ },
+ "fullDescription": {
+ "text": "Reports an assignment expression nested inside another expression, for example, 'a = b = 1'. Such expressions may be confusing and violate the general design principle that a given construct should do precisely one thing.",
+ "markdown": "Reports an assignment expression nested inside another expression, for example, `a = b = 1`. Such expressions may be confusing and violate the general design principle that a given construct should do precisely one thing."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "NestedAssignmentJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Assignment issues",
+ "index": 63,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "DefaultNotLastCaseInSwitchJS",
+ "shortDescription": {
+ "text": "'default' not last case in 'switch'"
+ },
+ "fullDescription": {
+ "text": "Reports a 'switch' statement where the 'default' case comes before another case instead of being the very last case, which may cause confusion.",
+ "markdown": "Reports a `switch` statement where the `default` case comes before another case instead of being the very last case, which may cause confusion."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "DefaultNotLastCaseInSwitchJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Switch statement issues",
+ "index": 70,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ConfusingPlusesOrMinusesJS",
+ "shortDescription": {
+ "text": "Confusing sequence of '+' or '-'"
+ },
+ "fullDescription": {
+ "text": "Reports a suspicious combination of '+' or '-' characters in JavaScript code (for example, 'a+++b'. Such sequences are confusing, and their semantics may change through changes in the whitespace.",
+ "markdown": "Reports a suspicious combination of `+` or `-` characters in JavaScript code (for example, `a+++b`. Such sequences are confusing, and their semantics may change through changes in the whitespace."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ConfusingPlusesOrMinusesJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EmptyFinallyBlockJS",
+ "shortDescription": {
+ "text": "Empty 'finally' block"
+ },
+ "fullDescription": {
+ "text": "Reports an empty 'finally' block, which usually indicates an error.",
+ "markdown": "Reports an empty `finally` block, which usually indicates an error."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EmptyFinallyBlockJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Try statement issues",
+ "index": 45,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSCommentMatchesSignature",
+ "shortDescription": {
+ "text": "Mismatched JSDoc and function signature"
+ },
+ "fullDescription": {
+ "text": "Reports mismatch between the names and the number of parameters within a JSDoc comment and the actual parameters of a function. Suggests updating parameters in JSDoc comment. Example: '/**\n * @param height Height in pixels\n */\nfunction sq(height, width) {} // width is not documented' After the quick-fix is applied: '/**\n * @param height Height in pixels\n * @param width\n */\nfunction sq(height, width) {}'",
+ "markdown": "Reports mismatch between the names and the number of parameters within a JSDoc comment and the actual parameters of a function. Suggests updating parameters in JSDoc comment.\n\n**Example:**\n\n\n /**\n * @param height Height in pixels\n */\n function sq(height, width) {} // width is not documented\n\nAfter the quick-fix is applied:\n\n\n /**\n * @param height Height in pixels\n * @param width\n */\n function sq(height, width) {}\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSCommentMatchesSignature",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptConfig",
+ "shortDescription": {
+ "text": "Inconsistent tsconfig.json properties"
+ },
+ "fullDescription": {
+ "text": "Reports inconsistency of a 'paths', 'checkJs', or 'extends' property in a tsconfig.json file. The 'checkJs' property requires 'allowJs'. The 'extends' property should be a valid file reference.",
+ "markdown": "Reports inconsistency of a `paths`, `checkJs`, or `extends` property in a tsconfig.json file. \nThe `checkJs` property requires `allowJs`. \nThe `extends` property should be a valid file reference."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "TypeScriptConfig",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ForLoopThatDoesntUseLoopVariableJS",
+ "shortDescription": {
+ "text": "'for' loop where update or condition does not use loop variable"
+ },
+ "fullDescription": {
+ "text": "Reports a 'for' loop where the condition or update does not use the 'for' loop variable.",
+ "markdown": "Reports a `for` loop where the condition or update does not use the `for` loop variable."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ForLoopThatDoesntUseLoopVariableJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptAbstractClassConstructorCanBeMadeProtected",
+ "shortDescription": {
+ "text": "Abstract class constructor can be made protected"
+ },
+ "fullDescription": {
+ "text": "Reports a public constructor of an abstract class and suggests making it protected (because it is useless to have it public).",
+ "markdown": "Reports a public constructor of an abstract class and suggests making it protected (because it is useless to have it public)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "TypeScriptAbstractClassConstructorCanBeMadeProtected",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "FunctionWithMultipleReturnPointsJS",
+ "shortDescription": {
+ "text": "Function with multiple return points"
+ },
+ "fullDescription": {
+ "text": "Reports a function with multiple return points. Such functions are hard to understand and maintain.",
+ "markdown": "Reports a function with multiple return points. Such functions are hard to understand and maintain."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "FunctionWithMultipleReturnPointsJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Function metrics",
+ "index": 90,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSIgnoredPromiseFromCall",
+ "shortDescription": {
+ "text": "Result of method call returning a promise is ignored"
+ },
+ "fullDescription": {
+ "text": "Reports a function call that returns a 'Promise' that is not used later. Such calls are usually unintended and indicate an error.",
+ "markdown": "Reports a function call that returns a `Promise` that is not used later. Such calls are usually unintended and indicate an error."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSIgnoredPromiseFromCall",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Async code and promises",
+ "index": 73,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ThreeNegationsPerFunctionJS",
+ "shortDescription": {
+ "text": "Function with more than three negations"
+ },
+ "fullDescription": {
+ "text": "Reports a function with three or more negation operations ('!' or '!='). Such functions may be unnecessarily confusing.",
+ "markdown": "Reports a function with three or more negation operations (`!` or `!=`). Such functions may be unnecessarily confusing."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "FunctionWithMoreThanThreeNegationsJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Function metrics",
+ "index": 90,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSRemoveUnnecessaryParentheses",
+ "shortDescription": {
+ "text": "Unnecessary parentheses"
+ },
+ "fullDescription": {
+ "text": "Reports redundant parentheses. In expressions: 'var x = ((1) + 2) + 3' In arrow function argument lists: 'var incrementer = (x) => x + 1' In TypeScript and Flow type declarations: 'type Card = (Suit & Rank) | (Suit & Number)'",
+ "markdown": "Reports redundant parentheses.\n\nIn expressions:\n\n var x = ((1) + 2) + 3\n\nIn arrow function argument lists:\n\n var incrementer = (x) => x + 1\n\nIn TypeScript and Flow type declarations:\n\n type Card = (Suit & Rank) | (Suit & Number)\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSRemoveUnnecessaryParentheses",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code style issues",
+ "index": 62,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "OverlyComplexBooleanExpressionJS",
+ "shortDescription": {
+ "text": "Overly complex boolean expression"
+ },
+ "fullDescription": {
+ "text": "Reports a boolean expression with too many terms. Such expressions may be confusing and bug-prone. Use the field below to specify the maximum number of terms allowed in an arithmetic expression.",
+ "markdown": "Reports a boolean expression with too many terms. Such expressions may be confusing and bug-prone.\n\n\nUse the field below to specify the maximum number of terms allowed in an arithmetic expression."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "OverlyComplexBooleanExpressionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "OverlyComplexArithmeticExpressionJS",
+ "shortDescription": {
+ "text": "Overly complex arithmetic expression"
+ },
+ "fullDescription": {
+ "text": "Reports an arithmetic expression with too many terms. Such expressions may be confusing and bug-prone. Use the field below to specify the maximum number of terms allowed in an arithmetic expression.",
+ "markdown": "Reports an arithmetic expression with too many terms. Such expressions may be confusing and bug-prone.\n\n\nUse the field below to specify the maximum number of terms allowed in an arithmetic expression."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "OverlyComplexArithmeticExpressionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "StringLiteralBreaksHTMLJS",
+ "shortDescription": {
+ "text": "String literal which breaks HTML parsing"
+ },
+ "fullDescription": {
+ "text": "Reports a string literal that contains a '' sequence. Such strings may result in incorrect parsing of any HTML in which the JavaScript code is embedded.",
+ "markdown": "Reports a string literal that contains a `` sequence. Such strings may result in incorrect parsing of any HTML in which the JavaScript code is embedded."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "StringLiteralBreaksHTMLJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Validity issues",
+ "index": 38,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "DuplicateConditionJS",
+ "shortDescription": {
+ "text": "Duplicate condition in 'if' statement"
+ },
+ "fullDescription": {
+ "text": "Reports duplicate conditions in different branches of an 'if' statement. Duplicate conditions usually represent programmer oversight. Example: 'if (a) {\n ...\n } else if (a) {\n ...\n }'",
+ "markdown": "Reports duplicate conditions in different branches of an `if` statement. Duplicate conditions usually represent programmer oversight.\n\nExample:\n\n\n if (a) {\n ...\n } else if (a) {\n ...\n }\n\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "DuplicateConditionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TrivialIfJS",
+ "shortDescription": {
+ "text": "Redundant 'if' statement"
+ },
+ "fullDescription": {
+ "text": "Reports an 'if' statement that can be simplified to a single assignment or a 'return' statement. Example: 'if(foo())\n {\n return true;\n }\n else\n {\n return false;\n }' After applying the quick-fix the code looks as follows: 'return foo();'",
+ "markdown": "Reports an `if` statement that can be simplified to a single assignment or a `return` statement.\n\nExample:\n\n\n if(foo())\n {\n return true;\n }\n else\n {\n return false;\n }\n\nAfter applying the quick-fix the code looks as follows:\n\n return foo();\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RedundantIfStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CommaExpressionJS",
+ "shortDescription": {
+ "text": "Comma expression"
+ },
+ "fullDescription": {
+ "text": "Reports a comma expression. Such expressions are often a sign of overly clever code, and may lead to subtle bugs. Comma expressions in the initializer or in the update section of 'for' loops are ignored.",
+ "markdown": "Reports a comma expression. Such expressions are often a sign of overly clever code, and may lead to subtle bugs. Comma expressions in the initializer or in the update section of `for` loops are ignored."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CommaExpressionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially undesirable code constructs",
+ "index": 51,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6BindWithArrowFunction",
+ "shortDescription": {
+ "text": "Suspicious usage of 'bind' with arrow function"
+ },
+ "fullDescription": {
+ "text": "Reports 'bind' used together with an arrow function. Because arrow functions use lexical 'this', a 'bind' call will have no effect on them. See here for details.",
+ "markdown": "Reports `bind` used together with an arrow function. \nBecause arrow functions use lexical `this`, a `bind` call will have no effect on them. \nSee [here](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Lexical_this) for details."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ES6BindWithArrowFunction",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSComparisonWithNaN",
+ "shortDescription": {
+ "text": "Comparison with NaN"
+ },
+ "fullDescription": {
+ "text": "Reports a comparison with NaN. Comparisons like 'expr == NaN' or 'expr === NaN' are always evaluated to 'false'.",
+ "markdown": "Reports a comparison with NaN. Comparisons like `expr == NaN` or `expr === NaN` are always evaluated to `false`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSComparisonWithNaN",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "UnnecessaryLabelJS",
+ "shortDescription": {
+ "text": "Unnecessary label"
+ },
+ "fullDescription": {
+ "text": "Reports an unused label.",
+ "markdown": "Reports an unused label."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "UnnecessaryLabelJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSBitwiseOperatorUsage",
+ "shortDescription": {
+ "text": "Bitwise operator usage"
+ },
+ "fullDescription": {
+ "text": "Reports a suspicious usage of a bitwise AND (\"'&'\") or OR (\"'|'\") operator. Usually it is a typo and the result of applying boolean operations AND (\"'&&'\") and OR (\"'||'\") is expected.",
+ "markdown": "Reports a suspicious usage of a bitwise AND (\"`&`\") or OR (\"`|`\") operator. Usually it is a typo and the result of applying boolean operations AND (\"`&&`\") and OR (\"`||`\") is expected."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSBitwiseOperatorUsage",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Bitwise operation issues",
+ "index": 30,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSUnresolvedReference",
+ "shortDescription": {
+ "text": "Unresolved reference"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved reference in JavaScript code. In TypeScript code, a problem is reported if the part of the reference before the dot is of the type 'any'.",
+ "markdown": "Reports an unresolved reference in JavaScript code. In TypeScript code, a problem is reported if the part of the reference before the dot is of the type `any`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSUnresolvedReference",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "UnterminatedStatementJS",
+ "shortDescription": {
+ "text": "Unterminated statement"
+ },
+ "fullDescription": {
+ "text": "Reports a statement without a semicolon or a newline at the end. Select the 'Terminate statements with semicolons' option in Editor | Code Style | JavaScript or TypeScript - Punctuation to report any statement that doesn't end with a semicolon, even if a newline is used. According to some coding styles, semicolons are preferred to line-breaks for consistency with the other languages.",
+ "markdown": "Reports a statement without a semicolon or a newline at the end.\n\nSelect the 'Terminate statements with semicolons' option in *Editor \\| Code Style \\| JavaScript or TypeScript - Punctuation* to report any statement that doesn't end with a semicolon, even if a newline is used.\nAccording to some coding styles, semicolons are preferred to line-breaks for consistency with the other languages."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "UnterminatedStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code style issues",
+ "index": 62,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PlatformDetectionJS",
+ "shortDescription": {
+ "text": "Inaccurate platform detection"
+ },
+ "fullDescription": {
+ "text": "Reports a common JavaScript pattern for detecting the browser or operating system in which the script is run. In addition to pointing out non-portable constructs, these platform detection patterns are often incomplete and easily fooled. For most cases, detection of individual environment features is preferable to attempting to detect the entire platform. Patterns detected include: 'document.all' 'document.layers' 'navigator.userAgent' 'navigator.oscpu' 'navigator.appName' 'navigator.appCodeName' 'navigator.platform'",
+ "markdown": "Reports a common JavaScript pattern for detecting the browser or operating system in which the script is run. In addition to pointing out non-portable constructs, these platform detection patterns are often incomplete and easily fooled. For most cases, detection of individual environment features is preferable to attempting to detect the entire platform.\n\nPatterns detected include:\n\n* `document.all`\n* `document.layers`\n* `navigator.userAgent`\n* `navigator.oscpu`\n* `navigator.appName`\n* `navigator.appCodeName`\n* `navigator.platform`"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "PlatformDetectionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/DOM issues",
+ "index": 72,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "IfStatementWithIdenticalBranchesJS",
+ "shortDescription": {
+ "text": "'if' statement with identical branches"
+ },
+ "fullDescription": {
+ "text": "Reports an 'if' statement with identical 'then' and 'else' branches. Such statements are almost certainly an error.",
+ "markdown": "Reports an `if` statement with identical `then` and `else` branches. Such statements are almost certainly an error."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "IfStatementWithIdenticalBranchesJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSConsecutiveCommasInArrayLiteral",
+ "shortDescription": {
+ "text": "Consecutive commas in array literal"
+ },
+ "fullDescription": {
+ "text": "Reports a consecutive comma in an array literal. The skipped element accepts the 'undefined' value, but it could be done unintentionally, for example, when commas are at the end of one line and at the beginning of the next one.",
+ "markdown": "Reports a consecutive comma in an array literal. The skipped element accepts the `undefined` value, but it could be done unintentionally, for example, when commas are at the end of one line and at the beginning of the next one."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSConsecutiveCommasInArrayLiteral",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSUnreachableSwitchBranches",
+ "shortDescription": {
+ "text": "Unreachable 'case' branch of a 'switch' statement"
+ },
+ "fullDescription": {
+ "text": "Reports an unreachable 'case' branch of a 'switch' statement. Example: '/**\n * @param {('foo' | 'bar')} p\n */\nfunction foo(p) {\n switch (p) {\n case 'foo': break;\n case 'bar': break;\n case 'baz': break; // unreachable\n }\n}'",
+ "markdown": "Reports an unreachable `case` branch of a `switch` statement.\n\nExample:\n\n\n /**\n * @param {('foo' | 'bar')} p\n */\n function foo(p) {\n switch (p) {\n case 'foo': break;\n case 'bar': break;\n case 'baz': break; // unreachable\n }\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSUnreachableSwitchBranches",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Switch statement issues",
+ "index": 70,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptDuplicateUnionOrIntersectionType",
+ "shortDescription": {
+ "text": "Duplicate union or intersection type component"
+ },
+ "fullDescription": {
+ "text": "Reports a duplicate type inside a union or intersection.",
+ "markdown": "Reports a duplicate type inside a union or intersection."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "TypeScriptDuplicateUnionOrIntersectionType",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TrivialConditionalJS",
+ "shortDescription": {
+ "text": "Redundant conditional expression"
+ },
+ "fullDescription": {
+ "text": "Reports a conditional expression of the form 'condition ? true : false\ncondition ? false : true' These expressions may be safely converted to 'condition\n!condition'",
+ "markdown": "Reports a conditional expression of the form\n\n\n condition ? true : false\n condition ? false : true\n\n\nThese expressions may be safely converted to\n\n\n condition\n !condition\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RedundantConditionalExpressionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6UnusedImports",
+ "shortDescription": {
+ "text": "Unused import"
+ },
+ "fullDescription": {
+ "text": "Reports a redundant 'import' statement. This is usually the case if the imported symbols are not used in the source file. To avoid side-effects, consider using bare import 'import 'packageName'' instead of the regular one.",
+ "markdown": "Reports a redundant `import` statement. This is usually the case if the imported symbols are not used in the source file. To avoid side-effects, consider using bare import `import 'packageName'` instead of the regular one."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ES6UnusedImports",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Imports and dependencies",
+ "index": 77,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "InnerHTMLJS",
+ "shortDescription": {
+ "text": "Use of 'innerHTML' property"
+ },
+ "fullDescription": {
+ "text": "Reports a JavaScript access to DOM nodes as text using the 'innerHTML' property. Most usages of 'innerHTML' are performed better with explicit DOM calls, such as 'getElementByID()' and 'createElement()'. Additionally, 'innerHTML' will not work with XML DOMs, including DOMs for XHTML if viewed as XML. This can lead to difficulties in diagnosing bugs.",
+ "markdown": "Reports a JavaScript access to DOM nodes as text using the `innerHTML` property. Most usages of `innerHTML` are performed better with explicit DOM calls, such as `getElementByID()` and `createElement()`. Additionally, `innerHTML` will not work with XML DOMs, including DOMs for XHTML if viewed as XML. This can lead to difficulties in diagnosing bugs."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "InnerHTMLJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/DOM issues",
+ "index": 72,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "VoidExpressionJS",
+ "shortDescription": {
+ "text": "'void' expression"
+ },
+ "fullDescription": {
+ "text": "Reports a 'void' expression.",
+ "markdown": "Reports a `void` expression."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "VoidExpressionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially undesirable code constructs",
+ "index": 51,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSAssignmentUsedAsCondition",
+ "shortDescription": {
+ "text": "Assignment used as condition"
+ },
+ "fullDescription": {
+ "text": "Reports an assignment that is used as the condition of an 'if', 'while', 'for', or 'do' statement. Although occasionally intended, this usage is confusing, and often indicates a typo (for example, '=' instead of '==').",
+ "markdown": "Reports an assignment that is used as the condition of an `if`, `while`, `for`, or `do` statement. Although occasionally intended, this usage is confusing, and often indicates a typo (for example, `=` instead of `==`)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSAssignmentUsedAsCondition",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Assignment issues",
+ "index": 63,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ForLoopReplaceableByWhileJS",
+ "shortDescription": {
+ "text": "'for' loop may be replaced by 'while' loop"
+ },
+ "fullDescription": {
+ "text": "Reports a 'for' loop that contains neither initialization nor an update component. Suggests replacing the loop with a simpler 'while' statement. Example: 'for(; exitCondition(); ) {\n process();\n }' After the quick-fix is applied the result looks like: 'while(exitCondition()) {\n process();\n }' Use the checkbox below if you wish this inspection to ignore for loops with trivial or non-existent conditions.",
+ "markdown": "Reports a `for` loop that contains neither initialization nor an update component. Suggests replacing the loop with a simpler `while` statement.\n\nExample:\n\n\n for(; exitCondition(); ) {\n process();\n }\n\nAfter the quick-fix is applied the result looks like:\n\n\n while(exitCondition()) {\n process();\n }\n\nUse the checkbox below if you wish this inspection to ignore **for** loops with trivial or non-existent conditions."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ForLoopReplaceableByWhile",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSVoidFunctionReturnValueUsed",
+ "shortDescription": {
+ "text": "Void function return value used"
+ },
+ "fullDescription": {
+ "text": "Reports a return value of a function that doesn't return anything. Calling of such functions always produces an 'undefined' value and such assignment may indicate an error. Example: 'let a = console.log('foo');' The following usages are ignored: Inside a return statement In some binary operations For overridden non-void functions",
+ "markdown": "Reports a return value of a function that doesn't return anything. Calling of such functions always produces an `undefined` value and such assignment may indicate an error.\n\nExample:\n\n\n let a = console.log('foo');\n\nThe following usages are ignored:\n\n* Inside a return statement\n* In some binary operations\n* For overridden non-void functions"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSVoidFunctionReturnValueUsed",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ReturnFromFinallyBlockJS",
+ "shortDescription": {
+ "text": "'return' inside 'finally' block"
+ },
+ "fullDescription": {
+ "text": "Reports a 'return' statement inside a 'finally' block. Such 'return' statements may mask exceptions thrown, and complicate debugging.",
+ "markdown": "Reports a `return` statement inside a `finally` block. Such `return` statements may mask exceptions thrown, and complicate debugging."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ReturnInsideFinallyBlockJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Try statement issues",
+ "index": 45,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSValidateTypes",
+ "shortDescription": {
+ "text": "Type mismatch"
+ },
+ "fullDescription": {
+ "text": "Reports incorrect type of: a parameter in a function call a return value an assigned expression TypeScript code is ignored.",
+ "markdown": "Reports incorrect type of:\n\n* a parameter in a function call\n* a return value\n* an assigned expression\n\nTypeScript code is ignored."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSValidateTypes",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ConstantConditionalExpressionJS",
+ "shortDescription": {
+ "text": "Constant conditional expression"
+ },
+ "fullDescription": {
+ "text": "Reports a conditional expression in the format 'true? result1: result2' or 'false? result1: result2. Suggests simplifying the expression.'",
+ "markdown": "Reports a conditional expression in the format `true? result1: result2` or `false? result1: result2``.\nSuggests simplifying the expression.\n`"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ConstantConditionalExpressionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSTestFailedLine",
+ "shortDescription": {
+ "text": "Highlight failure line in test code"
+ },
+ "fullDescription": {
+ "text": "Reports a failed method call or an assertion in a test.",
+ "markdown": "Reports a failed method call or an assertion in a test."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSTestFailedLine",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Unit testing",
+ "index": 11,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "IfStatementWithTooManyBranchesJS",
+ "shortDescription": {
+ "text": "'if' statement with too many branches"
+ },
+ "fullDescription": {
+ "text": "Reports an 'if' statement with too many branches. Such statements may be confusing, and often indicate inadequate levels of design abstraction. Use the field below to specify the maximum number of branches expected.",
+ "markdown": "Reports an `if` statement with too many branches. Such statements may be confusing, and often indicate inadequate levels of design abstraction.\n\n\nUse the field below to specify the maximum number of branches expected."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "IfStatementWithTooManyBranchesJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "NonBlockStatementBodyJS",
+ "shortDescription": {
+ "text": "Statement body without braces"
+ },
+ "fullDescription": {
+ "text": "Reports a 'if', 'while', 'for', or 'with' statements whose body is not a block statement. Using code block in statement bodies is usually safer for downstream maintenance.",
+ "markdown": "Reports a `if`, `while`, `for`, or `with` statements whose body is not a block statement. Using code block in statement bodies is usually safer for downstream maintenance."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "NonBlockStatementBodyJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code style issues",
+ "index": 62,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSValidateJSDoc",
+ "shortDescription": {
+ "text": "Syntax errors and unresolved references in JSDoc"
+ },
+ "fullDescription": {
+ "text": "Reports a syntax discrepancy in a documentation comment.",
+ "markdown": "Reports a syntax discrepancy in a documentation comment."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSValidateJSDoc",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "BreakStatementJS",
+ "shortDescription": {
+ "text": "'break' statement"
+ },
+ "fullDescription": {
+ "text": "Reports a 'break' statements. Ignores 'break' statements that end case blocks.",
+ "markdown": "Reports a `break` statements. Ignores `break` statements that end case blocks."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "BreakStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially undesirable code constructs",
+ "index": 51,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "FlowJSConfig",
+ "shortDescription": {
+ "text": "Missing .flowconfig"
+ },
+ "fullDescription": {
+ "text": "Reports a JavaScript file with a '@flow' flag that doesn't have an associated '.flowconfig' file in the project.",
+ "markdown": "Reports a JavaScript file with a `@flow` flag that doesn't have an associated `.flowconfig` file in the project."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "FlowJSConfig",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Flow type checker",
+ "index": 23,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSPotentiallyInvalidUsageOfClassThis",
+ "shortDescription": {
+ "text": "Potentially invalid reference to 'this' of a class from closure"
+ },
+ "fullDescription": {
+ "text": "Reports an attempt to reference a member of an ECMAScript class via the 'this.' qualifier in a nested function that is not a lambda. 'this' in a nested function that is not a lambda is the function's own 'this' and doesn't relate to the outer class.",
+ "markdown": "Reports an attempt to reference a member of an ECMAScript class via the `this.` qualifier in a nested function that is not a lambda. \n`this` in a nested function that is not a lambda is the function's own `this` and doesn't relate to the outer class."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSPotentiallyInvalidUsageOfClassThis",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "DebuggerStatementJS",
+ "shortDescription": {
+ "text": "'debugger' statement"
+ },
+ "fullDescription": {
+ "text": "Reports a 'debugger' statement used for interaction with the Javascript debuggers. Such statements should not appear in production code.",
+ "markdown": "Reports a `debugger` statement used for interaction with the Javascript debuggers. Such statements should not appear in production code."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "DebuggerStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially undesirable code constructs",
+ "index": 51,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "UnnecessaryContinueJS",
+ "shortDescription": {
+ "text": "Unnecessary 'continue' statement"
+ },
+ "fullDescription": {
+ "text": "Reports an unnecessary 'continue' statement at the end of a loop. Suggests removing such statements.",
+ "markdown": "Reports an unnecessary `continue` statement at the end of a loop. Suggests removing such statements."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "UnnecessaryContinueJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptValidateTypes",
+ "shortDescription": {
+ "text": "Type mismatch"
+ },
+ "fullDescription": {
+ "text": "Reports a parameter, return value, or assigned expression of incorrect type.",
+ "markdown": "Reports a parameter, return value, or assigned expression of incorrect type."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "TypeScriptValidateTypes",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "BreakStatementWithLabelJS",
+ "shortDescription": {
+ "text": "'break' statement with label"
+ },
+ "fullDescription": {
+ "text": "Reports a labeled 'break' statement.",
+ "markdown": "Reports a labeled `break` statement."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "BreakStatementWithLabelJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially undesirable code constructs",
+ "index": 51,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "StatementsPerFunctionJS",
+ "shortDescription": {
+ "text": "Overly long function"
+ },
+ "fullDescription": {
+ "text": "Reports an overly long function. Function length is calculated by counting up the number of non-empty statements in the function. Functions that are too long are error-prone and difficult to test. Use the field below to specify the maximum acceptable number of statements in a function.",
+ "markdown": "Reports an overly long function. Function length is calculated by counting up the number of non-empty statements in the function. Functions that are too long are error-prone and difficult to test.\n\n\nUse the field below to specify the maximum acceptable number of statements in a function."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "FunctionTooLongJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Function metrics",
+ "index": 90,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSDeclarationsAtScopeStart",
+ "shortDescription": {
+ "text": "'var' declared not at the beginning of a function"
+ },
+ "fullDescription": {
+ "text": "Checks that declarations of local variables declared with var are at the top of a function scope. By default, variable declarations are always moved (\"hoisted\") invisibly to the top of their containing scope when the code is executed. Therefore, declaring them at the top of the scope helps represent this behavior in the code.",
+ "markdown": "Checks that declarations of local variables declared with **var** are at the top of a function scope. \n\nBy default, variable declarations are always moved (\"hoisted\") invisibly to the top of their containing scope when the code is executed. Therefore, declaring them at the top of the scope helps represent this behavior in the code."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSDeclarationsAtScopeStart",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code style issues",
+ "index": 62,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ContinueStatementWithLabelJS",
+ "shortDescription": {
+ "text": "'continue' statement with label"
+ },
+ "fullDescription": {
+ "text": "Reports a labeled 'continue' statement.",
+ "markdown": "Reports a labeled `continue` statement."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ContinueStatementWithLabelJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially undesirable code constructs",
+ "index": 51,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptMissingConfigOption",
+ "shortDescription": {
+ "text": "Missing tsconfig.json option "
+ },
+ "fullDescription": {
+ "text": "Reports a usage that requires an explicit option in 'tsconfig.json'. For example, to use JSX in '.tsx' files, 'tsconfig.json' must contain '\"jsx\"' property.",
+ "markdown": "Reports a usage that requires an explicit option in `tsconfig.json`. For example, to use JSX in `.tsx` files, `tsconfig.json` must contain `\"jsx\"` property."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "TypeScriptMissingConfigOption",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSObjectNullOrUndefined",
+ "shortDescription": {
+ "text": "Object is 'null' or 'undefined'"
+ },
+ "fullDescription": {
+ "text": "Reports an error caused by invoking a method, accessing a property, or calling a function on an object that is 'undefined' or 'null'.",
+ "markdown": "Reports an error caused by invoking a method, accessing a property, or calling a function on an object that is `undefined` or `null`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSObjectNullOrUndefined",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6ShorthandObjectProperty",
+ "shortDescription": {
+ "text": "Property can be replaced with shorthand"
+ },
+ "fullDescription": {
+ "text": "Reports an object property that can be converted to ES6 shorthand style and provides a quick-fix to do it. Example: 'var obj = {foo:foo}' After applying the quick-fix the code looks as follows: 'var obj = {foo}'",
+ "markdown": "Reports an object property that can be converted to ES6 shorthand style and provides a quick-fix to do it.\n\nExample:\n\n\n var obj = {foo:foo}\n\nAfter applying the quick-fix the code looks as follows:\n\n\n var obj = {foo}\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "ES6ShorthandObjectProperty",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "AssignmentToForLoopParameterJS",
+ "shortDescription": {
+ "text": "Assignment to 'for' loop parameter"
+ },
+ "fullDescription": {
+ "text": "Reports an assignment to a variable declared as a 'for' loop parameter. Although occasionally intended, this construct can be extremely confusing, and is often a result of an error.",
+ "markdown": "Reports an assignment to a variable declared as a `for` loop parameter. Although occasionally intended, this construct can be extremely confusing, and is often a result of an error."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "AssignmentToForLoopParameterJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Assignment issues",
+ "index": 63,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSPotentiallyInvalidConstructorUsage",
+ "shortDescription": {
+ "text": "Potentially invalid constructor usage"
+ },
+ "fullDescription": {
+ "text": "Reports a usage of a potentially invalid constructor function, for example: a function that is not a constructor after 'new', using a constructor's prototype or calling a constructor without 'new'. A constructor function is assumed to have an upper case name (optional) or have an explicit JSDoc '@constructor' tag.",
+ "markdown": "Reports a usage of a potentially invalid constructor function, for example: a function that is not a constructor after `new`, using a constructor's prototype or calling a constructor without `new`. A constructor function is assumed to have an upper case name (optional) or have an explicit JSDoc `@constructor` tag."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSPotentiallyInvalidConstructorUsage",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PointlessArithmeticExpressionJS",
+ "shortDescription": {
+ "text": "Pointless arithmetic expression"
+ },
+ "fullDescription": {
+ "text": "Reports an arithmetic expression that include adding or subtracting zero, multiplying by zero or one, division by one, and shift by zero. Such expressions may result from not fully completed automated refactoring.",
+ "markdown": "Reports an arithmetic expression that include adding or subtracting zero, multiplying by zero or one, division by one, and shift by zero. Such expressions may result from not fully completed automated refactoring."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "PointlessArithmeticExpressionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "NodeCoreCodingAssistance",
+ "shortDescription": {
+ "text": "Unresolved Node.js APIs"
+ },
+ "fullDescription": {
+ "text": "Suggests configuring coding assistance for Node.js, for example, 'require' and/or core modules ('path', 'http', 'fs', etc.). See https://nodejs.org/api/ for the complete list.",
+ "markdown": "Suggests configuring coding assistance for Node.js, for example, `require` and/or core modules ('path', 'http', 'fs', etc.).\n\n\nSee for the complete list."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "NodeCoreCodingAssistance",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Node.js",
+ "index": 100,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSPrimitiveTypeWrapperUsage",
+ "shortDescription": {
+ "text": "Primitive type object wrapper used"
+ },
+ "fullDescription": {
+ "text": "Reports an improper usage of a wrapper for primitive types or a property of a primitive type being modified, as in the latter case the assigned value will be lost.",
+ "markdown": "Reports an improper usage of a wrapper for primitive types or a property of a primitive type being modified, as in the latter case the assigned value will be lost."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSPrimitiveTypeWrapperUsage",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptSmartCast",
+ "shortDescription": {
+ "text": "Narrowed type"
+ },
+ "fullDescription": {
+ "text": "Reports a usage of a variable where the variable type is narrowed by a type guard. Note that severity level doesn't affect this inspection.",
+ "markdown": "Reports a usage of a variable where the variable type is narrowed by a type guard. Note that severity level doesn't affect this inspection."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "TypeScriptSmartCast",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6ConvertIndexedForToForOf",
+ "shortDescription": {
+ "text": "Indexed 'for' is used instead of 'for..of'"
+ },
+ "fullDescription": {
+ "text": "Reports an indexed 'for' loop used on an array. Suggests replacing it with a 'for..of' loop. 'for..of' loops are introduced in ECMAScript 6 and iterate over 'iterable' objects.",
+ "markdown": "Reports an indexed [for](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for) loop used on an array. Suggests replacing it with a [for..of](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of) loop. \n`for..of` loops are introduced in ECMAScript 6 and iterate over `iterable` objects."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "ES6ConvertIndexedForToForOf",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/ES2015 migration aids",
+ "index": 33,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSLastCommaInArrayLiteral",
+ "shortDescription": {
+ "text": "Unneeded last comma in array literal"
+ },
+ "fullDescription": {
+ "text": "Reports a usage of a trailing comma in an array literal. The warning is reported only when the JavaScript language version is set to ECMAScript 5.1. Although trailing commas in arrays are allowed by the specification, some browsers may throw an error when a trailing comma is used. You can configure formatting options for trailing commas in Code Style | JavaScript or TypeScript | Punctuation.",
+ "markdown": "Reports a usage of a trailing comma in an array literal.\n\nThe warning is reported only when the JavaScript language version is set to ECMAScript 5.1.\n\nAlthough trailing commas in arrays are allowed by the specification, some browsers may throw an error when a trailing comma is used.\n\nYou can configure formatting options for trailing commas in **Code Style** \\| **JavaScript** or **TypeScript** \\| **Punctuation**."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSLastCommaInArrayLiteral",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ConditionalExpressionJS",
+ "shortDescription": {
+ "text": "Conditional expression"
+ },
+ "fullDescription": {
+ "text": "Reports a ternary conditional expression. Some coding standards prohibit such expressions in favor of explicit 'if' statements.",
+ "markdown": "Reports a ternary conditional expression. Some coding standards prohibit such expressions in favor of explicit `if` statements."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ConditionalExpressionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially undesirable code constructs",
+ "index": 51,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6ConvertVarToLetConst",
+ "shortDescription": {
+ "text": "'var' is used instead of 'let' or 'const'"
+ },
+ "fullDescription": {
+ "text": "Reports a 'var' declaration that is used instead of 'let' or 'const'. Both 'let' and 'const' are block-scoped and behave more strictly. Suggests replacing all 'var' declarations with 'let' or 'const' declarations, depending on the semantics of a particular value. The declarations may be moved to the top of the function or placed before the first usage of the variable to avoid Reference errors. Select the 'Conservatively convert var with Fix all action' option to prevent any changes in these complex cases when using the 'Fix all' action.",
+ "markdown": "Reports a `var` declaration that is used instead of `let` or `const`. \nBoth `let` and `const` are block-scoped and behave more strictly. \n\nSuggests replacing all `var` declarations with `let` or `const` declarations, depending on the semantics of a particular value. The declarations may be moved to the top of the function or placed before the first usage of the variable to avoid Reference errors. \nSelect the 'Conservatively convert var with Fix all action' option to prevent any changes in these complex cases when using the 'Fix all' action."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "ES6ConvertVarToLetConst",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/ES2015 migration aids",
+ "index": 33,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PointlessBooleanExpressionJS",
+ "shortDescription": {
+ "text": "Pointless statement or boolean expression"
+ },
+ "fullDescription": {
+ "text": "Reports a pointless or pointlessly complicated boolean expression or statement. Example: 'let a = !(false && x);\n let b = false || x;' After the quick fix is applied the result looks like: 'let a = true;\n let b = x;'",
+ "markdown": "Reports a pointless or pointlessly complicated boolean expression or statement.\n\nExample:\n\n\n let a = !(false && x);\n let b = false || x;\n\nAfter the quick fix is applied the result looks like:\n\n\n let a = true;\n let b = x;\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "PointlessBooleanExpressionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "DynamicallyGeneratedCodeJS",
+ "shortDescription": {
+ "text": "Execution of dynamically generated code"
+ },
+ "fullDescription": {
+ "text": "Reports a call of the 'eval()', 'setTimeout()', or 'setInterval()' function or an allocation of a 'Function' object. These functions are used to execute arbitrary strings of JavaScript text, which often dynamically generated. This can be very confusing, and may be a security risk. Ignores the cases when a callback function is provided to these methods statically, without code generation.",
+ "markdown": "Reports a call of the `eval()`, `setTimeout()`, or `setInterval()` function or an allocation of a `Function` object. These functions are used to execute arbitrary strings of JavaScript text, which often dynamically generated. This can be very confusing, and may be a security risk. \n\nIgnores the cases when a callback function is provided to these methods statically, without code generation."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "DynamicallyGeneratedCodeJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "NegatedConditionalExpressionJS",
+ "shortDescription": {
+ "text": "Negated conditional expression"
+ },
+ "fullDescription": {
+ "text": "Reports a conditional expression whose condition is negated. Suggests flipping the order of branches in the conditional expression to increase the clarity of the statement. Example: '!condition ? 2 : 1'",
+ "markdown": "Reports a conditional expression whose condition is negated. Suggests flipping the order of branches in the conditional expression to increase the clarity of the statement. Example: `!condition ? 2 : 1`"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "NegatedConditionalExpressionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSUrlImportUsage",
+ "shortDescription": {
+ "text": "URL import is used"
+ },
+ "fullDescription": {
+ "text": "Checks used URL imports in the JavaScript language. Suggests downloading the module for the specified remote URL. Such association enables the IDE to provide proper code completion and navigation. URLs in import specifiers are supported only for ECMAScript modules in the JavaScript language.",
+ "markdown": "Checks used URL imports in the JavaScript language. Suggests downloading the module for the specified remote URL. Such association enables the IDE to provide proper code completion and navigation. \n\nURLs in import specifiers are supported only for ECMAScript modules in the JavaScript language."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSUrlImportUsage",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Imports and dependencies",
+ "index": 77,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "UnnecessaryLabelOnContinueStatementJS",
+ "shortDescription": {
+ "text": "Unnecessary label on 'continue' statement"
+ },
+ "fullDescription": {
+ "text": "Reports a labeled 'continue' statement whose labels may be removed without changing the flow of control.",
+ "markdown": "Reports a labeled `continue` statement whose labels may be removed without changing the flow of control."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "UnnecessaryLabelOnContinueStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSPotentiallyInvalidTargetOfIndexedPropertyAccess",
+ "shortDescription": {
+ "text": "Possibly incorrect target of indexed property access"
+ },
+ "fullDescription": {
+ "text": "Reports a potentially invalid indexed property access, for example, 'Array[1]'.",
+ "markdown": "Reports a potentially invalid indexed property access, for example, `Array[1]`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSPotentiallyInvalidTargetOfIndexedPropertyAccess",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSAccessibilityCheck",
+ "shortDescription": {
+ "text": "Inaccessible @private and @protected members referenced"
+ },
+ "fullDescription": {
+ "text": "Reports a reference to a JavaScript member that is marked with a '@private' or '@protected' tag but does not comply with visibility rules that these tags imply.",
+ "markdown": "Reports a reference to a JavaScript member that is marked with a `@private` or `@protected` tag but does not comply with visibility rules that these tags imply."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSAccessibilityCheck",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "FunctionWithMultipleLoopsJS",
+ "shortDescription": {
+ "text": "Function with multiple loops"
+ },
+ "fullDescription": {
+ "text": "Reports a function with multiple loop statements.",
+ "markdown": "Reports a function with multiple loop statements."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "FunctionWithMultipleLoopsJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Function metrics",
+ "index": 90,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "LabeledStatementJS",
+ "shortDescription": {
+ "text": "Labeled statement"
+ },
+ "fullDescription": {
+ "text": "Reports a labeled statement.",
+ "markdown": "Reports a labeled statement."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "LabeledStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially undesirable code constructs",
+ "index": 51,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "UnusedCatchParameterJS",
+ "shortDescription": {
+ "text": "Unused 'catch' parameter"
+ },
+ "fullDescription": {
+ "text": "Reports a 'catch' parameter that is not used in the corresponding block. The 'catch' parameters named 'ignore' or 'ignored' are ignored. Use the checkbox below to disable this inspection for 'catch' blocks with comments.",
+ "markdown": "Reports a `catch` parameter that is not used in the corresponding block. The `catch` parameters named `ignore` or `ignored` are ignored.\n\n\nUse the checkbox below to disable this inspection for `catch`\nblocks with comments."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "UnusedCatchParameterJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Try statement issues",
+ "index": 45,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "NpmUsedModulesInstalled",
+ "shortDescription": {
+ "text": "Missing module dependency"
+ },
+ "fullDescription": {
+ "text": "Reports a module from a 'require()' call or an 'import' statement that is not installed or is not listed in package.json dependencies. Suggests installing the module and/or including it into package.json. For 'require()' calls, works only in the files from the scope of Node.js Core JavaScript library.",
+ "markdown": "Reports a module from a `require()` call or an `import` statement that is not installed or is not listed in package.json dependencies.\n\nSuggests installing the module and/or including it into package.json.\n\nFor `require()` calls, works only in the files from the scope of *Node.js Core* JavaScript library."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "NpmUsedModulesInstalled",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Imports and dependencies",
+ "index": 77,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "WithStatementJS",
+ "shortDescription": {
+ "text": "'with' statement"
+ },
+ "fullDescription": {
+ "text": "Reports a 'with' statements. Such statements result in potentially confusing implicit bindings, and may behave strangely in setting new variables.",
+ "markdown": "Reports a `with` statements. Such statements result in potentially confusing implicit bindings, and may behave strangely in setting new variables."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "WithStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially undesirable code constructs",
+ "index": 51,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSConstantReassignment",
+ "shortDescription": {
+ "text": "Attempt to assign to const or readonly variable"
+ },
+ "fullDescription": {
+ "text": "Reports reassigning a value to a constant or a readonly variable.",
+ "markdown": "Reports reassigning a value to a constant or a readonly variable."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "JSConstantReassignment",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Validity issues",
+ "index": 38,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "MagicNumberJS",
+ "shortDescription": {
+ "text": "Magic number"
+ },
+ "fullDescription": {
+ "text": "Reports a \"magic number\" that is a numeric literal used without being named by a constant declaration. Magic numbers can result in code whose intention is unclear, and may result in errors if a magic number is changed in one code location but remains unchanged in another. The numbers 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100, 1000, 0.0 and 1.0 are ignored.",
+ "markdown": "Reports a \"magic number\" that is a numeric literal used without being named by a constant declaration. Magic numbers can result in code whose intention is unclear, and may result in errors if a magic number is changed in one code location but remains unchanged in another. The numbers 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100, 1000, 0.0 and 1.0 are ignored."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "MagicNumberJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "FunctionNamingConventionJS",
+ "shortDescription": {
+ "text": "Function naming convention"
+ },
+ "fullDescription": {
+ "text": "Reports a function whose name is too short, too long, or does not follow the specified regular expression pattern. Use the fields provided below to specify minimum length, maximum length, and a regular expression for function names. Use the standard 'java.util.regex' format for regular expressions.",
+ "markdown": "Reports a function whose name is too short, too long, or does not follow the specified regular expression pattern.\n\n\nUse the fields provided below to specify minimum length, maximum length, and a regular expression\nfor function names. Use the standard `java.util.regex` format for regular expressions."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "FunctionNamingConventionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Naming conventions",
+ "index": 83,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptLibrary",
+ "shortDescription": {
+ "text": "Missing global library"
+ },
+ "fullDescription": {
+ "text": "Reports a TypeScript library file that is required for a symbol but is not listed under the 'lib' compiler option in 'tsconfig.json'.",
+ "markdown": "Reports a TypeScript library file that is required for a symbol but is not listed under the `lib` compiler option in `tsconfig.json`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "TypeScriptLibrary",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptMissingAugmentationImport",
+ "shortDescription": {
+ "text": "Missing augmentation import"
+ },
+ "fullDescription": {
+ "text": "Reports a usage from augmentation module without an explicit import.",
+ "markdown": "Reports a usage from [augmentation module](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation) without an explicit import."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "TypeScriptMissingAugmentationImport",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "AnonymousFunctionJS",
+ "shortDescription": {
+ "text": "Anonymous function"
+ },
+ "fullDescription": {
+ "text": "Reports an anonymous function. An explicit name of a function expression may be helpful for debugging. Ignores function expressions without names if they have a 'name' property specified in the ECMAScript 6 standard. For example, 'var bar = function() {};' is not reported.",
+ "markdown": "Reports an anonymous function. An explicit name of a function expression may be helpful for debugging. Ignores function expressions without names if they have a `name` property specified in the ECMAScript 6 standard. For example, `var bar = function() {};` is not reported."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "AnonymousFunctionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially undesirable code constructs",
+ "index": 51,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ObjectAllocationIgnoredJS",
+ "shortDescription": {
+ "text": "Result of object allocation ignored"
+ },
+ "fullDescription": {
+ "text": "Reports object allocation where the result of the allocated object is ignored, for example, 'new Error();' as a statement, without any assignment. Such allocation expressions may indicate an odd object initialization strategy.",
+ "markdown": "Reports object allocation where the result of the allocated object is ignored, for example, `new Error();` as a statement, without any assignment. Such allocation expressions may indicate an odd object initialization strategy."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ObjectAllocationIgnored",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSTypeOfValues",
+ "shortDescription": {
+ "text": "'typeof' comparison with non-standard value"
+ },
+ "fullDescription": {
+ "text": "Reports a comparison of a 'typeof' expression with a literal string which is not one of the standard types: 'undefined', 'object', 'boolean', 'number', 'string', 'function', or 'symbol'. Such comparisons always return 'false'.",
+ "markdown": "Reports a comparison of a `typeof` expression with a literal string which is not one of the standard types: `undefined`, `object`, `boolean`, `number`, `string`, `function`, or `symbol`. Such comparisons always return `false`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSTypeOfValues",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EmptyCatchBlockJS",
+ "shortDescription": {
+ "text": "Empty 'catch' block"
+ },
+ "fullDescription": {
+ "text": "Reports an empty 'catch' block. This indicates that errors are simply ignored instead of handling them. Any comment in a 'catch' block mutes the inspection.",
+ "markdown": "Reports an empty `catch` block. This indicates that errors are simply ignored instead of handling them. \n\nAny comment in a `catch` block mutes the inspection."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EmptyCatchBlockJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Try statement issues",
+ "index": 45,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSHint",
+ "shortDescription": {
+ "text": "JSHint"
+ },
+ "fullDescription": {
+ "text": "Reports a problem detected by the JSHint linter.",
+ "markdown": "Reports a problem detected by the [JSHint](https://jshint.com/) linter."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "JSHint",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code quality tools",
+ "index": 85,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "Eslint",
+ "shortDescription": {
+ "text": "ESLint"
+ },
+ "fullDescription": {
+ "text": "Reports a discrepancy detected by the ESLint linter. The highlighting is based on the rule severity specified in the ESLint configuration file for each individual rule. Clear the 'Use rule severity from the configuration file' checkbox to use the severity configured in this inspection for all ESLint rules.",
+ "markdown": "Reports a discrepancy detected by the [ESLint](https://eslint.org) linter. \n\nThe highlighting is based on the rule severity specified in the [ESLint configuration file](https://eslint.org/docs/user-guide/configuring) for each individual rule. \n\nClear the 'Use rule severity from the configuration file' checkbox to use the severity configured in this inspection for all ESLint rules."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "Eslint",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code quality tools",
+ "index": 85,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSEqualityComparisonWithCoercion.TS",
+ "shortDescription": {
+ "text": "Equality operator may cause type coercion"
+ },
+ "fullDescription": {
+ "text": "Reports a usage of equality operators may cause unexpected type coercions. Suggests replacing '==' or '!=' equality operators with type-safe '===' or '!==' operators. Depending on the option selected, one of the following cases will be reported: All usages of '==' and '!=' operators. All usages except comparison with null. Some code styles allow using 'x == null' as a replacement for 'x === null || x === undefined'. Only suspicious expressions, such as: '==' or '!=' comparisons with '0', '''', 'null', 'true', 'false', or 'undefined'.",
+ "markdown": "Reports a usage of equality operators may cause unexpected type coercions. Suggests replacing `==` or `!=` equality operators with type-safe `===` or `!==` operators.\n\nDepending on the option selected, one of the following cases will be reported:\n\n* All usages of `==` and `!=` operators.\n* All usages except comparison with null. Some code styles allow using `x == null` as a replacement for `x === null || x === undefined`.\n* Only suspicious expressions, such as: `==` or `!=` comparisons with `0`, `''`, `null`, `true`, `false`, or `undefined`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EqualityComparisonWithCoercionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ExceptionCaughtLocallyJS",
+ "shortDescription": {
+ "text": "Exception used for local control-flow"
+ },
+ "fullDescription": {
+ "text": "Reports a 'throw' statement whose exceptions are always caught by the containing 'try' statement. Using 'throw' statements as a 'goto' to change the local flow of control is confusing.",
+ "markdown": "Reports a `throw` statement whose exceptions are always caught by the containing `try` statement. Using `throw` statements as a `goto` to change the local flow of control is confusing."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ExceptionCaughtLocallyJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Try statement issues",
+ "index": 45,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ThrowFromFinallyBlockJS",
+ "shortDescription": {
+ "text": "'throw' inside 'finally' block"
+ },
+ "fullDescription": {
+ "text": "Reports s 'throw' statement inside a 'finally' block. Such 'throw' statements may mask exceptions thrown, and complicate debugging.",
+ "markdown": "Reports s `throw` statement inside a `finally` block. Such `throw` statements may mask exceptions thrown, and complicate debugging."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ThrowInsideFinallyBlockJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Try statement issues",
+ "index": 45,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CyclomaticComplexityJS",
+ "shortDescription": {
+ "text": "Overly complex function"
+ },
+ "fullDescription": {
+ "text": "Reports a function with too many branching points in a function (too high cyclomatic complexity). Such functions may be confusing and hard to test. Use the field provided below to specify the maximum acceptable cyclomatic complexity for a function.",
+ "markdown": "Reports a function with too many branching points in a function (too high cyclomatic complexity). Such functions may be confusing and hard to test.\n\n\nUse the field provided below to specify the maximum acceptable cyclomatic complexity for a function."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "OverlyComplexFunctionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Function metrics",
+ "index": 90,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PackageJsonMismatchedDependency",
+ "shortDescription": {
+ "text": "Mismatched dependencies in package.json"
+ },
+ "fullDescription": {
+ "text": "Reports a dependency from package.json that is not installed or doesn't match the specified version range.",
+ "markdown": "Reports a dependency from package.json that is not installed or doesn't match the specified [version range](https://docs.npmjs.com/about-semantic-versioning)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "PackageJsonMismatchedDependency",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Imports and dependencies",
+ "index": 77,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSPotentiallyInvalidUsageOfThis",
+ "shortDescription": {
+ "text": "Potentially invalid reference to 'this' from closure"
+ },
+ "fullDescription": {
+ "text": "Reports a 'this' in closure that is used for referencing properties of outer context. Example: 'function Outer() {\n this.outerProp = 1;\n function inner() {\n // bad, because 'outerProp' of Outer\n // won't be updated here\n // on calling 'new Outer()' as may be expected\n this.outerProp = 2;\n }\n inner();\n}'",
+ "markdown": "Reports a `this` in closure that is used for referencing properties of outer context.\n\nExample:\n\n\n function Outer() {\n this.outerProp = 1;\n function inner() {\n // bad, because 'outerProp' of Outer\n // won't be updated here\n // on calling 'new Outer()' as may be expected\n this.outerProp = 2;\n }\n inner();\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSPotentiallyInvalidUsageOfThis",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSUnresolvedLibraryURL",
+ "shortDescription": {
+ "text": "Missed locally stored library for HTTP link"
+ },
+ "fullDescription": {
+ "text": "Reports a URL of an external JavaScript library that is not associated with any locally stored file. Suggests downloading the library. Such association enables the IDE to provide proper code completion and navigation.",
+ "markdown": "Reports a URL of an external JavaScript library that is not associated with any locally stored file. Suggests downloading the library. Such association enables the IDE to provide proper code completion and navigation."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSUnresolvedLibraryURL",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "InfiniteLoopJS",
+ "shortDescription": {
+ "text": "Infinite loop statement"
+ },
+ "fullDescription": {
+ "text": "Reports a 'for', 'while', or 'do' statement which can only exit by throwing an exception. Such statements often indicate coding errors.",
+ "markdown": "Reports a `for`, `while`, or `do` statement which can only exit by throwing an exception. Such statements often indicate coding errors."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "InfiniteLoopJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSArrowFunctionBracesCanBeRemoved",
+ "shortDescription": {
+ "text": "Redundant braces around arrow function body"
+ },
+ "fullDescription": {
+ "text": "Reports an arrow function whose body only consists of braces and exactly one statement. Suggests converting to concise syntax without braces. 'let incrementer = (x) => {return x + 1};' After the quick-fix is applied, the code fragment looks as follows: 'let incrementer = (x) => x + 1;'",
+ "markdown": "Reports an arrow function whose body only consists of braces and exactly one statement. Suggests converting to concise syntax without braces.\n\n\n let incrementer = (x) => {return x + 1};\n\nAfter the quick-fix is applied, the code fragment looks as follows:\n\n\n let incrementer = (x) => x + 1;\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSArrowFunctionBracesCanBeRemoved",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code style issues",
+ "index": 62,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "Stylelint",
+ "shortDescription": {
+ "text": "Stylelint"
+ },
+ "fullDescription": {
+ "text": "Reports a discrepancy detected by the Stylelint linter. The highlighting is based on the rule severity specified in the Stylelint configuration file for each individual rule.",
+ "markdown": "Reports a discrepancy detected by the [Stylelint](http://stylelint.io) linter. \n\nThe highlighting is based on the rule severity specified in the [Stylelint configuration file](https://stylelint.io/user-guide/configure) for each individual rule."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "Stylelint",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Code quality tools",
+ "index": 105,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSClassNamingConvention",
+ "shortDescription": {
+ "text": "Class naming convention"
+ },
+ "fullDescription": {
+ "text": "Reports a class or a function that is annotated with a JSDoc '@constructor' or '@class' tag whose names are too short, too long, or do not follow the specified regular expression pattern. Use the fields provided below to specify minimum length, maximum length, and a regular expression expected for classes names. Use the standard 'java.util.regex' format for regular expressions.",
+ "markdown": "Reports a class or a function that is annotated with a JSDoc `@constructor` or `@class` tag whose names are too short, too long, or do not follow the specified regular expression pattern.\n\n\nUse the fields provided below to specify minimum length, maximum length, and a regular expression\nexpected for classes names. Use the standard `java.util.regex` format for regular expressions."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSClassNamingConvention",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Naming conventions",
+ "index": 83,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptValidateJSTypes",
+ "shortDescription": {
+ "text": "Type mismatch in 'any' type"
+ },
+ "fullDescription": {
+ "text": "Reports a function call with a parameter, return value, or assigned expression or incorrect type, if the context symbol can be implicitly resolved to the 'any' type. declare var test: any;\ntest.hasOwnProperty(true); //reports 'true'",
+ "markdown": "Reports a function call with a parameter, return value, or assigned expression or incorrect type, if the context symbol can be implicitly resolved to the `any` type.\n\n```\ndeclare var test: any;\ntest.hasOwnProperty(true); //reports 'true'\n```"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "TypeScriptValidateJSTypes",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "XHTMLIncompatabilitiesJS",
+ "shortDescription": {
+ "text": "Incompatible XHTML usages"
+ },
+ "fullDescription": {
+ "text": "Reports common JavaScript DOM patterns which may present problems with XHTML documents. In particular, the patterns detected will behave completely differently depending on whether the document is loaded as XML or HTML. This can result in subtle bugs where script behaviour is dependent on the MIME-type of the document, rather than its content. Patterns detected include document.body, document.images, document.applets, document.links, document.forms, and document.anchors.",
+ "markdown": "Reports common JavaScript DOM patterns which may present problems with XHTML documents. In particular, the patterns detected will behave completely differently depending on whether the document is loaded as XML or HTML. This can result in subtle bugs where script behaviour is dependent on the MIME-type of the document, rather than its content. Patterns detected include **document.body** , **document.images** , **document.applets** , **document.links** , **document.forms** , and **document.anchors**."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "XHTMLIncompatabilitiesJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/DOM issues",
+ "index": 72,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptJSXUnresolvedComponent",
+ "shortDescription": {
+ "text": "Unresolved JSX component"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved reference to a JSX component. Suggests adding an import statement if the referenced component is defined in the project or its dependencies or creating a new component with the specified name. The template for a new component can be modified in Editor | File and Code Templates.",
+ "markdown": "Reports an unresolved reference to a JSX component. Suggests adding an import statement if the referenced component is defined in the project or its dependencies or creating a new component with the specified name.\n\nThe template for a new component can be modified in Editor \\| File and Code Templates."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "TypeScriptJSXUnresolvedComponent",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptFieldCanBeMadeReadonly",
+ "shortDescription": {
+ "text": "Field can be readonly"
+ },
+ "fullDescription": {
+ "text": "Reports a private field that can be made readonly (for example, if the field is assigned only in the constructor).",
+ "markdown": "Reports a private field that can be made readonly (for example, if the field is assigned only in the constructor)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "TypeScriptFieldCanBeMadeReadonly",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "NegatedIfStatementJS",
+ "shortDescription": {
+ "text": "Negated 'if' statement"
+ },
+ "fullDescription": {
+ "text": "Reports if statements which have an else branch and a negated condition. Flipping the order of the if and else branches will usually increase the clarity of such statements.",
+ "markdown": "Reports **if** statements which have an **else** branch and a negated condition. Flipping the order of the **if** and **else** branches will usually increase the clarity of such statements."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "NegatedIfStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ConditionalExpressionWithIdenticalBranchesJS",
+ "shortDescription": {
+ "text": "Conditional expression with identical branches"
+ },
+ "fullDescription": {
+ "text": "Reports a ternary conditional expression with identical 'then' and 'else' branches.",
+ "markdown": "Reports a ternary conditional expression with identical `then` and `else` branches."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ConditionalExpressionWithIdenticalBranchesJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSAnnotator",
+ "shortDescription": {
+ "text": "ECMAScript specification is not followed"
+ },
+ "fullDescription": {
+ "text": "Reports basic syntax issues and inconsistencies with language specification, such as invalid usages of keywords, usages of incompatible numeric format, or multiple parameters to getters/setters. Generally, such errors must always be reported and shouldn't be disabled. But in some cases, such as issues due to the dynamic nature of JavaScript, the use of not yet supported language features, or bugs in IDE's checker, it may be handy to disable reporting these very basic errors.",
+ "markdown": "Reports basic syntax issues and inconsistencies with language specification, such as invalid usages of keywords, usages of incompatible numeric format, or multiple parameters to getters/setters. \nGenerally, such errors must always be reported and shouldn't be disabled. But in some cases, such as issues due to the dynamic nature of JavaScript, the use of not yet supported language features, or bugs in IDE's checker, it may be handy to disable reporting these very basic errors."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "JSAnnotator",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSUnfilteredForInLoop",
+ "shortDescription": {
+ "text": "Unfiltered for..in loop"
+ },
+ "fullDescription": {
+ "text": "Reports unfiltered 'for-in' loops. The use of this construct results in processing not only own properties of an object but properties from its prototype as well. It may be unexpected in some specific cases, for example, in utility methods that copy or modify all properties or when 'Object''s prototype may be incorrectly modified. For example, the following code will print 42 and myMethod: 'Object.prototype.myMethod = function myMethod() {};\nlet a = { foo: 42 };\nfor (let i in a) {\n console.log(a[i]);\n}' Suggests replacing the whole loop with a 'Object.keys()' method or adding a 'hasOwnProperty()' check. After applying the quick-fix the code looks as follows: 'for (let i in a) {\n if (a.hasOwnProperty(i)) {\n console.log(a[i]);\n }\n}'",
+ "markdown": "Reports unfiltered `for-in` loops. \n\nThe use of this construct results in processing not only own properties of an object but properties from its prototype as well. It may be unexpected in some specific cases, for example, in utility methods that copy or modify all properties or when `Object`'s prototype may be incorrectly modified. For example, the following code will print **42** and **myMethod** : \n\n\n Object.prototype.myMethod = function myMethod() {};\n let a = { foo: 42 };\n for (let i in a) {\n console.log(a[i]);\n }\n\nSuggests replacing the whole loop with a `Object.keys()` method or adding a `hasOwnProperty()` check. After applying the quick-fix the code looks as follows:\n\n\n for (let i in a) {\n if (a.hasOwnProperty(i)) {\n console.log(a[i]);\n }\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSUnfilteredForInLoop",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSIncompatibleTypesComparison",
+ "shortDescription": {
+ "text": "Comparison of expressions having incompatible types"
+ },
+ "fullDescription": {
+ "text": "Reports a comparison with operands of incompatible types or an operand with a type without possible common values.",
+ "markdown": "Reports a comparison with operands of incompatible types or an operand with a type without possible common values."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSIncompatibleTypesComparison",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSFunctionExpressionToArrowFunction",
+ "shortDescription": {
+ "text": "Function expression is used instead of arrow function"
+ },
+ "fullDescription": {
+ "text": "Reports a function expression. Suggests converting it to an arrow function. Example: 'arr.map(function(el) {return el + 1})' After applying the quick-fix the code looks as follows: 'arr.map(el => el + 1)'",
+ "markdown": "Reports a [function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function) expression. Suggests converting it to an [arrow function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions).\n\nExample:\n\n arr.map(function(el) {return el + 1})\n\nAfter applying the quick-fix the code looks as follows:\n\n arr.map(el => el + 1)\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSFunctionExpressionToArrowFunction",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/ES2015 migration aids",
+ "index": 33,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6TopLevelAwaitExpression",
+ "shortDescription": {
+ "text": "Top-level 'await' expression"
+ },
+ "fullDescription": {
+ "text": "Reports a usage of a top-level 'await' expression. While the new 'top-level async' proposal is on its way, using 'await' outside async functions is not allowed.",
+ "markdown": "Reports a usage of a top-level `await` expression. While the new 'top-level async' proposal is on its way, using `await` outside async functions is not allowed."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "ES6TopLevelAwaitExpression",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Async code and promises",
+ "index": 73,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6ConvertToForOf",
+ "shortDescription": {
+ "text": "'for..in' is used instead of 'for..of'"
+ },
+ "fullDescription": {
+ "text": "Reports a usage of a 'for..in' loop on an array. Suggests replacing it with a 'for..of' loop. 'for..of' loops, which are introduced in ECMAScript 6, iterate over 'iterable' objects. For arrays, this structure is preferable to 'for..in', because it works only with array values but not with array object's properties.",
+ "markdown": "Reports a usage of a [for..in](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in) loop on an array. Suggests replacing it with a [for..of](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of) loop. \n`for..of` loops, which are introduced in ECMAScript 6, iterate over `iterable` objects. For arrays, this structure is preferable to `for..in`, because it works only with array values but not with array object's properties."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "ES6ConvertToForOf",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/ES2015 migration aids",
+ "index": 33,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ParameterNamingConventionJS",
+ "shortDescription": {
+ "text": "Function parameter naming convention"
+ },
+ "fullDescription": {
+ "text": "Reports a function parameter whose name is too short, too long, or doesn't follow the specified regular expression pattern. Use the fields provided below to specify minimum length, maximum length and regular expression expected for local variables names. Use the standard 'java.util.regex' format regular expressions.",
+ "markdown": "Reports a function parameter whose name is too short, too long, or doesn't follow the specified regular expression pattern.\n\n\nUse the fields provided below to specify minimum length, maximum length and regular expression\nexpected for local variables names. Use the standard `java.util.regex` format regular expressions."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ParameterNamingConventionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Naming conventions",
+ "index": 83,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSUndefinedPropertyAssignment",
+ "shortDescription": {
+ "text": "Undefined property assignment"
+ },
+ "fullDescription": {
+ "text": "Reports an assignment to a property that is not defined in the type of a variable. Example: '/**\n * @type {{ property1: string, property2: number }}\n */\nlet myVariable = create();\n\nmyVariable.newProperty = 3; // bad'",
+ "markdown": "Reports an assignment to a property that is not defined in the type of a variable.\n\nExample:\n\n\n /**\n * @type {{ property1: string, property2: number }}\n */\n let myVariable = create();\n\n myVariable.newProperty = 3; // bad\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSUndefinedPropertyAssignment",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code style issues",
+ "index": 62,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ParametersPerFunctionJS",
+ "shortDescription": {
+ "text": "Function with too many parameters"
+ },
+ "fullDescription": {
+ "text": "Reports a function with too many parameters. Such functions often indicate problems with design. Use the field below to specify the maximum acceptable number of parameters for a function.",
+ "markdown": "Reports a function with too many parameters. Such functions often indicate problems with design.\n\n\nUse the field below to specify the maximum acceptable number of parameters for a function."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "OverlyComplexFunctionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Function metrics",
+ "index": 90,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ThisExpressionReferencesGlobalObjectJS",
+ "shortDescription": {
+ "text": "'this' expression which references the global object"
+ },
+ "fullDescription": {
+ "text": "Reports a 'this' expression outside an object literal or a constructor body. Such 'this' expressions reference the top-level \"global\" JavaScript object, but are mostly useless.",
+ "markdown": "Reports a `this` expression outside an object literal or a constructor body. Such `this` expressions reference the top-level \"global\" JavaScript object, but are mostly useless."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ThisExpressionReferencesGlobalObjectJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Validity issues",
+ "index": 38,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSDeprecatedSymbols",
+ "shortDescription": {
+ "text": "Deprecated symbol used"
+ },
+ "fullDescription": {
+ "text": "Reports a usage of a deprecated function variable.",
+ "markdown": "Reports a usage of a deprecated function variable."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSDeprecatedSymbols",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "LocalVariableNamingConventionJS",
+ "shortDescription": {
+ "text": "Local variable naming convention"
+ },
+ "fullDescription": {
+ "text": "Reports a local variable whose name is too short, too long, or doesn't follow the specified regular expression pattern. Use the fields provided below to specify minimum length, maximum length, and a regular expression expected for local variables names. Use the standard 'java.util.regex' format regular expressions.",
+ "markdown": "Reports a local variable whose name is too short, too long, or doesn't follow the specified regular expression pattern.\n\n\nUse the fields provided below to specify minimum length, maximum length, and a regular expression\nexpected for local variables names. Use the standard `java.util.regex` format regular expressions."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "LocalVariableNamingConventionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Naming conventions",
+ "index": 83,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "UpdateDependencyToLatestVersion",
+ "shortDescription": {
+ "text": "Update package.json dependencies to latest versions"
+ },
+ "fullDescription": {
+ "text": "Suggests to upgrade your package.json dependencies to the latest versions, ignoring specified versions.",
+ "markdown": "Suggests to upgrade your package.json dependencies to the latest versions, ignoring specified versions."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "UpdateDependencyToLatestVersion",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Imports and dependencies",
+ "index": 77,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSSuspiciousNameCombination",
+ "shortDescription": {
+ "text": "Suspicious variable/parameter name combination"
+ },
+ "fullDescription": {
+ "text": "Reports an assignment or a function call where the name of the target variable or the function parameter does not match the name of the value assigned to it. Example: 'var x = 0;\n var y = x;' or 'var x = 0, y = 0;\n var rc = new Rectangle(y, x, 20, 20);' Here the inspection guesses that 'x' and 'y' are mixed up. Specify the names that should not be used together. An error is reported if a parameter name or an assignment target name contains words from one group while the name of the assigned or passed variable contains words from another group.",
+ "markdown": "Reports an assignment or a function call where the name of the target variable or the function parameter does not match the name of the value assigned to it.\n\nExample:\n\n\n var x = 0;\n var y = x;\n\nor\n\n\n var x = 0, y = 0;\n var rc = new Rectangle(y, x, 20, 20);\n\nHere the inspection guesses that `x` and `y` are mixed up.\n\nSpecify the names that should not be used together. An error is reported\nif a parameter name or an assignment target name contains words from one group while the name of the assigned or passed\nvariable contains words from another group."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSSuspiciousNameCombination",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSUnresolvedExtXType",
+ "shortDescription": {
+ "text": "Unresolved Ext JS xtype"
+ },
+ "fullDescription": {
+ "text": "Reports an Ext JS 'xtype' reference that doesn't have a corresponding class.",
+ "markdown": "Reports an Ext JS `xtype` reference that doesn't have a corresponding class."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSUnresolvedExtXType",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6RedundantNestingInTemplateLiteral",
+ "shortDescription": {
+ "text": "Redundant nesting in template literal"
+ },
+ "fullDescription": {
+ "text": "Reports nested instances of a string or a template literal. Suggests inlining the nested instances into the containing template string. Example: 'let a = `Hello, ${`Brave ${\"New\"}`} ${\"World\"}!`' After applying the quick-fix the code looks as follows: 'let a = `Hello, Brave New World!`'",
+ "markdown": "Reports nested instances of a string or a template literal. Suggests inlining the nested instances into the containing template string.\n\nExample:\n\n\n let a = `Hello, ${`Brave ${\"New\"}`} ${\"World\"}!`\n\nAfter applying the quick-fix the code looks as follows:\n\n\n let a = `Hello, Brave New World!`\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "ES6RedundantNestingInTemplateLiteral",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "NestingDepthJS",
+ "shortDescription": {
+ "text": "Overly nested function"
+ },
+ "fullDescription": {
+ "text": "Reports a function whose body contains statements that are too deeply nested within other statements. Such functions may be confusing and indicate that refactoring may be necessary. Use the field provided below to specify the maximum acceptable nesting depth allowed in a function.",
+ "markdown": "Reports a function whose body contains statements that are too deeply nested within other statements. Such functions may be confusing and indicate that refactoring may be necessary.\n\n\nUse the field provided below to specify the maximum acceptable nesting depth allowed in a function."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "OverlyNestedFunctionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Function metrics",
+ "index": 90,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptSuspiciousConstructorParameterAssignment",
+ "shortDescription": {
+ "text": "Assigned constructor field parameter"
+ },
+ "fullDescription": {
+ "text": "Reports a common mistake in TypeScript code, when a class field is declared as a constructor parameter, and then this parameter is assigned. In this case, the corresponding field won't be assigned, only the local parameter value is modified. 'class Foo {\n constructor(private p: number) {\n p = 1; //must be this.p = 1;\n }\n}'",
+ "markdown": "Reports a common mistake in TypeScript code, when a class field is declared as a constructor parameter, and then this parameter is assigned. \nIn this case, the corresponding field *won't* be assigned, only the local parameter value is modified.\n\n\n class Foo {\n constructor(private p: number) {\n p = 1; //must be this.p = 1;\n }\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "TypeScriptSuspiciousConstructorParameterAssignment",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ChainedFunctionCallJS",
+ "shortDescription": {
+ "text": "Chained function call"
+ },
+ "fullDescription": {
+ "text": "Reports a function call whose target is another function call, for example, 'foo().bar()'",
+ "markdown": "Reports a function call whose target is another function call, for example, `foo().bar()`"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ChainedFunctionCallJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code style issues",
+ "index": 62,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "NestedFunctionCallJS",
+ "shortDescription": {
+ "text": "Nested function call"
+ },
+ "fullDescription": {
+ "text": "Reports a function call that is used as an argument in another function call, for example, 'foo(bar())'",
+ "markdown": "Reports a function call that is used as an argument in another function call, for example, `foo(bar())`"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "NestedFunctionCallJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code style issues",
+ "index": 62,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSEqualityComparisonWithCoercion",
+ "shortDescription": {
+ "text": "Equality operator may cause type coercion"
+ },
+ "fullDescription": {
+ "text": "Reports a usage of an equality operator that may cause unexpected type coercions. Suggests replacing '==' and '!=' with type-safe equality operators '===' and '!=='. Depending on the option selected, one of the following cases will be reported: All usages of '==' and '!=' operators. All usages except comparison with null. Some code styles allow using 'x == null' as a replacement for 'x === null || x === undefined'. Only suspicious expressions, such as: '==' or '!=' comparisons with '0', '''', 'null', 'true', 'false', or 'undefined'.",
+ "markdown": "Reports a usage of an equality operator that may cause unexpected type coercions. Suggests replacing `==` and `!=` with type-safe equality operators `===` and `!==`.\n\nDepending on the option selected, one of the following cases will be reported:\n\n* All usages of `==` and `!=` operators.\n* All usages except comparison with null. Some code styles allow using `x == null` as a replacement for `x === null || x === undefined`.\n* Only suspicious expressions, such as: `==` or `!=` comparisons with `0`, `''`, `null`, `true`, `false`, or `undefined`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EqualityComparisonWithCoercionJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSCheckFunctionSignatures",
+ "shortDescription": {
+ "text": "Signature mismatch"
+ },
+ "fullDescription": {
+ "text": "Reports a JavaScript call expression where the arguments do not match the signature of the referenced function, including the types of arguments and their number. Also, reports if the overloading function doesn't match the overloaded one in terms of parameters and return types. TypeScript code is ignored.",
+ "markdown": "Reports a JavaScript call expression where the arguments do not match the signature of the referenced function, including the types of arguments and their number. Also, reports if the overloading function doesn't match the overloaded one in terms of parameters and return types.\n\nTypeScript code is ignored."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSCheckFunctionSignatures",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ConstantOnLHSOfComparisonJS",
+ "shortDescription": {
+ "text": "Constant on left side of comparison"
+ },
+ "fullDescription": {
+ "text": "Reports a comparison operation with a constant value in the left-hand side. According to coding conventions, constants should be in the right-hand side of comparisons.",
+ "markdown": "Reports a comparison operation with a constant value in the left-hand side. According to coding conventions, constants should be in the right-hand side of comparisons."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ConstantOnLefSideOfComparisonJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code style issues",
+ "index": 62,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "AssignmentResultUsedJS",
+ "shortDescription": {
+ "text": "Result of assignment used"
+ },
+ "fullDescription": {
+ "text": "Reports an assignment expression where the result of the assignment is used in the containing expression. Such assignments often indicate coding errors, for example, '=' instead of '=='. Moreover, they can result in confusion due to the order of operations, as evaluation of the assignment may affect the outer expression in unexpected ways. Expressions in parentheses are ignored.",
+ "markdown": "Reports an assignment expression where the result of the assignment is used in the containing expression. Such assignments often indicate coding errors, for example, `=` instead of `==`. Moreover, they can result in confusion due to the order of operations, as evaluation of the assignment may affect the outer expression in unexpected ways.\n\nExpressions in parentheses are ignored."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "AssignmentResultUsedJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Assignment issues",
+ "index": 63,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ConstantOnRHSOfComparisonJS",
+ "shortDescription": {
+ "text": "Constant on right side of comparison"
+ },
+ "fullDescription": {
+ "text": "Reports a comparison operation with a constant in the right-hand side. According to coding conventions, constants should only be in the left-hand side of comparisons.",
+ "markdown": "Reports a comparison operation with a constant in the right-hand side. According to coding conventions, constants should only be in the left-hand side of comparisons."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "ConstantOnRightSideOfComparisonJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Code style issues",
+ "index": 62,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSUnnecessarySemicolon",
+ "shortDescription": {
+ "text": "Unnecessary semicolon"
+ },
+ "fullDescription": {
+ "text": "Reports an unneeded semicolon.",
+ "markdown": "Reports an unneeded semicolon."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSUnnecessarySemicolon",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptUnresolvedReference",
+ "shortDescription": {
+ "text": "Unresolved TypeScript reference"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved reference in TypeScript code.",
+ "markdown": "Reports an unresolved reference in TypeScript code."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "TypeScriptUnresolvedReference",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSNonStrictModeUsed",
+ "shortDescription": {
+ "text": "Non-strict mode used"
+ },
+ "fullDescription": {
+ "text": "Reports a JavaScript file that is not in the 'strict' mode.",
+ "markdown": "Reports a JavaScript file that is not in the `strict` mode."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSNonStrictModeUsed",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "ES6RedundantAwait",
+ "shortDescription": {
+ "text": "Redundant 'await' expression"
+ },
+ "fullDescription": {
+ "text": "Reports a redundant usage of 'await', such as 'await await', or awaiting a non-promise result. When the 'Report for promises' option is selected, suggests removing 'await' before promises when applicable (in 'return' statements, and with 'Promise.resolve/reject'). Removing 'await' in such contexts causes two problems. Surrounding your code with 'try-catch' and forgetting to add 'await' will change code semantics while you may fail to notice that. Having an explicit 'await' may prevent the V8 runtime from providing async stack traces.",
+ "markdown": "Reports a redundant usage of `await`, such as `await await`, or awaiting a non-promise result.\n\n\nWhen the 'Report for promises' option is selected, suggests removing `await` before promises when applicable\n(in `return` statements, and with `Promise.resolve/reject`).\n\nRemoving `await` in such contexts causes two problems.\n\n* Surrounding your code with `try-catch` and forgetting to add `await` will change code semantics while you may fail to notice that.\n* Having an explicit `await` may prevent the V8 runtime from providing [async stack traces](http://bit.ly/v8-zero-cost-async-stack-traces)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "ES6RedundantAwait",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Async code and promises",
+ "index": 73,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "NestedSwitchStatementJS",
+ "shortDescription": {
+ "text": "Nested 'switch' statement"
+ },
+ "fullDescription": {
+ "text": "Reports a 'switch' statement that is nested in another 'switch' statement. Nested 'switch' statements may be very confusing, particularly if indenting is inconsistent.",
+ "markdown": "Reports a `switch` statement that is nested in another `switch` statement. Nested `switch` statements may be very confusing, particularly if indenting is inconsistent."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "NestedSwitchStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Switch statement issues",
+ "index": 70,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "AssignmentToFunctionParameterJS",
+ "shortDescription": {
+ "text": "Assignment to function parameter"
+ },
+ "fullDescription": {
+ "text": "Reports an assignment to a function parameter, including increment and decrement operations. Although occasionally intended, this construct can be extremely confusing, and is often a result of an error.",
+ "markdown": "Reports an assignment to a function parameter, including increment and decrement operations. Although occasionally intended, this construct can be extremely confusing, and is often a result of an error."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "AssignmentToFunctionParameterJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Assignment issues",
+ "index": 63,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "FallThroughInSwitchStatementJS",
+ "shortDescription": {
+ "text": "Fallthrough in 'switch' statement"
+ },
+ "fullDescription": {
+ "text": "Reports a 'switch' statement where control can proceed from a branch to the next one. Such \"fall-through\" often indicates an error, for example, a missing 'break' or 'return'.",
+ "markdown": "Reports a `switch` statement where control can proceed from a branch to the next one. Such \"fall-through\" often indicates an error, for example, a missing `break` or `return`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "FallThroughInSwitchStatementJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Switch statement issues",
+ "index": 70,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CallerJS",
+ "shortDescription": {
+ "text": "Use of 'caller' property"
+ },
+ "fullDescription": {
+ "text": "Reports a usage of the 'caller' property in a JavaScript function. Using this property to access the stack frame of the calling method can be extremely confusing and result in subtle bugs.",
+ "markdown": "Reports a usage of the `caller` property in a JavaScript function. Using this property to access the stack frame of the calling method can be extremely confusing and result in subtle bugs."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CallerJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "TypeScriptExplicitMemberType",
+ "shortDescription": {
+ "text": "Explicit types"
+ },
+ "fullDescription": {
+ "text": "Reports a type annotation that doesn't match the current code style for explicit types. Type declarations are not necessary when the type that is inferred from the context exactly matches the type annotation, for example: 'var pi: number = 3.14' In some cases it is preferable to always have explicit types - this prevents accidental type changes and makes code more explicit.",
+ "markdown": "Reports a type annotation that doesn't match the current code style for explicit types.\n\n\nType declarations are not necessary when the type that is inferred from the context exactly matches the type annotation, for example:\n\n\n var pi: number = 3.14\n\nIn some cases it is preferable to always have explicit types - this prevents accidental type changes and makes code more explicit."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "TypeScriptExplicitMemberType",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/TypeScript",
+ "index": 67,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSDuplicateCaseLabel",
+ "shortDescription": {
+ "text": "Duplicate 'case' label"
+ },
+ "fullDescription": {
+ "text": "Reports a duplicated 'case' label on a 'switch' statement, which normally indicates an error.",
+ "markdown": "Reports a duplicated `case` label on a `switch` statement, which normally indicates an error."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSDuplicateCaseLabel",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Switch statement issues",
+ "index": 70,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSMissingSwitchBranches",
+ "shortDescription": {
+ "text": "'switch' statement has missing branches"
+ },
+ "fullDescription": {
+ "text": "Reports a 'switch' statement on a variable of the type 'enum' or 'union' when the statement doesn't cover some value options from the type.",
+ "markdown": "Reports a `switch` statement on a variable of the type `enum` or `union` when the statement doesn't cover some value options from the type."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "JSMissingSwitchBranches",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Switch statement issues",
+ "index": 70,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSSwitchVariableDeclarationIssue",
+ "shortDescription": {
+ "text": "Variable is declared and being used in different 'case' clauses"
+ },
+ "fullDescription": {
+ "text": "Reports a variable that is declared in one 'case' clause of a 'switch' statement but is used in another 'case' clause of the same statement. For block-scoped variables, this results in throwing a 'ReferenceError'. For 'var' variables, it indicates a potential error. Disable the inspection for 'var' variables if this pattern is used intentionally.",
+ "markdown": "Reports a variable that is declared in one `case` clause of a `switch` statement but is used in another `case` clause of the same statement. For block-scoped variables, this results in throwing a `ReferenceError`. For `var` variables, it indicates a potential error.\n\nDisable the inspection for `var` variables if this pattern is used intentionally."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSSwitchVariableDeclarationIssue",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Switch statement issues",
+ "index": 70,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSJQueryEfficiency",
+ "shortDescription": {
+ "text": "JQuery selector can be optimized"
+ },
+ "fullDescription": {
+ "text": "Reports a duplicated jQuery selector that can be cached or a usage of an attribute or a pseudo-selector (optional).",
+ "markdown": "Reports a duplicated jQuery selector that can be cached or a usage of an attribute or a pseudo-selector (optional)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSJQueryEfficiency",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "UnreachableCodeJS",
+ "shortDescription": {
+ "text": "Unreachable code"
+ },
+ "fullDescription": {
+ "text": "Reports code that can never be executed, which almost certainly indicates an error",
+ "markdown": "Reports code that can never be executed, which almost certainly indicates an error"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "UnreachableCodeJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Control flow issues",
+ "index": 49,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSSuspiciousEqPlus",
+ "shortDescription": {
+ "text": "Suspicious '=+' assignment"
+ },
+ "fullDescription": {
+ "text": "Reports an assignment in the form 'a =+ b'. Suggests replacing with 'a += b'.",
+ "markdown": "Reports an assignment in the form `a =+ b`. Suggests replacing with `a += b`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSSuspiciousEqPlus",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Probable bugs",
+ "index": 56,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EmptyStatementBodyJS",
+ "shortDescription": {
+ "text": "Statement with empty body"
+ },
+ "fullDescription": {
+ "text": "Reports an 'if', 'while', 'for', or 'with' statement with an empty body. Such statements often result from typos, and may cause confusion. Use the checkbox below to specify whether the statements with empty block statements as bodies should be reported.",
+ "markdown": "Reports an `if`, `while`, `for`, or `with` statement with an empty body. Such statements often result from typos, and may cause confusion.\n\n\nUse the checkbox below to specify whether the statements with empty block statements as bodies\nshould be reported."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "StatementWithEmptyBodyJS",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Potentially confusing code constructs",
+ "index": 40,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "JSUnusedLocalSymbols",
+ "shortDescription": {
+ "text": "Unused local symbol"
+ },
+ "fullDescription": {
+ "text": "Reports an unused locally accessible parameter, local variable, function, class, or private member declaration.",
+ "markdown": "Reports an unused locally accessible parameter, local variable, function, class, or private member declaration."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JSUnusedLocalSymbols",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/Unused symbols",
+ "index": 22,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "org.editorconfig.editorconfigjetbrains",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "EditorConfigRootDeclarationUniqueness",
+ "shortDescription": {
+ "text": "Extra top-level declaration"
+ },
+ "fullDescription": {
+ "text": "Reports multiple top-level declarations. There can be only one optional “root=true” top-level declaration in the EditorConfig file. Using multiple top-level declarations is not allowed.",
+ "markdown": "Reports multiple top-level declarations. There can be only one optional \"root=true\" top-level declaration in the EditorConfig file. Using multiple top-level declarations is not allowed."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "EditorConfigRootDeclarationUniqueness",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigNumerousWildcards",
+ "shortDescription": {
+ "text": "Too many wildcards"
+ },
+ "fullDescription": {
+ "text": "Reports sections that contain too many wildcards. Using a lot of wildcards may lead to performance issues.",
+ "markdown": "Reports sections that contain too many wildcards. Using a lot of wildcards may lead to performance issues."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "EditorConfigNumerousWildcards",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigKeyCorrectness",
+ "shortDescription": {
+ "text": "Unknown property"
+ },
+ "fullDescription": {
+ "text": "Reports properties that are not supported by the IDE. Note: some “ij” domain properties may require specific language plugins.",
+ "markdown": "Reports properties that are not supported by the IDE. Note: some \"ij\" domain properties may require specific language plugins."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigKeyCorrectness",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigEncoding",
+ "shortDescription": {
+ "text": "File encoding doesn't match EditorConfig charset"
+ },
+ "fullDescription": {
+ "text": "Checks that current file encoding matches the encoding defined in \"charset\" property of .editorconfig file.",
+ "markdown": "Checks that current file encoding matches the encoding defined in \"charset\" property of .editorconfig file."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigEncoding",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigRootDeclarationCorrectness",
+ "shortDescription": {
+ "text": "Unexpected top-level declaration"
+ },
+ "fullDescription": {
+ "text": "Reports unexpected top-level declarations. Top-level declarations other than “root=true” are not allowed in the EditorConfig file.",
+ "markdown": "Reports unexpected top-level declarations. Top-level declarations other than \"root=true\" are not allowed in the EditorConfig file."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "EditorConfigRootDeclarationCorrectness",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigPatternRedundancy",
+ "shortDescription": {
+ "text": "Duplicate or redundant pattern"
+ },
+ "fullDescription": {
+ "text": "Reports file patterns that are redundant as there already are other patterns that define the same scope of files or even a broader one. For example, in '[{*.java,*}]' the first '*.java' pattern defines a narrower scope compared to '*'. That is why it is redundant and can be removed.",
+ "markdown": "Reports file patterns that are redundant as there already are other patterns that define the same scope of files or even a broader one. For example, in `[{*.java,*}]` the first `*.java` pattern defines a narrower scope compared to `*`. That is why it is redundant and can be removed."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigPatternRedundancy",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigDeprecatedDescriptor",
+ "shortDescription": {
+ "text": "Deprecated property"
+ },
+ "fullDescription": {
+ "text": "Reports EditorConfig properties that are no longer supported.",
+ "markdown": "Reports EditorConfig properties that are no longer supported."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigDeprecatedDescriptor",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigShadowedOption",
+ "shortDescription": {
+ "text": "Overridden property"
+ },
+ "fullDescription": {
+ "text": "Reports properties that are already defined in other sections. For example: '[*.java]\nindent_size=4\n[{*.java,*.js}]\nindent_size=2' The second section includes all '*.java' files too but it also redefines indent_size. As a result the value 2 will be used for files matching '*.java'.",
+ "markdown": "Reports properties that are already defined in other sections.\n\nFor example:\n\n\n [*.java]\n indent_size=4\n [{*.java,*.js}]\n indent_size=2\n\nThe second section includes all `*.java` files too but it also redefines indent_size. As a result the value 2 will be used for files matching `*.java`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigShadowedOption",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigEmptyHeader",
+ "shortDescription": {
+ "text": "Empty header"
+ },
+ "fullDescription": {
+ "text": "Reports sections with an empty header. Section header must contain file path globs in the format similar to one supported by 'gitignore'.",
+ "markdown": "Reports sections with an empty header. Section header must contain file path globs in the format similar to one supported by `gitignore`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "EditorConfigEmptyHeader",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigValueUniqueness",
+ "shortDescription": {
+ "text": "Non-unique list value"
+ },
+ "fullDescription": {
+ "text": "Reports duplicates in lists of values.",
+ "markdown": "Reports duplicates in lists of values."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "EditorConfigValueUniqueness",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigMissingRequiredDeclaration",
+ "shortDescription": {
+ "text": "Required declarations are missing"
+ },
+ "fullDescription": {
+ "text": "Reports properties that miss the required declarations. Refer to the documentation for more information.",
+ "markdown": "Reports properties that miss the required declarations. Refer to the documentation for more information."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "EditorConfigMissingRequiredDeclaration",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigSpaceInHeader",
+ "shortDescription": {
+ "text": "Space in file pattern"
+ },
+ "fullDescription": {
+ "text": "Reports space characters in wildcard patterns that affect pattern matching. If these characters are not intentional, they should be removed.",
+ "markdown": "Reports space characters in wildcard patterns that affect pattern matching. If these characters are not intentional, they should be removed."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "EditorConfigSpaceInHeader",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigOptionRedundancy",
+ "shortDescription": {
+ "text": "Redundant property"
+ },
+ "fullDescription": {
+ "text": "Reports properties that are redundant when another applicable section already contains the same property and value. For example: '[*]\nindent_size=4\n[*.java]\nindent_size=4' are both applicable to '*.java' files and define the same 'indent_size' value.",
+ "markdown": "Reports properties that are redundant when another applicable section already contains the same property and value.\n\n\nFor example:\n\n\n [*]\n indent_size=4\n [*.java]\n indent_size=4\n\nare both applicable to `*.java` files and define the same `indent_size` value."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigOptionRedundancy",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigUnexpectedComma",
+ "shortDescription": {
+ "text": "Unexpected comma"
+ },
+ "fullDescription": {
+ "text": "Reports commas that cannot be used in the current context. Commas are allowed only as separators for values in lists.",
+ "markdown": "Reports commas that cannot be used in the current context. Commas are allowed only as separators for values in lists."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "EditorConfigUnexpectedComma",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigCharClassRedundancy",
+ "shortDescription": {
+ "text": "Unnecessary character class"
+ },
+ "fullDescription": {
+ "text": "Reports character classes that consist of a single character. Such classes can be simplified to a character, for example '[a]'→'a'.",
+ "markdown": "Reports character classes that consist of a single character. Such classes can be simplified to a character, for example `[a]`→`a`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigCharClassRedundancy",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigPartialOverride",
+ "shortDescription": {
+ "text": "Overlapping sections"
+ },
+ "fullDescription": {
+ "text": "Reports subsets of files specified in the current section that overlap with other subsets in other sections. For example: '[{foo,bar}]' and '[{foo,bas}]' both contain “foo”.",
+ "markdown": "Reports subsets of files specified in the current section that overlap with other subsets in other sections. For example: `[{foo,bar}]` and `[{foo,bas}]` both contain \"foo\"."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "EditorConfigPartialOverride",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigEmptySection",
+ "shortDescription": {
+ "text": "Empty section"
+ },
+ "fullDescription": {
+ "text": "Reports sections that do not contain any EditorConfig properties.",
+ "markdown": "Reports sections that do not contain any EditorConfig properties."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigEmptySection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigShadowingOption",
+ "shortDescription": {
+ "text": "Overriding property"
+ },
+ "fullDescription": {
+ "text": "Reports properties that override the same properties defined earlier in the file. For example: '[*.java]\nindent_size=4\n[{*.java,*.js}]\nindent_size=2' The second section includes the same files as '[*.java]' but also sets indent_size to value 2. Thus the first declaration 'indent_size=4'will be ignored.",
+ "markdown": "Reports properties that override the same properties defined earlier in the file.\n\nFor example:\n\n\n [*.java]\n indent_size=4\n [{*.java,*.js}]\n indent_size=2\n\nThe second section includes the same files as `[*.java]` but also sets indent_size to value 2. Thus the first declaration `indent_size=4`will be ignored."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigShadowingOption",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigListAcceptability",
+ "shortDescription": {
+ "text": "Unexpected value list"
+ },
+ "fullDescription": {
+ "text": "Reports lists of values that are used in properties in which lists are not supported. In this case, only a single value can be specified.",
+ "markdown": "Reports lists of values that are used in properties in which lists are not supported. In this case, only a single value can be specified."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "EditorConfigListAcceptability",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigPatternEnumerationRedundancy",
+ "shortDescription": {
+ "text": "Unnecessary braces"
+ },
+ "fullDescription": {
+ "text": "Reports pattern lists that are either empty '{}' or contain just one pattern, for example '{foo}' in contrast to a list containing multiple patterns, for example '{foo,bar}'. In this case braces are handled as a part of the name. For example, the pattern '*.{a}' will match the file 'my.{a}' but not 'my.a'.",
+ "markdown": "Reports pattern lists that are either empty `{}` or contain just one pattern, for example `{foo}` in contrast to a list containing multiple patterns, for example `{foo,bar}`. In this case braces are handled as a part of the name. For example, the pattern `*.{a}` will match the file `my.{a}` but not `my.a`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "EditorConfigPatternEnumerationRedundancy",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigReferenceCorrectness",
+ "shortDescription": {
+ "text": "Invalid reference"
+ },
+ "fullDescription": {
+ "text": "Reports identifiers that are either unknown or have a wrong type.",
+ "markdown": "Reports identifiers that are either unknown or have a wrong type."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "EditorConfigReferenceCorrectness",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigPairAcceptability",
+ "shortDescription": {
+ "text": "Unexpected key-value pair"
+ },
+ "fullDescription": {
+ "text": "Reports key-value pairs that are not allowed in the current context.",
+ "markdown": "Reports key-value pairs that are not allowed in the current context."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "EditorConfigPairAcceptability",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigNoMatchingFiles",
+ "shortDescription": {
+ "text": "No matching files"
+ },
+ "fullDescription": {
+ "text": "Reports sections with wildcard patterns that do not match any files under the directory in which the '.editorconfig' file is located.",
+ "markdown": "Reports sections with wildcard patterns that do not match any files under the directory in which the `.editorconfig` file is located."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigNoMatchingFiles",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigWildcardRedundancy",
+ "shortDescription": {
+ "text": "Redundant wildcard"
+ },
+ "fullDescription": {
+ "text": "Reports wildcards that become redundant when the “**” wildcard is used in the same section. The “**” wildcard defines a broader set of files than any other wildcard. That is why, any other wildcard used in the same section has no affect and can be removed.",
+ "markdown": "Reports wildcards that become redundant when the \"\\*\\*\" wildcard is used in the same section.\n\n\nThe \"\\*\\*\" wildcard defines a broader set of files than any other wildcard.\nThat is why, any other wildcard used in the same section has no affect and can be removed."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigWildcardRedundancy",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigHeaderUniqueness",
+ "shortDescription": {
+ "text": "EditorConfig section is not unique"
+ },
+ "fullDescription": {
+ "text": "Reports sections that define the same file pattern as other sections.",
+ "markdown": "Reports sections that define the same file pattern as other sections."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigHeaderUniqueness",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigValueCorrectness",
+ "shortDescription": {
+ "text": "Invalid property value"
+ },
+ "fullDescription": {
+ "text": "Reports property values that do not meet value restrictions. For example, some properties may be only “true” or “false”, others contain only integer numbers etc. If a value has a limited set of variants, use code completion to see all of them.",
+ "markdown": "Reports property values that do not meet value restrictions. For example, some properties may be only \"true\" or \"false\", others contain only integer numbers etc. If a value has a limited set of variants, use code completion to see all of them."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "EditorConfigValueCorrectness",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigVerifyByCore",
+ "shortDescription": {
+ "text": "Invalid .editorconfig file"
+ },
+ "fullDescription": {
+ "text": "Verifies the whole file using the backing EditorConfig core library and reports any failures. Any such failure would prevent EditorConfig properties from being correctly applied.",
+ "markdown": "Verifies the whole file using the backing EditorConfig core library and reports any failures. Any such failure would prevent EditorConfig properties from being correctly applied."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "EditorConfigVerifyByCore",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigCharClassLetterRedundancy",
+ "shortDescription": {
+ "text": "Duplicate character class letter"
+ },
+ "fullDescription": {
+ "text": "Reports wildcard patterns in the EditorConfig section that contain a duplicate character in the character class, for example '[aa]'.",
+ "markdown": "Reports wildcard patterns in the EditorConfig section that contain a duplicate character in the character class, for example `[aa]`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigCharClassLetterRedundancy",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "EditorConfigUnusedDeclaration",
+ "shortDescription": {
+ "text": "Unused declaration"
+ },
+ "fullDescription": {
+ "text": "Reports unused declarations. Such declarations can be removed.",
+ "markdown": "Reports unused declarations. Such declarations can be removed."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "EditorConfigUnusedDeclaration",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "EditorConfig",
+ "index": 26,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "org.intellij.plugins.postcss",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "PostCssUnresolvedModuleValueReference",
+ "shortDescription": {
+ "text": "Unresolved CSS module value"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved reference to a CSS Module Value ('@value' declaration). Example: '@value foo from unknown;'",
+ "markdown": "Reports an unresolved reference to a [CSS Module Value](https://github.com/css-modules/postcss-modules-values) (`@value` declaration).\n\nExample:\n\n\n @value foo from unknown;\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "PostCssUnresolvedModuleValueReference",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PostCSS",
+ "index": 29,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PostCssNesting",
+ "shortDescription": {
+ "text": "Invalid nested rule"
+ },
+ "fullDescription": {
+ "text": "Reports a nested style rule whose syntax doesn't comply with the PostCSS Nested or the PostCSS Nesting specification. Example: '.phone {\n &_title {}\n}'",
+ "markdown": "Reports a nested style rule whose syntax doesn't comply with the [PostCSS Nested](https://github.com/postcss/postcss-nested) or the [PostCSS Nesting](https://github.com/csstools/postcss-nesting) specification.\n\nExample:\n\n\n .phone {\n &_title {}\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "PostCssNesting",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PostCSS",
+ "index": 29,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PostCssCustomMedia",
+ "shortDescription": {
+ "text": "Invalid custom media"
+ },
+ "fullDescription": {
+ "text": "Reports a syntax error in a PostCSS Custom Media query. Example: '@custom-media --small-viewport (max-width: 30em);'",
+ "markdown": "Reports a syntax error in a [PostCSS Custom Media](https://github.com/postcss/postcss-custom-media) query.\n\nExample:\n\n\n @custom-media --small-viewport (max-width: 30em);\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "PostCssCustomMedia",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PostCSS",
+ "index": 29,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PostCssCustomSelector",
+ "shortDescription": {
+ "text": "Invalid custom selector"
+ },
+ "fullDescription": {
+ "text": "Reports a syntax error in PostCSS Custom Selector. Example: '@custom-selector :--heading h1, h2, h3;'",
+ "markdown": "Reports a syntax error in [PostCSS Custom Selector](https://github.com/postcss/postcss-custom-selectors).\n\nExample:\n\n\n @custom-selector :--heading h1, h2, h3;\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "PostCssCustomSelector",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PostCSS",
+ "index": 29,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PostCssMediaRange",
+ "shortDescription": {
+ "text": "Invalid media query range"
+ },
+ "fullDescription": {
+ "text": "Checks range context syntax, which may alternatively be used for media features with a 'range' type. Example: '@media screen and (500px <= width <= 1200px) {}'",
+ "markdown": "Checks [range context](https://github.com/postcss/postcss-media-minmax) syntax, which may alternatively be used for media features with a 'range' type.\n\nExample:\n\n\n @media screen and (500px <= width <= 1200px) {}\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "PostCssMediaRange",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PostCSS",
+ "index": 29,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "HtmlTools",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "HtmlRequiredAltAttribute",
+ "shortDescription": {
+ "text": "Missing required 'alt' attribute"
+ },
+ "fullDescription": {
+ "text": "Reports a missing 'alt' attribute in a 'img' or 'applet' tag or in a 'area' element of an image map. Suggests adding a required attribute with a text alternative for the contents of the tag. Based on WCAG 2.0: H24, H35, H36, H37.",
+ "markdown": "Reports a missing `alt` attribute in a `img` or `applet` tag or in a `area` element of an image map. Suggests adding a required attribute with a text alternative for the contents of the tag. Based on WCAG 2.0: [H24](https://www.w3.org/TR/WCAG20-TECHS/H24.html), [H35](https://www.w3.org/TR/WCAG20-TECHS/H35.html), [H36](https://www.w3.org/TR/WCAG20-TECHS/H36.html), [H37](https://www.w3.org/TR/WCAG20-TECHS/H37.html)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "HtmlRequiredAltAttribute",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML/Accessibility",
+ "index": 36,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlDeprecatedTag",
+ "shortDescription": {
+ "text": "Obsolete tag"
+ },
+ "fullDescription": {
+ "text": "Reports an obsolete HTML5 tag. Suggests replacing the obsolete tag with a CSS or another tag.",
+ "markdown": "Reports an obsolete HTML5 tag. Suggests replacing the obsolete tag with a CSS or another tag."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "HtmlDeprecatedTag",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CheckImageSize",
+ "shortDescription": {
+ "text": "Mismatched image size"
+ },
+ "fullDescription": {
+ "text": "Reports a 'width' and 'height' attribute value of a 'img' tag that is different from the actual width and height of the referenced image.",
+ "markdown": "Reports a `width` and `height` attribute value of a `img` tag that is different from the actual width and height of the referenced image."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CheckImageSize",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlRequiredSummaryAttribute",
+ "shortDescription": {
+ "text": "Missing required 'summary' attribute"
+ },
+ "fullDescription": {
+ "text": "Reports a missing 'summary' attribute in a 'table' tag. Suggests adding a'summary' attribute. Based on WCAG 2.0: H73.",
+ "markdown": "Reports a missing `summary` attribute in a `table` tag. Suggests adding a`summary` attribute. Based on WCAG 2.0: [H73](https://www.w3.org/TR/WCAG20-TECHS/H73.html)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "HtmlRequiredSummaryAttribute",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML/Accessibility",
+ "index": 36,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlNonExistentInternetResource",
+ "shortDescription": {
+ "text": "Unresolved web link"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved web link. Works by making network requests in the background.",
+ "markdown": "Reports an unresolved web link. Works by making network requests in the background."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "HtmlNonExistentInternetResource",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlFormInputWithoutLabel",
+ "shortDescription": {
+ "text": "Missing associated label"
+ },
+ "fullDescription": {
+ "text": "Reports a form element ('input', 'textarea', or 'select') without an associated label. Suggests creating a new label. Based on WCAG 2.0: H44.",
+ "markdown": "Reports a form element (`input`, `textarea`, or `select`) without an associated label. Suggests creating a new label. Based on WCAG 2.0: [H44](https://www.w3.org/TR/WCAG20-TECHS/H44.html). "
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "HtmlFormInputWithoutLabel",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML/Accessibility",
+ "index": 36,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlRequiredTitleAttribute",
+ "shortDescription": {
+ "text": "Missing required 'title' attribute"
+ },
+ "fullDescription": {
+ "text": "Reports a missing title attribute 'frame', 'iframe', 'dl', and 'a' tags. Suggests adding a title attribute. Based on WCAG 2.0: H33, H40, and H64.",
+ "markdown": "Reports a missing title attribute `frame`, `iframe`, `dl`, and `a` tags. Suggests adding a title attribute. Based on WCAG 2.0: [H33](https://www.w3.org/TR/WCAG20-TECHS/H33.html), [H40](https://www.w3.org/TR/WCAG20-TECHS/H40.html), and [H64](https://www.w3.org/TR/WCAG20-TECHS/H64.html)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "HtmlRequiredTitleAttribute",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML/Accessibility",
+ "index": 36,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlRequiredLangAttribute",
+ "shortDescription": {
+ "text": "Missing required 'lang' attribute"
+ },
+ "fullDescription": {
+ "text": "Reports a missing 'lang' (or 'xml:lang') attribute in a 'html' tag. Suggests adding a required attribute to state the default language of the document. Based on WCAG 2.0: H57.",
+ "markdown": "Reports a missing `lang` (or `xml:lang`) attribute in a `html` tag. Suggests adding a required attribute to state the default language of the document. Based on WCAG 2.0: [H57](https://www.w3.org/TR/WCAG20-TECHS/H57.html)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "HtmlRequiredLangAttribute",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML/Accessibility",
+ "index": 36,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlRequiredTitleElement",
+ "shortDescription": {
+ "text": "Missing required 'title' element"
+ },
+ "fullDescription": {
+ "text": "Reports a missing 'title' element inside a 'head' section. Suggests adding a 'title' element. The title should describe the document. Based on WCAG 2.0: H25.",
+ "markdown": "Reports a missing `title` element inside a `head` section. Suggests adding a `title` element. The title should describe the document. Based on WCAG 2.0: [H25](https://www.w3.org/TR/WCAG20-TECHS/H25.html)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "HtmlRequiredTitleElement",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML/Accessibility",
+ "index": 36,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlDeprecatedAttribute",
+ "shortDescription": {
+ "text": "Obsolete attribute"
+ },
+ "fullDescription": {
+ "text": "Reports an obsolete HTML5 attribute.",
+ "markdown": "Reports an obsolete HTML5 attribute."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "HtmlDeprecatedAttribute",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "HtmlPresentationalElement",
+ "shortDescription": {
+ "text": "Presentational tag"
+ },
+ "fullDescription": {
+ "text": "Reports a presentational HTML tag. Suggests replacing the presentational tag with a CSS or another tag.",
+ "markdown": "Reports a presentational HTML tag. Suggests replacing the presentational tag with a CSS or another tag."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "HtmlPresentationalElement",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "HTML",
+ "index": 20,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "com.intellij.css",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "CssInvalidHtmlTagReference",
+ "shortDescription": {
+ "text": "Invalid type selector"
+ },
+ "fullDescription": {
+ "text": "Reports a CSS type selector that matches an unknown HTML element.",
+ "markdown": "Reports a CSS [type selector](https://developer.mozilla.org/en-US/docs/Web/CSS/Type_selectors) that matches an unknown HTML element."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssInvalidHtmlTagReference",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssInvalidFunction",
+ "shortDescription": {
+ "text": "Invalid function"
+ },
+ "fullDescription": {
+ "text": "Reports an unknown CSS function or an incorrect function parameter.",
+ "markdown": "Reports an unknown [CSS function](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Functions) or an incorrect function parameter."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CssInvalidFunction",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssMissingSemicolon",
+ "shortDescription": {
+ "text": "Missing semicolon"
+ },
+ "fullDescription": {
+ "text": "Reports a missing semicolon at the end of a declaration.",
+ "markdown": "Reports a missing semicolon at the end of a declaration."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssMissingSemicolon",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Code style issues",
+ "index": 52,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssMissingComma",
+ "shortDescription": {
+ "text": "Missing comma in selector list"
+ },
+ "fullDescription": {
+ "text": "Reports a multi-line selector. Most likely this means that several single-line selectors are actually intended but a comma is missing at the end of one or several lines. Example: 'input /* comma has probably been forgotten */\n.button {\n margin: 1px;\n}'",
+ "markdown": "Reports a multi-line selector. Most likely this means that several single-line selectors are actually intended but a comma is missing at the end of one or several lines.\n\n**Example:**\n\n\n input /* comma has probably been forgotten */\n .button {\n margin: 1px;\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssMissingComma",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Probable bugs",
+ "index": 68,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssInvalidCustomPropertyAtRuleName",
+ "shortDescription": {
+ "text": "Invalid @property name"
+ },
+ "fullDescription": {
+ "text": "Reports an invalid custom property name. Custom property name should be prefixed with two dashes. Example: '@property invalid-property-name {\n ...\n}\n\n@property --valid-property-name {\n ...\n}'",
+ "markdown": "Reports an invalid custom property name. Custom property name should be prefixed with two dashes.\n\n**Example:**\n\n\n @property invalid-property-name {\n ...\n }\n\n @property --valid-property-name {\n ...\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CssInvalidCustomPropertyAtRuleName",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssConvertColorToHexInspection",
+ "shortDescription": {
+ "text": "Color could be replaced with #-hex"
+ },
+ "fullDescription": {
+ "text": "Reports an 'rgb()', 'hsl()', or other color function. Suggests replacing a color function with an equivalent hexadecimal notation. Example: 'rgb(12, 15, 255)' After the quick-fix is applied: '#0c0fff'.",
+ "markdown": "Reports an `rgb()`, `hsl()`, or other color function.\n\nSuggests replacing a color function with an equivalent hexadecimal notation.\n\n**Example:**\n\n rgb(12, 15, 255)\n\nAfter the quick-fix is applied:\n\n #0c0fff.\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssConvertColorToHexInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS",
+ "index": 41,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssConvertColorToRgbInspection",
+ "shortDescription": {
+ "text": "Color could be replaced with rgb()"
+ },
+ "fullDescription": {
+ "text": "Reports an 'hsl()' or 'hwb()' color function or a hexadecimal color notation. Suggests replacing such color value with an equivalent 'rgb()' or 'rgba()' color function. Example: '#0c0fff' After the quick-fix is applied: 'rgb(12, 15, 255)'.",
+ "markdown": "Reports an `hsl()` or `hwb()` color function or a hexadecimal color notation.\n\nSuggests replacing such color value with an equivalent `rgb()` or `rgba()` color function.\n\n**Example:**\n\n #0c0fff\n\nAfter the quick-fix is applied:\n\n rgb(12, 15, 255).\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssConvertColorToRgbInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS",
+ "index": 41,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssUnusedSymbol",
+ "shortDescription": {
+ "text": "Unused selector"
+ },
+ "fullDescription": {
+ "text": "Reports a CSS class or an element IDs that appears in selectors but is not used in HTML. Note that complete inspection results are available only when running it via Code | Inspect Code or Code | Analyze Code | Run Inspection by Name. Due to performance reasons, style sheet files are not inspected on the fly.",
+ "markdown": "Reports a CSS class or an element IDs that appears in selectors but is not used in HTML.\n\n\nNote that complete inspection results are available only when running it via **Code \\| Inspect Code** or\n**Code \\| Analyze Code \\| Run Inspection by Name**.\nDue to performance reasons, style sheet files are not inspected on the fly."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssUnusedSymbol",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS",
+ "index": 41,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssInvalidAtRule",
+ "shortDescription": {
+ "text": "Unknown at-rule"
+ },
+ "fullDescription": {
+ "text": "Reports an unknown CSS at-rule.",
+ "markdown": "Reports an unknown [CSS at-rule](https://developer.mozilla.org/en-US/docs/Web/CSS/At-rule)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CssInvalidAtRule",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssUnknownTarget",
+ "shortDescription": {
+ "text": "Unresolved file reference"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved file reference, for example, an incorrect path in an '@import' statement.",
+ "markdown": "Reports an unresolved file reference, for example, an incorrect path in an `@import` statement."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CssUnknownTarget",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssNegativeValue",
+ "shortDescription": {
+ "text": "Negative property value"
+ },
+ "fullDescription": {
+ "text": "Reports a negative value of a CSS property that is not expected to be less than zero, for example, object width or height.",
+ "markdown": "Reports a negative value of a CSS property that is not expected to be less than zero, for example, object width or height."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CssNegativeValue",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssNoGenericFontName",
+ "shortDescription": {
+ "text": "Missing generic font family name"
+ },
+ "fullDescription": {
+ "text": "Verifies that the 'font-family' property contains a generic font family name as a fallback alternative. Generic font family names are: 'serif', 'sans-serif', 'cursive', 'fantasy', and 'monospace'.",
+ "markdown": "Verifies that the [font-family](https://developer.mozilla.org/en-US/docs/Web/CSS/font-family) property contains a generic font family name as a fallback alternative.\n\n\nGeneric font family names are: `serif`, `sans-serif`, `cursive`, `fantasy`,\nand `monospace`."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssNoGenericFontName",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Probable bugs",
+ "index": 68,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssInvalidCharsetRule",
+ "shortDescription": {
+ "text": "Misplaced or incorrect @charset"
+ },
+ "fullDescription": {
+ "text": "Reports a misplaced '@charset' at-rule or an incorrect charset value.",
+ "markdown": "Reports a misplaced `@charset` at-rule or an incorrect charset value."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssInvalidCharsetRule",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssInvalidPseudoSelector",
+ "shortDescription": {
+ "text": "Invalid pseudo-selector"
+ },
+ "fullDescription": {
+ "text": "Reports an incorrect CSS pseudo-class pseudo-element.",
+ "markdown": "Reports an incorrect CSS [pseudo-class](https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes) [pseudo-element](https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CssInvalidPseudoSelector",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssInvalidCustomPropertyAtRuleDeclaration",
+ "shortDescription": {
+ "text": "Invalid @property declaration"
+ },
+ "fullDescription": {
+ "text": "Reports a missing required syntax, inherits, or initial-value property in a declaration of a custom property.",
+ "markdown": "Reports a missing required [syntax](https://developer.mozilla.org/en-US/docs/web/css/@property/syntax), [inherits](https://developer.mozilla.org/en-US/docs/web/css/@property/inherits), or [initial-value](https://developer.mozilla.org/en-US/docs/web/css/@property/initial-value) property in a declaration of a custom property."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CssInvalidCustomPropertyAtRuleDeclaration",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssRedundantUnit",
+ "shortDescription": {
+ "text": "Redundant measure unit"
+ },
+ "fullDescription": {
+ "text": "Reports a measure unit of a zero value where units are not required by the specification. Example: 'width: 0px'",
+ "markdown": "Reports a measure unit of a zero value where units are not required by the specification.\n\n**Example:**\n\n width: 0px\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssRedundantUnit",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Code style issues",
+ "index": 52,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssInvalidPropertyValue",
+ "shortDescription": {
+ "text": "Invalid property value"
+ },
+ "fullDescription": {
+ "text": "Reports an incorrect CSS property value.",
+ "markdown": "Reports an incorrect CSS property value."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CssInvalidPropertyValue",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssBrowserCompatibilityForProperties",
+ "shortDescription": {
+ "text": "Property is incompatible with selected browsers"
+ },
+ "fullDescription": {
+ "text": "Reports a CSS property that is not supported by the specified browsers. Based on the MDN Compatibility Data.",
+ "markdown": "Reports a CSS property that is not supported by the specified browsers. Based on the [MDN Compatibility Data](https://github.com/mdn/browser-compat-data)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssBrowserCompatibilityForProperties",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS",
+ "index": 41,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssReplaceWithShorthandUnsafely",
+ "shortDescription": {
+ "text": "Properties may probably be replaced with a shorthand"
+ },
+ "fullDescription": {
+ "text": "Reports a set of longhand CSS properties and suggests replacing an incomplete set of longhand CSS properties with a shorthand form, which is however not 100% equivalent in this case. For example, 2 properties: 'outline-color' and 'outline-style' may be replaced with a single 'outline'. Such replacement is not 100% equivalent because shorthands reset all omitted sub-values to their initial states. In this example, switching to the 'outline' shorthand means that 'outline-width' is also set to its initial value, which is 'medium'. This inspection doesn't handle full sets of longhand properties (when switching to shorthand is 100% safe). For such cases see the 'Properties may be safely replaced with a shorthand' inspection instead.",
+ "markdown": "Reports a set of longhand CSS properties and suggests replacing an incomplete set of longhand CSS properties with a shorthand form, which is however not 100% equivalent in this case.\n\n\nFor example, 2 properties: `outline-color` and `outline-style` may be replaced with a single `outline`.\nSuch replacement is not 100% equivalent because shorthands reset all omitted sub-values to their initial states.\nIn this example, switching to the `outline` shorthand means that `outline-width` is also set to its initial value,\nwhich is `medium`.\n\n\nThis inspection doesn't handle full sets of longhand properties (when switching to shorthand is 100% safe).\nFor such cases see the 'Properties may be safely replaced with a shorthand' inspection instead."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "CssReplaceWithShorthandUnsafely",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS",
+ "index": 41,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssUnknownUnit",
+ "shortDescription": {
+ "text": "Unknown unit"
+ },
+ "fullDescription": {
+ "text": "Reports an unknown unit.",
+ "markdown": "Reports an unknown unit."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CssUnknownUnit",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssInvalidMediaFeature",
+ "shortDescription": {
+ "text": "Invalid media feature"
+ },
+ "fullDescription": {
+ "text": "Reports an unknown CSS media feature or an incorrect media feature value.",
+ "markdown": "Reports an unknown [CSS media feature](https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries) or an incorrect media feature value."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CssInvalidMediaFeature",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssDeprecatedValue",
+ "shortDescription": {
+ "text": "Deprecated value"
+ },
+ "fullDescription": {
+ "text": "Reports a deprecated CSS value. Suggests replacing the deprecated value with its valid equivalent.",
+ "markdown": "Reports a deprecated CSS value. Suggests replacing the deprecated value with its valid equivalent."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CssDeprecatedValue",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS",
+ "index": 41,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssNonIntegerLengthInPixels",
+ "shortDescription": {
+ "text": "Non-integer length in pixels"
+ },
+ "fullDescription": {
+ "text": "Reports a non-integer length in pixels. Example: 'width: 3.14px'",
+ "markdown": "Reports a non-integer length in pixels.\n\n**Example:**\n\n width: 3.14px\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "CssNonIntegerLengthInPixels",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Probable bugs",
+ "index": 68,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssInvalidImport",
+ "shortDescription": {
+ "text": "Misplaced @import"
+ },
+ "fullDescription": {
+ "text": "Reports a misplaced '@import' statement. According to the specification, '@import' rules must precede all other types of rules, except '@charset' rules.",
+ "markdown": "Reports a misplaced `@import` statement.\n\n\nAccording to the [specification](https://developer.mozilla.org/en-US/docs/Web/CSS/@import),\n`@import` rules must precede all other types of rules, except `@charset` rules."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssInvalidImport",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssUnresolvedCustomProperty",
+ "shortDescription": {
+ "text": "Unresolved custom property"
+ },
+ "fullDescription": {
+ "text": "Reports an unresolved reference to a custom property among the arguments of the 'var()' function.",
+ "markdown": "Reports an unresolved reference to a [custom property](https://developer.mozilla.org/en-US/docs/Web/CSS/--*) among the arguments of the `var()` function."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CssUnresolvedCustomProperty",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssOverwrittenProperties",
+ "shortDescription": {
+ "text": "Overwritten property"
+ },
+ "fullDescription": {
+ "text": "Reports a duplicated CSS property within a ruleset. Respects shorthand properties. Example: '.foo {\n margin-bottom: 1px;\n margin-bottom: 1px; /* duplicates margin-bottom */\n margin: 0; /* overrides margin-bottom */\n}'",
+ "markdown": "Reports a duplicated CSS property within a ruleset. Respects shorthand properties.\n\n**Example:**\n\n\n .foo {\n margin-bottom: 1px;\n margin-bottom: 1px; /* duplicates margin-bottom */\n margin: 0; /* overrides margin-bottom */\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssOverwrittenProperties",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS",
+ "index": 41,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssUnresolvedClassInComposesRule",
+ "shortDescription": {
+ "text": "Unresolved class in 'composes' rule"
+ },
+ "fullDescription": {
+ "text": "Reports a CSS class reference in the 'composes' rule that cannot be resolved to any valid target. Example: '.className {/* ... */}\n\n .otherClassName {\n composes: className;\n }'",
+ "markdown": "Reports a CSS class reference in the ['composes'](https://github.com/css-modules/css-modules#composition) rule that cannot be resolved to any valid target.\n\n**Example:**\n\n\n .className {/* ... */}\n\n .otherClassName {\n composes: className;\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "CssUnresolvedClassInComposesRule",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssReplaceWithShorthandSafely",
+ "shortDescription": {
+ "text": "Properties may be safely replaced with a shorthand"
+ },
+ "fullDescription": {
+ "text": "Reports a set of longhand properties. Suggests replacing a complete set of longhand CSS properties with an equivalent shorthand form. For example, 4 properties: 'padding-top', 'padding-right', 'padding-bottom', and 'padding-left' can be safely replaced with a single 'padding' property. Note that this inspection doesn't show up if the set of longhand properties is incomplete (e.g. only 3 'padding-xxx' properties in a ruleset) because switching to a shorthand may change the result. For such cases consider the 'Properties may probably be replaced with a shorthand' inspection.",
+ "markdown": "Reports a set of longhand properties. Suggests replacing a complete set of longhand CSS properties with an equivalent shorthand form.\n\n\nFor example, 4 properties: `padding-top`, `padding-right`, `padding-bottom`, and\n`padding-left`\ncan be safely replaced with a single `padding` property.\n\n\nNote that this inspection doesn't show up if the set of longhand properties is incomplete\n(e.g. only 3 `padding-xxx` properties in a ruleset)\nbecause switching to a shorthand may change the result.\nFor such cases consider the 'Properties may probably be replaced with a shorthand'\ninspection."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "CssReplaceWithShorthandSafely",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS",
+ "index": 41,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssUnknownProperty",
+ "shortDescription": {
+ "text": "Unknown property"
+ },
+ "fullDescription": {
+ "text": "Reports an unknown CSS property or a property used in a wrong context. Add the unknown property to the 'Custom CSS properties' list to skip validation.",
+ "markdown": "Reports an unknown CSS property or a property used in a wrong context.\n\nAdd the unknown property to the 'Custom CSS properties' list to skip validation."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssUnknownProperty",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CssInvalidNestedSelector",
+ "shortDescription": {
+ "text": "Invalid nested selector"
+ },
+ "fullDescription": {
+ "text": "Reports a nested selector starting with an identifier or a functional notation.",
+ "markdown": "Reports a nested selector starting with an identifier or a functional notation."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CssInvalidNestedSelector",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "CSS/Invalid elements",
+ "index": 42,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "org.jetbrains.plugins.yaml",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "YAMLSchemaValidation",
+ "shortDescription": {
+ "text": "Validation by JSON Schema"
+ },
+ "fullDescription": {
+ "text": "Reports inconsistencies between a YAML file and a JSON Schema if the schema is specified. Scheme example: '{\n \"properties\": {\n \"SomeNumberProperty\": {\n \"type\": \"number\"\n }\n }\n }' The following is an example with the corresponding warning: 'SomeNumberProperty: hello world'",
+ "markdown": "Reports inconsistencies between a YAML file and a JSON Schema if the schema is specified.\n\n**Scheme example:**\n\n\n {\n \"properties\": {\n \"SomeNumberProperty\": {\n \"type\": \"number\"\n }\n }\n }\n\n**The following is an example with the corresponding warning:**\n\n\n SomeNumberProperty: hello world\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "YAMLSchemaValidation",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "YAML",
+ "index": 46,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "YAMLUnresolvedAlias",
+ "shortDescription": {
+ "text": "Unresolved alias"
+ },
+ "fullDescription": {
+ "text": "Reports unresolved aliases in YAML files. Example: 'some_key: *unknown_alias'",
+ "markdown": "Reports unresolved aliases in YAML files.\n\n**Example:**\n\n\n some_key: *unknown_alias\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "YAMLUnresolvedAlias",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "YAML",
+ "index": 46,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "YAMLSchemaDeprecation",
+ "shortDescription": {
+ "text": "Deprecated YAML key"
+ },
+ "fullDescription": {
+ "text": "Reports deprecated keys in YAML files. Deprecation is checked only if there exists a JSON schema associated with the corresponding YAML file. Note that the deprecation mechanism is not defined in the JSON Schema specification yet, and this inspection uses a non-standard 'deprecationMessage' extension. Scheme deprecation example: '{\n \"properties\": {\n \"SomeDeprecatedProperty\": {\n \"deprecationMessage\": \"Baz\",\n \"description\": \"Foo bar\"\n }\n }\n }' The following is an example with the corresponding warning: 'SomeDeprecatedProperty: some value'",
+ "markdown": "Reports deprecated keys in YAML files.\n\nDeprecation is checked only if there exists a JSON schema associated with the corresponding YAML file.\n\nNote that the deprecation mechanism is not defined in the JSON Schema specification yet,\nand this inspection uses a non-standard `deprecationMessage` extension.\n\n**Scheme deprecation example:**\n\n\n {\n \"properties\": {\n \"SomeDeprecatedProperty\": {\n \"deprecationMessage\": \"Baz\",\n \"description\": \"Foo bar\"\n }\n }\n }\n\n**The following is an example with the corresponding warning:**\n\n\n SomeDeprecatedProperty: some value\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "YAMLSchemaDeprecation",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "YAML",
+ "index": 46,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "YAMLIncompatibleTypes",
+ "shortDescription": {
+ "text": "Suspicious type mismatch"
+ },
+ "fullDescription": {
+ "text": "Reports a mismatch between a scalar value type in YAML file and types of the values in the similar positions. Example: 'myElements:\n - value1\n - value2\n - false # <- reported, because it is a boolean value, while other values are strings'",
+ "markdown": "Reports a mismatch between a scalar value type in YAML file and types of the values in the similar positions.\n\n**Example:**\n\n\n myElements:\n - value1\n - value2\n - false # <- reported, because it is a boolean value, while other values are strings\n"
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "YAMLIncompatibleTypes",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "YAML",
+ "index": 46,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "YAMLRecursiveAlias",
+ "shortDescription": {
+ "text": "Recursive alias"
+ },
+ "fullDescription": {
+ "text": "Reports recursion in YAML aliases. Alias can't be recursive and be used inside the data referenced by a corresponding anchor. Example: 'some_key: &some_anchor\n sub_key1: value1\n sub_key2: *some_anchor'",
+ "markdown": "Reports recursion in YAML aliases.\n\nAlias can't be recursive and be used inside the data referenced by a corresponding anchor.\n\n**Example:**\n\n\n some_key: &some_anchor\n sub_key1: value1\n sub_key2: *some_anchor\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "YAMLRecursiveAlias",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "YAML",
+ "index": 46,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "YAMLDuplicatedKeys",
+ "shortDescription": {
+ "text": "Duplicated YAML keys"
+ },
+ "fullDescription": {
+ "text": "Reports duplicated keys in YAML files. Example: 'same_key: some value\n same_key: another value'",
+ "markdown": "Reports duplicated keys in YAML files.\n\n**Example:**\n\n\n same_key: some value\n same_key: another value\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "YAMLDuplicatedKeys",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "YAML",
+ "index": 46,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "YAMLUnusedAnchor",
+ "shortDescription": {
+ "text": "Unused anchor"
+ },
+ "fullDescription": {
+ "text": "Reports unused anchors. Example: 'some_key: &some_anchor\n key1: value1'",
+ "markdown": "Reports unused anchors.\n\n**Example:**\n\n\n some_key: &some_anchor\n key1: value1\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "YAMLUnusedAnchor",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "YAML",
+ "index": 46,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "org.jetbrains.plugins.less",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "LessUnresolvedVariable",
+ "shortDescription": {
+ "text": "Unresolved variable"
+ },
+ "fullDescription": {
+ "text": "Reports a reference to a Less variable that is not resolved. Example: '* {\n margin: @unknown-var;\n}'",
+ "markdown": "Reports a reference to a [Less variable](http://lesscss.org/features/#variables-feature) that is not resolved.\n\n**Example:**\n\n\n * {\n margin: @unknown-var;\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "LessUnresolvedVariable",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Less",
+ "index": 55,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "LessResolvedByNameOnly",
+ "shortDescription": {
+ "text": "Missing import"
+ },
+ "fullDescription": {
+ "text": "Reports a reference to a variable or mixin that is declared in another file, which is not explicitly imported in the current file. Example: '* {\n margin: @var-in-other-file;\n}'",
+ "markdown": "Reports a reference to a variable or mixin that is declared in another file, which is not explicitly [imported](http://lesscss.org/features/#import-atrules-feature) in the current file.\n\n**Example:**\n\n\n * {\n margin: @var-in-other-file;\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "LessResolvedByNameOnly",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Less",
+ "index": 55,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "LessUnresolvedMixin",
+ "shortDescription": {
+ "text": "Unresolved mixin"
+ },
+ "fullDescription": {
+ "text": "Reports a reference to a Less mixin that is not resolved. Example: '* {\n .unknown-mixin();\n}'",
+ "markdown": "Reports a reference to a [Less mixin](http://lesscss.org/features/#mixins-feature) that is not resolved.\n\n**Example:**\n\n\n * {\n .unknown-mixin();\n }\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "LessUnresolvedMixin",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Less",
+ "index": 55,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "de.espend.idea.php.annotation",
+ "version": "9.4.0",
+ "rules": [
+ {
+ "id": "DoctrineTypeDeprecatedInspection",
+ "shortDescription": {
+ "text": "[Annotations] Doctrine column type deprecated"
+ },
+ "fullDescription": {
+ "text": "Reports deprecations of the type Doctrine\\ORM\\Mapping\\Column::type based on the underlying type class [Annotation]Reports deprecations of Doctrine\\ORM\\Mapping\\Column::type",
+ "markdown": "Reports deprecations of the type Doctrine\\\\ORM\\\\Mapping\\\\Column::type based on the underlying type class\n\n\\[Annotation\\]Reports deprecations of Doctrine\\\\ORM\\\\Mapping\\\\Column::type"
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "DoctrineTypeDeprecatedInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Annotation",
+ "index": 59,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "AnnotationDeprecatedInspection",
+ "shortDescription": {
+ "text": "[Annotations] Annotation is deprecated"
+ },
+ "fullDescription": {
+ "text": "Doc block annotation class found, but it is deprecated You should migrate to a current alternative annotation",
+ "markdown": "Doc block annotation class found, but it is deprecated\n\nYou should migrate to a current alternative annotation"
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "AnnotationDeprecatedInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Annotation",
+ "index": 59,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "AnnotationDocBlockClassConstantNotFound",
+ "shortDescription": {
+ "text": "[Annotations] Class not found"
+ },
+ "fullDescription": {
+ "text": "Class in class constant of DocBlock context not found",
+ "markdown": "Class in class constant of DocBlock context not found"
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "AnnotationDocBlockClassConstantNotFound",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Annotation",
+ "index": 59,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "AnnotationMissingUseInspection",
+ "shortDescription": {
+ "text": "[Annotations] Missing import"
+ },
+ "fullDescription": {
+ "text": "Doc block annotation class found, but its missing in use statement You should import the class as use statement Doctrine Annotations",
+ "markdown": "Doc block annotation class found, but its missing in use statement \nYou should import the class as *use* statement \n[Doctrine Annotations](http://doctrine-common.readthedocs.org/en/latest/reference/annotations.html)"
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "AnnotationMissingUseInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Annotation",
+ "index": 59,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "RepositoryClassInspection",
+ "shortDescription": {
+ "text": "[Annotations] Missing repository class"
+ },
+ "fullDescription": {
+ "text": "No repository class was found. Please create a PHP class see for more details",
+ "markdown": "No repository class was found. Please create a PHP class [see for more details](https://symfony.com/doc/current/doctrine/repository.html?phpstorm)"
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "RepositoryClassInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Annotation",
+ "index": 59,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "AnnotationDocBlockConstantDeprecated",
+ "shortDescription": {
+ "text": "[Annotations] Deprecated usage"
+ },
+ "fullDescription": {
+ "text": "Constant in class found, but it is deprecated You should migrate to a current alternative annotation",
+ "markdown": "Constant in class found, but it is deprecated\n\nYou should migrate to a current alternative annotation"
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "AnnotationDocBlockConstantDeprecated",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Annotation",
+ "index": 59,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "com.jetbrains.php.joomla",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "FileHeaderInspection",
+ "shortDescription": {
+ "text": "Missing @copyright/@license tags"
+ },
+ "fullDescription": {
+ "text": "Reports the file header DocBlocks that do not contain the '@copyright' and '@license' tags required by the Joomla! DocBlocks standard. See Joomla! Coding Standards (developer.joomla.org) for details.",
+ "markdown": "Reports the file header DocBlocks that do not contain the `@copyright` and `@license` tags required by the Joomla! DocBlocks standard.\n\n\nSee [Joomla! Coding Standards (developer.joomla.org)](https://developer.joomla.org/coding-standards/docblocks.html) for details."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "FileHeaderInspection",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Joomla!",
+ "index": 64,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "MissingSinceTagDocInspection",
+ "shortDescription": {
+ "text": "Missing @since tag"
+ },
+ "fullDescription": {
+ "text": "Reports the class, class property, and class method DocBlocks that do not contain the '@since' tag required by the Joomla! DocBlocks standard. See Joomla! Coding Standards (developer.joomla.org) for details.",
+ "markdown": "Reports the class, class property, and class method DocBlocks that do not contain the `@since` tag required by the Joomla! DocBlocks standard.\n\nSee [Joomla! Coding Standards (developer.joomla.org)](https://developer.joomla.org/coding-standards/docblocks.html) for details."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "MissingSinceTagDocInspection",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Joomla!",
+ "index": 64,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "com.jetbrains.php.architecture",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "PhpComplexClassInspection",
+ "shortDescription": {
+ "text": "Complex class should be refactored"
+ },
+ "fullDescription": {
+ "text": "Reports the classes that are too complex. Class complexity is evaluated based on three metrics: TCC (Tight class cohesion) — the measure of class cohesiveness (more is better). WMC (Weighted Method count) — the sum of cyclomatic complexities for all methods in a class (less is better). ATFD (Access to foreign data) — the number of properties from another class that are accessed in the current class (less is better).",
+ "markdown": "Reports the classes that are too complex.\n\nClass complexity is evaluated based on three metrics:\n\n* TCC (Tight class cohesion) --- the measure of class cohesiveness (more is better).\n* WMC (Weighted Method count) --- the sum of cyclomatic complexities for all methods in a class (less is better).\n* ATFD (Access to foreign data) --- the number of properties from another class that are accessed in the current class (less is better)."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "PhpComplexClassInspection",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Refactoring opportunities",
+ "index": 66,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PhpMemberCanBePulledUpInspection",
+ "shortDescription": {
+ "text": "Member can be pulled up"
+ },
+ "fullDescription": {
+ "text": "Reports the class methods and properties that should be pulled up to the parent class or interface.",
+ "markdown": "Reports the class methods and properties that should be pulled up to the parent class or interface."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "PhpMemberCanBePulledUpInspection",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Refactoring opportunities",
+ "index": 66,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PhpFeatureEnvyLocalInspection",
+ "shortDescription": {
+ "text": "Method has Feature Envy on another class"
+ },
+ "fullDescription": {
+ "text": "Reports the \"Feature Envy\" code smell. Feature envy is defined as occurring when a method calls methods on another class more times than on the source class. It often indicates that the intended functionality is located in the wrong class. Calls to library classes, parent classes, and contained or containing classes are not counted by this inspection.",
+ "markdown": "Reports the \"Feature Envy\" code smell. Feature envy is defined as occurring when a method calls methods on another class more times than on the source class. It often indicates that the intended functionality is located in the wrong class.\n\n\nCalls to library classes, parent classes, and contained or containing classes are not counted by this inspection."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "PhpFeatureEnvyLocalInspection",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Refactoring opportunities",
+ "index": 66,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PhpClassHasTooManyDeclaredMembersInspection",
+ "shortDescription": {
+ "text": "Class has too many declared members"
+ },
+ "fullDescription": {
+ "text": "Reports the classes that have too many properties or methods.",
+ "markdown": "Reports the classes that have too many properties or methods."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "PhpClassHasTooManyDeclaredMembersInspection",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Refactoring opportunities",
+ "index": 66,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PhpFunctionCyclomaticComplexityInspection",
+ "shortDescription": {
+ "text": "Function has too high cyclomatic complexity"
+ },
+ "fullDescription": {
+ "text": "Reports the methods that have high cyclomatic complexity and can probably be simplified. See Cyclomatic complexity (wikipedia.org) for details.",
+ "markdown": "Reports the methods that have high cyclomatic complexity and can probably be simplified.\n\n\nSee [Cyclomatic complexity (wikipedia.org)](https://en.wikipedia.org/wiki/Cyclomatic_complexity) for details."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "PhpFunctionCyclomaticComplexityInspection",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Refactoring opportunities",
+ "index": 66,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PhpHalsteadMetricInspection",
+ "shortDescription": {
+ "text": "Halstead metric"
+ },
+ "fullDescription": {
+ "text": "Reports the methods with high Halstead Complexity metric. See Halstead measure (wikipedia.org) for details.",
+ "markdown": "Reports the methods with high Halstead Complexity metric.\n\n\nSee [Halstead measure (wikipedia.org)](https://en.wikipedia.org/wiki/Halstead_complexity_measures) for details."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "PhpHalsteadMetricInspection",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Refactoring opportunities",
+ "index": 66,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PhpComplexFunctionInspection",
+ "shortDescription": {
+ "text": "Complex function should be refactored"
+ },
+ "fullDescription": {
+ "text": "Reports the functions or methods that are too complex. Complexity is evaluated based on four metrics: Lines of code — the number of code lines in a function/method (less is better) Maximum Nesting depth — the maximum number of nested statements in a function/method body (less is better) Cyclomatic complexity — the function/method cyclomatic complexity (less is better) Number of variables — the number of variables used in function/method body",
+ "markdown": "Reports the functions or methods that are too complex.\n\nComplexity is evaluated based on four metrics:\n\n* Lines of code --- the number of code lines in a function/method (less is better)\n* Maximum Nesting depth --- the maximum number of nested statements in a function/method body (less is better)\n* Cyclomatic complexity --- the function/method cyclomatic complexity (less is better)\n* Number of variables --- the number of variables used in function/method body"
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "PhpComplexFunctionInspection",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Refactoring opportunities",
+ "index": 66,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PhpLackOfCohesionInspection",
+ "shortDescription": {
+ "text": "LCOM metric"
+ },
+ "fullDescription": {
+ "text": "Reports the classes that have high Lack of Cohesion metric value, which represents the degree of cohesiveness of a class. It uses class dependency graph components for class cohesiveness measure (M. Hitz and B. Montazeri definition of LCOM metric)",
+ "markdown": "Reports the classes that have high Lack of Cohesion metric value, which represents the degree of cohesiveness of a class.\n\n\nIt uses class dependency graph components for class cohesiveness measure (M. Hitz and B. Montazeri definition of LCOM metric)"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "PhpLackOfCohesionInspection",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Refactoring opportunities",
+ "index": 66,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "org.intellij.qodana",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "JsCoverageInspection",
+ "shortDescription": {
+ "text": "Check JavaScript and TypeScript source code coverage"
+ },
+ "fullDescription": {
+ "text": "Reports methods, classes and files whose coverage is below a certain threshold.",
+ "markdown": "Reports methods, classes and files whose coverage is below a certain threshold."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "JsCoverageInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Code Coverage",
+ "index": 74,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PhpCoverageInspection",
+ "shortDescription": {
+ "text": "Check the PHP source code coverage"
+ },
+ "fullDescription": {
+ "text": "Reports methods, classes and files whose coverage is below a certain threshold.",
+ "markdown": "Reports methods, classes and files whose coverage is below a certain threshold."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "PhpCoverageInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Code Coverage",
+ "index": 74,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "QodanaSanity",
+ "shortDescription": {
+ "text": "Sanity"
+ },
+ "fullDescription": {
+ "text": "Reports issues essential to this file like syntax errors, unresolved methods and variables, etc...",
+ "markdown": "Reports issues essential to this file like syntax errors, unresolved methods and variables, etc..."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "QodanaSanity",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Qodana",
+ "index": 109,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "com.jetbrains.php.behat",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "BehatDocStepCanBeConvertedToAttributeInspection",
+ "shortDescription": {
+ "text": "Behat doc step can be converted to attribute version"
+ },
+ "fullDescription": {
+ "text": "Reports Behat doc tags that can be replaced with attribute version",
+ "markdown": "Reports Behat doc tags that can be replaced with attribute version"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "BehatDocStepCanBeConvertedToAttributeInspection",
+ "ideaSeverity": "INFORMATION",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Behat",
+ "index": 76,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "com.jetbrains.plugins.ini4idea",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "DuplicateSectionInFile",
+ "shortDescription": {
+ "text": "Duplicate section in file"
+ },
+ "fullDescription": {
+ "text": "Reports duplicate sections in the 'ini' file.",
+ "markdown": "Reports duplicate sections in the `ini` file."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "DuplicateSectionInFile",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Ini files",
+ "index": 78,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "DuplicateKeyInSection",
+ "shortDescription": {
+ "text": "Duplicate directive in section"
+ },
+ "fullDescription": {
+ "text": "Reports duplicate properties in the 'ini' file section.",
+ "markdown": "Reports duplicate properties in the `ini` file section."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "DuplicateKeyInSection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Ini files",
+ "index": 78,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "com.intellij.php.psalm",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "PsalmAdvanceCallableParamsInspection",
+ "shortDescription": {
+ "text": "Function call is not compatible with 'callable' declaration"
+ },
+ "fullDescription": {
+ "text": "Reports the parameters in function calls whose types are not compatible with the ones defined via 'Closure'.",
+ "markdown": "Reports the parameters in function calls whose types are not compatible with the ones defined via `Closure`."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "PsalmAdvanceCallableParamsInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Psalm",
+ "index": 82,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PsalmGlobal",
+ "shortDescription": {
+ "text": "Psalm validation"
+ },
+ "fullDescription": {
+ "text": "Runs Psalm to find code problems. The inspection requires Psalm to be properly installed and set up in the IDE under Settings | PHP | Quality Tools | Psalm. To learn more about installing Psalm, see: https://psalm.dev/docs/running_psalm/installation/",
+ "markdown": "Runs Psalm to find code problems. \n\nThe inspection requires Psalm to be properly installed and set up in the IDE under [Settings \\| PHP \\| Quality Tools \\| Psalm](settings://settings.php.quality.tools?Psalm).\n\nTo learn more about installing Psalm, see:\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "PsalmGlobal",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Quality tools",
+ "index": 89,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "com.intellij.taintAnalysis",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "PhpTaintFunctionInspection",
+ "shortDescription": {
+ "text": "Vulnerabilities scanner"
+ },
+ "fullDescription": {
+ "text": "Call of this function may be unsafe.",
+ "markdown": "Call of this function may be unsafe."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "PhpTaintFunctionInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Taint analysis",
+ "index": 84,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "PhpVulnerablePathsInspection",
+ "shortDescription": {
+ "text": "Vulnerable paths scanner"
+ },
+ "fullDescription": {
+ "text": "Global taint analysis inspection.",
+ "markdown": "Global taint analysis inspection."
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "PhpVulnerablePathsInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Taint analysis",
+ "index": 84,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "com.jetbrains.php.blade",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "BladeUnpairedParenthesesInStringLiteral",
+ "shortDescription": {
+ "text": "Parse error due to unpaired parentheses in string literals"
+ },
+ "fullDescription": {
+ "text": "Reports the unpaired parentheses in string literals that produce blade parser errors. See laravel issue (github.com) for details.",
+ "markdown": "Reports the unpaired parentheses in string literals that produce blade parser errors.\n\n\nSee [laravel issue (github.com)](https://github.com/laravel/framework/issues/18317) for details."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "BladeUnpairedParenthesesInStringLiteral",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Blade files",
+ "index": 86,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "BladeControlDirectives",
+ "shortDescription": {
+ "text": "Control directive missing"
+ },
+ "fullDescription": {
+ "text": "Reports the Blade control directives that are not closed with the corresponding '@end...' directives. See Blade directives (laravel.com) for details.",
+ "markdown": "Reports the Blade control directives that are not closed with the corresponding `@end...` directives.\n\n\nSee [Blade directives (laravel.com)](https://laravel.com/docs/blade#blade-directives) for details."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "BladeControlDirectives",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Blade files",
+ "index": 86,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "tanvd.grazi",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "LanguageDetectionInspection",
+ "shortDescription": {
+ "text": "Natural language detection"
+ },
+ "fullDescription": {
+ "text": "Detects natural languages and suggests enabling corresponding grammar and spelling checks.",
+ "markdown": "Detects natural languages and suggests enabling corresponding grammar and spelling checks."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "LanguageDetectionInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Proofreading",
+ "index": 75,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "GrazieInspection",
+ "shortDescription": {
+ "text": "Grammar"
+ },
+ "fullDescription": {
+ "text": "Reports grammar mistakes in your text. You can configure the inspection in Settings | Editor | Natural Languages | Grammar.",
+ "markdown": "Reports grammar mistakes in your text. You can configure the inspection in [Settings \\| Editor \\| Natural Languages \\| Grammar](settings://reference.settingsdialog.project.grazie)."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "GrazieInspection",
+ "ideaSeverity": "GRAMMAR_ERROR",
+ "qodanaSeverity": "Info"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Proofreading",
+ "index": 75,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "org.jetbrains.plugins.vue",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "VueMissingComponentImportInspection",
+ "shortDescription": {
+ "text": "Missing component import"
+ },
+ "fullDescription": {
+ "text": "Reports Vue components, which require to be imported in Vue templates. It provides a quick fix to add the missing import.",
+ "markdown": "Reports Vue components, which require to be imported in Vue templates. It provides a quick fix to add the missing import."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "VueMissingComponentImportInspection",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Vue",
+ "index": 96,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "VueUnrecognizedDirective",
+ "shortDescription": {
+ "text": "Unrecognized directive"
+ },
+ "fullDescription": {
+ "text": "Reports an unrecognized Vue directive.",
+ "markdown": "Reports an unrecognized Vue directive."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "VueUnrecognizedDirective",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Vue",
+ "index": 96,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "VueDuplicateTag",
+ "shortDescription": {
+ "text": "Duplicate template/script tag"
+ },
+ "fullDescription": {
+ "text": "Reports multiple usages of the 'template' or 'script' tag in a Vue file. Vue Component specification indicates that each '*.vue' file can contain at most one 'template' or 'script' block at a time.",
+ "markdown": "Reports multiple usages of the `template` or `script` tag in a Vue file.\n\n[Vue Component specification](https://vue-loader.vuejs.org/spec.html) indicates that each `*.vue` file can contain at most one `template` or `script` block at a time."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "VueDuplicateTag",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Vue",
+ "index": 96,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "VueDeprecatedSymbol",
+ "shortDescription": {
+ "text": "Deprecated symbol"
+ },
+ "fullDescription": {
+ "text": "Reports a deprecated Vue symbol.",
+ "markdown": "Reports a deprecated Vue symbol."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "VueDeprecatedSymbol",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Vue",
+ "index": 96,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "VueDataFunction",
+ "shortDescription": {
+ "text": "Data function"
+ },
+ "fullDescription": {
+ "text": "Reports a Vue component data property that is not a function. Suggests wrapping an object literal with a function. When defining a component, 'data' must be declared as a function that returns the initial data object, because the same definition will be used for creating numerous instances. If a plain object is still used for 'data', that very object will be shared by reference across all instances created! With a 'data' function, every time a new instance is created we can simply call it to return a fresh copy of the initial data.",
+ "markdown": "Reports a Vue component [data](https://vuejs.org/v2/api/#data) property that is not a function. Suggests wrapping an object literal with a function.\n\nWhen defining a component, `data` must be declared as a function that returns the initial data object, because the same definition will be used for creating numerous instances. If a plain object is still used for `data`, that very object will be shared by reference across all instances created! With a `data` function, every time a new instance is created we can simply call it to return a fresh copy of the initial data."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "VueDataFunction",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Vue",
+ "index": 96,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "VueUnrecognizedSlot",
+ "shortDescription": {
+ "text": "Unrecognized slot"
+ },
+ "fullDescription": {
+ "text": "Reports an unrecognized Vue slot.",
+ "markdown": "Reports an unrecognized Vue slot."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "VueUnrecognizedSlot",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Vue",
+ "index": 96,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "com.intellij.plugins.dependencyAnalysis",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "CheckThirdPartySoftwareList",
+ "shortDescription": {
+ "text": "Check third party software list"
+ },
+ "fullDescription": {
+ "text": "Check project for possible problems: user's third party software list does not match the collected project metadata",
+ "markdown": "Check project for possible problems: user's third party software list does not match the collected project metadata"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CheckThirdPartySoftwareList",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Dependency analysis",
+ "index": 99,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CheckDependencyLicenses",
+ "shortDescription": {
+ "text": "Check dependency licenses"
+ },
+ "fullDescription": {
+ "text": "Check dependencies licenses for possible problems: missing or prohibited licenses, or other compliance issues",
+ "markdown": "Check dependencies licenses for possible problems: missing or prohibited licenses, or other compliance issues"
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CheckDependencyLicenses",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Dependency analysis",
+ "index": 99,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ },
+ {
+ "id": "CheckModuleLicenses",
+ "shortDescription": {
+ "text": "Check module licenses"
+ },
+ "fullDescription": {
+ "text": "Check module licenses for possible problems: missing licenses or other compliance issues",
+ "markdown": "Check module licenses for possible problems: missing licenses or other compliance issues"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "CheckModuleLicenses",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "Dependency analysis",
+ "index": 99,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "org.intellij.intelliLang",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "InjectedReferences",
+ "shortDescription": {
+ "text": "Injected references"
+ },
+ "fullDescription": {
+ "text": "Reports unresolved references injected by Language Injections. Example: '@Language(\"file-reference\")\n String fileName = \"/home/user/nonexistent.file\"; // highlighted if file doesn't exist'",
+ "markdown": "Reports unresolved references injected by [Language Injections](https://www.jetbrains.com/help/idea/using-language-injections.html).\n\nExample:\n\n\n @Language(\"file-reference\")\n String fileName = \"/home/user/nonexistent.file\"; // highlighted if file doesn't exist\n"
+ },
+ "defaultConfiguration": {
+ "enabled": true,
+ "level": "error",
+ "parameters": {
+ "suppressToolId": "InjectedReferences",
+ "ideaSeverity": "ERROR",
+ "qodanaSeverity": "Critical"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "General",
+ "index": 35,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "com.intellij.php.tools.quality.phpstan",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "PhpStanGlobal",
+ "shortDescription": {
+ "text": "PHPStan validation"
+ },
+ "fullDescription": {
+ "text": "Runs PHPStan to find code problems. The inspection requires PHPStan to be properly installed and set up in the IDE under Settings | PHP | Quality Tools | PHPStan. To learn more about installing PHPStan, see: https://phpstan.org/user-guide/getting-started",
+ "markdown": "Runs PHPStan to find code problems. \n\nThe inspection requires PHPStan to be properly installed and set up in the IDE under [Settings \\| PHP \\| Quality Tools \\| PHPStan](settings://settings.php.quality.tools?PHPStan).\n\nTo learn more about installing PHPStan, see:\n"
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "note",
+ "parameters": {
+ "suppressToolId": "PhpStanGlobal",
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "PHP/Quality tools",
+ "index": 89,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ },
+ {
+ "name": "intellij.webpack",
+ "version": "233.14717",
+ "rules": [
+ {
+ "id": "WebpackConfigHighlighting",
+ "shortDescription": {
+ "text": "Webpack config compliance with JSON Schema"
+ },
+ "fullDescription": {
+ "text": "Validates options in webpack config files (which name should start with `webpack`, e.g. `webpack.config.js`) against webpack options schema. Disable this inspection to turn off validation and code completion inside the configuration object.",
+ "markdown": "Validates options in webpack config files (which name should start with \\`webpack\\`, e.g. \\`webpack.config.js\\`) against [webpack options schema](https://github.com/webpack/webpack/blob/master/schemas/WebpackOptions.json). \n\nDisable this inspection to turn off validation and code completion inside the configuration object."
+ },
+ "defaultConfiguration": {
+ "enabled": false,
+ "level": "warning",
+ "parameters": {
+ "suppressToolId": "WebpackConfigHighlighting",
+ "ideaSeverity": "WARNING",
+ "qodanaSeverity": "High"
+ }
+ },
+ "relationships": [
+ {
+ "target": {
+ "id": "JavaScript and TypeScript/General",
+ "index": 32,
+ "toolComponent": {
+ "name": "QDPHP"
+ }
+ },
+ "kinds": [
+ "superset"
+ ]
+ }
+ ]
+ }
+ ],
+ "language": "en-US",
+ "contents": [
+ "localizedData",
+ "nonLocalizedData"
+ ],
+ "isComprehensive": false
+ }
+ ]
+ },
+ "invocations": [
+ {
+ "startTimeUtc": "2024-03-06T14:24:47.108468511Z",
+ "exitCode": 255,
+ "exitCodeDescription": "Failure condition triggered:\n- Detected 2 problems across all severities, fail threshold: 0",
+ "executionSuccessful": true
+ }
+ ],
+ "language": "en-US",
+ "versionControlProvenance": [
+ {
+ "repositoryUri": "https://github.com/pimcore/studio-api-bundle.git",
+ "revisionId": "d44e6fe87239160c64004cbe3387f1b4779cf343",
+ "branch": "0x-First-Prototype",
+ "properties": {
+ "repoUrl": "https://github.com/pimcore/studio-api-bundle.git",
+ "lastAuthorName": "mattamon",
+ "vcsType": "Git",
+ "lastAuthorEmail": "matthias.schuhmayer@pimcore.com"
+ }
+ }
+ ],
+ "results": [
+ {
+ "ruleId": "DuplicatedCode",
+ "kind": "fail",
+ "level": "note",
+ "message": {
+ "text": "Duplicated code",
+ "markdown": "Duplicated code"
+ },
+ "locations": [
+ {
+ "physicalLocation": {
+ "artifactLocation": {
+ "uri": "src/Service/GenericData/V1/Hydrator/Asset/ArchiveHydrator.php",
+ "uriBaseId": "SRCROOT"
+ },
+ "region": {
+ "startLine": 36,
+ "startColumn": 13,
+ "charOffset": 1274,
+ "charLength": 743,
+ "snippet": {
+ "text": "$this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),\n $item->isHasChildren(),\n $item->getType(),\n $item->getKey(),\n $item->getMimeType(),\n $this->metaDataHydrator->hydrate($item->getMetaData()),\n $item->isHasWorkflowWithPermissions(),\n $item->getFullPath(),\n $item->getId(),\n $item->getParentId(),\n $item->getPath(),\n $item->getUserOwner(),\n $item->getUserModification(),\n $item->getLocked(),\n $item->isLocked(),\n $item->getCreationDate(),\n $item->getModificationDate(),\n $this->permissionsHydrator->hydrate($item->getPermissions())"
+ },
+ "sourceLanguage": "PHP"
+ },
+ "contextRegion": {
+ "startLine": 36,
+ "startColumn": 1,
+ "charOffset": 1262,
+ "charLength": 755,
+ "snippet": {
+ "text": " $this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),\n $item->isHasChildren(),\n $item->getType(),\n $item->getKey(),\n $item->getMimeType(),\n $this->metaDataHydrator->hydrate($item->getMetaData()),\n $item->isHasWorkflowWithPermissions(),\n $item->getFullPath(),\n $item->getId(),\n $item->getParentId(),\n $item->getPath(),\n $item->getUserOwner(),\n $item->getUserModification(),\n $item->getLocked(),\n $item->isLocked(),\n $item->getCreationDate(),\n $item->getModificationDate(),\n $this->permissionsHydrator->hydrate($item->getPermissions())"
+ },
+ "sourceLanguage": "PHP"
+ }
+ },
+ "logicalLocations": [
+ {
+ "fullyQualifiedName": "project",
+ "kind": "module"
+ }
+ ]
+ },
+ {
+ "physicalLocation": {
+ "artifactLocation": {
+ "uri": "src/Service/GenericData/V1/Hydrator/Asset/AudioHydrator.php",
+ "uriBaseId": "SRCROOT"
+ },
+ "region": {
+ "startLine": 36,
+ "startColumn": 13,
+ "charOffset": 1258,
+ "charLength": 743,
+ "snippet": {
+ "text": "$this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),\n $item->isHasChildren(),\n $item->getType(),\n $item->getKey(),\n $item->getMimeType(),\n $this->metaDataHydrator->hydrate($item->getMetaData()),\n $item->isHasWorkflowWithPermissions(),\n $item->getFullPath(),\n $item->getId(),\n $item->getParentId(),\n $item->getPath(),\n $item->getUserOwner(),\n $item->getUserModification(),\n $item->getLocked(),\n $item->isLocked(),\n $item->getCreationDate(),\n $item->getModificationDate(),\n $this->permissionsHydrator->hydrate($item->getPermissions())"
+ },
+ "sourceLanguage": "PHP"
+ },
+ "contextRegion": {
+ "startLine": 36,
+ "startColumn": 1,
+ "charOffset": 1246,
+ "charLength": 755,
+ "snippet": {
+ "text": " $this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),\n $item->isHasChildren(),\n $item->getType(),\n $item->getKey(),\n $item->getMimeType(),\n $this->metaDataHydrator->hydrate($item->getMetaData()),\n $item->isHasWorkflowWithPermissions(),\n $item->getFullPath(),\n $item->getId(),\n $item->getParentId(),\n $item->getPath(),\n $item->getUserOwner(),\n $item->getUserModification(),\n $item->getLocked(),\n $item->isLocked(),\n $item->getCreationDate(),\n $item->getModificationDate(),\n $this->permissionsHydrator->hydrate($item->getPermissions())"
+ },
+ "sourceLanguage": "PHP"
+ }
+ },
+ "logicalLocations": [
+ {
+ "fullyQualifiedName": "project",
+ "kind": "module"
+ }
+ ]
+ },
+ {
+ "physicalLocation": {
+ "artifactLocation": {
+ "uri": "src/Service/GenericData/V1/Hydrator/Asset/FolderHydrator.php",
+ "uriBaseId": "SRCROOT"
+ },
+ "region": {
+ "startLine": 36,
+ "startColumn": 13,
+ "charOffset": 1266,
+ "charLength": 743,
+ "snippet": {
+ "text": "$this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),\n $item->isHasChildren(),\n $item->getType(),\n $item->getKey(),\n $item->getMimeType(),\n $this->metaDataHydrator->hydrate($item->getMetaData()),\n $item->isHasWorkflowWithPermissions(),\n $item->getFullPath(),\n $item->getId(),\n $item->getParentId(),\n $item->getPath(),\n $item->getUserOwner(),\n $item->getUserModification(),\n $item->getLocked(),\n $item->isLocked(),\n $item->getCreationDate(),\n $item->getModificationDate(),\n $this->permissionsHydrator->hydrate($item->getPermissions())"
+ },
+ "sourceLanguage": "PHP"
+ },
+ "contextRegion": {
+ "startLine": 36,
+ "startColumn": 1,
+ "charOffset": 1254,
+ "charLength": 755,
+ "snippet": {
+ "text": " $this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),\n $item->isHasChildren(),\n $item->getType(),\n $item->getKey(),\n $item->getMimeType(),\n $this->metaDataHydrator->hydrate($item->getMetaData()),\n $item->isHasWorkflowWithPermissions(),\n $item->getFullPath(),\n $item->getId(),\n $item->getParentId(),\n $item->getPath(),\n $item->getUserOwner(),\n $item->getUserModification(),\n $item->getLocked(),\n $item->isLocked(),\n $item->getCreationDate(),\n $item->getModificationDate(),\n $this->permissionsHydrator->hydrate($item->getPermissions())"
+ },
+ "sourceLanguage": "PHP"
+ }
+ },
+ "logicalLocations": [
+ {
+ "fullyQualifiedName": "project",
+ "kind": "module"
+ }
+ ]
+ },
+ {
+ "physicalLocation": {
+ "artifactLocation": {
+ "uri": "src/Service/GenericData/V1/Hydrator/Asset/TextHydrator.php",
+ "uriBaseId": "SRCROOT"
+ },
+ "region": {
+ "startLine": 36,
+ "startColumn": 13,
+ "charOffset": 1250,
+ "charLength": 743,
+ "snippet": {
+ "text": "$this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),\n $item->isHasChildren(),\n $item->getType(),\n $item->getKey(),\n $item->getMimeType(),\n $this->metaDataHydrator->hydrate($item->getMetaData()),\n $item->isHasWorkflowWithPermissions(),\n $item->getFullPath(),\n $item->getId(),\n $item->getParentId(),\n $item->getPath(),\n $item->getUserOwner(),\n $item->getUserModification(),\n $item->getLocked(),\n $item->isLocked(),\n $item->getCreationDate(),\n $item->getModificationDate(),\n $this->permissionsHydrator->hydrate($item->getPermissions())"
+ },
+ "sourceLanguage": "PHP"
+ },
+ "contextRegion": {
+ "startLine": 36,
+ "startColumn": 1,
+ "charOffset": 1238,
+ "charLength": 755,
+ "snippet": {
+ "text": " $this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),\n $item->isHasChildren(),\n $item->getType(),\n $item->getKey(),\n $item->getMimeType(),\n $this->metaDataHydrator->hydrate($item->getMetaData()),\n $item->isHasWorkflowWithPermissions(),\n $item->getFullPath(),\n $item->getId(),\n $item->getParentId(),\n $item->getPath(),\n $item->getUserOwner(),\n $item->getUserModification(),\n $item->getLocked(),\n $item->isLocked(),\n $item->getCreationDate(),\n $item->getModificationDate(),\n $this->permissionsHydrator->hydrate($item->getPermissions())"
+ },
+ "sourceLanguage": "PHP"
+ }
+ },
+ "logicalLocations": [
+ {
+ "fullyQualifiedName": "project",
+ "kind": "module"
+ }
+ ]
+ },
+ {
+ "physicalLocation": {
+ "artifactLocation": {
+ "uri": "src/Service/GenericData/V1/Hydrator/Asset/UnknownHydrator.php",
+ "uriBaseId": "SRCROOT"
+ },
+ "region": {
+ "startLine": 36,
+ "startColumn": 13,
+ "charOffset": 1274,
+ "charLength": 743,
+ "snippet": {
+ "text": "$this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),\n $item->isHasChildren(),\n $item->getType(),\n $item->getKey(),\n $item->getMimeType(),\n $this->metaDataHydrator->hydrate($item->getMetaData()),\n $item->isHasWorkflowWithPermissions(),\n $item->getFullPath(),\n $item->getId(),\n $item->getParentId(),\n $item->getPath(),\n $item->getUserOwner(),\n $item->getUserModification(),\n $item->getLocked(),\n $item->isLocked(),\n $item->getCreationDate(),\n $item->getModificationDate(),\n $this->permissionsHydrator->hydrate($item->getPermissions())"
+ },
+ "sourceLanguage": "PHP"
+ },
+ "contextRegion": {
+ "startLine": 36,
+ "startColumn": 1,
+ "charOffset": 1262,
+ "charLength": 755,
+ "snippet": {
+ "text": " $this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),\n $item->isHasChildren(),\n $item->getType(),\n $item->getKey(),\n $item->getMimeType(),\n $this->metaDataHydrator->hydrate($item->getMetaData()),\n $item->isHasWorkflowWithPermissions(),\n $item->getFullPath(),\n $item->getId(),\n $item->getParentId(),\n $item->getPath(),\n $item->getUserOwner(),\n $item->getUserModification(),\n $item->getLocked(),\n $item->isLocked(),\n $item->getCreationDate(),\n $item->getModificationDate(),\n $this->permissionsHydrator->hydrate($item->getPermissions())"
+ },
+ "sourceLanguage": "PHP"
+ }
+ },
+ "logicalLocations": [
+ {
+ "fullyQualifiedName": "project",
+ "kind": "module"
+ }
+ ]
+ },
+ {
+ "physicalLocation": {
+ "artifactLocation": {
+ "uri": "src/Service/GenericData/V1/Hydrator/AssetHydrator.php",
+ "uriBaseId": "SRCROOT"
+ },
+ "region": {
+ "startLine": 36,
+ "startColumn": 13,
+ "charOffset": 1247,
+ "charLength": 743,
+ "snippet": {
+ "text": "$this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),\n $item->isHasChildren(),\n $item->getType(),\n $item->getKey(),\n $item->getMimeType(),\n $this->metaDataHydrator->hydrate($item->getMetaData()),\n $item->isHasWorkflowWithPermissions(),\n $item->getFullPath(),\n $item->getId(),\n $item->getParentId(),\n $item->getPath(),\n $item->getUserOwner(),\n $item->getUserModification(),\n $item->getLocked(),\n $item->isLocked(),\n $item->getCreationDate(),\n $item->getModificationDate(),\n $this->permissionsHydrator->hydrate($item->getPermissions())"
+ },
+ "sourceLanguage": "PHP"
+ },
+ "contextRegion": {
+ "startLine": 36,
+ "startColumn": 1,
+ "charOffset": 1235,
+ "charLength": 755,
+ "snippet": {
+ "text": " $this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),\n $item->isHasChildren(),\n $item->getType(),\n $item->getKey(),\n $item->getMimeType(),\n $this->metaDataHydrator->hydrate($item->getMetaData()),\n $item->isHasWorkflowWithPermissions(),\n $item->getFullPath(),\n $item->getId(),\n $item->getParentId(),\n $item->getPath(),\n $item->getUserOwner(),\n $item->getUserModification(),\n $item->getLocked(),\n $item->isLocked(),\n $item->getCreationDate(),\n $item->getModificationDate(),\n $this->permissionsHydrator->hydrate($item->getPermissions())"
+ },
+ "sourceLanguage": "PHP"
+ }
+ },
+ "logicalLocations": [
+ {
+ "fullyQualifiedName": "project",
+ "kind": "module"
+ }
+ ]
+ }
+ ],
+ "partialFingerprints": {
+ "equalIndicator/v1": "dcc32b630c06449e2de443a18a2dd4f6758a9dea5c44c772e6e32a79c54d29d1"
+ },
+ "baselineState": "new",
+ "properties": {
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate",
+ "tags": [
+ "PHP"
+ ]
+ }
+ },
+ {
+ "ruleId": "EfferentObjectCouplingInspection",
+ "kind": "fail",
+ "level": "note",
+ "message": {
+ "text": "[EA] High efferent coupling (28).",
+ "markdown": "\\[EA\\] High efferent coupling (28)."
+ },
+ "locations": [
+ {
+ "physicalLocation": {
+ "artifactLocation": {
+ "uri": "src/Service/GenericData/V1/Hydrator/AssetHydratorService.php",
+ "uriBaseId": "SRCROOT"
+ },
+ "region": {
+ "startLine": 46,
+ "startColumn": 22,
+ "charOffset": 2806,
+ "charLength": 20,
+ "snippet": {
+ "text": "AssetHydratorService"
+ },
+ "sourceLanguage": "PHP"
+ },
+ "contextRegion": {
+ "startLine": 44,
+ "startColumn": 1,
+ "charOffset": 2687,
+ "charLength": 215,
+ "snippet": {
+ "text": "use Pimcore\\Bundle\\StudioApiBundle\\Service\\GenericData\\V1\\Hydrator\\Asset\\VideoHydratorInterface;\n\nfinal readonly class AssetHydratorService implements AssetHydratorServiceInterface\n{\n public function __construct("
+ },
+ "sourceLanguage": "PHP"
+ }
+ },
+ "logicalLocations": [
+ {
+ "fullyQualifiedName": "project",
+ "kind": "module"
+ }
+ ]
+ }
+ ],
+ "partialFingerprints": {
+ "equalIndicator/v1": "10668b157fa72184354a3ce775dcbd0ba6554fe81c40f599cc120eacfbcc931d"
+ },
+ "baselineState": "new",
+ "properties": {
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate",
+ "tags": [
+ "PHP"
+ ]
+ }
+ },
+ {
+ "ruleId": "OnlyWritesOnParameterInspection",
+ "kind": "fail",
+ "level": "note",
+ "message": {
+ "text": "[EA] Parameter/variable is overridden, but is never used or appears outside of the scope.",
+ "markdown": "\\[EA\\] Parameter/variable is overridden, but is never used or appears outside of the scope."
+ },
+ "locations": [
+ {
+ "physicalLocation": {
+ "artifactLocation": {
+ "uri": "src/ApiPlatform/OpenApiFactoryDecorator.php",
+ "uriBaseId": "SRCROOT"
+ },
+ "region": {
+ "startLine": 37,
+ "startColumn": 9,
+ "charOffset": 1116,
+ "charLength": 36,
+ "snippet": {
+ "text": "$securitySchemes[self::ACCESS_TOKEN]"
+ },
+ "sourceLanguage": "PHP"
+ },
+ "contextRegion": {
+ "startLine": 35,
+ "startColumn": 1,
+ "charOffset": 1010,
+ "charLength": 220,
+ "snippet": {
+ "text": "\n $securitySchemes = $openApi->getComponents()->getSecuritySchemes() ?: new ArrayObject();\n $securitySchemes[self::ACCESS_TOKEN] = new SecurityScheme(\n type: 'http',\n scheme: 'bearer',"
+ },
+ "sourceLanguage": "PHP"
+ }
+ },
+ "logicalLocations": [
+ {
+ "fullyQualifiedName": "project",
+ "kind": "module"
+ }
+ ]
+ }
+ ],
+ "partialFingerprints": {
+ "equalIndicator/v1": "e5a5888e4d46630173f7a3d633577bcf5a128c81127af2be85baed1bb57efa32"
+ },
+ "baselineState": "unchanged",
+ "properties": {
+ "ideaSeverity": "WEAK WARNING",
+ "qodanaSeverity": "Moderate",
+ "tags": [
+ "PHP"
+ ]
+ }
+ }
+ ],
+ "automationDetails": {
+ "id": "project/qodana/2024-03-06",
+ "guid": "8da1f312-bbe5-4efb-91a8-5929ccb22f55",
+ "properties": {
+ "jobUrl": "https://github.com/pimcore/studio-api-bundle/actions/runs/8173608135"
+ }
+ },
+ "newlineSequences": [
+ "\r\n",
+ "\n"
+ ],
+ "properties": {
+ "qodanaFailureConditions": {
+ "severityThresholds": {
+ "any": 0
+ }
+ },
+ "configProfile": "path",
+ "deviceId": "200820300000000-f800-ac37-cd19-06b28a4a08d3",
+ "qodanaNewResultSummary": {
+ "moderate": 2,
+ "total": 2
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/qodana.yaml b/qodana.yaml
index 95fff5680..89a9f4fdd 100644
--- a/qodana.yaml
+++ b/qodana.yaml
@@ -3,7 +3,7 @@ linter: jetbrains/qodana-php:latest
profile:
path: .qodana-profile.xml
php:
- version: "8.1"
+ version: "8.2"
failThreshold: 0
exclude:
- name: All
@@ -33,6 +33,7 @@ exclude:
- .env
- .gitatributes
- src/DependencyInjection/Configuration.php
+ - qodana.sarif.json
include:
- name: PhpTaintFunctionInspection
- name: PhpVulnerablePathsInspection
diff --git a/src/ApiPlatform/OpenApiFactoryDecorator.php b/src/ApiPlatform/OpenApiFactoryDecorator.php
new file mode 100644
index 000000000..021f1e910
--- /dev/null
+++ b/src/ApiPlatform/OpenApiFactoryDecorator.php
@@ -0,0 +1,44 @@
+decorated->__invoke($context);
+
+ $securitySchemes = $openApi->getComponents()->getSecuritySchemes() ?: new ArrayObject();
+ $securitySchemes[self::ACCESS_TOKEN] = new SecurityScheme(
+ type: 'http',
+ scheme: 'bearer',
+ );
+
+ return $openApi;
+ }
+}
diff --git a/src/Controller/DefaultController.php b/src/Controller/DefaultController.php
index 04188c368..2dce06d4d 100644
--- a/src/Controller/DefaultController.php
+++ b/src/Controller/DefaultController.php
@@ -4,11 +4,14 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle\Controller;
diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php
index 86dee49de..7abedefd0 100644
--- a/src/DependencyInjection/Configuration.php
+++ b/src/DependencyInjection/Configuration.php
@@ -4,11 +4,14 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle\DependencyInjection;
@@ -23,11 +26,26 @@
*/
class Configuration implements ConfigurationInterface
{
+ public const ROOT_NODE = 'pimcore_studio_api';
+
/**
* {@inheritdoc}
*/
public function getConfigTreeBuilder(): TreeBuilder
{
- return new TreeBuilder('pimcore_studio_api');
+ $treeBuilder = new TreeBuilder(self::ROOT_NODE);
+
+ $rootNode = $treeBuilder->getRootNode();
+ $rootNode->addDefaultsIfNotSet();
+ $rootNode->children()
+ ->arrayNode('api_token')
+ ->addDefaultsIfNotSet()
+ ->children()
+ ->integerNode('lifetime')
+ ->defaultValue(3600)
+ ->end()
+ ->end();
+
+ return $treeBuilder;
}
}
diff --git a/src/DependencyInjection/PimcoreStudioApiExtension.php b/src/DependencyInjection/PimcoreStudioApiExtension.php
index 6ba89f3b7..9d6246b87 100644
--- a/src/DependencyInjection/PimcoreStudioApiExtension.php
+++ b/src/DependencyInjection/PimcoreStudioApiExtension.php
@@ -4,16 +4,20 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle\DependencyInjection;
use Exception;
+use Pimcore\Bundle\StudioApiBundle\Service\TokenServiceInterface;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
@@ -55,6 +59,9 @@ public function load(array $configs, ContainerBuilder $container): void
'pimcore_studio_api.serializer.mapping.paths',
$config['serializer']['mapping']['paths']
);
+
+ $definition = $container->getDefinition(TokenServiceInterface::class);
+ $definition->setArgument('$tokenLifetime', $config['api_token']['lifetime']);
}
public function prepend(ContainerBuilder $container): void
diff --git a/src/Dto/Asset.php b/src/Dto/Asset.php
index d06accb6f..3f69a8fac 100644
--- a/src/Dto/Asset.php
+++ b/src/Dto/Asset.php
@@ -4,192 +4,117 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle\Dto;
use ApiPlatform\Metadata\ApiProperty;
-use Exception;
use Pimcore\Bundle\StudioApiBundle\Dto\Asset\Permissions;
-use Pimcore\Model\Asset as ModelAsset;
-use Pimcore\Model\Dependency;
-use Pimcore\Model\User;
-class Asset
+class Asset extends Element
{
- public function __construct(private readonly ModelAsset $asset, private readonly Permissions $permission)
- {
- }
-
- #[ApiProperty(genId: false)]
- public function getPermissions(): Permissions
- {
- return $this->permission;
- }
-
- public function getId(): ?int
- {
- return $this->asset->getId();
- }
-
- public function getParentId(): ?int
- {
- return $this->asset->getParentId();
+ public function __construct(
+ private readonly string $iconName,
+ private readonly bool $hasChildren,
+ private readonly string $type,
+ private readonly string $filename,
+ private readonly ?string $mimeType,
+ private readonly array $metaData,
+ private readonly bool $workflowWithPermissions,
+ private readonly string $fullPath,
+ int $id,
+ int $parentId,
+ string $path,
+ int $userOwner,
+ int $userModification,
+ ?string $locked,
+ bool $isLocked,
+ ?int $creationDate,
+ ?int $modificationDate,
+ Permissions $permissions
+ ) {
+ parent::__construct(
+ $id,
+ $parentId,
+ $path,
+ $userOwner,
+ $userModification,
+ $locked,
+ $isLocked,
+ $creationDate,
+ $modificationDate,
+ $permissions
+ );
+ }
+
+ public function getIconName(): string
+ {
+ return $this->iconName;
}
public function hasChildren(): bool
{
- return $this->asset->hasChildren();
- }
-
- public function getUserModification(): ?int
- {
- return $this->asset->getUserModification();
- }
-
- public function getCreationDate(): ?int
- {
- return $this->asset->getCreationDate();
- }
-
- public function getModificationDate(): ?int
- {
- return $this->asset->getModificationDate();
- }
-
- public function getUserOwner(): ?int
- {
- return $this->asset->getUserOwner();
+ return $this->hasChildren;
}
- /**
- * enum('self','propagate') nullable
- *
- */
- public function getLock(): ?string
+ public function hasWorkflowWithPermissions(): bool
{
- return $this->asset->getLocked();
- }
-
- public function isLocked(): bool
- {
- return $this->asset->isLocked();
- }
-
- /**
- * @return Property[] the $properties
- */
- public function getProperties(): array
- {
- $properties = [];
- foreach ($this->asset->getProperties() as $property) {
- $properties[] = new Property($property);
- }
-
- return $properties;
- }
-
- public function getVersionCount(): int
- {
- return $this->asset->getVersionCount();
+ return $this->workflowWithPermissions;
}
public function getFilename(): ?string
{
- return $this->asset->getFilename();
- }
-
- public function getKey(): ?string
- {
- return $this->asset->getKey();
+ return $this->filename;
}
public function getType(): string
{
- return $this->asset->getType();
+ return $this->type;
}
- /**
- * @return Version[] the $versions
- */
- public function getVersions(): array
- {
- $versions = [];
- foreach ($this->asset->getVersions() as $version) {
- $versions[] = new Version($version);
- }
-
- return $versions;
- }
-
- public function getCustomSettings(): array
- {
- return $this->asset->getCustomSettings();
- }
+ // public function getCustomSettings(): array
+ // {
+ // return $this->asset->getCustomSettings();
+ // }
public function getMimeType(): ?string
{
- return $this->asset->getMimeType();
- }
-
- /**
- * @return Task[] the $scheduledTasks
- */
- public function getScheduledTasks(): array
- {
- $tasks = [];
- foreach ($this->asset->getScheduledTasks() as $task) {
- $tasks[] = new Task($task);
- }
-
- return $tasks;
- }
-
- public function getPath(): ?string
- {
- return $this->asset->getPath();
- }
-
- public function getMetadata(): array
- {
- return $this->asset->getMetadata();
+ return $this->mimeType;
}
#[ApiProperty(genId: false)]
- public function getDependencies(): Dependency
+ public function getMetadata(): array
{
- return $this->asset->getDependencies();
+ return $this->metaData;
}
public function getHasMetaData(): bool
{
- return $this->asset->getHasMetaData();
+ return count($this->metaData) > 0;
}
public function getFullPath(): string
{
- return $this->asset->getFullPath();
+ return $this->fullPath;
}
- public function getFrontendFullPath(): string
- {
- return $this->asset->getFrontendFullPath();
- }
-
- /**
- * @param User|null $user
- *
- * @return array
- *
- * @throws Exception
- */
- public function getUserPermissions(?User $user = null): array
- {
- return $this->asset->getUserPermissions($user);
- }
+ // /**
+ // * @param User|null $user
+ // *
+ // * @return array
+ // *
+ // * @throws Exception
+ // */
+ // public function getUserPermissions(?User $user = null): array
+ // {
+ // return $this->permis;
+ // }
}
diff --git a/src/Dto/Asset/Archive.php b/src/Dto/Asset/Archive.php
new file mode 100644
index 000000000..e48d69760
--- /dev/null
+++ b/src/Dto/Asset/Archive.php
@@ -0,0 +1,23 @@
+pageCount;
+ }
+
+ public function getImageThumbnailPath(): ?string
+ {
+ return $this->imageThumbnailPath;
+ }
+}
diff --git a/src/Dto/Asset/Folder.php b/src/Dto/Asset/Folder.php
new file mode 100644
index 000000000..dd35eb80e
--- /dev/null
+++ b/src/Dto/Asset/Folder.php
@@ -0,0 +1,23 @@
+asset->getLowQualityPreviewPath();
+ public function __construct(
+ private readonly string $format,
+ private readonly int $width,
+ private readonly int $height,
+ private readonly bool $vectorGraphic,
+ private readonly bool $animated,
+ private readonly string $thumbnailPath,
+ string $iconName,
+ bool $hasChildren,
+ string $type,
+ string $filename,
+ string $mimeType,
+ array $metaData,
+ bool $workflowWithPermissions,
+ string $fullPath,
+ int $id,
+ int $parentId,
+ string $path,
+ int $userOwner,
+ int $userModification,
+ ?string $locked,
+ bool $isLocked,
+ ?int $creationDate,
+ ?int $modificationDate,
+ Permissions $permissions
+ ) {
+ parent::__construct(
+ $iconName,
+ $hasChildren,
+ $type,
+ $filename,
+ $mimeType,
+ $metaData,
+ $workflowWithPermissions,
+ $fullPath,
+ $id,
+ $parentId,
+ $path,
+ $userOwner,
+ $userModification,
+ $locked,
+ $isLocked,
+ $creationDate,
+ $modificationDate,
+ $permissions
+ );
}
- public function getLowQualityPreviewDataUri(): ?string
+ public function getThumbnailPath(): string
{
- return $this->asset->getLowQualityPreviewDataUri();
- }
-
- public function getThumbnail(
- array|string|ModelImage\Thumbnail\Config|null $config = null,
- bool $deferred = true
- ): ThumbnailInterface {
- return $this->asset->getThumbnail($config, $deferred);
+ return $this->thumbnailPath;
}
public function getFormat(): string
{
- return $this->asset->getFormat();
- }
-
- /**
- * @param string|null $path
- * @param bool $force
- *
- * @return array|null
- *
- * @throws Exception
- */
- public function getDimensions(string $path = null, bool $force = false): ?array
- {
- return $this->asset->getDimensions($path, $force);
+ return $this->format;
}
public function getWidth(): int
{
- return $this->asset->getWidth();
+ return $this->width;
}
public function getHeight(): int
{
- return $this->asset->getHeight();
+ return $this->height;
}
public function isVectorGraphic(): bool
{
- return $this->asset->isVectorGraphic();
+ return $this->vectorGraphic;
}
public function isAnimated(): bool
{
- return $this->asset->isAnimated();
+ return $this->animated;
}
+ //
+ // public function getLowQualityPreviewPath(): string
+ // {
+ // return $this->asset->getLowQualityPreviewPath();
+ // }
+ //
+ // public function getLowQualityPreviewDataUri(): ?string
+ // {
+ // return $this->asset->getLowQualityPreviewDataUri();
+ // }
}
diff --git a/src/Dto/Asset/MetaData.php b/src/Dto/Asset/MetaData.php
new file mode 100644
index 000000000..9c551e56e
--- /dev/null
+++ b/src/Dto/Asset/MetaData.php
@@ -0,0 +1,42 @@
+name;
+ }
+
+ public function getLanguage(): ?string
+ {
+ return $this->language;
+ }
+
+ public function getData(): mixed
+ {
+ return $this->data;
+ }
+}
diff --git a/src/Dto/Asset/Permissions.php b/src/Dto/Asset/Permissions.php
index af9f165e8..f6b370bff 100644
--- a/src/Dto/Asset/Permissions.php
+++ b/src/Dto/Asset/Permissions.php
@@ -4,28 +4,31 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle\Dto\Asset;
-class Permissions
+readonly class Permissions
{
//TODO: remove or change default permissions
public function __construct(
- private readonly bool $list = true,
- private readonly bool $view = true,
- private readonly bool $publish = true,
- private readonly bool $delete = true,
- private readonly bool $rename = true,
- private readonly bool $create = true,
- private readonly bool $settings = true,
- private readonly bool $versions = true,
- private readonly bool $properties = true
+ private bool $list = true,
+ private bool $view = true,
+ private bool $publish = true,
+ private bool $delete = true,
+ private bool $rename = true,
+ private bool $create = true,
+ private bool $settings = true,
+ private bool $versions = true,
+ private bool $properties = true
) {
}
diff --git a/src/Dto/Asset/Text.php b/src/Dto/Asset/Text.php
new file mode 100644
index 000000000..5c3e35ef5
--- /dev/null
+++ b/src/Dto/Asset/Text.php
@@ -0,0 +1,23 @@
+duration;
+ }
+
+ public function getWidth(): ?int
+ {
+ return $this->width;
+ }
+
+ public function getHeight(): ?int
+ {
+ return $this->height;
+ }
+
+ public function getImageThumbnailPath(): ?string
+ {
+ return $this->imageThumbnailPath;
+ }
+}
diff --git a/src/Dto/Dependency.php b/src/Dto/Dependency.php
new file mode 100644
index 000000000..2cd3674d5
--- /dev/null
+++ b/src/Dto/Dependency.php
@@ -0,0 +1,69 @@
+dependency->getSourceId();
+ }
+
+ public function getRequires(int $offset = null, int $limit = null): array
+ {
+ return $this->dependency->getRequires($offset, $limit);
+ }
+
+ public function getFilterRequiresByPath(int $offset = null, int $limit = null, string $value = null): array
+ {
+ return $this->dependency->getFilterRequiresByPath($offset, $limit, $value);
+ }
+
+ public function getFilterRequiredByPath(int $offset = null, int $limit = null, string $value = null): array
+ {
+ return $this->dependency->getFilterRequiredByPath($offset, $limit, $value);
+ }
+
+ public function getRequiredBy(int $offset = null, int $limit = null): array
+ {
+ return $this->dependency->getRequiredBy($offset, $limit);
+ }
+
+ public function getSourceType(): string
+ {
+ return $this->dependency->getSourceType();
+ }
+
+ public function getRequiresTotalCount(): int
+ {
+ return $this->dependency->getRequiresTotalCount();
+ }
+
+ public function getRequiredByTotalCount(): int
+ {
+ return $this->dependency->getRequiredByTotalCount();
+ }
+
+ public function isRequired(): bool
+ {
+ return $this->dependency->isRequired();
+ }
+}
diff --git a/src/Dto/Element.php b/src/Dto/Element.php
new file mode 100644
index 000000000..3a5d30092
--- /dev/null
+++ b/src/Dto/Element.php
@@ -0,0 +1,151 @@
+id;
+ }
+
+ public function getParentId(): int
+ {
+ return $this->parentId;
+ }
+
+ public function getPath(): string
+ {
+ return $this->path;
+ }
+
+ public function getUserModification(): ?int
+ {
+ return $this->userModification;
+ }
+
+ public function getCreationDate(): ?int
+ {
+ return $this->creationDate;
+ }
+
+ public function getModificationDate(): ?int
+ {
+ return $this->modificationDate;
+ }
+
+ public function getUserOwner(): int
+ {
+ return $this->userOwner;
+ }
+
+ /**
+ * enum('self','propagate') nullable
+ *
+ */
+ public function getLock(): ?string
+ {
+ return $this->locked;
+ }
+
+ // public function getParent(): ?Element2
+ // {
+ // if ($this->element->getParent() === null) {
+ // return null;
+ // }
+ // // TODO: implement proper user permission handling via service
+ // return new Element2($this->element->getParent(), new Permissions());
+ // }
+
+ // /**
+ // * @return Property[] the $properties
+ // */
+ // public function getProperties(): array
+ // {
+ // $properties = [];
+ // foreach ($this->element->getProperties() as $property) {
+ // $properties[] = new Property($property);
+ // }
+ //
+ // return $properties;
+ // }
+
+ // public function getVersionCount(): int
+ // {
+ // return $this->element->getVersionCount();
+ // }
+
+ public function isLocked(): bool
+ {
+ return $this->isLocked;
+ }
+
+ #[ApiProperty(genId: false)]
+ public function getPermissions(): Permissions
+ {
+ return $this->permissions;
+ }
+
+ // #[ApiProperty(genId: false)]
+ // public function getDependencies(): Dependency
+ // {
+ // return new Dependency($this->element->getDependencies());
+ // }
+
+ // /**
+ // * @return Task[] the $scheduledTasks
+ // */
+ // public function getScheduledTasks(): array
+ // {
+ // $tasks = [];
+ // foreach ($this->element->getScheduledTasks() as $task) {
+ // $tasks[] = new Task($task);
+ // }
+ //
+ // return $tasks;
+ // }
+
+ // /**
+ // * @return Version[] the $versions
+ // */
+ // public function getVersions(): array
+ // {
+ // $versions = [];
+ // foreach ($this->element->getVersions() as $version) {
+ // $versions[] = new Version($version);
+ // }
+ //
+ // return $versions;
+ // }
+}
diff --git a/src/Dto/Property.php b/src/Dto/Property.php
index 4b29a0afc..17bd472cb 100644
--- a/src/Dto/Property.php
+++ b/src/Dto/Property.php
@@ -4,18 +4,21 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle\Dto;
-class Property
+readonly class Property
{
- public function __construct(private readonly \Pimcore\Model\Property $property)
+ public function __construct(private \Pimcore\Model\Property $property)
{
}
diff --git a/src/Dto/ResetPasswordRequest.php b/src/Dto/ResetPasswordRequest.php
index 31b1cd9e2..771edf479 100644
--- a/src/Dto/ResetPasswordRequest.php
+++ b/src/Dto/ResetPasswordRequest.php
@@ -4,11 +4,14 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle\Dto;
diff --git a/src/Dto/Task.php b/src/Dto/Task.php
index 8daf7cde3..3fe86c3d0 100644
--- a/src/Dto/Task.php
+++ b/src/Dto/Task.php
@@ -4,18 +4,21 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle\Dto;
-class Task
+readonly class Task
{
- public function __construct(private readonly \Pimcore\Model\Schedule\Task $task)
+ public function __construct(private \Pimcore\Model\Schedule\Task $task)
{
}
diff --git a/src/Dto/Token/Create.php b/src/Dto/Token/Create.php
new file mode 100644
index 000000000..981115e39
--- /dev/null
+++ b/src/Dto/Token/Create.php
@@ -0,0 +1,39 @@
+username;
+ }
+
+ public function getPassword(): string
+ {
+ return $this->password;
+ }
+}
diff --git a/src/Dto/Token/Info.php b/src/Dto/Token/Info.php
new file mode 100644
index 000000000..3de5fe099
--- /dev/null
+++ b/src/Dto/Token/Info.php
@@ -0,0 +1,39 @@
+token;
+ }
+
+ public function getUsername(): string
+ {
+ return $this->username;
+ }
+}
diff --git a/src/Dto/Token/Output.php b/src/Dto/Token/Output.php
new file mode 100644
index 000000000..47dc91a48
--- /dev/null
+++ b/src/Dto/Token/Output.php
@@ -0,0 +1,52 @@
+token;
+ }
+
+ public function getUsername(): string
+ {
+ return $this->username;
+ }
+
+ public function getLifetime(): int
+ {
+ return $this->lifetime;
+ }
+
+ public function validUntil(): int
+ {
+ return Carbon::now()->addSeconds($this->lifetime)->getTimestamp();
+ }
+}
diff --git a/src/Dto/Token/Refresh.php b/src/Dto/Token/Refresh.php
new file mode 100644
index 000000000..1bbcc63e8
--- /dev/null
+++ b/src/Dto/Token/Refresh.php
@@ -0,0 +1,33 @@
+token;
+ }
+}
diff --git a/src/Dto/Translation.php b/src/Dto/Translation.php
new file mode 100644
index 000000000..a3afa84e5
--- /dev/null
+++ b/src/Dto/Translation.php
@@ -0,0 +1,39 @@
+locale;
+ }
+
+ public function getKeys(): array
+ {
+ return $this->keys;
+ }
+}
diff --git a/src/Dto/User.php b/src/Dto/User.php
new file mode 100644
index 000000000..ea177610b
--- /dev/null
+++ b/src/Dto/User.php
@@ -0,0 +1,177 @@
+user->getName();
+ }
+
+ public function getFirstname(): ?string
+ {
+ return $this->user->getFirstname();
+ }
+
+ public function getLastname(): ?string
+ {
+ return $this->user->getLastname();
+ }
+
+ public function getFullName(): string
+ {
+ return $this->user->getFullName();
+ }
+
+ public function getEmail(): ?string
+ {
+ return $this->user->getEmail();
+ }
+
+ public function getLanguage(): string
+ {
+ return $this->user->getLanguage();
+ }
+
+ public function isAdmin(): bool
+ {
+ return $this->user->isAdmin();
+ }
+
+ public function isActive(): bool
+ {
+ return $this->user->isActive();
+ }
+
+ /**
+ * @return int[]
+ */
+ public function getRoles(): array
+ {
+ return $this->user->getRoles();
+ }
+
+ public function getWelcomescreen(): bool
+ {
+ return $this->user->getWelcomescreen();
+ }
+
+ public function getCloseWarning(): bool
+ {
+ return $this->user->getCloseWarning();
+ }
+
+ public function getMemorizeTabs(): bool
+ {
+ return $this->user->getMemorizeTabs();
+ }
+
+ public function getAllowDirtyClose(): bool
+ {
+ return $this->user->getAllowDirtyClose();
+ }
+
+ /**
+ *
+ * @return resource
+ */
+ public function getImage(?int $width = null, ?int $height = null)
+ {
+ return $this->user->getImage($width, $height);
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getContentLanguages(): array
+ {
+ return $this->user->getContentLanguages();
+ }
+
+ public function getActivePerspective(): string
+ {
+ return $this->user->getActivePerspective();
+ }
+
+ /**
+ * Returns the first perspective name
+ *
+ * @internal
+ */
+ public function getFirstAllowedPerspective(): string
+ {
+ return $this->user->getFirstAllowedPerspective();
+ }
+
+ /**
+ * Returns array of languages allowed for editing. If edit and view languages are empty all languages are allowed.
+ * If only edit languages are empty (but view languages not) empty array is returned.
+ *
+ * @return string[]|null
+ *
+ * @internal
+ *
+ */
+ public function getAllowedLanguagesForEditingWebsiteTranslations(): ?array
+ {
+ return $this->user->getAllowedLanguagesForEditingWebsiteTranslations();
+ }
+
+ /**
+ * Returns array of languages allowed for viewing. If view languages are empty all languages are allowed.
+ *
+ * @return string[]|null
+ *
+ * @internal
+ *
+ */
+ public function getAllowedLanguagesForViewingWebsiteTranslations(): ?array
+ {
+ return $this->user->getAllowedLanguagesForViewingWebsiteTranslations();
+ }
+
+ public function getLastLogin(): int
+ {
+ return $this->user->getLastLogin();
+ }
+
+ public function getKeyBindings(): ?string
+ {
+ return $this->user->getKeyBindings();
+ }
+
+ public function getProvider(): ?string
+ {
+ return $this->user->getProvider();
+ }
+
+ public function hasImage(): bool
+ {
+ return $this->user->hasImage();
+ }
+}
diff --git a/src/Dto/Version.php b/src/Dto/Version.php
index 55c6b6976..513fd316a 100644
--- a/src/Dto/Version.php
+++ b/src/Dto/Version.php
@@ -4,23 +4,24 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle\Dto;
-use Pimcore\Bundle\StudioApiBundle\Dto\Asset\Permissions;
-use Pimcore\Model\Asset\Image;
use Pimcore\Model\User;
use Pimcore\Model\Version as ModelVersion;
-class Version
+readonly class Version
{
- public function __construct(private readonly ModelVersion $version)
+ public function __construct(private ModelVersion $version)
{
}
@@ -70,12 +71,10 @@ public function getUserId(): int
*/
public function getData(): mixed
{
- $data = $this->version->getData();
- if ($data instanceof Image) {
- return new Asset\Image($data, new Permissions());
- }
-
- return $data;
+ return $this->version->getData();
+ // if ($data instanceof Image) {
+ // return new Asset\Image($data, new Permissions());
+ // }
}
public function getSerialized(): bool
diff --git a/src/Exception/NoAuthTokenFound.php b/src/Exception/NoAuthTokenFound.php
new file mode 100644
index 000000000..38ccdfe95
--- /dev/null
+++ b/src/Exception/NoAuthTokenFound.php
@@ -0,0 +1,23 @@
+assetQueryProvider = $assetQueryProvider;
+ }
+
+ public function apply(Request $request, bool $normalization, array $attributes, array &$context): void
+ {
+ $excludeFolders = $request->query->getBoolean(self::FOLDER_FILTER_QUERY_PARAM);
+
+ if (!$excludeFolders) {
+ return;
+ }
+
+ $assetQuery = $this->getAssetQuery($context)->excludeFolders();
+ $this->setAssetQuery($context, $assetQuery);
+ }
+
+ public function getDescription(string $resourceClass): array
+ {
+ return [
+ self::FOLDER_FILTER_QUERY_PARAM => [
+ 'property' => Asset::class,
+ 'type' => 'bool',
+ 'required' => false,
+ 'is_collection' => false,
+ 'description' => 'Filter folders from result.',
+ 'openapi' => [
+ 'description' => 'Filter folders from result.',
+ ],
+ ],
+ ];
+ }
+}
diff --git a/src/Filter/AssetIdSearchFilter.php b/src/Filter/AssetIdSearchFilter.php
new file mode 100644
index 000000000..b2391a7b9
--- /dev/null
+++ b/src/Filter/AssetIdSearchFilter.php
@@ -0,0 +1,63 @@
+assetQueryProvider = $assetQueryProvider;
+ }
+
+ public function apply(Request $request, bool $normalization, array $attributes, array &$context): void
+ {
+ $searchIdTerm = $request->query->get(self::ID_SEARCH_FILTER_QUERY_PARAM);
+
+ if (!$searchIdTerm) {
+ return;
+ }
+
+ $assetQuery = $this->getAssetQuery($context)->setSearchTerm($searchIdTerm);
+ $this->setAssetQuery($context, $assetQuery);
+ }
+
+ public function getDescription(string $resourceClass): array
+ {
+ return [
+ self::ID_SEARCH_FILTER_QUERY_PARAM => [
+ 'property' => Asset::class,
+ 'type' => 'string',
+ 'required' => false,
+ 'is_collection' => false,
+ 'description' => 'Filter assets by matching ids. As a wildcard * can be used',
+ 'openapi' => [
+ 'description' => 'Filter assets by matching ids. As a wildcard * can be used',
+ ],
+ ],
+ ];
+ }
+}
diff --git a/src/Filter/AssetParentIdFilter.php b/src/Filter/AssetParentIdFilter.php
index b6a08e9e6..91b3cbdd6 100644
--- a/src/Filter/AssetParentIdFilter.php
+++ b/src/Filter/AssetParentIdFilter.php
@@ -4,46 +4,58 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle\Filter;
use ApiPlatform\Serializer\Filter\FilterInterface;
-
use Pimcore\Bundle\StudioApiBundle\Dto\Asset;
+use Pimcore\Bundle\StudioApiBundle\Service\GenericData\V1\AssetQueryContextTrait;
+use Pimcore\Bundle\StudioApiBundle\Service\GenericData\V1\AssetQueryProviderInterface;
use Symfony\Component\HttpFoundation\Request;
-class AssetParentIdFilter implements FilterInterface
+final class AssetParentIdFilter implements FilterInterface
{
- public const ASSET_PARENT_ID_FILTER_CONTEXT = 'asset_parent_id_filter';
+ use AssetQueryContextTrait;
+
+ private const PARENT_ID_QUERY_PARAM = 'parentId';
+
+ public function __construct(AssetQueryProviderInterface $assetQueryProvider)
+ {
+ $this->assetQueryProvider = $assetQueryProvider;
+ }
public function apply(Request $request, bool $normalization, array $attributes, array &$context): void
{
- $parentId = $request->query->get('parentId');
+ $parentId = $request->query->get(self::PARENT_ID_QUERY_PARAM);
if (!$parentId) {
return;
}
- $context[self::ASSET_PARENT_ID_FILTER_CONTEXT] = $parentId;
+ $assetQuery = $this->getAssetQuery($context)->filterParentId((int)$parentId);
+ $this->setAssetQuery($context, $assetQuery);
}
public function getDescription(string $resourceClass): array
{
return [
- 'parentId' => [
+ self::PARENT_ID_QUERY_PARAM => [
'property' => Asset::class,
'type' => 'int',
- 'required' => true,
+ 'required' => false,
'is_collection' => false,
- 'description' => 'Filters assets by parent id.',
+ 'description' => 'Filter assets by parent id.',
'openapi' => [
- 'description' => 'Filters assets by parent id.',
+ 'description' => 'Filter assets by parent id.',
],
],
];
diff --git a/src/Filter/AssetPathFilter.php b/src/Filter/AssetPathFilter.php
new file mode 100644
index 000000000..785ab85f9
--- /dev/null
+++ b/src/Filter/AssetPathFilter.php
@@ -0,0 +1,90 @@
+assetQueryProvider = $assetQueryProvider;
+ }
+
+ public function apply(Request $request, bool $normalization, array $attributes, array &$context): void
+ {
+ $path = $request->query->get(self::AP_QUERY_PARAM);
+
+ if (!$path) {
+ return;
+ }
+
+ $includeDescendants = $request->query->getBoolean(self::AP_INCLUDE_DESCENDANTS_PARAM);
+ $includeParent = $request->query->getBoolean(self::AP_INCLUDE_PARENT_PARAM);
+
+ $assetQuery = $this->getAssetQuery($context)->filterPath($path, $includeDescendants, $includeParent);
+ $this->setAssetQuery($context, $assetQuery);
+ }
+
+ public function getDescription(string $resourceClass): array
+ {
+ return [
+ self::AP_QUERY_PARAM => [
+ 'property' => Asset::class,
+ 'type' => 'string',
+ 'required' => false,
+ 'is_collection' => false,
+ 'description' => 'Filter assets by path.',
+ 'openapi' => [
+ 'description' => 'Filter assets by path.',
+ ],
+ ],
+ self::AP_INCLUDE_PARENT_PARAM => [
+ 'property' => Asset::class,
+ 'type' => 'bool',
+ 'required' => false,
+ 'is_collection' => false,
+ 'description' => 'Include the parent item in the result.',
+ 'openapi' => [
+ 'description' => 'Include the parent item in the result.',
+ ],
+ ],
+ self::AP_INCLUDE_DESCENDANTS_PARAM => [
+ 'property' => Asset::class,
+ 'type' => 'bool',
+ 'required' => false,
+ 'is_collection' => false,
+ 'description' => 'Include all descendants in the result.',
+ 'openapi' => [
+ 'description' => 'Include all descendants in the result.',
+ ],
+ ],
+ ];
+ }
+}
diff --git a/src/Installer.php b/src/Installer.php
index ea5a77483..41b9a11b4 100644
--- a/src/Installer.php
+++ b/src/Installer.php
@@ -4,11 +4,14 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle;
diff --git a/src/PimcoreStudioApiBundle.php b/src/PimcoreStudioApiBundle.php
index afe2e2ba5..7b31faf9b 100644
--- a/src/PimcoreStudioApiBundle.php
+++ b/src/PimcoreStudioApiBundle.php
@@ -4,11 +4,14 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle;
diff --git a/src/Security/Trait/PublicTranslationTrait.php b/src/Security/Trait/PublicTranslationTrait.php
new file mode 100644
index 000000000..d3c082822
--- /dev/null
+++ b/src/Security/Trait/PublicTranslationTrait.php
@@ -0,0 +1,53 @@
+all();
+ if (!array_key_exists(self::ARRAY_KEYS_INDEX, $parameters)) {
+ return false;
+ }
+
+ $nonPublicTranslations = array_diff(
+ $parameters[self::ARRAY_KEYS_INDEX],
+ PublicTranslations::PUBLIC_KEYS
+ );
+
+ if (!empty($nonPublicTranslations)) {
+ throw new NonPublicTranslationException(
+ sprintf(
+ 'You have requested non public keys: %s',
+ implode(',', $nonPublicTranslations)
+ )
+ );
+ }
+
+ return true;
+ }
+}
diff --git a/src/Security/Trait/RequestTrait.php b/src/Security/Trait/RequestTrait.php
new file mode 100644
index 000000000..c465c2eae
--- /dev/null
+++ b/src/Security/Trait/RequestTrait.php
@@ -0,0 +1,60 @@
+headers->get(self::AUTHORIZATION_HEADER);
+ if($authToken === null) {
+ throw new NoAuthTokenFound('Full authentication is required to access this resource.');
+ }
+
+ return $this->removeBearerPrefix($authToken);
+ }
+
+ /**
+ * @throws NoRequestException
+ */
+ private function getCurrentRequest(RequestStack $requestStack): Request
+ {
+ $request = $requestStack->getCurrentRequest();
+ if(!$request) {
+ throw new NoRequestException('No request found');
+ }
+
+ return $request;
+ }
+
+ private function removeBearerPrefix(string $token): string
+ {
+ return str_replace(self::BEARER_PREFIX, '', $token);
+ }
+}
diff --git a/src/Security/Voter/PublicTokenVoter.php b/src/Security/Voter/PublicTokenVoter.php
new file mode 100644
index 000000000..10c80aaf0
--- /dev/null
+++ b/src/Security/Voter/PublicTokenVoter.php
@@ -0,0 +1,79 @@
+getCurrentRequest($this->requestStack);
+
+ $authToken = $this->getAuthToken($request);
+
+ if ($this->securityService->checkAuthToken($authToken)) {
+ return true;
+ }
+
+ return $this->voteOnRequest($request, $subject);
+ }
+
+ /**
+ * @throws NonPublicTranslationException
+ */
+ private function voteOnRequest(Request $request, string $subject): bool
+ {
+ return match ($subject) {
+ 'translation' => $this->voteOnTranslation($request->getPayload()),
+ default => false,
+ };
+ }
+}
diff --git a/src/Security/Voter/TokenVoter.php b/src/Security/Voter/TokenVoter.php
new file mode 100644
index 000000000..e92f5c81b
--- /dev/null
+++ b/src/Security/Voter/TokenVoter.php
@@ -0,0 +1,64 @@
+getCurrentRequest($this->requestStack);
+
+ $authToken = $this->getAuthToken($request);
+
+ return $this->securityService->checkAuthToken($authToken);
+ }
+}
diff --git a/src/Serializer/AssetNormalizer.php b/src/Serializer/AssetNormalizer.php
deleted file mode 100644
index ced9ed95f..000000000
--- a/src/Serializer/AssetNormalizer.php
+++ /dev/null
@@ -1,60 +0,0 @@
-normalizer->normalize($object, $format, $context);
-
- if (isset($data['data']) && $data['data']) {
- $data['data'] = base64_encode($data['data']);
- }
-
- if ($object instanceof Asset\Image) {
- $data['thumbnailXXX'] = $object->getThumbnail()->getPath(['frontend' => true]);
- }
-
- return $data;
- }
-
- public function supportsNormalization($data, $format = null, array $context = []): bool
- {
- return false;
- /*if (isset($context[self::ALREADY_CALLED])) {
- return false;
- }
-
- return $data instanceof Asset;*/
- }
-
- public function getSupportedTypes(?string $format): array
- {
- return [
- Asset::class => false,
- ];
- }
-}
diff --git a/src/Service/AssetSearchResult.php b/src/Service/AssetSearchResult.php
new file mode 100644
index 000000000..e9c8b3457
--- /dev/null
+++ b/src/Service/AssetSearchResult.php
@@ -0,0 +1,67 @@
+ $items
+ * @param int $currentPage
+ * @param int $pageSize
+ * @param int $totalItems
+ */
+ public function __construct(
+ private array $items,
+ private int $currentPage,
+ private int $pageSize,
+ private int $totalItems,
+ ) {
+ }
+
+ public function getTotalItems(): int
+ {
+ return $this->totalItems;
+ }
+
+ /**
+ * @return array
+ */
+ public function getItems(): array
+ {
+ return $this->items;
+ }
+
+ public function getCurrentPage(): int
+ {
+ return $this->currentPage;
+ }
+
+ public function getPageSize(): int
+ {
+ return $this->pageSize;
+ }
+}
diff --git a/src/Service/AssetSearchService.php b/src/Service/AssetSearchService.php
new file mode 100644
index 000000000..d503fded3
--- /dev/null
+++ b/src/Service/AssetSearchService.php
@@ -0,0 +1,46 @@
+assetSearchAdapter->searchAssets($assetQuery);
+ }
+
+ public function getAssetById(int $id): Asset|Archive|Audio|Document|Folder|Image|Text|Unknown|Video|null
+ {
+ return $this->assetSearchAdapter->getAssetById($id);
+ }
+}
diff --git a/src/Service/AssetSearchServiceInterface.php b/src/Service/AssetSearchServiceInterface.php
new file mode 100644
index 000000000..8876a10a2
--- /dev/null
+++ b/src/Service/AssetSearchServiceInterface.php
@@ -0,0 +1,35 @@
+search->setPage($page);
+
+ return $this;
+ }
+
+ public function setPageSize(int $pageSize): self
+ {
+ $this->search->setPageSize($pageSize);
+
+ return $this;
+ }
+
+ public function filterParentId(?int $parentId): self
+ {
+ if ($parentId !== null) {
+ $this->search->addModifier(new ParentIdFilter($parentId));
+ }
+
+ return $this;
+ }
+
+ public function filterPath(string $path, bool $includeDescendants, bool $includeParent): self
+ {
+ $this->search->addModifier(new PathFilter($path, !$includeDescendants, $includeParent));
+
+ return $this;
+ }
+
+ public function setSearchTerm(?string $term): self
+ {
+ if ($term !== null) {
+ $this->search->addModifier(new ElementKeySearch($term));
+ }
+
+ return $this;
+ }
+
+ public function excludeFolders(): self
+ {
+ $this->search->addModifier(new ExcludeFoldersFilter());
+
+ return $this;
+ }
+
+ public function getSearch(): SearchInterface
+ {
+ return $this->search;
+ }
+}
diff --git a/src/Service/GenericData/V1/AssetQueryContextTrait.php b/src/Service/GenericData/V1/AssetQueryContextTrait.php
new file mode 100644
index 000000000..fd6042991
--- /dev/null
+++ b/src/Service/GenericData/V1/AssetQueryContextTrait.php
@@ -0,0 +1,36 @@
+assetQueryProvider->createAssetQuery();
+ }
+
+ return $context[AssetQuery::ASSET_QUERY_ID];
+ }
+}
diff --git a/src/Service/GenericData/V1/AssetQueryProvider.php b/src/Service/GenericData/V1/AssetQueryProvider.php
new file mode 100644
index 000000000..297a6b8c8
--- /dev/null
+++ b/src/Service/GenericData/V1/AssetQueryProvider.php
@@ -0,0 +1,31 @@
+searchProvider->createAssetSearch());
+ }
+}
diff --git a/src/Service/GenericData/V1/AssetQueryProviderInterface.php b/src/Service/GenericData/V1/AssetQueryProviderInterface.php
new file mode 100644
index 000000000..b0428781a
--- /dev/null
+++ b/src/Service/GenericData/V1/AssetQueryProviderInterface.php
@@ -0,0 +1,22 @@
+searchService->search($assetQuery->getSearch());
+ $result = [];
+ foreach ($searchResult->getItems() as $item) {
+ $result[] = $this->assetHydratorService->hydrate($item);
+ }
+
+ return new AssetSearchResult(
+ $result,
+ $searchResult->getPagination()->getPage(),
+ $searchResult->getPagination()->getPageSize(),
+ $searchResult->getPagination()->getTotalItems(),
+ );
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function getAssetById(int $id): ?Asset
+ {
+ $searchResult = $this->searchService->byId($id);
+ if ($searchResult === null) {
+ return null;
+ }
+
+ return $this->assetHydratorService->hydrate($searchResult);
+ }
+}
diff --git a/src/Service/GenericData/V1/Hydrator/Asset/ArchiveHydrator.php b/src/Service/GenericData/V1/Hydrator/Asset/ArchiveHydrator.php
new file mode 100644
index 000000000..6826ee50a
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/Asset/ArchiveHydrator.php
@@ -0,0 +1,56 @@
+iconService->getIconForAsset($item->getType(), $item->getMimeType()),
+ $item->isHasChildren(),
+ $item->getType(),
+ $item->getKey(),
+ $item->getMimeType(),
+ $this->metaDataHydrator->hydrate($item->getMetaData()),
+ $item->isHasWorkflowWithPermissions(),
+ $item->getFullPath(),
+ $item->getId(),
+ $item->getParentId(),
+ $item->getPath(),
+ $item->getUserOwner(),
+ $item->getUserModification(),
+ $item->getLocked(),
+ $item->isLocked(),
+ $item->getCreationDate(),
+ $item->getModificationDate(),
+ $this->permissionsHydrator->hydrate($item->getPermissions())
+ );
+ }
+}
diff --git a/src/Service/GenericData/V1/Hydrator/Asset/ArchiveHydratorInterface.php b/src/Service/GenericData/V1/Hydrator/Asset/ArchiveHydratorInterface.php
new file mode 100644
index 000000000..a1c5c1e8c
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/Asset/ArchiveHydratorInterface.php
@@ -0,0 +1,25 @@
+iconService->getIconForAsset($item->getType(), $item->getMimeType()),
+ $item->isHasChildren(),
+ $item->getType(),
+ $item->getKey(),
+ $item->getMimeType(),
+ $this->metaDataHydrator->hydrate($item->getMetaData()),
+ $item->isHasWorkflowWithPermissions(),
+ $item->getFullPath(),
+ $item->getId(),
+ $item->getParentId(),
+ $item->getPath(),
+ $item->getUserOwner(),
+ $item->getUserModification(),
+ $item->getLocked(),
+ $item->isLocked(),
+ $item->getCreationDate(),
+ $item->getModificationDate(),
+ $this->permissionsHydrator->hydrate($item->getPermissions())
+ );
+ }
+}
diff --git a/src/Service/GenericData/V1/Hydrator/Asset/AudioHydratorInterface.php b/src/Service/GenericData/V1/Hydrator/Asset/AudioHydratorInterface.php
new file mode 100644
index 000000000..23dd7b2d8
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/Asset/AudioHydratorInterface.php
@@ -0,0 +1,25 @@
+getPageCount(),
+ $item->getImageThumbnail(),
+ $this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),
+ $item->isHasChildren(),
+ $item->getType(),
+ $item->getKey(),
+ $item->getMimeType(),
+ $this->metaDataHydrator->hydrate($item->getMetaData()),
+ $item->isHasWorkflowWithPermissions(),
+ $item->getFullPath(),
+ $item->getId(),
+ $item->getParentId(),
+ $item->getPath(),
+ $item->getUserOwner(),
+ $item->getUserModification(),
+ $item->getLocked(),
+ $item->isLocked(),
+ $item->getCreationDate(),
+ $item->getModificationDate(),
+ $this->permissionsHydrator->hydrate($item->getPermissions())
+ );
+ }
+}
diff --git a/src/Service/GenericData/V1/Hydrator/Asset/DocumentHydratorInterface.php b/src/Service/GenericData/V1/Hydrator/Asset/DocumentHydratorInterface.php
new file mode 100644
index 000000000..42b3aaeff
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/Asset/DocumentHydratorInterface.php
@@ -0,0 +1,25 @@
+iconService->getIconForAsset($item->getType(), $item->getMimeType()),
+ $item->isHasChildren(),
+ $item->getType(),
+ $item->getKey(),
+ $item->getMimeType(),
+ $this->metaDataHydrator->hydrate($item->getMetaData()),
+ $item->isHasWorkflowWithPermissions(),
+ $item->getFullPath(),
+ $item->getId(),
+ $item->getParentId(),
+ $item->getPath(),
+ $item->getUserOwner(),
+ $item->getUserModification(),
+ $item->getLocked(),
+ $item->isLocked(),
+ $item->getCreationDate(),
+ $item->getModificationDate(),
+ $this->permissionsHydrator->hydrate($item->getPermissions())
+ );
+ }
+}
diff --git a/src/Service/GenericData/V1/Hydrator/Asset/FolderHydratorInterface.php b/src/Service/GenericData/V1/Hydrator/Asset/FolderHydratorInterface.php
new file mode 100644
index 000000000..59f72833a
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/Asset/FolderHydratorInterface.php
@@ -0,0 +1,25 @@
+getWidth(),
+ $item->getHeight(),
+ false, // TODO: Implement isVectorGraphic
+ false,// TODO: Implement isAnimated
+ $item->getThumbnail(),
+ $this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),
+ $item->isHasChildren(),
+ $item->getType(),
+ $item->getKey(),
+ $item->getMimeType(),
+ $this->metaDataHydrator->hydrate($item->getMetaData()),
+ $item->isHasWorkflowWithPermissions(),
+ $item->getFullPath(),
+ $item->getId(),
+ $item->getParentId(),
+ $item->getPath(),
+ $item->getUserOwner(),
+ $item->getUserModification(),
+ $item->getLocked(),
+ $item->isLocked(),
+ $item->getCreationDate(),
+ $item->getModificationDate(),
+ $this->permissionsHydrator->hydrate($item->getPermissions())
+ );
+ }
+}
diff --git a/src/Service/GenericData/V1/Hydrator/Asset/ImageHydratorInterface.php b/src/Service/GenericData/V1/Hydrator/Asset/ImageHydratorInterface.php
new file mode 100644
index 000000000..060f4cd5e
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/Asset/ImageHydratorInterface.php
@@ -0,0 +1,25 @@
+ $metaData
+ *
+ * @return array
+ */
+ public function hydrate(array $metaData): array
+ {
+ $result = [];
+ foreach ($metaData as $item) {
+ $result[] = new MetaData(
+ $item->getName(),
+ $item->getLanguage(),
+ $item->getData()
+ );
+ }
+
+ return $result;
+ }
+}
diff --git a/src/Service/GenericData/V1/Hydrator/Asset/MetaDataHydratorInterface.php b/src/Service/GenericData/V1/Hydrator/Asset/MetaDataHydratorInterface.php
new file mode 100644
index 000000000..7237fb3a3
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/Asset/MetaDataHydratorInterface.php
@@ -0,0 +1,30 @@
+ $metaData
+ *
+ * @return array
+ */
+ public function hydrate(array $metaData): array;
+}
diff --git a/src/Service/GenericData/V1/Hydrator/Asset/TextHydrator.php b/src/Service/GenericData/V1/Hydrator/Asset/TextHydrator.php
new file mode 100644
index 000000000..b15c8ba64
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/Asset/TextHydrator.php
@@ -0,0 +1,56 @@
+iconService->getIconForAsset($item->getType(), $item->getMimeType()),
+ $item->isHasChildren(),
+ $item->getType(),
+ $item->getKey(),
+ $item->getMimeType(),
+ $this->metaDataHydrator->hydrate($item->getMetaData()),
+ $item->isHasWorkflowWithPermissions(),
+ $item->getFullPath(),
+ $item->getId(),
+ $item->getParentId(),
+ $item->getPath(),
+ $item->getUserOwner(),
+ $item->getUserModification(),
+ $item->getLocked(),
+ $item->isLocked(),
+ $item->getCreationDate(),
+ $item->getModificationDate(),
+ $this->permissionsHydrator->hydrate($item->getPermissions())
+ );
+ }
+}
diff --git a/src/Service/GenericData/V1/Hydrator/Asset/TextHydratorInterface.php b/src/Service/GenericData/V1/Hydrator/Asset/TextHydratorInterface.php
new file mode 100644
index 000000000..0f6654b05
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/Asset/TextHydratorInterface.php
@@ -0,0 +1,25 @@
+iconService->getIconForAsset($item->getType(), $item->getMimeType()),
+ $item->isHasChildren(),
+ $item->getType(),
+ $item->getKey(),
+ $item->getMimeType(),
+ $this->metaDataHydrator->hydrate($item->getMetaData()),
+ $item->isHasWorkflowWithPermissions(),
+ $item->getFullPath(),
+ $item->getId(),
+ $item->getParentId(),
+ $item->getPath(),
+ $item->getUserOwner(),
+ $item->getUserModification(),
+ $item->getLocked(),
+ $item->isLocked(),
+ $item->getCreationDate(),
+ $item->getModificationDate(),
+ $this->permissionsHydrator->hydrate($item->getPermissions())
+ );
+ }
+}
diff --git a/src/Service/GenericData/V1/Hydrator/Asset/UnknownHydratorInterface.php b/src/Service/GenericData/V1/Hydrator/Asset/UnknownHydratorInterface.php
new file mode 100644
index 000000000..8e99e9146
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/Asset/UnknownHydratorInterface.php
@@ -0,0 +1,25 @@
+getDuration(),
+ $item->getWidth(),
+ $item->getHeight(),
+ $item->getImageThumbnail(),
+ $this->iconService->getIconForAsset($item->getType(), $item->getMimeType()),
+ $item->isHasChildren(),
+ $item->getType(),
+ $item->getKey(),
+ $item->getMimeType(),
+ $this->metaDataHydrator->hydrate($item->getMetaData()),
+ $item->isHasWorkflowWithPermissions(),
+ $item->getFullPath(),
+ $item->getId(),
+ $item->getParentId(),
+ $item->getPath(),
+ $item->getUserOwner(),
+ $item->getUserModification(),
+ $item->getLocked(),
+ $item->isLocked(),
+ $item->getCreationDate(),
+ $item->getModificationDate(),
+ $this->permissionsHydrator->hydrate($item->getPermissions())
+ );
+ }
+}
diff --git a/src/Service/GenericData/V1/Hydrator/Asset/VideoHydratorInterface.php b/src/Service/GenericData/V1/Hydrator/Asset/VideoHydratorInterface.php
new file mode 100644
index 000000000..b8fe6e249
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/Asset/VideoHydratorInterface.php
@@ -0,0 +1,25 @@
+iconService->getIconForAsset($item->getType(), $item->getMimeType()),
+ $item->isHasChildren(),
+ $item->getType(),
+ $item->getKey(),
+ $item->getMimeType(),
+ $this->metaDataHydrator->hydrate($item->getMetaData()),
+ $item->isHasWorkflowWithPermissions(),
+ $item->getFullPath(),
+ $item->getId(),
+ $item->getParentId(),
+ $item->getPath(),
+ $item->getUserOwner(),
+ $item->getUserModification(),
+ $item->getLocked(),
+ $item->isLocked(),
+ $item->getCreationDate(),
+ $item->getModificationDate(),
+ $this->permissionsHydrator->hydrate($item->getPermissions())
+ );
+ }
+}
diff --git a/src/Service/GenericData/V1/Hydrator/AssetHydratorInterface.php b/src/Service/GenericData/V1/Hydrator/AssetHydratorInterface.php
new file mode 100644
index 000000000..79b2ee4a3
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/AssetHydratorInterface.php
@@ -0,0 +1,25 @@
+ $this->archiveHydrator->hydrate($item),
+ $item instanceof AudioItem => $this->audioHydrator->hydrate($item),
+ $item instanceof DocumentItem => $this->documentHydrator->hydrate($item),
+ $item instanceof FolderItem => $this->folderHydrator->hydrate($item),
+ $item instanceof ImageItem => $this->imageHydrator->hydrate($item),
+ $item instanceof TextItem => $this->textHydrator->hydrate($item),
+ $item instanceof UnknownItem => $this->unknownHydrator->hydrate($item),
+ $item instanceof VideoItem => $this->videoHydrator->hydrate($item),
+ default => $this->assetHydrator->hydrate($item)
+ };
+ }
+}
diff --git a/src/Service/GenericData/V1/Hydrator/AssetHydratorServiceInterface.php b/src/Service/GenericData/V1/Hydrator/AssetHydratorServiceInterface.php
new file mode 100644
index 000000000..b734e2fcb
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/AssetHydratorServiceInterface.php
@@ -0,0 +1,38 @@
+isList(),
+ $permissions->isView(),
+ $permissions->isPublish(),
+ $permissions->isDelete(),
+ $permissions->isRename(),
+ $permissions->isCreate(),
+ $permissions->isSettings(),
+ $permissions->isVersions(),
+ $permissions->isProperties()
+ );
+ }
+}
diff --git a/src/Service/GenericData/V1/Hydrator/PermissionsHydratorInterface.php b/src/Service/GenericData/V1/Hydrator/PermissionsHydratorInterface.php
new file mode 100644
index 000000000..dc14c2dce
--- /dev/null
+++ b/src/Service/GenericData/V1/Hydrator/PermissionsHydratorInterface.php
@@ -0,0 +1,25 @@
+ 'presentation-chart-01',
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'file-x-03',
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'file-02',
+ 'application/pdf' => 'file-check-02',
+ default => $this->defaultIcon
+ };
+ }
+
+ if ($assetType === 'text' && $mimeType !== null) {
+ return match ($mimeType) {
+ 'application/json' => 'file-code-01',
+ 'application/type9' => 'file-check-02',
+ 'text/plain' => 'file-02',
+ 'text/csv' => 'file-x-03',
+ default => $this->defaultIcon
+ };
+ }
+
+ return match ($assetType) {
+ 'folder' => 'folder',
+ 'image' => 'image-01',
+ 'video' => 'video-recorder',
+ 'audio' => 'volume-max',
+ default => $this->defaultIcon
+ };
+ }
+}
diff --git a/src/Service/IconServiceInterface.php b/src/Service/IconServiceInterface.php
new file mode 100644
index 000000000..43997b850
--- /dev/null
+++ b/src/Service/IconServiceInterface.php
@@ -0,0 +1,22 @@
+userProvider->loadUserByIdentifier($token->getUsername());
+ } catch (UserNotFoundException) {
+ throw new AccessDeniedException('Invalid credentials');
+ }
+
+ if(
+ !$user instanceof PasswordAuthenticatedUserInterface ||
+ !$this->passwordHasher->isPasswordValid($user, $token->getPassword())
+ ) {
+ throw new AccessDeniedException('Invalid credentials');
+ }
+
+ return $user;
+ }
+
+ public function checkAuthToken(string $token): bool
+ {
+ $entry = $this->tmpStoreResolver->get($token);
+
+ return $entry !== null && $entry->getId() === $token;
+ }
+}
diff --git a/src/Service/SecurityServiceInterface.php b/src/Service/SecurityServiceInterface.php
new file mode 100644
index 000000000..96c7f74d4
--- /dev/null
+++ b/src/Service/SecurityServiceInterface.php
@@ -0,0 +1,30 @@
+tokenGenerator->generateToken();
+ $entry = $this->tmpStoreResolver->get($token);
+ } while ($entry !== null);
+
+ $this->saveToken(new Info($token, $userIdentifier));
+
+ return $token;
+ }
+
+ public function refreshToken(string $token): Info
+ {
+ $entry = $this->tmpStoreResolver->get($token);
+ if($entry === null) {
+ throw new TokenNotFoundException('Token not found');
+ }
+
+ $data = $entry->getData();
+
+ if(!isset($data['username'])) {
+ throw new TokenNotFoundException('Token not found');
+ }
+
+ $tokenInfo = new Info($token, $data['username']);
+ $this->saveToken($tokenInfo);
+
+ return $tokenInfo;
+ }
+
+ public function getLifetime(): int
+ {
+ return $this->tokenLifetime;
+ }
+
+ private function saveToken(Info $tokenInfo): void
+ {
+ $this->tmpStoreResolver->set(
+ $tokenInfo->getToken(),
+ [
+ 'username' => $tokenInfo->getUsername(),
+ ],
+ $this->getTmpStoreTag($tokenInfo->getUsername()),
+ $this->tokenLifetime
+ );
+ }
+
+ private function getTmpStoreTag(string $userId): string
+ {
+ return str_replace(
+ self::TMP_STORE_TAG_PLACEHOLDER,
+ $userId,
+ self::TMP_STORE_TAG
+ );
+ }
+}
diff --git a/src/Service/TokenServiceInterface.php b/src/Service/TokenServiceInterface.php
new file mode 100644
index 000000000..35f92886c
--- /dev/null
+++ b/src/Service/TokenServiceInterface.php
@@ -0,0 +1,28 @@
+translator = $translator;
+ }
+
+ public function getAllTranslations(string $locale): Translation
+ {
+ return new Translation(
+ $locale,
+ $this->translator->getCatalogue($locale)->all(self::DOMAIN)
+ );
+ }
+
+ public function getTranslationsForKeys(string $locale, array $keys): Translation
+ {
+ $translations = [];
+ foreach ($keys as $key) {
+ $translations[$key] = $this->translator->getCatalogue($locale)->get($key, self::DOMAIN);
+ }
+
+ return new Translation($locale, $translations);
+ }
+}
diff --git a/src/Service/TranslatorServiceInterface.php b/src/Service/TranslatorServiceInterface.php
new file mode 100644
index 000000000..d8b7cab96
--- /dev/null
+++ b/src/Service/TranslatorServiceInterface.php
@@ -0,0 +1,29 @@
+assetQueryProvider = $assetQueryProvider;
}
public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null
{
if ($operation instanceof CollectionOperationInterface) {
- $result =[];
- $totalItems = 0;
- if (array_key_exists(AssetParentIdFilter::ASSET_PARENT_ID_FILTER_CONTEXT, $context)) {
- $parentId = (int)($context[AssetParentIdFilter::ASSET_PARENT_ID_FILTER_CONTEXT] ?? 1);
- $items = $this->assetTreeService->fetchTreeItems(
- $parentId,
- $this->pagination->getPage($context),
- $this->pagination->getLimit($operation, $context)
- );
- $totalItems = $items->getPagination()->getTotalItems();
- foreach ($items->getItems() as $item) {
- $assetModel = $this->assetResolver->getById($item->getId());
- if ($assetModel === null) {
- continue;
- }
- $result[] = new Asset($assetModel, new Asset\Permissions());
- }
- }
+
+ $assetQuery = $this->getAssetQuery($context)
+ ->setPage($this->pagination->getPage($context))
+ ->setPageSize($this->pagination->getLimit($operation, $context));
+
+ $searchResult = $this->assetSearchService->searchAssets($assetQuery);
return new TraversablePaginator(
- new ArrayIterator($result),
+ new ArrayIterator($searchResult->getItems()),
$this->pagination->getPage($context),
$this->pagination->getLimit($operation, $context),
- $totalItems
+ $searchResult->getTotalItems()
);
}
- $assetModel = $this->assetResolver->getById($uriVariables['id']);
-
- if ($assetModel === null) {
- return null;
- }
-
- if ($assetModel instanceof ImageModel) {
- return new Image($assetModel, new Asset\Permissions());
- }
- return new Asset($assetModel, new Asset\Permissions());
+ return $this->assetSearchService->getAssetById($uriVariables['id']);
}
}
diff --git a/src/State/ResetPasswordProcessor.php b/src/State/ResetPasswordProcessor.php
index b0b1073e8..63ffeba1d 100644
--- a/src/State/ResetPasswordProcessor.php
+++ b/src/State/ResetPasswordProcessor.php
@@ -4,11 +4,14 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle\State;
@@ -32,13 +35,13 @@
use Symfony\Component\RateLimiter\RateLimiterFactory;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
-final class ResetPasswordProcessor implements ProcessorInterface
+final readonly class ResetPasswordProcessor implements ProcessorInterface
{
public function __construct(
- private readonly UrlGeneratorInterface $router,
- private readonly RequestStack $requestStack,
- private readonly RateLimiterFactory $resetPasswordLimiter,
- private readonly EventDispatcherInterface $eventDispatcher
+ private UrlGeneratorInterface $router,
+ private RequestStack $requestStack,
+ private RateLimiterFactory $resetPasswordLimiter,
+ private EventDispatcherInterface $eventDispatcher
) {
}
diff --git a/src/State/ScheduledTaskProvider.php b/src/State/ScheduledTaskProvider.php
index 8caec692e..313bdf69f 100644
--- a/src/State/ScheduledTaskProvider.php
+++ b/src/State/ScheduledTaskProvider.php
@@ -4,11 +4,14 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle\State;
@@ -19,10 +22,10 @@
use Pimcore\Bundle\StaticResolverBundle\Models\Schedule\TaskResolverInterface;
use Pimcore\Bundle\StudioApiBundle\Dto\Task;
-final class ScheduledTaskProvider implements ProviderInterface
+final readonly class ScheduledTaskProvider implements ProviderInterface
{
public function __construct(
- private readonly TaskResolverInterface $taskResolver,
+ private TaskResolverInterface $taskResolver,
) {
}
diff --git a/src/State/Token/Create/Processor.php b/src/State/Token/Create/Processor.php
new file mode 100644
index 000000000..d2fe99223
--- /dev/null
+++ b/src/State/Token/Create/Processor.php
@@ -0,0 +1,64 @@
+getUriTemplate() !== self::OPERATION_URI_TEMPLATE
+ ) {
+ // wrong operation
+ throw new OperationNotFoundException();
+ }
+
+ /** @var User $user */
+ $user = $this->securityService->authenticateUser($data);
+
+ $token = $this->tokenService->generateAndSaveToken($user->getUserIdentifier());
+
+ return new Output($token, $this->tokenService->getLifetime(), $user->getUserIdentifier());
+ }
+}
diff --git a/src/State/Token/Refresh/Processor.php b/src/State/Token/Refresh/Processor.php
new file mode 100644
index 000000000..a50b3bb06
--- /dev/null
+++ b/src/State/Token/Refresh/Processor.php
@@ -0,0 +1,58 @@
+getUriTemplate() !== self::OPERATION_URI_TEMPLATE
+ ) {
+ // wrong operation
+ throw new OperationNotFoundException();
+ }
+
+ $tokenInfo = $this->tokenService->refreshToken($data->getToken());
+
+ return new Output($tokenInfo->getToken(), $this->tokenService->getLifetime(), $tokenInfo->getUsername());
+ }
+}
diff --git a/src/State/TranslationProcessor.php b/src/State/TranslationProcessor.php
new file mode 100644
index 000000000..e74b04c42
--- /dev/null
+++ b/src/State/TranslationProcessor.php
@@ -0,0 +1,59 @@
+getUriTemplate() !== self::OPERATION_URI_TEMPLATE
+ ) {
+ // wrong operation
+ throw new OperationNotFoundException();
+ }
+
+ if(empty($data->getKeys())) {
+ return $this->translatorService->getAllTranslations($data->getLocale());
+ }
+
+ return $this->translatorService->getTranslationsForKeys($data->getLocale(), $data->getKeys());
+ }
+}
diff --git a/src/State/UserProvider.php b/src/State/UserProvider.php
new file mode 100644
index 000000000..cf2742b51
--- /dev/null
+++ b/src/State/UserProvider.php
@@ -0,0 +1,45 @@
+userResolver->getById($uriVariables['id']);
+
+ if ($userModel === null) {
+ return null;
+ }
+
+ return new User($userModel);
+ }
+}
diff --git a/src/State/VersionProvider.php b/src/State/VersionProvider.php
index 9aa2ed110..0f9e9c1a7 100644
--- a/src/State/VersionProvider.php
+++ b/src/State/VersionProvider.php
@@ -4,11 +4,14 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
namespace Pimcore\Bundle\StudioApiBundle\State;
@@ -19,10 +22,10 @@
use Pimcore\Bundle\StaticResolverBundle\Models\Version\VersionResolverInterface;
use Pimcore\Bundle\StudioApiBundle\Dto\Version;
-final class VersionProvider implements ProviderInterface
+final readonly class VersionProvider implements ProviderInterface
{
public function __construct(
- private readonly VersionResolverInterface $versionResolver,
+ private VersionResolverInterface $versionResolver,
) {
}
diff --git a/src/Util/Constants/PublicTranslations.php b/src/Util/Constants/PublicTranslations.php
new file mode 100644
index 000000000..a4d2730d1
--- /dev/null
+++ b/src/Util/Constants/PublicTranslations.php
@@ -0,0 +1,27 @@
+assertSame('token', $create->getUsername());
+ $this->assertSame('test', $create->getPassword());
+ }
+}
diff --git a/tests/Unit/Dto/Token/InfoTest.php b/tests/Unit/Dto/Token/InfoTest.php
new file mode 100644
index 000000000..fb341b581
--- /dev/null
+++ b/tests/Unit/Dto/Token/InfoTest.php
@@ -0,0 +1,30 @@
+assertSame('token', $info->getToken());
+ $this->assertSame('test', $info->getUsername());
+ }
+}
diff --git a/tests/Unit/Dto/Token/OutputTest.php b/tests/Unit/Dto/Token/OutputTest.php
new file mode 100644
index 000000000..13cb25e53
--- /dev/null
+++ b/tests/Unit/Dto/Token/OutputTest.php
@@ -0,0 +1,31 @@
+assertSame('token', $output->getToken());
+ $this->assertSame(3600, $output->getLifetime());
+ $this->assertSame('test', $output->getUsername());
+ }
+}
diff --git a/tests/Unit/Dto/Token/RefreshTest.php b/tests/Unit/Dto/Token/RefreshTest.php
new file mode 100644
index 000000000..06878bca8
--- /dev/null
+++ b/tests/Unit/Dto/Token/RefreshTest.php
@@ -0,0 +1,29 @@
+assertSame('token', $refresh->getToken());
+ }
+}
diff --git a/tests/Unit/Dto/TranslationTest.php b/tests/Unit/Dto/TranslationTest.php
new file mode 100644
index 000000000..5258c50e2
--- /dev/null
+++ b/tests/Unit/Dto/TranslationTest.php
@@ -0,0 +1,32 @@
+assertSame('en', $translation->getLocale());
+ $this->assertIsArray($translation->getKeys());
+ $this->assertCount(1, $translation->getKeys());
+ $this->assertContains('login', $translation->getKeys());
+ }
+}
diff --git a/tests/Unit/Service/Security/SecurityServiceTest.php b/tests/Unit/Service/Security/SecurityServiceTest.php
new file mode 100644
index 000000000..2028f9077
--- /dev/null
+++ b/tests/Unit/Service/Security/SecurityServiceTest.php
@@ -0,0 +1,150 @@
+mockSecurityService();
+ $user = $securityService->authenticateUser(new Create('test', 'test'));
+
+ $this->assertInstanceOf(User::class, $user);
+ $this->assertSame('test', $user->getPassword());
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function testInvalidPassword(): void
+ {
+ $securityService = $this->mockSecurityService(false);
+
+ $this->expectExceptionMessage('Invalid credentials');
+ $securityService->authenticateUser(new Create('test', 'test'));
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function testUserNotFound(): void
+ {
+ $securityService = $this->mockSecurityService(false, false);
+
+ $this->expectExceptionMessage('Invalid credentials');
+ $securityService->authenticateUser(new Create('test', 'test'));
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function testTokenAllowedTrue(): void
+ {
+ $securityService = $this->mockSecurityService(false, false);
+
+ $this->assertTrue($securityService->checkAuthToken('test'));
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function testTokenAllowedFalse(): void
+ {
+ $securityService = $this->mockSecurityService(false, false, false);
+
+ $this->assertFalse($securityService->checkAuthToken('test'));
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function mockSecurityService($validPassword = true, bool $withUser = true, bool $withTmpStore = true): SecurityServiceInterface
+ {
+ return new SecurityService(
+ $withUser ? $this->mockUserProviderWithUser() : $this->mockUserProviderWithOutUser(),
+ $this->mockPasswordHasher($validPassword),
+ $this->mockTmpStoreResolver($withTmpStore)
+ );
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function mockUserProviderWithUser(): UserProvider
+ {
+ return $this->makeEmpty(UserProvider::class, [
+ 'loadUserByIdentifier' => function () {
+ return $this->makeEmpty(User::class, [
+ 'getPassword' => 'test',
+ ]);
+ },
+ ]);
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function mockUserProviderWithOutUser(): UserProvider
+ {
+ return $this->makeEmpty(UserProvider::class, [
+ 'loadUserByIdentifier' => fn () => throw new UserNotFoundException('User not found'),
+ ]);
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function mockPasswordHasher($validPassword = true): UserPasswordHasherInterface
+ {
+ return $this->makeEmpty(UserPasswordHasherInterface::class, [
+ 'isPasswordValid' => $validPassword,
+ ]);
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function mockTmpStoreResolver($withTmpStore = true): TmpStoreResolverInterface
+ {
+ return $this->makeEmpty(TmpStoreResolverInterface::class, [
+ 'get' => $withTmpStore ? $this->mockTmpStore() : null,
+ ]);
+ }
+
+ private function mockTmpStore(): TmpStore
+ {
+ $tmpStore = new TmpStore();
+ $tmpStore->setId('test');
+
+ return $tmpStore;
+ }
+}
diff --git a/tests/Unit/Service/Translator/TranslatorServiceTest.php b/tests/Unit/Service/Translator/TranslatorServiceTest.php
new file mode 100644
index 000000000..1342955ce
--- /dev/null
+++ b/tests/Unit/Service/Translator/TranslatorServiceTest.php
@@ -0,0 +1,68 @@
+mockTranslatorService();
+ $locale = 'en';
+
+ $translations = $translatorService->getAllTranslations($locale);
+
+ $this->assertEquals($locale, $translations->getLocale());
+ $this->assertEmpty($translations->getKeys());
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function testGetTranslationsForKeys(): void
+ {
+ $translatorService = $this->mockTranslatorService();
+ $locale = 'fr';
+ $keys = PublicTranslations::PUBLIC_KEYS;
+
+ $translations = $translatorService->getTranslationsForKeys($locale, $keys);
+
+ $this->assertEquals($locale, $translations->getLocale());
+ foreach ($keys as $key) {
+ $this->assertArrayHasKey($key, $translations->getKeys());
+ }
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function mockTranslatorService(): TranslatorServiceInterface
+ {
+ $translator = $this->makeEmpty(Translator::class);
+
+ return new TranslatorService($translator);
+ }
+}
diff --git a/tests/Unit/State/Token/Create/ProcessorTest.php b/tests/Unit/State/Token/Create/ProcessorTest.php
new file mode 100644
index 000000000..78b59b565
--- /dev/null
+++ b/tests/Unit/State/Token/Create/ProcessorTest.php
@@ -0,0 +1,115 @@
+mockProcessor();
+
+ $this->expectException(OperationNotFoundException::class);
+
+ $translationProcessor->process(
+ $this->getCreateToken(),
+ $this->getPostOperation('/wrong-uri-template')
+ );
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function testWrongOperation(): void
+ {
+ $translationProcessor = $this->mockProcessor();
+
+ $this->expectException(OperationNotFoundException::class);
+
+ $translationProcessor->process(
+ $this->getCreateToken(),
+ $this->getGetOperation()
+ );
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function testWrongData(): void
+ {
+ $translationProcessor = $this->mockProcessor();
+
+ $this->expectException(OperationNotFoundException::class);
+
+ $translationProcessor->process(
+ new stdClass(),
+ $this->getPostOperation('/token/create')
+ );
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function mockProcessor(): Processor
+ {
+ return new Processor($this->mockSecuritySercice(), $this->mockTokenService());
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function mockSecuritySercice(): SecurityServiceInterface
+ {
+ return $this->makeEmpty(SecurityServiceInterface::class);
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function mockTokenService(): TokenServiceInterface
+ {
+ return $this->makeEmpty(TokenServiceInterface::class);
+ }
+
+ private function getCreateToken(): Create
+ {
+ return new Create('test', 'test');
+ }
+
+ private function getPostOperation(string $uriTemplate): Post
+ {
+ return new Post(uriTemplate: $uriTemplate);
+ }
+
+ private function getGetOperation(): Get
+ {
+ return new Get(uriTemplate: '/token/create');
+ }
+}
diff --git a/tests/Unit/State/Token/Refresh/ProcessorTest.php b/tests/Unit/State/Token/Refresh/ProcessorTest.php
new file mode 100644
index 000000000..aa49488e7
--- /dev/null
+++ b/tests/Unit/State/Token/Refresh/ProcessorTest.php
@@ -0,0 +1,106 @@
+mockProcessor();
+
+ $this->expectException(OperationNotFoundException::class);
+
+ $translationProcessor->process(
+ $this->getCreateToken(),
+ $this->getPostOperation('/wrong-uri-template')
+ );
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function testWrongOperation(): void
+ {
+ $translationProcessor = $this->mockProcessor();
+
+ $this->expectException(OperationNotFoundException::class);
+
+ $translationProcessor->process(
+ $this->getCreateToken(),
+ $this->getGetOperation()
+ );
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function testWrongData(): void
+ {
+ $translationProcessor = $this->mockProcessor();
+
+ $this->expectException(OperationNotFoundException::class);
+
+ $translationProcessor->process(
+ new stdClass(),
+ $this->getPostOperation('/token/refresh')
+ );
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function mockProcessor(): Processor
+ {
+ return new Processor($this->mockTokenService());
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function mockTokenService(): TokenServiceInterface
+ {
+ return $this->makeEmpty(TokenServiceInterface::class);
+ }
+
+ private function getCreateToken(): Create
+ {
+ return new Create('test', 'test');
+ }
+
+ private function getPostOperation(string $uriTemplate): Post
+ {
+ return new Post(uriTemplate: $uriTemplate);
+ }
+
+ private function getGetOperation(): Get
+ {
+ return new Get(uriTemplate: '/token/refresh');
+ }
+}
diff --git a/tests/Unit/State/TranslationProcessorTest.php b/tests/Unit/State/TranslationProcessorTest.php
new file mode 100644
index 000000000..f72a7a48e
--- /dev/null
+++ b/tests/Unit/State/TranslationProcessorTest.php
@@ -0,0 +1,100 @@
+mockTranslationProcessor();
+
+ $this->expectException(OperationNotFoundException::class);
+
+ $translationProcessor->process(
+ $this->getTranslation(),
+ $this->getPostOperation('/wrong-uri-template')
+ );
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function testWrongOperation(): void
+ {
+ $translationProcessor = $this->mockTranslationProcessor();
+
+ $this->expectException(OperationNotFoundException::class);
+
+ $translationProcessor->process(
+ $this->getTranslation(),
+ $this->getGetOperation()
+ );
+ }
+
+ /**
+ * @throws Exception
+ */
+ public function testWrongData(): void
+ {
+ $translationProcessor = $this->mockTranslationProcessor();
+
+ $this->expectException(OperationNotFoundException::class);
+
+ $translationProcessor->process(
+ new stdClass(),
+ $this->getPostOperation('/translations')
+ );
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function mockTranslationProcessor(): TranslationProcessor
+ {
+ $translatorInterface = $this->makeEmpty(TranslatorServiceInterface::class);
+
+ return new TranslationProcessor($translatorInterface);
+ }
+
+ private function getTranslation(): Translation
+ {
+ return new Translation('en', []);
+ }
+
+ private function getPostOperation(string $uriTemplate): Post
+ {
+ return new Post(uriTemplate: $uriTemplate);
+ }
+
+ private function getGetOperation(): Get
+ {
+ return new Get(uriTemplate: '/translations');
+ }
+}
diff --git a/tests/_bootstrap.php b/tests/_bootstrap.php
index a497fadb0..360fdc5e8 100644
--- a/tests/_bootstrap.php
+++ b/tests/_bootstrap.php
@@ -3,11 +3,14 @@
/**
* Pimcore
*
- * This source file is available under following license:
+ * This source file is available under two different licenses:
+ * - GNU General Public License version 3 (GPLv3)
* - Pimcore Commercial License (PCL)
+ * Full copyright and license information is available in
+ * LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
- * @license http://www.pimcore.org/license PCL
+ * @license http://www.pimcore.org/license GPLv3 and PCL
*/
define('PIMCORE_PROJECT_ROOT', dirname(__DIR__));